一个用于处理添加和更新文件的API

时间:2013-12-04 07:50:18

标签: java svn svnkit

我正在使用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);
    }
  }

1 个答案:

答案 0 :(得分:1)

这是svn://协议中优化的副作用。在编辑器驱动期间,除非出现错误,否则服务器不会发送任何响应,因此客户端无法判断特定操作是否成功。我没有看过SVNKit的代码,但我敢打赌你可能会从任何编辑器方法中获得异常,因为在服务器响应之后,将在下一个编辑器驱动器调用中检测到错误。在这种情况下,您的更改非常小,以至于编辑器驱动器发送在检测到服务器的响应之前发生,因此您在执行closeEdit()时最终会看到错误。

Subversion中的svnmucc命令与您尝试解决的问题类似。它有一个添加或更新文件的put操作。它使用了与Dmitry建议您在svnkit-users邮件列表(link1link2)上使用的相同技术。在确定添加或创建文件之前,专门运行check_path。

由于协议的工作方式,你无法做更好的事情。