Pure JavaによるMercurial実装 Hg4J #mercurialjp
このエントリは Mercuiral Advent Calendar 2012 の20日目です。
Pure JavaによるMercurialの実装Hg4Jの紹介をしたいと思います。
Hg4J
Hg4J Pure Java によるMercurial実装です。
Mercurial 1.9から利用できる CommandServerを利用する JavaHg とは異なり、Hg4JはMercurialのリポジトリを直接を操作します。
現時点の1.0.0では一部のリポジトリの読み込みを行うコマンド(cat, log, manifest, status, branches, tagsなど)のみサポートしています。
実際のプログラム
python-hglibのexamples/stats.pyをだいたいHg4Jで実装してみました。
// stats.groovy import java.io.File @GrabResolver(name='tmatesoft', root='http://maven.tmatesoft.com/content/repositories/releases/') @Grab(group='org.tmatesoft.hg4j', module='hg4j', version='1.0.0') import org.tmatesoft.hg.core.Nodeid import org.tmatesoft.hg.core.HgRepoFacade import org.tmatesoft.hg.core.HgFileRevision import org.tmatesoft.hg.core.HgManifestHandler import org.tmatesoft.hg.util.Path import static org.tmatesoft.hg.repo.HgRepository.TIP def repo = '.' if (args.length > 0) { repo = args[0] } HgRepoFacade hgRepo = new HgRepoFacade() if (! hgRepo.initFrom(new File(repo))) { println "Can't find repository in: ${hgRepo.repository.location}" System.exit 1 } def revs = hgRepo.createLogCommand().range(TIP, TIP).execute()[0].revisionIndex def manifestHanlder = new HgManifestHandler() { def count = 0 public void file(HgFileRevision fileRevision) { count++ } public void begin(Nodeid manifestRevision) { } public void dir(Path p) { } public void end(Nodeid manifestRevision) { } } hgRepo.createManifestCommand().changeset(TIP).execute(manifestHanlder) def files = manifestHanlder.count def branches = hgRepo.repository.branches.allBranches.size() def tags = hgRepo.repository.tags.allTags.size() def users = hgRepo.createLogCommand().range(0, TIP).execute().inject([:], { m, v -> m[v.user] = true; m }).size() def merges = hgRepo.createLogCommand().range(0, TIP).execute().grep({ v -> v.merge }).size() println "${revs} revisions" println "${merges} merges" println "${files} files" println "${branches} branches" println "${tags} tags" println "${users} users"
実行するとこんな感じになります。
% groovy stats.groovy src/hg 18043 revisions 2092 merges 999 files 2 branches 77 tags 627 users % % python src/python-hglib/examples/stats.py src/hg 18043 revisions 2092 merges 999 files 4 heads 2 branches 77 tags 626 authors %
まとめ
Hg4Jは現在1.1.0のリリースに向けて絶賛開発中です。1.1.0では次が予定されているようです。
次のリリースが楽しみですね!