揮発性のメモ2

http://d.hatena.ne.jp/iww/

CVSで指定したタグに含まれるファイルとバージョン一覧を表示

バージョン管理システム CVS を使う
http://vox.nishimotz.com/cvs/taglist.txt
これを改造して出力をちょっとコンパクトにする。

#!/bin/sh
# tag の名前を引数で指定すると、そのファイル名で
# 構成するファイルのバージョン一覧を出力する・改
if [ $# -ne 1 ]; then
    echo usage: $0 [tag]
    exit
fi

cvs update -p -r $1 2>&1 >/dev/null |\
sed -ne "/^Checking out/{
N
N
s/Checking out \(.*\)\n.*\nVERS: \(.*\)/\\1:\\2/p
}"

tagを引数にして実行すると、そのタグのファイル一覧とバージョンを出力する

$ cvstaglist HEAD
Makefile:1.2
hoge.c:1.2
hoge.h:1.3
main.c:1.5
$


たったこれだけのスクリプトに1時間とかかかったのでメモ。

cvs update: Updating .
===================================================================
Checking out Makefile
RCS:  /var/lib/cvs/unko/Makefile,v
VERS: 1.2
***************
===================================================================
Checking out hoge.c
RCS:  /var/lib/cvs/unko/hoge.c,v
VERS: 1.2
***************

cvs update -pすると標準エラー出力にこんな感じ出力が出るので、これをなんとか加工する。

if [ $# -ne 1 ]; then

引数の数。

cvs update -p -r $1 2>&1 >/dev/null |\

cvsのupdateコマンド。-pは標準出力に出力する。(=ファイルは更新されない)

cvs update -p -r $1 2>&1 >/dev/null |\

標準出力を捨てて標準エラー出力を標準出力に出力する。リダイレクトは評価順序が後ろからなので
順序を逆にすると、標準エラー出力を標準出力に出力して標準出力を捨てる(=何もでない)になる。

sed -ne "/^Checking out/{

sedはマッチしないときも出力してしまうので、-nで何も出力しないようにする。
(マッチした分はあとで出力するように指示する)

sed -ne "/^Checking out/{

複数行のsedのコマンドを書くよー

sed -ne "/^Checking out/{
N
N

パターンスペースに次の行も追加するコマンド。2行追加してるのでこれで合計3行分が対象になる。
パターンスペースの中では hoge\npiyo\nfuga となり、お尻に改行コードはない(重要)

N
N
s/Checking out \(.*\)\n.*\nVERS: \(.*\)/\\1:\\2/p

Checking out の後ろの文字列がファイル名、VERS: の後ろの文字列がバージョンなので取っとく。

s/Checking out \(.*\)\n.*\nVERS: \(.*\)/\\1:\\2/p

取っといた後方参照で置換。ファイル名:バージョン

s/Checking out \(.*\)\n.*\nVERS: \(.*\)/\\1:\\2/p
}"

置換したパターンスペースを出力。最後の改行はここで付く。

}"

おわり


今更cvsの使い勝手を良くしても意味無いな・・・
gitにしたい。オレが動くしかないのか。