awk で cvs log を編集2006年12月02日 14時12分16秒


% cvs log
RCS file: /export/home/uyota/cvs/ffusion/Makefile,v
Working file: Makefile
head: 1.15
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 15;    selected revisions: 15
description:
----------------------------
revision 1.15
date: 2006/09/30 03:08:40;  author: uyota;  state: Exp;  lines: +1 -1
Verified timestamps.
----------------------------
revision 1.14
date: 2006/09/23 07:30:34;  author: uyota;  state: Exp;  lines: +1 -0
Enhanced debug options.
----------------------------
revision 1.13
date: 2006/09/16 22:28:19;  author: uyota;  state: Exp;  lines: +3 -3
Changed stat types.
---------------------------

cvs から log を抜き取る。しかし、RCS の情報がたくさんは入っていて見づらい。今回のものは tag を付けていないが、tag が大量に付いていると、それが全て繰り返される。

はっきり言ってとても見づらい。tag の付け方など、場合によっては、余計な RCS の情報に有益な commit log の方が隠されてしまい何も見えない。

そのような時に awk の出番である。cvs log を十秒も流し見をすると特定のパターンに気が付く。ファイル名だけを抜き取った後、罫線 (---) に区切られたところを抜き出せばいいだけだ。

少し使い勝手がいいようにシェルスクリプトにしたが、ほぼ awk プログラムだ。


#!/bin/sh

cvs log -N $* | awk '
  /Working file/{file = $NF}
  /^----------/{display = 1; print $0; print file; next}
  /^==========/{display = 0}
  { if(display) print }'

なお、このプログラムは元祖awk、nawk、gawk でも動く。nawk 以降だと最後の行は、以下のように display だけでもよい。


#!/bin/sh

cvs log -N $* | awk '
  /Working file/{file = $NF}
  /^----------/{display = 1; print $0; print file; next}
  /^==========/{display = 0}
  display'

これを使うと、以下のように出力が変わる。


----------------------------
Makefile
revision 1.15
date: 2006/09/30 03:08:40;  author: uyota;  state: Exp;  lines: +1 -1
Verified timestamps.
----------------------------
Makefile
revision 1.14
date: 2006/09/23 07:30:34;  author: uyota;  state: Exp;  lines: +1 -0
Enhanced debug options.
----------------------------
Makefile
revision 1.13
date: 2006/09/16 22:28:19;  author: uyota;  state: Exp;  lines: +3 -3
Changed stat types.
----------------------------

実は今回の cvs log を使っている例が、あまりよくないので違いはほとんど実感できないだろう。しかし、最低でも数百のファイルがあり、前回のリリースからの変更内容を知りたいときなどには、とても便利になる。大型のプログラムの前回からの差分となると、ほとんどのファイルは変更すらされていないことになる。そのような時に RCS の情報を各ファイル毎に見ても、何も役に立たないのだ。シェルスクリプトの変数に -r last_release:: などと渡すと、違いが実感できる。