我目前在應用程序中實現了一些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
事件,但不包含更新文件的目錄的目錄已經改變。
如何使用'SvnClientReporter'?基本上,我創建了一個由我使用的'SvnClient'實例提供的實例,以及一些我希望獲得輸出的作者。但是之後? SvnClientReporter會自動將通知添加到作者身上嗎? – royalTS
我剛剛嘗試過'SvnClientRepoter',它確實像預期的那樣工作!謝謝! – royalTS
是的,確切地說。它在收到通知事件時寫入通知。 –