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.
中看到的输出
我目前正在应用程序中实现一些 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.