2017-07-17 172 views
1

我目前在应用程序中实现了一些SVN功能。其中之一是“svn更新”。SharpSvn更新通知事件

不幸的是,命令行中“svn update”命令的输出和Notify事件中关于已更改文件的输出不同。例如。如果我只用一个文件夹更新一个工作副本,其中只有文本文件的内容发生变化,我将获得三次(文件,包含的文件夹和工作副本本身)事件Action.UpdateUpdate。是否有可能将事件减少到“根本原因”?我确实知道每个项目都会发生变化,至少在记录版本(“svn info”)方面有所改变,但我只想简单地展示根本原因。

如果我只更新文件本身(而不是整个工作副本),这将更加不同。然后,我将收到两个Action.UpdateUpdate事件,即文件本身和包含该文件的文件夹(但仅限直接父文件夹)。

我在版本1.8009.3299.43中使用SharpSvn.dll。

谢谢!

例如代码:

SharpSvn.SvnUpdateResult updateResult; 
      SvnUpdateArgs updateArgs = new SvnUpdateArgs(); 
      updateArgs.IgnoreExternals = ignoreExternals; 
      if (revision >= 0) 
       updateArgs.Revision = revision; 

      // Use throw on error, since this provides much more information why the operation failed 
      // might slow down a little bit, since the exception must be handled 
      updateArgs.ThrowOnError = true; 

      List<Tuple<string, SvnUpdateFileChangeType>> changedFiles = new List<Tuple<string, SvnUpdateFileChangeType>>(); 
      using (var svnClient = new SvnClient()) 
      { 
       svnClient.Notify += (sender, notifyEventArgs) => 
       { 
        switch (notifyEventArgs.Action) 
        { 
         case SvnNotifyAction.UpdateAdd: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Added)); 
          break; 
         case SvnNotifyAction.UpdateDelete: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Deleted)); 
          break; 
         case SvnNotifyAction.UpdateUpdate: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Updated)); 
          break; 
         case SvnNotifyAction.UpdateShadowedAdd: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Added)); 
          break; 
         case SvnNotifyAction.UpdateShadowedDelete: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Deleted)); 
          break; 
         case SvnNotifyAction.UpdateShadowedUpdate: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Updated)); 
          break; 
         case SvnNotifyAction.ConflictResolverStarting: 
          changedFiles.Add(new Tuple<string, SvnUpdateFileChangeType>(notifyEventArgs.FullPath, SvnUpdateFileChangeType.Conflicted)); 
          break; 
        }; 
       }; 

       svnClient.Update(localPath, updateArgs, out updateResult); 
      } 

更新: 如果指定签出深度的输出变得更加复杂。例如,存储库包含一个文件和一个包含另一个文件的目录。这两个文件都会在内容中发生变化。检出版本库,然后更新到版本文件内容发生更改的版本中,尽管svn info显示修订版本,我收到单个文件和工作副本目录的Action.UpdateUpdate事件,但不包含更新文件的目录的目录已经改变。

回答

2

通知的内容取决于Subversion核心库,而不是顶层的SharpSvn层。一般来说,您可以确定svn从100%这些相同的通知中创建了它的输出。在某些情况下,它只会删除或合并预期的通知以将其过滤为有用的输出。

一般而言,Subversion将尝试从高于指定目标的一个级别(但只是目标内部)进行更新,以允许在执行更新所需的情况下替换根操作。这是必需的,因为Subversion只允许更新树中的所有内容,作为该树上的编辑操作。

我通常偷看notify.c,看看它是如何处理通知的。如果您只想显示相同的输出,SharpSvn内部有一个助手SvnClientReporter,它允许您大多重新创建svn输出。 (它应该真的复制输出,但有时候事情会不同步)。这是您在AnkhSVN Subversion输出窗口中看到的输出。

+0

如何使用'SvnClientReporter'?基本上,我创建了一个由我使用的'SvnClient'实例提供的实例,以及一些我希望获得输出的作者。但是之后? SvnClientReporter会自动将通知添加到作者身上吗? – royalTS

+0

我刚刚尝试过'SvnClientRepoter',它确实像预期的那样工作!谢谢! – royalTS

+2

是的,确切地说。它在收到通知事件时写入通知。 –