xref: /openbsd-src/gnu/usr.bin/cvs/contrib/log.in (revision 43c1707e6f6829177cb1974ee6615ce6c1307689)
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