blob: d18804217cb070ed0739b1c6764449b02f789712 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#!/usr/bin/perl -w
# (C) 2004-12-10 Thomas Radke <tradke@aei.mpg.de>
# Some changes by Erik Schnetter <schnetter@aei.mpg.de>
# GPL licenced
### some constants
# list of email addresses to send notifications to
my $email_list = 'schnetter@aei.mpg.de swhite@aei.mpg.de tradke@aei.mpg.de';
# where to find the real darcs executable
my $darcs = '/home/darcs/bin/darcs1';
# patch database
my %submitters = ();
my %timestamps = ();
my %comments = ();
# sanity check
die "Couldn't find executable '$darcs' !\n\n" if (! -x $darcs);
# short cut for darcs commands other than 'apply --all'
exec ($darcs, @ARGV)
if (! ($#ARGV == 1 && $ARGV[0] eq 'apply' && $ARGV[1] eq '--all'));
# open a pipe for running darcs on the other end
open (DARCS, "| $darcs @ARGV") || die "Couldn't open pipe to darcs !\n";
# skip everything before the 'New patches:' section
while (<STDIN>)
{
print DARCS;
last if (/^New patches:$/);
}
# separator for a patch's header and its contents
my $endmarker = '] {';
# now parse individual patches
while (<STDIN>)
{
print DARCS;
# each patch starts with a line '[<patch name>'
next if (! /^\[(.+)$/);
my $patch = $1;
# on the next line follow the submitter's email address
# and the timestamp of the patch
$_ = <STDIN>;
print DARCS;
next if (! /^(.+)\*\*(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})($endmarker)??$/o);
# add this patch to the database
$submitters{$patch} = $1;
# convert the timestamp into some readable form 'DD-MM-YYYY HH:MM:SS'
$timestamps{$patch} = "$4-$3-$2 $5:$6:$7";
# everything until an end-marker string belongs to
# a long comment for this patch
if (! $8)
{
while (<STDIN>)
{
print DARCS;
last if (/^$endmarker$/);
$comments{$patch} .= $_;
}
}
# skip everything that makes out the patch's contents
# (ie. read away until a single line '}' matches)
while (<STDIN>)
{
print DARCS;
last if (/^}$/);
}
}
close (DARCS) || die "Failed to run darcs command '$darcs @ARGV'\n";
# now send out notification email(s)
foreach $patch (keys %submitters)
{
open (NOTIFY, "| mail -s 'darcs: $patch' $email_list");
print NOTIFY "A new patch named\n\n";
print NOTIFY " $patch\n\n";
print NOTIFY "has been pushed by " .
"${submitters{$patch}} at ${timestamps{$patch}}.";
if ($comments{$patch})
{
print NOTIFY "\n\nThe long comment for this patch reads:\n\n";
print NOTIFY $comments{$patch};
}
close (NOTIFY);
}
|