前回の記事「git logのrange指定」で行ったことをJavaから行います。gitへのアクセスを一から書くと大変なので今回はjgitを使用します。
行うことの流れとしては以下の通り。
- Repositoryインスタンス作成
- RevWalkインスタンス作成
- 範囲となるRevCommit(始点、終点)インスタンス作成
- RevWalkにRevCommit(始点、終点)をmark
- 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( |
---|