Use the commit message in a CVS pre-commit hook

后端 未结 4 2198
梦毁少年i
梦毁少年i 2021-01-13 04:34

Is it possible to use the commit message in a pre-commit hook in CVS? The CVS server is running remotely, and I access it using pserver.

Ideally, I want

4条回答
  •  我在风中等你
    2021-01-13 05:18

    Here are some useful tutorials to read more:

    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

    You can't do what you want with just one hook but you can use two hooks, commitinfo will let you verify the files themselves and verifymsg will let you verify the message. Both can be used to cancel the commit (the programs just need to exit with status 1). In case you weren't aware, checkoutlist, commitinfo and 'verifymsg' can all be found in the CVSROOT directory of your repository. I would recommend putting any scripts you write as hooks in that directory as well, but it doesn't really matter as you get to specify the full path. Also, perl is not necessary or required, just simple for me to write some (silly) examples in:

    checkoutlist

    # these files will be automatically checked out for you
    acceptable
    

    verifymsg

    # 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
    

    acceptable

    #/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;
    

    Caveat emptor: I wrote most of this off the top of my head with no testing so I can't guarantee it works but it should get you at least close.

    Edit again, I just realized that I was originally wrong and you can pass both the logfile and the committed filenames to verifymsg making the answer quite a bit simpler.

提交回复
热议问题