git logのrange指定をjgitで行う

前回の記事「git logのrange指定」で行ったことをJavaから行います。gitへのアクセスを一から書くと大変なので今回はjgitを使用します。

行うことの流れとしては以下の通り。

  1. Repositoryインスタンス作成
  2. RevWalkインスタンス作成
  3. 範囲となるRevCommit(始点、終点)インスタンス作成
  4. RevWalkにRevCommit(始点、終点)をmark
  5. RevWalkで範囲内のRevCommitを取得

1から5をコードに起こすとだいたいこんな感じ。リポジトリの場所及びCommitの範囲は引数で指定するようにしました。出力内容は前回の記事「git logのrange指定」と合わせています。

package sample;

import java.io.File;
import java.io.IOException;

import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;

public class Sample01 {

    public static void main(String[] args) throws Exception {
        if (args.length == 3) {
            new Sample01(args[0]).execute(args[1], args[2]);
        }
    }

    private Repository repository;

    public Sample01(String path) throws IOException {
        FileRepositoryBuilder builder = new FileRepositoryBuilder();
        repository = builder.setGitDir(new File(path)).readEnvironment()
                .findGitDir().build();
    }

    private void execute(String from, String to) throws Exception {
        RevWalk walk = new RevWalk(repository);
        RevCommit fromCommit = walk.parseCommit(repository.resolve(from));
        RevCommit toCommit = walk.parseCommit(repository.resolve(to));
        walk.markStart(fromCommit);
        walk.markUninteresting(toCommit);
        walk.forEach1)RevCommit commit) -> {
            System.out.printf("%s\t%s\n", 
                    commit.getName().substring(0, 7),
                    commit.getShortMessage(;
        });
        walk.dispose();
    }

}

この程度であればmainで終わらせてもよいですね。インスタンスを作って実行しているのは癖みたいなものなので適当に読み飛ばしてください。

今回はJava8で書いています。せっかくなのでラムダ式を使ってみました。RevWalkで範囲内のRevCommitを取得する箇所がそれです。中々便利ですね。

使用するRepositoryは前回の記事「git logのrange指定」で使用したものと同じで、release/v0.2.0からrelease/v0.1.0の範囲を指定して実行すると以下が出力されます。

fc78c4c	add release_0.2.0.txt
0172707	Merge branch 'release/v0.1.0' into develop
f278bcf	Merge branch 'feature/func21' into develop
fe556d4	Merge branch 'feature/func12' into develop
ee7ffeb	modify func12.txt
10f9fa6	add func21.txt
3a1bbcd	modify func12.txt
1e68c15	add func12.txt

当たり前ですが、 同じ内容になっています。

単に範囲のCommitを取得したいぐらいであればgit logでよいかと思います。その先で取得した情報から何かしたい場合にjgit(とJava)は色々と役立ってくれそうです。

jgitを使うにあたってUser Guideがとっかかりとしていい情報源でした。
では。

References   [ + ]

1. RevCommit commit) -> { System.out.printf("%s\t%s\n", commit.getName().substring(0, 7), commit.getShortMessage(