バージョン管理システム 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にしたい。オレが動くしかないのか。