#!/usr/bin/perl -w # # $FreeBSD$ use strict; use lib $ENV{CVSROOT}; use CVSROOT::cfg; my $CVSROOT = $ENV{'CVSROOT'} || die "Can't determine \$CVSROOT!"; my $debug = $cfg::DEBUG; my $BASE_FN = "$cfg::TMPDIR/$cfg::FILE_PREFIX"; my $FILES_FILE = "$BASE_FN.files"; print "$$: pgrp: ", getpgrp(), "\n" if ($debug); print "$$: committer: ", $cfg::COMMITTER, "\n" if ($debug); foreach (@ARGV) { print "$$: args: $_\n" if ($debug); } my $logfile = $ARGV[0]; my $log = ""; if (-r $logfile) { open(H, "<$logfile") or die; foreach () { print "$$: log: $_" if ($debug); $log .= $_; } close(H); } if (-r $FILES_FILE and open(FILES, $FILES_FILE)) { my %tag; while () { chomp; my ($tag, $file) = split(/\t/, $_, 2); print "$$: files_file: tag=$tag, file=$file\n" if ($debug); push @{$tag{$tag}}, $file; } close(FILES); if (check_approvers($log, %tag)) { unlink $FILES_FILE; exit 1; } if ($cfg::FEATURE_FREEZE) { if (check_featuresafe($log)) { unlink $FILES_FILE; exit 1; } } } exit 0; # ============================================================ sub read_approvers { my @Approvers; my $approvers = "$CVSROOT/CVSROOT/approvers"; if (-r $approvers) { print "$$: Read $approvers\n" if ($debug); open(APP, "<$approvers") or return; while () { chomp; next if (/^#/); my ($mod, $tag, $rev) = split(/\t+/, $_, 3); if ($rev) { push @Approvers, { mod => $mod, tag => $tag, app => $rev }; } } close(APP); } @Approvers; } sub check_approvers { my ($log, %files) = @_; my %tag; my @Approvers = &read_approvers(); foreach my $t (keys %files) { foreach (@{$files{$t}}) { $tag{$t}->{$_}++; } } foreach my $r (@Approvers) { printf "$$: checking: %s, %s, %s\n", $r->{mod}, $r->{tag}, $r->{app} if ($debug); foreach my $tag (sort keys %tag) { foreach my $file (sort keys %{$tag{$tag}}) { return 1 if (check_one($log, $r, $tag, $file)); } } } 0; } sub check_one { my ($log, $r, $tag, $file) = @_; if ($file !~ m|$r->{mod}|) { printf "$$: file not matched (%s, %s)\n", $file, $r->{mod} if ($debug); return 0; } printf "$$: file matched (%s, %s)\n", $file, $r->{mod} if ($debug); if ($tag !~ m|$r->{tag}|) { printf "$$: tag not matched (%s, %s)\n", $tag, $r->{tag} if ($debug); return 0; } printf "$$: tag matched (%s, %s)\n", $tag, $r->{tag} if ($debug); if ($log =~ m|Approved by:[\t ]*$r->{app}|s) { printf "$$: log matched (%s, %s)\n", $log, $r->{app} if ($debug); return 0; } printf "$$: log not matched (%s, %s)\n", $log, $r->{app} if ($debug); printf "**** You need \"Approved by: %s\" line in your log entry.\n", $r->{app}; return 1; } sub check_featuresafe { my ($log) = @_; if ($log =~ m|Feature safe:[\t ]*[Yy][Ee][Ss]|s) { printf "$$: log matched (%s)\n", $log if ($debug); return 0; } printf "$$: log did not match (%s)\n", $log if ($debug); printf "****\n"; printf "**** Feature freeze is in effect. Recommit with a\n"; printf "****\n"; printf "**** Feature safe: yes\n"; printf "****\n"; printf "**** tag if you are sure this commit does not violate\n"; printf "**** feature freeze guidelines. If in doubt, contact portmgr.\n"; printf "****\n"; return 1; }