読者です 読者をやめる 読者になる 読者になる

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-hglibexamples/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では次が予定されているようです。

  • http, httpsssh
  • incomming
  • outgoing
  • clone

次のリリースが楽しみですね!