5

CVS の pre-commit フックでコミット メッセージを使用することは可能ですか? CVS サーバーはリモートで実行されており、私は を使用してアクセスしていpserverます。

理想的には、ファイルがフィルターを通過した場合、またはコミット メッセージに特定のテキストが含まれている場合に、コミットを許可したいと考えています。

別のバージョン管理システムを使用する選択肢はありません。

4

4 に答える 4

4

詳細を読むための便利なチュートリアルを次に示します。

http://durak.org/sean/pubs/software/cvsbook/The-commitinfo-And-loginfo-And-rcsinfo-Files.html
http://durak.org/sean/pubs/software/cvsbook/The-verifymsg -And-rcsinfo-Files.html#The-verifymsg-And-rcsinfo-Files

1 つのフックだけではやりたいことはできませんが、2 つのフックを使用する commitinfoことで、ファイル自体verifymsgを検証し、メッセージを検証することができます。どちらもコミットをキャンセルするために使用できます (プログラムはステータス 1 で終了する必要があります)。ご存じないかもしれませんが、checkoutlistcommitinfoおよび 'verifymsg' はすべて、リポジトリの CVSROOT ディレクトリにあります。作成したスクリプトもすべてそのディレクトリにフックとして配置することをお勧めしますが、フル パスを指定できるため、それほど重要ではありません。また、perl は必須でも必須でもなく、次のような (ばかげた) 例を簡単に書くことができます。

チェックアウトリスト

# these files will be automatically checked out for you
acceptable

検証メッセージ

# specifies which file to run as hook, %l is filename of log message
# bar$     /path/to/repo/CVSROOT/verify_ends_in_bar %l
DEFAULT    /path/to/repo/CVSROOT/acceptable %l %s

許容できる

#/usr/bin/perl -w

use strict;
use warnings;

# this would be simpler if cvs passed sane arguments
my ($logfile, $dir, @files) = @ARGV;
my $grep = `grep -i 'accept liability' $logfile`;
exit 0 if $grep;

my $found = 0;
foreach my $file (@files) {
    my $path = join '/', $dir, $file;
    die "Can't find file $path" if ! -e $path;
    my $grep = `grep -i 'evidence of any deliberation' $path`;
    $found++ if $grep;
}
die "You must accept liability or show evidence of deliberation" if $found < @files;

警告: 私はこれのほとんどをテストせずに頭のてっぺんから書いたので、それが機能することを保証することはできませんが、少なくとも近づくはずです.

もう一度編集してください。もともと間違っていたことに気付きました。ログファイルとコミットされたファイル名の両方を渡しverifymsgて、答えをかなり簡単にすることができます。

于 2010-01-16T06:07:15.017 に答える
3

CVS::Trigger Perl モジュールには、異なるトリガーの呼び出し間で値をキャッシュできる実験的な機能があるようです。このページでは、ファイル名を commitinfo から verifymsg に渡すことについて明示的に言及しているため、目的を達成するのに役立つ可能性があります。

于 2010-01-15T21:51:30.580 に答える
1

verifymsgディレクトリ内のファイルを使用できますCVSROOT。チェックインコメントの内容を確認できるスクリプトを呼び出すように構成できます。ゼロ以外を返すことで、コミットを拒否できます。

デフォルトのverifymsgファイルには詳細が含まれています。

于 2009-12-07T02:48:59.783 に答える
0

私は同じ問題を扱ってきました。これまでのところ、私の最善の解決策は、親プロセス ID (getppid()) を取得し、commitinfo からファイルのリストを入れることができる一時ファイルで使用することでした。この親 ID は、verifymsg プロセスと同じようです (少なくとも AIX 上では)。幸運を。

于 2010-02-22T19:09:13.533 に答える