Bootstrap

gitblit钩子脚本实现代码提交后自动获取提交的md文件内容

gitblit钩子脚本

gitblit钩子脚本语言是groovy,需要编写groovy文件
主要使用的是jgit的jar包
脚本写法:

import com.gitblit.GitBlit
import org.slf4j.Logger
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.lib.ObjectReader
import org.eclipse.jgit.lib.ObjectId
import org.eclipse.jgit.lib.ObjectLoader
import org.eclipse.jgit.lib.AbbreviatedObjectId
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.diff.DiffEntry
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
import org.apache.http.NameValuePair
import org.apache.http.client.entity.UrlEncodedFormEntity
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpPost
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.message.BasicNameValuePair
import org.apache.http.util.EntityUtils
import org.jsoup.Jsoup
import org.jsoup.nodes.Document

logger.info("gitblit hook triggered by ${user.username} for ${repository.name}")
//获取仓库
Repository r = gitblit.getRepository(repository.name)
for (command in commands){
    // 从command中,获取提交的分支名
    String refName = command.refName
    //resolve方法可以传多种类型,这里传入分支名,可以获取对应分支的ObjectId
    //获取上一个,和当前的tree
    ObjectId oldHead = r.resolve(refName+"^^{tree}")
    ObjectId head = r.resolve(refName+"^{tree}")
    //new一个ObjectReader
    ObjectReader reader = r.newObjectReader()
    CanonicalTreeParser oldTreeIter=new CanonicalTreeParser()
    oldTreeIter.reset(reader,oldHead)
    CanonicalTreeParser newTreeIter=new CanonicalTreeParser()
    newTreeIter.reset(reader,head)
    
    Git git = new Git(r)
    //获取差异
    List<DiffEntry> diffs = git.diff().setNewTree(newTreeIter).setOldTree(oldTreeIter).call();
    // 遍历差异
    for(entry in diffs){
        String filePath = entry.getNewPath()
        // 判断是否是md文件
        if(filePath.endsWith("md")){
            AbbreviatedObjectId fileId = entry.getNewId()
            ObjectLoader loader =r.open(fileId.toObjectId())
            byte[] bytes = loader.getBytes();
            if (bytes != null){
                println new String(bytes)
            }
        }
    }
}

;