ノード:The commitinfo And loginfo And rcsinfo Files, 次:The verifymsg And rcsinfo Files, 前:The modules File, 上:The CVSROOT/ Administrative Directory
他の管理ファイルは、大半がコミット処理のさまざまな部分に programmatic な フックをしかけるためのものです(たとえばコミットを許可する前にログ メッセージやファイルの状態を検証するようにもできますし、リポジトリの特定 ディレクトリへのコミットが発生したら開発者グループに知らせるようにもでき ます)。
それらのファイルでは共通の文法を用います。各行はこのような形式です:
REGULAR_EXPRESSION PROGRAM_TO_RUN
この正規表現は、コミットが起こるディレクトリに対してテストされます(リポ ジトリのトップディレクトリからの相対パス名)。マッチすれば指定したプログ ラムが実行されます。コミット処理中の各ファイル名がプログラムに渡されます; プログラムはそれらのファイル名を使って何でも好きなことができます、ファイ ルをオープンして内容を調べたりすることも含めてです。プログラムの終了コー ドがノンゼロの場合、コミットは実行されません。
(Regular expressions とは文字列のクラスを簡潔に記述するシステムで
す。正規表現をよく知らないかたは、概略を手短に示しますので、これでとりあ
えずなんとかなると思います: foo
は文字列 foo
を含むファイ
ル名にマッチします。foo.*bar
は、foo
を含み、任意の数の文
字が続き、そのあとに文字列 bar
が続くファイル名にマッチします。通
常の文字列はそれ自体にマッチしますが、.
と *
は特殊だから
です。.
は任意の文字にマッチし、*
は前の文字が任意の数(0含
む)だけ続いたものにマッチします。^
と $
はそれぞれ、文字列
の最初と最後にマッチします: ですから、^foo.*bar.*baz$
は
foo
で始まり、中ほどのどこかに bar
を含んでおり、そして
baz
で終わる文字列とマッチします。ここではこのくらいにしておきま
しょう、この概略説明は正規表現の文法全てのうち、かなり省略されたサブセッ
トです)
commitinfo ファイルでは全てのコミット時に実行したい汎用的フックを
書きます。commitinfo の行の例をいくつか示します:
^a-subdir* /usr/local/bin/check-asubdir.sh ou /usr/local/bin/validate-project.pl
myproj/a-subdir へコミットすると最初の行にマッチするので、
check-asubdir.sh スクリプトが実行されます。文字列 ou
を含む名前の
プロジェクト(実際のリポジトリディレクトリ名であってモジュール名である必
要はありませ)へコミットすると、 validate-project.pl スクリプトが実行され
ます。ただし、既に a-subdir の行にマッチしたコミットは除きます。
正規表現の個所に DEFAULT
あるいは ALL
という語を使うことが
できます。DEFAULT 行(もし2つ以上ある場合は最初の DEFAULT 行)はどの正規表
現にもマッチしなかった場合に実行され、各 ALL 行はマッチする他の行に加え
て実行されます。
プログラムに渡されるファイル名は RCS ファイルを指すものではありません、 コミットされつつある作業コピーと同じ内容の通常のファイルを指します。CVS はそのファイルをリポジトリ内に一時的に置き、プログラムはリポジトリの中で そのファイルを使うことができます、あまり普通ではありませんね。
loginfo ファイルは commitinfo と同じですが、ファイルの内容ではなく ログメッセージに作用します。loginfo ファイルの左側は正規表現で、DEFAULT や ALL 行も書けます。右側のプログラムは標準入力からログメッセージを受け 取ります。その入力を使って好きなことができます。
右側にあるプログラムは任意の数のコマンドライン引数を取ることもできま
す。引数のうちのひとつは特殊な %
コードを書いてもよく、それは
CVS によって実行時に次のように展開されます:
%s ------> コミットされつつあるファイルの名前 %V ------> コミット前のリビジョン番号 %v ------> コミット後のリビジョン番号
展開された文字列の最初はリポジトリサブディレクトリ(リポジトリのトッ
プディレクトリからの相対パス)で、そのあとに各ファイルの情報が続きま
す。たとえば、コミットされたファイルが foo, bar, baz で、それらがす
べて myproj/a-subdir
の中にあった場合、%s
は次のように
展開されます。
myproj/a-subdir foo bar baz
そして %V
は古いリビジョン番号に展開されます
myproj/a-subdir 1.7 1.134 1.12
and %v
their new revision numbers:
myproj/a-subdir 1.8 1.135 1.13
%
記号に続けて中括弧でくくることによって、%
表現を結合
することができます。コミット時に、各ファイルごとの対応する情報をカン
マで区切ったサブリストに展開されます。例えば、 %{sv}
は次の
ように展開されます:
myproj/a-subdir foo,1.8 bar,1.135 baz,1.13
%{sVv}
だとこのように展開されます:
myproj/a-subdir foo,1.7,1.8 bar,1.134,1.135 baz,1.12,1.13
(カンマとピリオドを見間違えないよう、注意して見て下さい)
loginfo ファイルのサンプルを示します:
^myproj$ /usr/local/newrepos/CVSROOT/log.pl -m myproj-devel@foobar.com %s ou /usr/local/bin/ou-notify.pl %{sv} DEFAULT /usr/local/bin/default-notify.pl %{sVv}
最初の行では、リポジトリの myproj サブディレクトリへのコミットが発生
すると log.pl
を起動するよう設定しています。log.pl
の
引数として、電子メールアドレス(log.pl
はそのアドレスへログメッ
セージを送信すします)、リポジトリ、コミットされたファイルを渡します。
2行目では、リポジトリの文字列 ou
を含むサブディレクトリへのコ
ミットが発生すると ou-notify.pl
(架空のものです)を起動するよ
う設定しています。リポジトリのあとに、ファイル名と新しいリビジョン番
号をリストで渡します。
3行目では、上記2行にマッチしないコミットが発生した時に
default-notify.pl
を起動するよう設定しています。渡せる情報は
渡しています(リポジトリパス、ファイル名、古いリビジョン番号、新しい
リビジョン番号)。