2017-07-17 23 views
1

私は現在、アプリケーションにいくつかの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イベントが表示されます。ディレクトリの名前が変更されました。

答えて

2

通知されるのは、SharpSvnレイヤーではなく、Subversionコアライブラリによって決まります。一般的には、svnがこれらの同じ通知を100%出力していることを確認できます。場合によっては、予期した通知をドロップまたは結合して有用な出力にフィルタリングします。

一般に、Subversionは、更新を実行するために必要な場合にルート操作を置き換えることができるように、指定したターゲット(ただし内部のターゲットのみ)より1つ上のレベルからの更新を試みます。これは、Subversionがそのツリー上の編集操作としてツリー内のすべてのものを更新することだけを許可するので必要です。

通知をどのように処理するかは、通常notify.cで確認してください。同じ出力を表示したいだけの場合は、SharpSvn内のヘルパーSvnClientReporterクラスを使用して、svn出力を再作成することができます。 (実際には出力を複製する必要がありますが、時には同期が外れることもあります)。これは、AnkhSVN Subversion出力ウィンドウに表示される出力です。

+0

'SvnClientReporter'はどのように使用できますか?基本的には、私が使用している 'SvnClient'インスタンスと、出力を取得したいと思ういくつかの種類のライターで提供されているインスタンスを作成します。しかしその後? 'SvnClientReporter'は自動的に通知をライターに追加しますか? – royalTS

+0

私は 'SvnClientRepoter'を試しましたが、期待どおりに動作します!ありがとう! – royalTS

+2

はい、正確です。通知イベントを受け取ったときに通知を書き込みます。 –

関連する問題