ClearCase:特定のラベルを1つだけ持つファイルを検索します。
質問
特定のラベルでラベル付けされているが、他のラベルが設定されていないファイルをClearCaseで見つけたい。
たとえば、次のようなラベルのファイルがある場合:
file1 LBL_A, LBL_B
file2 LBL_A
file1ではなくfile2のみを提供するクエリが必要です。
cleartool findでこれを行う方法はありますか?単一のクエリではこれができない場合は、いくつかのステップでこれを行う方法についてのアイデアも喜んでいます(perlスクリプトからcleartoolを呼び出すので、ファイルのリストを簡単に保存できます)一時的に追加のコマンドを実行します)。
事前に感謝します!
Jan
解決
LBL_Aが実行したい(唯一の)ラベルであると仮定
cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l"
与えるべき
file1: (LBL_A, LBL_B)
file2: (LBL_A)
出力として、perlスクリプトで確認したり、 sed -n 's / \(。* \):(LBL_A)/ \ 1 / p'
(コロンなしと仮定)でフィルター処理できます。ファイル名)。
更新:VonCが正しく指摘しているように、スペースが入っているファイルに対して上記のコマンドは失敗します。それを次のように処理するには:
cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....
改行をascii nullに変換し、xargsで区切り文字として使用します。
他のヒント
これをパイプすることなく直接行うことができます:
cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print
hlovdalの回答は、この場合、必要以上の要素を見つけてフィルターする必要があることを示しています(すべての ClearCase機能の検索)。
注:
cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print
要素を直接与えることができます(この場合、興味のないバージョンではありません)。以下で説明するように、 -version
とフォーマットディレクティブを使用してバージョンを見つけることができます。
fmt_ccase 、perlスクリプトを実行するために必要なものを正確に取得するように出力を調整できます。
cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
-
-fmt"%En%l \ n"
は、(バージョン:/ a / b / myFile @@の代わりに、 element のフルパスを表示します/ main / myVersion)=> / a / b / myFile '。 '
\ n`は1行に1つの結果を保証します。 -
-version
および-fmt"%n%l \ n"
はバージョンを表示します -
\" $ CLEARCASE_XPN \"
:見つかったバージョンの拡張パスを二重引用符で囲むと、名前にスペースを含むファイルが引き続き機能します。 -
grep -v"、"
:コンマがある場合は、「複数のラベル」を意味します -
%Cl
:ラベルの all リストを表示しないようにします。とにかく、複数ある場合、あなたは興味がありません!
したがって、正確なバージョンを見つけるには:
cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'
注:
上記はUNIX構文で機能します。 Windowsの構文は次のようになります。
cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"
、1つの(正しい)ラベルのみでファイルのバージョンをリストします。
-
awk '{sub(/ \(。* /、""); print}'
は"myFile @@ / main / myVersion(LBL_A)
" into" myFile @@ / main / myVersion"