我正在使用SVNKIT 1.8和SVN 1.8.5以及SVN协议来尝试批量添加文件到我的SVN存储库。我想有一种方法来添加和更新文件,下面的代码在使用FILE协议时成功处理这两种方法,因为editor.addFile(file,null,-1)抛出一个SVNException。当我切换到SVN协议(所需协议)时,编辑器.addFile(file,null,-1);不会抛出异常。而不是editor.closeEdit();抛出一个不希望的异常。关于如何使用一个API来添加和更新文件的任何想法?
public void addFiles(Map<String, String> data) throws Exception {
TreeSet<String> filesToCreate = new TreeSet<String>(data.keySet());
SVNRepository repo = null;
ISVNEditor editor = null;
try {
repo = openSession();
editor = repo.getCommitEditor("Adding files.", null);
editor.openRoot(-1);
for (String file : filesToCreate) {
try {
editor.addFile(file, null, -1);
} catch (SVNException e) {
editor.openFile(file, -1);
}
editor.applyTextDelta(file, null);
SVNDeltaGenerator gen = new SVNDeltaGenerator();
String checksum = gen.sendDelta(file, new ByteArrayInputStream(data.get(file).getBytes()), editor, true);
editor.closeFile(file, checksum);
}
editor.closeEdit();
} catch (Exception ex) {
abort(editor);
throw new Exception(ex.toString(), ex);
} finally {
closeSession(repo);
}
}
答案 0 :(得分:1)
这是svn://协议中优化的副作用。在编辑器驱动期间,除非出现错误,否则服务器不会发送任何响应,因此客户端无法判断特定操作是否成功。我没有看过SVNKit的代码,但我敢打赌你可能会从任何编辑器方法中获得异常,因为在服务器响应之后,将在下一个编辑器驱动器调用中检测到错误。在这种情况下,您的更改非常小,以至于编辑器驱动器发送在检测到服务器的响应之前发生,因此您在执行closeEdit()时最终会看到错误。
Subversion中的svnmucc命令与您尝试解决的问题类似。它有一个添加或更新文件的put操作。它使用了与Dmitry建议您在svnkit-users邮件列表(link1,link2)上使用的相同技术。在确定添加或创建文件之前,专门运行check_path。
由于协议的工作方式,你无法做更好的事情。