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:: などと渡すと、違いが実感できる。
最近のコメント