summaryrefslogtreecommitdiff
path: root/parse-trac
blob: 11ea881d4019f2f5709d7da4bf6ab3f45914ad3d (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/perl -wT

use strict;
use English;
use MIME::Base64;


my $HOME = '/home/commit/';
my $MAX_LINES = 4;
my $ENVELOPE_FROM = 'nobody@commit.noreply.org';
my $HEADER_FROM = 'nobody@commit.noreply.org';
my $BOT_ADDRESS = 'commit@commit.noreply.org';
my $SENDMAIL = '/usr/sbin/sendmail';

$ENV{'PATH'} = '/bin:/usr/bin';
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

die ("Usage: $PROGRAM_NAME <project> <mailfile>\n") unless (scalar @ARGV == 2);
my $project = $ARGV[0];

umask 077;

$project =~ m/^([a-zA-Z-]+(\.[a-zA-Z-]+)*)+$/;
$project = $1;
die ("Project is not a nice name.\n") unless defined $project;

my $is_base64 = 0;

open (MAIL, $ARGV[1]) || die ("Cannot open $ARGV[1]: $!\n");
my @mail = <MAIL>;
close(MAIL);
my $line;

my @headers;
my $lastline = undef;
while (defined($line = shift @mail)) {
	my $chomped = $line;
	chomp $chomped;
	if ($chomped =~ m/^\s+/) {
		$lastline .= ' '.$line;
	} elsif ($chomped =~ m/^$/) {
		push @headers, $lastline if defined $lastline;
		push @headers, $line;
		push @headers, @mail;
		last
	} else {
		push @headers, $lastline if defined $lastline;
		$lastline = $line;
	}
}

my $is_a_reply;
my $tracproject;
my $ticketid;
my $url;

while (defined($line = shift @headers)) {
	if ($line =~ m/^Subject:/i) {
		$is_a_reply = ($line =~ m/^Subject:\s*Re:/i);
	} elsif ($line =~ m/^X-Trac-Project:\s*(.*)/i) {
		$tracproject = $1;
	} elsif ($line =~ m/^X-Trac-Ticket-URL:\s*(.*)/i) {
		$url = $1;
		$url =~ s/^https:/http:/;
	} elsif ($line =~ m/^X-Trac-Ticket-ID:\s*(.*)/i) {
		$ticketid = $1;
	} elsif ($line =~ m/^Content-Transfer-Encoding: base64$/s) {
		$is_base64 = 1;
	} elsif ($line =~ m/^$/) {
		last;
	}
};

my $body = join '', @mail;
$body = decode_base64($body) if ($is_base64);
@mail = split(/\r?\n/, $body);

my $first_line = shift @mail;
chomp $first_line;
shift @mail;

my $reporter;
while (defined($line = shift @mail)) {
	if ($line =~ /Reporter:\s*(.*?)\s*\|/i and not defined $reporter) {
		$reporter = $1;
	};
	last if $line =~ /^-----------------/
}
my @body;
while (defined($line = shift @mail)) {
	last if $line =~ /^--/;
	push @body, $line;
}

die ("$PROGRAM_NAME - $project: No reporter found.\n") unless defined $reporter;
die ("$PROGRAM_NAME - $project: No tracproject found.\n") unless defined $tracproject;
die ("$PROGRAM_NAME - $project: No url found.\n") unless defined $url;
die ("$PROGRAM_NAME - $project: No ticketid found.\n") unless defined $ticketid;
die ("$PROGRAM_NAME - $project: No first_line found.\n") unless defined $first_line;

$body = join "\n", @body;

my $notice = $is_a_reply ?
	"[$tracproject] #$ticketid was updated" :
	"[$tracproject] #$ticketid filed by $reporter";

$notice .= ":  $first_line - $url";

#open(MAIL, "|cat") or
open(MAIL, "|$SENDMAIL -t -oi -f $ENVELOPE_FROM") or
	die ("Cannot exec sendmail: $!\n");
print MAIL "From: $HEADER_FROM\n";
print MAIL "To: $BOT_ADDRESS\n";
print MAIL "Subject: Announce $project\n";
print MAIL "Precedence: junk\n";
print MAIL "\n";
print MAIL "$notice\n";
print MAIL "$body\n";
close(MAIL);