2017-07-17 92 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

是的,確切地說。它在收到通知事件時寫入通知。 –