SharpSvn 更新时通知事件

SharpSvn Notify-Event on Update

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

不幸的是,命令行中 "svn update" 命令的输出与关于已更改文件的 Notify 事件的输出不同。例如。如果我只用一个文件夹更新一个工作副本,其中有一个简单的文本文件,其中只有文本文件的内容发生了变化,我会收到三次 Action.UpdateUpdate 事件(文件、包含的文件夹和工作副本本身)。是否可以将事件减少到 "root cause"?我知道这些项目中的每一项都发生了变化,至少在记录的修订方面是这样 ("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);
            }

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

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

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

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

中看到的输出