メモの日々


2004年11月26日(金) [長年日記]

[howto] CVSで変更・追加したファイル一覧を得る

ソース一式を入手→一式をCVSへ登録→独自の改造を加える、とした場合に、独自の改造を加えたファイルの一覧を得たかった。

cvs diff --brief -r1.1.1.1 | grep Index

とすると

cvs diff: Diffing ディレクトリパス

という余計な行が出力されてしまう。標準エラー出力をリダイレクトして(tcshを使っている)

cvs diff --brief -r1.1.1.1 |& grep Index

としてうまくいったと思ったら、これだと変更したファイルの一覧は出力されているが追加したファイルは出力されていなかった。後から追加したファイルにはリビジョン1.1.1.1が振られておらず、標準エラーに

cvs diff: tag 1.1.1.1 is not in file ファイルパス

という出力がなされていた。

cvs diff --brief -r1.1 |& grep Index

とすればいいかと思ったが、これだと変更していないファイルも出力されてしまう。それではと

cvs diff --brief -r1.1.1.1 |& grep 'Index\|is not in file'

としたら一応一覧を得られた。grep中の正規表現のor指定は「\|」とエスケープする必要があるみたい。で、このままだと出力がかっこ悪いので、覚えられないawkの使い方を調べながら

cvs diff --brief -r1.1.1.1 |& awk '/^Index|^cvs diff: tag 1.1.1.1 is not in file/ {print $NF}'

とした(正規表現も直した)。これでOK。awkのときは「|」にエスケープ要らないみたい。

もっと素直にできるやり方あるのかな。

(追記)

F先生からcvs updateでできるのでは、と言われたけど、

cvs -n update -r 1.1

だと変更していないファイルにもUマークが付いてしまい、

cvs -n update -r 1.1.1.1

だと後から追加したファイルに対して

cvs update: ファイルパス is no longer in the repository

のように出力されてしまうのでやっぱりawkなどで頑張る必要がある。

やること

  • プリンタ処分
  • リンク元のスリム化
  • ナンバーアナウンス解約
  • スーツをクリーニングへ
  • tDiaryバージョンアップ
  • FSWikiバージョンアップ
  • AVGバージョンアップ
  • バックアップ
  • JREバージョンアップ
本日のツッコミ(全3件) [ツッコミを入れる]
にしうら (2004年11月28日(日) 01:53)

cvs diffのオプションで、-N(Treat absent files as empty)というのがあるので、<br>sh<br> cvs diff --brief -r1.1.1.1 -d -s -N 2> /dev/null | awk '{if ($1 ~ /Index/) {file = $NF}} {if ($0 ~ /differ/) {print file}}'<br>csh<br> cvs diff --brief -r1.1.1.1 -d -s -N |& awk '{if ($1 ~ /Index/) {file = $NF}} {if ($0 ~ /differ/) {print file}}'<br>でどうでしょうか?<br>これまた素直と言えるかどうか微妙ですが。。

小川 (2004年11月28日(日) 20:27)

なるほど、awkってそうやって使えるのですか。こちらの方がいいですね。<br>ところで、diffのオプションの「-d」の意味がわかりませんでした。マニュアルには「より小さな差分を見つけるアルゴリズムに変更します。」のように書かれているけど、これをつけないと差分を見逃す可能性があるということ?

にしうら (2004年11月28日(日) 22:00)

私もよく知りません。なんとなく付けてみただけです。<br>Change the algorithm to perhaps find a smaller set of changes.<br>訳せませんでした。。perhapsってどういうこと?<br>むっちゃ遅なるときもあるで〜、みたいな事も書いてますし、あんまりお勧めじゃないようなので、特に気にしなくていいんじゃないですか。