Mercurial API for Java?

Mercurial API for Java?,java,api,mercurial,javahg,Java,Api,Mercurial,Javahg,是否有从Java访问Mercurial存储库的简单API Netbeans和Eclipse都有插件,但与Subversion不同的是,它们不使用普通的低级库,而是使用自己的包装器调用Mercurial二进制文件。调用二进制代码是可以的(目前来说),但是在独立应用程序中使用这些插件似乎非常困难(在构建它们的IDE之外) 还有HgKit,但这是非常早的alpha。你看过Jython吗?就我所见,它应该有助于在Java环境中使用python mercurial模块,就像Ruby一样。似乎有一个。但是,

是否有从Java访问Mercurial存储库的简单API

Netbeans和Eclipse都有插件,但与Subversion不同的是,它们不使用普通的低级库,而是使用自己的包装器调用Mercurial二进制文件。调用二进制代码是可以的(目前来说),但是在独立应用程序中使用这些插件似乎非常困难(在构建它们的IDE之外)


还有HgKit,但这是非常早的alpha。你看过Jython吗?就我所见,它应该有助于在Java环境中使用python mercurial模块,就像Ruby一样。

似乎有一个。但是,我不知道该提供商在您的情况下有多适用(即它与Maven体系结构的联系有多深和/或它与hg的接口有多深)。

还有一个新的选项,但目前它只允许读取存储库。

现在有更多(即克隆)功能,并且似乎正在实际开发中,这为您提供了一个高级Java API。本文给出了一个很好的示例,说明如何使用它进行编程(从JavaHg 0.1开始):

public void committeset()引发IOException{
Repository repo=getTestRepository();
书面文件(“x”、“abc”);
CommitCommand commit=CommitCommand.on(repo);
StatusCommand状态=StatusCommand.on(repo);
列表状态行=status.lines();
Assert.assertEquals(1,statusLines.size());
Assert.assertEquals(StatusLine.Type.UNKNOWN,statusLines.get(0.getType());
AddCommand.on(repo.execute();
statusLines=status.lines();
Assert.assertEquals(1,statusLines.size());
Assert.assertEquals(StatusLine.Type.ADDED,statusLines.get(0.getType());
commit.message(“添加文件”).user(“Martin Geisler”);
changesetcset=commit.execute();
Assert.assertEquals(“Martin Geisler”,cset.getUser());
statusLines=status.lines();
Assert.assertEquals(0,statusLines.size());
}

它与版本1.9及更高版本中的当前版本交互。这意味着将有一个持久的Mercurial进程,它接受多个命令,因此可以避免通常与启动Mercurial相关的启动开销。我们预计它将在MercurialElipse的下一个版本中使用。(我是JavaHg的作者之一。)

显然,Jython目前还不能运行Mercurial,部分原因是Mercurial的某些部分是用C编写的。Mercurial已经将大多数C模块向后移植到Python。我想他们已经差不多(如果不是完全)完成了。我们完成了,现在可以使用--pure标志setup.py来使用mercurial/pure下的模块。但请注意,这会带来很大的速度损失(不过我不知道Jython的表现如何),这看起来确实很有希望。当然,它使用Maven接口,但我想/希望这些接口也可以在Maven之外使用,至少比我在问题中提到的图形插件更容易。至于与hg的接口,它调用命令行程序(这很好)。嗯,看起来它不是一个纯粹的实现,而是一个二进制的包装器——或者我错了?@shabunc:你说得对。JavaHg使用的是Mercurial唯一稳定的API:命令行。这意味着,如果底层数据结构发生变化,它将继续工作。但是,您是对的,它不像JGit,它不是一个只使用Java的库,因为您也需要安装Mercurial。它已经过时,似乎不再被开发。
public void commitTest() throws IOException {
    Repository repo = getTestRepository();
    writeFile("x", "abc");

    CommitCommand commit = CommitCommand.on(repo);
    StatusCommand status = StatusCommand.on(repo);

    List<StatusLine> statusLines = status.lines();
    Assert.assertEquals(1, statusLines.size());
    Assert.assertEquals(StatusLine.Type.UNKNOWN, statusLines.get(0).getType());

    AddCommand.on(repo).execute();
    statusLines = status.lines();
    Assert.assertEquals(1, statusLines.size());
    Assert.assertEquals(StatusLine.Type.ADDED, statusLines.get(0).getType());

    commit.message("Add a file").user("Martin Geisler");
    Changeset cset = commit.execute();
    Assert.assertEquals("Martin Geisler", cset.getUser());
    statusLines = status.lines();
    Assert.assertEquals(0, statusLines.size());
}