Develop and Download Open Source Software

Browse CVS Repository

Contents of /pal/CVSROOT/scripts/loginfo2mail.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download) (as text)
Tue Jan 9 16:43:13 2007 UTC (17 years, 3 months ago) by tigercat
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +5 -3 lines
File MIME type: text/x-perl
New feature: The account full name added into sender address.

1 #!/usr/bin/perl -w
2 #
3 # CVS loginfo 2 mail
4 # Copyright (c) 2001-2002 SATOH Fumiyasu. All rights reserved.
5 # Customizer Copyright (c) 2004-2005 MATSUDA Masaaki as TigerCat.
6 #
7 # Date: 2004-11-16, since 2001-10-29
8 # License: GNU General Public License ver.2
9 #
10 # Required external commands:
11 # sendmail
12 # rcsdiff
13 #
14 # $Id: loginfo2mail.pl,v 1.1 2007/01/09 12:56:04 tigercat Exp $
15
16 # FIXME: Read configurations from external file
17 # FIXME: Print `cvs rdiff' command line to generate diff output
18 # [namazu-devel-ja 2164] [namazu-devel-ja 2166]
19 # FIXME: Support to customize sender address
20 # FIXME: Support diff(1) options for rcsdiff(1)
21 # FIXME: Support chroot(2)-ed environment
22
23 # Customization change log by TigerCat
24 # 2004-11-16 Customzed version 0.1.7-custom01 based on original 0.1.7.
25 # 2004-11-16 Implemented mail-from feature.
26 # 2004-11-16 Added mail-header: Return-path.
27 # 2004-11-16 Changed mail-header: Return-path to Errors-To.
28 # 2005-12-26 Fixed %{sVv} receiving issue.
29 # 2005-12-26 New feature: mail_from is set @domain, convert to $CVS_USER@domain.
30 # 2007-01-10 New feature: The account full name added into sender address.
31
32
33 use strict;
34 use English;
35 use FindBin;
36 use Getopt::Std;
37 use IO::File;
38
39 $ENV{'PATH'} = "/usr/bin:/usr/sbin:/usr/lib:$ENV{'PATH'}";
40
41 my $CMD_NAME ="cvs-$FindBin::Script";
42 my $CMD_VERSION = "0.1.7.custom02";
43
44 # Options
45 # ======================================================================
46
47 # CVS root
48 my $cvs_root = $ENV{'CVSROOT'};
49
50 # URL for CVS web interface by cvsweb or ViewCVS
51 my $cvsweb_url = 'http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi';
52 # Type of CVS web interface: 'cvsweb' or 'viewcvs'
53 my $cvsweb_type = 'viewcvs';
54
55 # Maximum line number of rcsdiff(1) output (0< mean `no limit')
56 my $diff_maxline = -1;
57
58 # Content language
59 my $lang = 'NONE';
60
61 # Mail return address : In case commented out, OS user will be used.
62 my $mail_return = '';
63
64 # Mail from address
65 my $mail_from = '';
66
67 my $usage = <<EOF_USAGE;
68 Usage: in \$CVSROOT/CVSROOT/loginfo
69 ^module \$CVSROOT/CVSROOT/$CMD_NAME [options] %{sVv} address ...
70 or, newer CVS server must set following,
71 ^module \$CVSROOT/CVSROOT/$CMD_NAME [options] %p %{sVv} address ...
72
73 Options:
74 -d cvsroot CVS root directory [\$CVSROOT]
75 -w webtype Type of web interface [$cvsweb_type]
76 -W url URL for CVS web interface [$cvsweb_url]
77 -f address Envelope sender address [$mail_from]
78 if set only \@somewhere.domain.net ,it will be converted
79 \$CVS_USER\@somewhere.domain.net
80 -r address Return mail address [$mail_return]
81 -D number Max line number of rcsdiff(1) output [$diff_maxline]
82 -L language Content language [$lang]
83
84 %{sVv} CVS loginfo
85 address Mail CVS loginfo to this address(es)
86
87 Type of web interface:
88 viewcvs ViewCVS - http://viewcvs.sourceforge.net/
89 cvsweb cvsweb - http://stud.fh-heilbronn.de/~zeller/cgi/cvsweb.cgi/
90
91 Content Language:
92 ja Japanese (ISO-2022-JP)
93 EOF_USAGE
94
95 # Command-line options
96 # ----------------------------------------------------------------------
97
98 use vars qw($opt_d $opt_w $opt_W $opt_f $opt_r $opt_D $opt_L);
99 if (!getopts('d:w:W:f:r:D:L:') || @ARGV < 2) {
100 print($usage);
101 exit(1);
102 }
103
104 $cvs_root = $opt_d if (defined($opt_d));
105 $cvsweb_type = $opt_w if (defined($opt_w));
106 $cvsweb_url = $opt_W if (defined($opt_W));
107 $diff_maxline = $opt_D if (defined($opt_D));
108 $lang = $opt_L if (defined($opt_L));
109 $mail_from = $opt_f if (defined($opt_f));
110 $mail_return = $opt_r if (defined($opt_r));
111
112 my $cvs_info = shift(@ARGV);
113 my @cvs_infos = grep !/\@/, @ARGV;
114 for (my $i=0; $i<@cvs_infos; $i++) {
115 if ($cvs_infos[$i] =~ m/,/) {
116 $cvs_info .= " $cvs_infos[$i]";
117 }
118 else {
119 $cvs_info .= " $cvs_infos[$i],$cvs_infos[$i+1],$cvs_infos[$i+2]";
120 $i = $i + 2;
121 }
122 }
123 my @recip = grep /\@/, @ARGV;
124
125 # Check options
126 # ----------------------------------------------------------------------
127
128 if (!defined($cvs_root)) {
129 die "\$CVSROOT not defined.\n";
130 }
131
132 # Language specific?
133 # ======================================================================
134
135 my $ja_convert = undef;
136 if ($lang eq 'ja') {
137 eval('use Jcode');
138 if ($@) {
139 eval('require "$cvs_root/CVSROOT/scripts/jcode.pl"');
140 if ($@) {
141 die "Jcode.pm or jcode.pl required to process Japanese.\n";
142 }
143 $ja_convert = sub {
144 jcode::convert($_[0], 'jis');
145 };
146 } else {
147 $ja_convert = sub {
148 Jcode::convert($_[0], 'jis');
149 };
150 }
151 }
152
153 # Parse %{sVv}
154 # ======================================================================
155
156 $cvs_info =~ s/ - (New directory|Imported sources)//g;
157 my ($cvs_module, @cvs_fileinfo) = split(/ /, $cvs_info);
158
159 my @cvs_file = my %cvs_rev_old = my %cvs_rev_new = ();
160 foreach my $cvs_fileinfo (@cvs_fileinfo) {
161 my ($file, $rev_old, $rev_new) = split(/,/, $cvs_fileinfo);
162 push(@cvs_file, $file);
163 $cvs_rev_old{$file} = $rev_old;
164 $cvs_rev_new{$file} = $rev_new;
165 }
166
167 # Get CVS username
168 # ======================================================================
169
170 my $cvs_user = $ENV{'CVS_USER'};
171 $cvs_user = getpwuid($EUID) if (!defined($cvs_user));
172 my $cvs_user_alias = (getpwnam($cvs_user))[6];
173 $cvs_user = $EUID if (!defined($cvs_user));
174
175 # Make mail header
176 # ======================================================================
177
178 $cvs_module =~ tr/\f\t\r\n//d;
179 my $header = <<EOF_HEADER;
180 Subject: CVS-Update: $cvs_module committed by $cvs_user
181 X-CVS-LogInfo: $CMD_NAME/$CMD_VERSION
182 X-CVS-Root: $cvs_root
183 X-CVS-User: $cvs_user
184 EOF_HEADER
185
186 if (defined($mail_return)) {
187 $header .= "Errors-To: $mail_return\n";
188 }
189 if (defined($mail_from)) {
190 if ($mail_from =~ m/^@/) {
191 $header .= "From: $cvs_user_alias<$cvs_user$mail_from>\n";
192 }
193 else {
194 $header .= "From: $mail_from\n";
195 }
196 }
197 $header .= "To: ";
198 $header .= join(",\n ", @recip) . "\n";
199 $header .= 'Content-Type: text/plain';
200 $header .= '; charset=ISO-2022-JP' if ($opt_L eq 'ja');
201 $header .= "\n";
202 $header .= "MIME-Version: 1.0\n" if ($opt_L ne 'NONE');
203
204 foreach my $cvs_file (@cvs_file) {
205 my $file = "$cvs_module/$cvs_file";
206 my $rev_old = $cvs_rev_old{$cvs_file};
207 my $rev_new = $cvs_rev_new{$cvs_file};
208
209 if ($rev_old eq 'NONE') {
210 $header .= "X-CVS-Added";
211 } elsif ($rev_new eq 'NONE') {
212 $header .= "X-CVS-Removed";
213 } else {
214 $header .= "X-CVS-Modified";
215 }
216 $header .= ": $file $rev_old->$rev_new\n";
217 }
218
219 # Send mail
220 # ======================================================================
221
222 my $fh_sendmail = new IO::File;
223 my $pid_sendmail = $fh_sendmail->open('|-');
224 if (!defined($pid_sendmail)) { # fork failed
225 print "Cannot fork child or open pipe: $!\n";
226 exit(1);
227 } elsif ($pid_sendmail == 0) { # child process
228 if (!exec('sendmail', '-t', '-oi')) {
229 print "Cannot exec sendmail: $!\n";
230 exit(1);
231 }
232 }
233
234 # Print header fields and log from cvs command
235 # ----------------------------------------------------------------------
236
237 $fh_sendmail->print($header);
238 $fh_sendmail->print("\n");
239 while (defined(my $line = STDIN->getline())) {
240 if ($opt_L eq 'ja') {
241 $ja_convert->(\$line);
242 }
243 $fh_sendmail->print($line);
244 }
245 $fh_sendmail->print("\n");
246
247 # Print commitment type and URL for web interface
248 # ----------------------------------------------------------------------
249
250 foreach my $cvs_file (@cvs_file) {
251 my $file = "$cvs_module/$cvs_file";
252 my $rev_old = $cvs_rev_old{$cvs_file};
253 my $rev_new = $cvs_rev_new{$cvs_file};
254
255 $fh_sendmail->print("$file $rev_old -> $rev_new (");
256 if ($rev_old eq 'NONE') {
257 $fh_sendmail->print('added');
258 } elsif ($rev_new eq 'NONE') {
259 $fh_sendmail->print('removed');
260 } else {
261 $fh_sendmail->print('modified');
262 }
263 $fh_sendmail->print(")\n");
264 $fh_sendmail->print("$cvsweb_url/$file");
265
266 if ($rev_old eq 'NONE' || $rev_new eq 'NONE') {
267 $fh_sendmail->print("?rev=");
268 $fh_sendmail->print($rev_old eq 'NONE' ? $rev_new : $rev_old);
269 $fh_sendmail->print('&content-type=text/');
270 if ($cvsweb_type eq 'cvsweb') {
271 $fh_sendmail->print('x-cvsweb-markup');
272 } else {
273 $fh_sendmail->print('vnd.viewcvs-markup');
274 }
275 $fh_sendmail->print("\n");
276 } else {
277 $fh_sendmail->print(".diff?r1=$rev_old&r2=$rev_new\n");
278 }
279 }
280
281 # Print diff by rcsdiff
282 # ----------------------------------------------------------------------
283
284 if ($diff_maxline == 0) {
285 exit(0);
286 }
287
288 chdir($cvs_root) || die "Cannot change working directory: $!\n";
289 my $diff_line = 0;
290 foreach my $cvs_file (@cvs_file) {
291 if ($diff_line == $diff_maxline) {
292 $fh_sendmail->print("\n\n---------- Diff output was snipped here.\n");
293 last;
294 }
295
296 my $file = "$cvs_module/$cvs_file,v";
297 my $rev_old = $cvs_rev_old{$cvs_file};
298 my $rev_new = $cvs_rev_new{$cvs_file};
299 next if ($rev_new eq 'NONE' || $rev_old eq 'NONE');
300
301 $fh_sendmail->print("\n");
302
303 my $fh_rcsdiff = new IO::File;
304 my $pid_rcsdiff = $fh_rcsdiff->open('-|');
305 if (!defined($pid_rcsdiff)) { # fork failed
306 print "Cannot fork child or open pipe: $!\n";
307 exit(1);
308 } elsif ($pid_rcsdiff == 0) { # child process
309 open(STDERR, '>&STDOUT') || warn "Cannot duplicate stdout: $!\n";
310 if (!exec('rcsdiff', '-u', '-kk', "-r$rev_old", "-r$rev_new", $file)) {
311 print "Cannot exec rcsdiff: $!\n";
312 exit(1);
313 }
314 }
315
316 while (defined(my $line = $fh_rcsdiff->getline())) {
317 if ($opt_L eq 'ja') {
318 $ja_convert->(\$line);
319 }
320 $fh_sendmail->print($line);
321
322 if ($diff_maxline > 0 && ++$diff_line == $diff_maxline) {
323 last;
324 }
325 }
326 # FIXME: Need close and wait for child?
327 }
328
329 # FIXME: Check sendmail exit code.
330
331 # Done
332 # ======================================================================
333
334 exit(0);
335

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26