Java 检索SVN以编程方式提交,无需Atlassian Fisheye

Java 检索SVN以编程方式提交,无需Atlassian Fisheye,java,svn,svnkit,Java,Svn,Svnkit,我们目前正在使用Atlassian JIRA解决缺陷和常规开发周期。我们使用SVN存储库来维护代码。我们最近做的一件事是使用SVNKit 1.7.4和Atlassian Fisheye开发了一个自定义实用程序,它提供了一个JIRA id的列表,从SVN获取提交。这是通过使用Atlassian Fisheye REST服务完成的。一旦我们获得此文件路径列表,我们将工作副本与目标进行比较,并使用SVNDeltaGenerator的applyTextDelta方法修改文件,然后在目标分支中签入。我们需

我们目前正在使用Atlassian JIRA解决缺陷和常规开发周期。我们使用SVN存储库来维护代码。我们最近做的一件事是使用SVNKit 1.7.4和Atlassian Fisheye开发了一个自定义实用程序,它提供了一个JIRA id的列表,从SVN获取提交。这是通过使用Atlassian Fisheye REST服务完成的。一旦我们获得此文件路径列表,我们将工作副本与目标进行比较,并使用SVNDeltaGenerator的applyTextDelta方法修改文件,然后在目标分支中签入。我们需要的一件最重要的事情是SVN对特定JIRA ID的变更集。一旦我们将JIRA ID作为输入,Fisheye将从SVN获取详细信息,并将其作为列表发送回

现在,如果我们需要绕过Fisheye,转而使用SVN内部功能来实现Fisheye为我们提供的功能,我们需要做什么?我们遵循svn钩子,其中提交消息始终包含JIRA ID,是否有一种方法可以检索完整的更改集,包括使用特定JIRA添加的文件名、路径和目录,比如使用提交消息?我们的开发人员使用的示例提交消息之一是“ND-9181:此文件与ABC相关,并已修复DE119919”。这里ND-9181是JIRA ID。类似地,所有对SVN的承诺都强制具有JIRA ID

我想在下面指定SVN:

从SVN中查找所有文件/文件路径/目录,其中Commit_Msg='ND-9817'


如果有人曾经实现过这一点,或者知道使用SVNKit编程实现这一点的方法,请告诉我。

自1.8版以来,Subversion CLI支持
svn log
命令的选项,因此如果使用CLI是一个选项,您可以简单地解析此命令的结果:

svn log -v --search ND-9817
奇怪的是,这个特性在最近的版本中是不可用的(他们提供的Javadoc是针对1.7版本的,但我用最新的1.8.11版本进行了实验)。因此,SVNKit解决方案似乎需要手动筛选。为了简洁起见,我省略了包、导入和主要方法

公共类Q3480380{
public void grepLogMessages(字符串url、字符串消息)引发SVNException{
SvnOperationFactory SvnOperationFactory=新的SvnOperationFactory();
试一试{
SvnLog log=svnOperationFactory.createLog();
log.setSingleTarget(SvnTarget.fromURL(SVNURL.parseURIEncoded(url));
log.addRange(SvnRevisionRange.create(SVNRevision.create(0),SVNRevision.HEAD));
log.setDiscoveryChangedPath(true);
setReceiver(新的GrepLogReceiver(消息));
log.run();
}最后{
svnOperationFactory.dispose();
}
}
私有类GrepLogReceiver实现ISvnObjectReceiver{
私有字符串消息;
公共GrepLogReceiver(字符串消息){
this.message=消息;
}
@凌驾
public void receive(SvnTarget target,SVNLogEntry le)抛出SVNException{
如果(le.getMessage()!=null&&le.getMessage()包含(消息)){
System.out.println(“rev#“+le.getRevision()+”:“+le.getMessage());
Map cps=le.getChangedPaths();
对于(Map.Entry e:cps.entrySet()){
SVNLogEntryPath lep=e.getValue();
System.out.println(lep.getType()+“”+lep.getPath());
}
}
}
}
}

这看起来是一种可行的方法。谢谢你的帮助。我将按我们的要求给这个班一次机会。在这两者之间,消息字符串可以将JIRA ID作为输入,因为存在“contains”测试。我的理解正确吗?没错。您可以根据自己的喜好调整该测试,例如使其不区分大小写,或者使用更复杂的正则表达式匹配方法。此外,您还需要一些机制,以便您可以从外部
GrepLogReceiver
访问结果,这里只需将结果打印到
STDOUT
-为了简洁起见,我保持了它的简单性
:)