2007/02/02

NAntContribのvssdiffタスク

使ってみたけど、どーもうまく動いてくれない。
というのも1行だけ出力されたoutputfile(xml)が出力されるだけだ。

ネットでいろいろ調べてみたが情報量が少なくわかんない。

という事でNAntContribのソースを見てみる事にした。
DiffTaskクラスのItemDiffメソッドでDiffってるぽいのでIVSSVersionクラスのActionプロパティにログを仕込んでみた。

なるほど。チェンジアクション(Created,Checkin等)の判定を文字列比較で行っているのだが、おもいっきりEnglishで比較している為、日本語VSS環境では1件もリビジョンが拾えてない。
具体的には以下のアクション文字列を判定しレポートするかしないかを判断している。
・Labeled ⇒ ラベル設定
・Add ⇒ 追加(?)
・Create ⇒ 作成
・Check ⇒ チェックイン

なので上記文字列を対応する日本語に代えてNAntContribをビルド。
NAntから動作させるとうまくレポートしてくれた。
ひょっとして別の方法があるかもーと思いつつ、今回はこれで対応!

<結論>
日本語環境のVSSでNAntContribのvssdiffタスクは正常にレポートしてくれない。
原因はリビジョンアクションの判定を英語で行っている為。
<対応>
1.NAntContribのSolutionを立ち上げるとNAntへの参照パスが不正なので変更。
(これはしなくてもbuildファイルにてちゃんと定義してるようなのでいらないかも)
2.NAntContribのDiffTask#ItemDiff()を修正し付属のbuildファイルを利用しNAntでビルド。(※VisualStudioでビルドするとエラーになる)
3.buildディレクトリにアセンブリが作成されるのでそれをNAntのbinにコピー。
4.再びvssdiffを起動すると正常にレポートされる。


念のため、ソース修正したところを添付。
(DiffTask#ItemDiff()の120行目あたりから数行)
// We found our version so stop adding versions to our list
//if (action.StartsWith ("Labeled '" + _label + "'")) {
  if (action.StartsWith ("ラベル設定 '" + _label + "'")) {    labeledVersion = version.VersionNumber;
    addVersion = false;
    //This is a bit annoying, it would be more efficient to break
    //out of the loop here but VSS throws an exception !%?!
    //http://tinyurl.com/nmct
    //break;
  }
  if (addVersion == true) {
    // Only add versions that have been added,created or checked in. Ignore label actions.
    //if( (action.StartsWith("Add")) || (action.StartsWith("Create")) || (action.StartsWith("Check") ))
    if( (action.StartsWith("追加")) || (action.StartsWith("作成")) || (action.StartsWith("チェック") ))
    {
 ・
 ・
 ・

0 件のコメント: