SharpSvn Notify-Event on Update

时间:2017-07-17 10:15:44

标签: c# svn sharpsvn

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

不幸的是," svn更新"命令行中的命令以及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);
            }

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

1 个答案:

答案 0 :(得分:2)

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

一般情况下,Subversion将尝试从高于您指定的目标的一个级别(但只是内部目标)更新,以便在执行更新所需的情况下替换根操作。这是必需的,因为Subversion只允许更新树中的所有内容作为该树上的编辑操作。

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

相关问题