svnkit:如何以编程方式将'svn status'的确切结果作为String?

时间:2012-10-19 08:26:00

标签: java svn svnkit

我只找到How to list locally-modified/unversioned files using svnkit?,需要实现复杂的逻辑才能在存储库的根目录中获得svn status的确切输出。

由于svnkit还提供了jsvn中实现的命令行工具svnkit-cli,我找到了我想在org.tmatesoft.svn.cli.svn.SVNStatusCommand.run()中使用的代码。

但我无法让它工作,也没有找到jsvn正在做的确切方式。我会调试jsvn,但无法获得gradle构建设置,很可能是因为我们的windows ntlm http代理在这里......

到目前为止我尝试过:

StringBuffer result = new StringBuffer();
SVNStatusCommand svnStatusCall = new SVNStatusCommand();
File statusResult = new File(System.getProperty("java.io.tmpdir") + File.separator + System.currentTimeMillis() + "svnStatusCalls");
PrintStream stream = new PrintStream(statusResult);
SVNCommandEnvironment env = new SVNCommandEnvironment("mySvn", stream, stream, null);
env.getTargets().add("/home/user/svnroot");
svnStatusCall.init(env);
svnStatusCall.run();
stream.flush();
Scanner scanner = new Scanner(statusResult);
while (scanner.hasNextLine()) {
    result.append(scanner.nextLine());
}
scanner.close();

由于SVNCommandEnvironment的myTargets尚未初始化,即为空,因此失败。目的是在String中获取输出。我不喜欢PrintStream和文件系统中的额外文件,但是没有看到不同的方式。

1 个答案:

答案 0 :(得分:4)

AbstractSVNCommand.registerCommand(new SVNStatusCommand());

final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final PrintStream stream = new PrintStream(bos);

final SVNCommandLine commandLine = new SVNCommandLine();
commandLine.init(new String[] {"status", "d:/svntest/small.svn17"});

final SVNCommandEnvironment env = new SVNCommandEnvironment("mySvn", stream, stream, System.in);
env.init(commandLine);
env.initClientManager();

final SVNStatusCommand svnStatusCall = new SVNStatusCommand();
svnStatusCall.init(env);
svnStatusCall.run();
stream.flush();
System.out.println(new String(bos.toByteArray()));