CVSのコミット制御

CVSはファイル毎のアクセス管理がダメ過ぎ。
社内のエンジニアは新しいツールへの適応力が低すぎて簡単にSubversionやGitに乗り換えられないし。
今後の社内でのツール等の統合の動きもあって今は身動きが取りにくい

特定タグに対してだけアクセス権を撤廃しようかと思って調べてたんだけどようやくなんとかなりそうだ。
CVSは特定の操作後に呼ばれる処理を定義する仕組みを使ったらできそうだ。

この程度の情報が転がっていないあたりCVSはまともに使われてないんだな。
ソースコード管理自体をしてない方が多数派なのかもしれないけど。

と思ったらシステムのCVSバージョンが1.11.17(Solaris10 Companion CDより)であったため
UseNewInfoFmtStrings=yesが定義できない。→1.12にバージョンを上げた
今度はcommitinfoで%t(タグ名)が取れない。→バージョンを取ってスクリプト内でブランチタグとのマッチをとったらどうか?
と思ったら%Vも取れない。

...詰んだ

人力検索はてなで登録してみました。
CVSでブランチ毎のアクセス管理をしたいと考えています。
もう少しポイント積んだ方がよかったかな。。

(2009/06/10追記)
ビバ人力検索!!知ってる人は知ってるものですね。
じつはcommitinfoで呼ばれるスクリプト中にsleepで長時間待ちを仕込んで
その間にサーバー側に転送されたファイルがどこに入るかを調べたら
/tmp/cvs-serv`cvsサーバーのPID`てところに入ってるのが分かって
commitinfoからcallされるスクリプトを書いて動作確認したところだったので、
技術的な追認をもらって一安心。
(2009/06/10追記ここまで)

特定操作時に起動する処理の定義

CVSROOT/taginfo … タグ操作の前に参照される。失敗するとタグつけない。
CVSROOT/commitinfo … コミット処理の前に参照される。失敗するとコミットしない。
CVSROOT/loginfo … 変更後に参照される。

書式

ディレクトリのパターン(正規表現) 実行スクリプト 引数 ...

パターンにマッチする行があれば実行するようです。
パターンにDEFAULTまたはALLと記述した場合は特殊になっているようです。

  • DEFAULT … 全パターンマッチしない場合実行
  • ALL … 全パターンマッチを行った後、追加で実行

例:

ALL echo $USER >> /tmp/hoge
^CVSROOT echo ”CVSROOT" /tmp/hoge
^prog1 echo %s >> /tmp/hoge

使用できる変数

taginfo/loginfo/commitinfoで使える予約語には以下のようなものがあるようです。
それぞれの中で使えるフォーマット文字は少しづつ違うようです。

フォーマット文字

先頭に%付けて呼出%s %{sv}のように記述する
使用するためにはCVSROOT/configの中に下記を設定

UseNewInfoFmtStrings=yes

多分こんな意味。

  • b … タグタイプ(ブランチタグ…T,非ブランチタグ… N,判定不能…?)
  • o … tagコマンドのオプション情報を返す。taginfo用("tag"…add, "tag -F"… mov, "tag -d" … del)
  • t … タグ名
  • s … ファイルリスト
  • V … 旧バージョン
  • v … 新バージョン
  • c … 実行されたコマンドupdateの場合は'update'、commitの場合は'commit'が入る
  • n … 単なるヌル文字
  • p … ディレクトリのレポジトリ
  • r … レポジトリ
  • R … リファラ
予約変数の一覧

下記は特に定義しなくても動作するもの

$CVSROOT … CVSROOTのディレクト
$CVSEDITOR/$EDITOR/$VISUAL … 環境変数のEDITOR
$USER/$CVS_USER$LOGNAME … ユーザー名

結局どうしたか

commitinfoを以下のようにした

DEFAULT スクリプト $USER %t

スクリプト内でユーザとタグの組み合わせを判断してダメな場合は0以外で抜けるようにした。

参考資料

CVS--Concurrent Versions System v1.12.12: C. Reference manual for Administrative files
CVSの基礎練習
一昔前にWinCVSを探したら軒並みリンクが死んでたけど、今探したらあるのは何故だろう。