私は現在、アプリケーションにいくつかのSVN機能を実装しています。それらの1つは "svn update"です。SharpSvn通知イベント - 更新時
残念ながら、コマンドラインの "svn update"コマンドと、変更されたファイルに関するNotify
イベントの出力が異なります。例えば。テキストファイルの内容だけが変更された単純なテキストファイルを含む1つのフォルダで作業コピーを更新すると、Action.UpdateUpdate
イベントが3回(ファイル、格納フォルダ、および作業コピー自体)になっています。イベントを「根本的な原因」だけに減らすことは可能ですか?私はこれらの項目のそれぞれが、少なくとも記録されたリビジョン(「svn info」)に関して変化していることを理解していますが、根本原因を単純に表示したいと思います。
私はファイル自体を更新するだけです(作業コピー全体ではありません)。私は2つの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);
}
更新:チェックアウトの深さが指定されている場合 出力はさらに複雑になります。たとえば、リポジトリにはファイルと、別のファイルが入ったディレクトリが含まれています。どちらのファイルも、コンテンツに変更が加えられます。リポジトリをチェックアウトして、ファイル内容が変更されたリビジョンに更新すると、svn info
にもかかわらず、更新されたファイルを含むディレクトリではなく、単一ファイルと作業コピーディレクトリのAction.UpdateUpdate
イベントが表示されます。ディレクトリの名前が変更されました。
'SvnClientReporter'はどのように使用できますか?基本的には、私が使用している 'SvnClient'インスタンスと、出力を取得したいと思ういくつかの種類のライターで提供されているインスタンスを作成します。しかしその後? 'SvnClientReporter'は自動的に通知をライターに追加しますか? – royalTS
私は 'SvnClientRepoter'を試しましたが、期待どおりに動作します!ありがとう! – royalTS
はい、正確です。通知イベントを受け取ったときに通知を書き込みます。 –