我目前在应用程序中实现了一些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
是的,确切地说。它在收到通知事件时写入通知。 –