从SVNKit只获取X个最新日志项

时间:2016-10-24 16:22:59

标签: svnkit

我想知道SVN标签的最新修订版。在我的情况下,不是实际的,而是之前的(或者说不同的是,从中标记存储库的版本)。

我有这个代码可以让我得到我想要的东西:

        Collection<SVNLogEntry> log = repository.log(new String[]{""}, null, 1, -1, false, false);
        List<Long> revisions = log.stream().map(entry -> entry.getRevision()).sorted().collect(Collectors.toList());
        System.out.println("Wanted Revision:" + revisions.get(revisions.size()-2));

然而,对于一个庞大的SVN存储库来说,它太慢了,因为我得到了很多我不需要的修订版。我几乎无法设置startRevision,因为我没有关于从哪里获取它的信息(以编程方式)......

如果我能从日志中获取X最新元素,我会很高兴,这样它会表现良好我可以得到我需要的信息,但我发现没办法做这样的事情,即使Eclipse确实有限历史甚至使用SVNKit,因此必须可以在不明确设置startRevision的情况下获得最后的N个修订。

我不了解SVNKit API的秘诀是什么?

我有以下导入:

compile group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.12'

更新:

我尝试了以下方法:

        repository.log(new String[]{""}, 1, -1, false, false, 15 /* limit */, false, null,
            new ISVNLogEntryHandler()
            {
                @Override
                public void handleLogEntry(SVNLogEntry logEntry) throws SVNException
                {
                    logs.add(logEntry);
                }
            });

然而,这用Java中的过滤(也可以表示为lambda),而不是来自存储库,因此它的执行与上面的示例相同,而且它显示前15个结果,而不是最后的结果。 ..

1 个答案:

答案 0 :(得分:0)

我在想这个问题没有干净的解决方案(虽然我不知道SVN的内部结构)......

我发现可行的方法如下:

        SVNDirEntry info = repository.info("", -1);
        Collection<SVNLogEntry> log = repository.log(new String[]{""}, null, info.getRevision() - 500, -1, false, false);
        List<Long> revisions = log.stream().map(entry -> entry.getRevision()).sorted().collect(Collectors.toList());
        revision = revisions.get(revisions.size()-2);

这样它就不会检索到这么多结果(只有最后500次修订)。对于我的例子,也许-10或-50会这样做,但我想确定...仍然会重构它以确保如果info.getRevision是&lt; 500它需要1。

我仍然对此不满意,因为我应该验证日志的大小,如果&lt; 2得到另外500,但我现在将忍受这个潜在的错误(这是我使用的工具,而不是我将部署)......处理这些事情的目的太多了......