1*43c1707eStholo#! @PERL@ 2*43c1707eStholo# -*-Perl-*- 3*43c1707eStholo# 4*43c1707eStholo# XXX: FIXME: handle multiple '-f logfile' arguments 5*43c1707eStholo# 6*43c1707eStholo# XXX -- I HATE Perl! This *will* be re-written in shell/awk/sed soon! 7*43c1707eStholo# 8*43c1707eStholo 9*43c1707eStholo# Usage: log.pl [-u user] [[-m mailto] ...] [-s] [-V] -f logfile 'dirname file ...' 10*43c1707eStholo# 11*43c1707eStholo# -u user - $USER passed from loginfo 12*43c1707eStholo# -m mailto - for each user to receive cvs log reports 13*43c1707eStholo# (multiple -m's permitted) 14*43c1707eStholo# -s - to prevent "cvs status -v" messages 15*43c1707eStholo# -V - without '-s', don't pass '-v' to cvs status 16*43c1707eStholo# -f logfile - for the logfile to append to (mandatory, 17*43c1707eStholo# but only one logfile can be specified). 18*43c1707eStholo 19*43c1707eStholo# here is what the output looks like: 20*43c1707eStholo# 21*43c1707eStholo# From: woods@kuma.domain.top 22*43c1707eStholo# Subject: CVS update: testmodule 23*43c1707eStholo# 24*43c1707eStholo# Date: Wednesday November 23, 1994 @ 14:15 25*43c1707eStholo# Author: woods 26*43c1707eStholo# 27*43c1707eStholo# Update of /local/src-CVS/testmodule 28*43c1707eStholo# In directory kuma:/home/kuma/woods/work.d/testmodule 29*43c1707eStholo# 30*43c1707eStholo# Modified Files: 31*43c1707eStholo# test3 32*43c1707eStholo# Added Files: 33*43c1707eStholo# test6 34*43c1707eStholo# Removed Files: 35*43c1707eStholo# test4 36*43c1707eStholo# Log Message: 37*43c1707eStholo# - wow, what a test 38*43c1707eStholo# 39*43c1707eStholo# (and for each file the "cvs status -v" output is appended unless -s is used) 40*43c1707eStholo# 41*43c1707eStholo# ================================================================== 42*43c1707eStholo# File: test3 Status: Up-to-date 43*43c1707eStholo# 44*43c1707eStholo# Working revision: 1.41 Wed Nov 23 14:15:59 1994 45*43c1707eStholo# Repository revision: 1.41 /local/src-CVS/cvs/testmodule/test3,v 46*43c1707eStholo# Sticky Options: -ko 47*43c1707eStholo# 48*43c1707eStholo# Existing Tags: 49*43c1707eStholo# local-v2 (revision: 1.7) 50*43c1707eStholo# local-v1 (revision: 1.1.1.2) 51*43c1707eStholo# CVS-1_4A2 (revision: 1.1.1.2) 52*43c1707eStholo# local-v0 (revision: 1.2) 53*43c1707eStholo# CVS-1_4A1 (revision: 1.1.1.1) 54*43c1707eStholo# CVS (branch: 1.1.1) 55*43c1707eStholo 56*43c1707eStholouse strict; 57*43c1707eStholouse IO::File; 58*43c1707eStholo 59*43c1707eStholomy $cvsroot = $ENV{'CVSROOT'}; 60*43c1707eStholo 61*43c1707eStholo# turn off setgid 62*43c1707eStholo# 63*43c1707eStholo$) = $(; 64*43c1707eStholo 65*43c1707eStholomy $dostatus = 1; 66*43c1707eStholomy $verbosestatus = 1; 67*43c1707eStholomy $users; 68*43c1707eStholomy $login; 69*43c1707eStholomy $donefiles; 70*43c1707eStholomy $logfile; 71*43c1707eStholomy @files; 72*43c1707eStholo 73*43c1707eStholo# parse command line arguments 74*43c1707eStholo# 75*43c1707eStholowhile (@ARGV) { 76*43c1707eStholo my $arg = shift @ARGV; 77*43c1707eStholo 78*43c1707eStholo if ($arg eq '-m') { 79*43c1707eStholo $users = "$users " . shift @ARGV; 80*43c1707eStholo } elsif ($arg eq '-u') { 81*43c1707eStholo $login = shift @ARGV; 82*43c1707eStholo } elsif ($arg eq '-f') { 83*43c1707eStholo ($logfile) && die "Too many '-f' args"; 84*43c1707eStholo $logfile = shift @ARGV; 85*43c1707eStholo } elsif ($arg eq '-s') { 86*43c1707eStholo $dostatus = 0; 87*43c1707eStholo } elsif ($arg eq '-V') { 88*43c1707eStholo $verbosestatus = 0; 89*43c1707eStholo } else { 90*43c1707eStholo ($donefiles) && die "Too many arguments!\n"; 91*43c1707eStholo $donefiles = 1; 92*43c1707eStholo @files = split(/ /, $arg); 93*43c1707eStholo } 94*43c1707eStholo} 95*43c1707eStholo 96*43c1707eStholo# the first argument is the module location relative to $CVSROOT 97*43c1707eStholo# 98*43c1707eStholomy $modulepath = shift @files; 99*43c1707eStholo 100*43c1707eStholomy $mailcmd = "| Mail -s 'CVS update: $modulepath'"; 101*43c1707eStholo 102*43c1707eStholo# Initialise some date and time arrays 103*43c1707eStholo# 104*43c1707eStholomy @mos = ('January','February','March','April','May','June','July', 105*43c1707eStholo 'August','September','October','November','December'); 106*43c1707eStholomy @days = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'); 107*43c1707eStholo 108*43c1707eStholomy ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; 109*43c1707eStholo$year += 1900; 110*43c1707eStholo 111*43c1707eStholo# get a login name for the guy doing the commit.... 112*43c1707eStholo# 113*43c1707eStholoif ($login eq '') { 114*43c1707eStholo $login = getlogin || (getpwuid($<))[0] || "nobody"; 115*43c1707eStholo} 116*43c1707eStholo 117*43c1707eStholo# open log file for appending 118*43c1707eStholo# 119*43c1707eStholomy $logfh = new IO::File ">>" . $logfile 120*43c1707eStholo or die "Could not open(" . $logfile . "): $!\n"; 121*43c1707eStholo 122*43c1707eStholo# send mail, if there's anyone to send to! 123*43c1707eStholo# 124*43c1707eStholomy $mailfh; 125*43c1707eStholoif ($users) { 126*43c1707eStholo $mailcmd = "$mailcmd $users"; 127*43c1707eStholo $mailfh = new IO::File $mailcmd 128*43c1707eStholo or die "Could not Exec($mailcmd): $!\n"; 129*43c1707eStholo} 130*43c1707eStholo 131*43c1707eStholo# print out the log Header 132*43c1707eStholo# 133*43c1707eStholo$logfh->print ("\n"); 134*43c1707eStholo$logfh->print ("****************************************\n"); 135*43c1707eStholo$logfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n"); 136*43c1707eStholo$logfh->print ("Author:\t$login\n\n"); 137*43c1707eStholo 138*43c1707eStholoif ($mailfh) { 139*43c1707eStholo $mailfh->print ("\n"); 140*43c1707eStholo $mailfh->print ("Date:\t$days[$wday] $mos[$mon] $mday, $year @ $hour:" . sprintf("%02d", $min) . "\n"); 141*43c1707eStholo $mailfh->print ("Author:\t$login\n\n"); 142*43c1707eStholo} 143*43c1707eStholo 144*43c1707eStholo# print the stuff from logmsg that comes in on stdin to the logfile 145*43c1707eStholo# 146*43c1707eStholomy $infh = new IO::File "< -"; 147*43c1707eStholoforeach ($infh->getlines) { 148*43c1707eStholo $logfh->print; 149*43c1707eStholo if ($mailfh) { 150*43c1707eStholo $mailfh->print ($_); 151*43c1707eStholo } 152*43c1707eStholo} 153*43c1707eStholoundef $infh; 154*43c1707eStholo 155*43c1707eStholo$logfh->print ("\n"); 156*43c1707eStholo 157*43c1707eStholo# after log information, do an 'cvs -Qq status -v' on each file in the arguments. 158*43c1707eStholo# 159*43c1707eStholoif ($dostatus != 0) { 160*43c1707eStholo while (@files) { 161*43c1707eStholo my $file = shift @files; 162*43c1707eStholo if ($file eq "-") { 163*43c1707eStholo $logfh->print ("[input file was '-']\n"); 164*43c1707eStholo if ($mailfh) { 165*43c1707eStholo $mailfh->print ("[input file was '-']\n"); 166*43c1707eStholo } 167*43c1707eStholo last; 168*43c1707eStholo } 169*43c1707eStholo my $rcsfh = new IO::File; 170*43c1707eStholo my $pid = $rcsfh->open ("-|"); 171*43c1707eStholo if ( !defined $pid ) 172*43c1707eStholo { 173*43c1707eStholo die "fork failed: $!"; 174*43c1707eStholo } 175*43c1707eStholo if ($pid == 0) 176*43c1707eStholo { 177*43c1707eStholo my @command = ('cvs', '-nQq', 'status'); 178*43c1707eStholo if ($verbosestatus) 179*43c1707eStholo { 180*43c1707eStholo push @command, '-v'; 181*43c1707eStholo } 182*43c1707eStholo push @command, $file; 183*43c1707eStholo exec @command; 184*43c1707eStholo die "cvs exec failed: $!"; 185*43c1707eStholo } 186*43c1707eStholo my $line; 187*43c1707eStholo while ($line = $rcsfh->getline) { 188*43c1707eStholo $logfh->print ($line); 189*43c1707eStholo if ($mailfh) { 190*43c1707eStholo $mailfh->print ($line); 191*43c1707eStholo } 192*43c1707eStholo } 193*43c1707eStholo undef $rcsfh; 194*43c1707eStholo } 195*43c1707eStholo} 196*43c1707eStholo 197*43c1707eStholo$logfh->close() 198*43c1707eStholo or die "Write to $logfile failed: $!"; 199*43c1707eStholo 200*43c1707eStholoif ($mailfh) 201*43c1707eStholo{ 202*43c1707eStholo $mailfh->close; 203*43c1707eStholo die "Pipe to $mailcmd failed" if $?; 204*43c1707eStholo} 205*43c1707eStholo 206*43c1707eStholo## must exit cleanly 207*43c1707eStholo## 208*43c1707eStholoexit 0; 209