我目前正在应用程序中实现一些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}}表示目录的修订已更改。
答案 0 :(得分:2)
通知的内容由Subversion核心库决定,而不是顶部的SharpSvn层。通常,您可以确保svn
从100%这些相同的通知创建其输出。在某些情况下,它会删除或组合预期通知,以将其过滤为有用的输出。
一般情况下,Subversion将尝试从高于您指定的目标的一个级别(但只是内部目标)更新,以便在执行更新所需的情况下替换根操作。这是必需的,因为Subversion只允许更新树中的所有内容作为该树上的编辑操作。
我经常偷看notify.c以了解它如何处理通知。如果您只想显示相同的输出,SharpSvn中有一个帮助器SvnClientReporter
类,允许您主要重新创建svn
输出。 (它应该真正复制输出,但有时事情会失去同步)。这是您在AnkhSVN Subversion输出窗口中看到的输出。