SharpSvn 更新时的通知事件



我目前正在应用程序中实现一些SVN功能。其中之一是"svn更新"。

不幸的是,命令行中的"svn update"命令和有关已更改文件的Notify事件的输出是不同的。 例如,如果我只用一个文件夹更新一个工作副本,其中包含一个简单的文本文件,其中只有文本文件的内容发生了变化,我得到Action.UpdateUpdate事件三次(文件, 包含文件夹和工作副本本身(。是否有可能将事件简化为"根本原因"?我确实了解这些项目中的每一个都会发生变化,至少在记录的修订("svn 信息"(方面,但我想简单地显示根本原因。

如果我只更新文件本身(而不是整个工作副本(,那就更不同了。然后,我将收到两个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);
}

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

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

一般来说,Subversion 会尝试从比你指定的目标(但只是里面的目标(更高的一个级别进行更新,以允许替换 root 操作,以防这是执行更新所必需的。这是必需的,因为 Subversion 只允许更新树中的所有内容作为对该树的编辑操作。

我通常会偷看 notify.c 以查看它如何处理通知。如果您只想显示相同的输出,则 SharpSvn 中有一个帮助程序SvnClientReporter类,它允许您主要重新创建svn输出。(它应该真正复制输出,但有时事情会不同步(。这是你在 AnkhSVN Subversion 输出窗口中看到的输出。

最新更新