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

Get only X latest log items from 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 个结果, 不是最后一个...

我认为这个问题没有干净的解决方案(虽然我不知道 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 是 < 500 它将需要 1.

我仍然对此不满意,因为我应该验证日志的大小,如果 <2 得到另一个 500,但我现在会忍受这个潜在的错误(它是我使用的工具,而不是我将部署的东西)...处理此类事情只是为此目的编写了太多代码...