* Rest of subscription patch that wasn't applied; adds support for
sending messages to affected bugs in service.in (the control bug)
and actually receiving the subscription messages (receive.in)
-# $Id: receive.in,v 1.16 2004/01/13 18:55:53 cjwatson Exp $
+# $Id: receive.in,v 1.17 2005/07/24 18:42:41 don Exp $
# usage: mail is piped directly into program
#set umask in order to have group-writable incoming/*
# usage: mail is piped directly into program
#set umask in order to have group-writable incoming/*
'-done', 'D',
'-close', 'D',
'-request', 'R',
'-done', 'D',
'-close', 'D',
'-request', 'R',
+ '-submitter', 'U',
+ # Used for bug subscription
+ #'-list-nothing-will-match-this', 'L',
+ );
%withpkgaddressmap= ('-request', 'R');
%withpkgaddressmap= ('-request', 'R');
#determine command
if (s/^(\d{1,9})\b//) {
$bugnumber= $1;
#determine command
if (s/^(\d{1,9})\b//) {
$bugnumber= $1;
- $map= $withbugaddressmap{$_};
+ if (not exists $withbugaddressmap{$_} and
+/-(?:(?:un)?subscribe|subhelp|ignore|(?:sub(?:yes|approve|reject)
+ |unsubyes|bounce|probe|approve|reject|
+ setlistyes|setlistsilentyes).*)/x
+ ) {
+ $map = 'L';
+ }
+ else {
+ $map= $withbugaddressmap{$_};
+ }
$addrrec= "$bugnumber$_";
} elsif (s/^(\w+)-//) {
$bugnumber= $1;
$addrrec= "$bugnumber$_";
} elsif (s/^(\w+)-//) {
$bugnumber= $1;
-# $Id: service.in,v 1.106 2005/07/24 18:01:52 cjwatson Exp $
+# $Id: service.in,v 1.107 2005/07/24 18:42:41 don Exp $
#
# Usage: service <code>.nn
# Temps: incoming/P<code>.nn
#
# Usage: service <code>.nn
# Temps: incoming/P<code>.nn
# header and decoded body respectively
my (@headerlines, @bodylines);
# header and decoded body respectively
my (@headerlines, @bodylines);
+# Bug numbers to send e-mail to, hash so that we don't send to the
+# same bug twice.
+my (%bug_affected);
if ($entity and $entity->head->tags) {
@headerlines = @{$entity->head->header};
if ($entity and $entity->head->tags) {
@headerlines = @{$entity->head->header};
} elsif (m/^close\s+\#?(-?\d+)(?:\s+(\d.*))?$/i) {
$ok++;
$ref= $1;
} elsif (m/^close\s+\#?(-?\d+)(?:\s+(\d.*))?$/i) {
$ok++;
$ref= $1;
$version= $2;
if (&setbug) {
&transcript("'close' is deprecated; see http://$gWebDomain/Developer$gHTMLSuffix#closing.\n");
$version= $2;
if (&setbug) {
&transcript("'close' is deprecated; see http://$gWebDomain/Developer$gHTMLSuffix#closing.\n");
} elsif (m/^reassign\s+\#?(-?\d+)\s+(\S+)(?:\s+(\d.*))?$/i) {
$ok++;
$ref= $1; $newpackage= $2;
} elsif (m/^reassign\s+\#?(-?\d+)\s+(\S+)(?:\s+(\d.*))?$/i) {
$ok++;
$ref= $1; $newpackage= $2;
$version= $3;
$newpackage =~ y/A-Z/a-z/;
if (&setbug) {
$version= $3;
$newpackage =~ y/A-Z/a-z/;
if (&setbug) {
m/^reopen\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($noriginator=$2, 1) : 0) {
$ok++;
$ref= $1;
m/^reopen\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($noriginator=$2, 1) : 0) {
$ok++;
$ref= $1;
if (&setbug) {
if (@{$data->{fixed_versions}}) {
&transcript("'reopen' is deprecated when a bug has been closed with a version;\nuse 'found' or 'submitter' as appropriate instead.\n");
if (&setbug) {
if (@{$data->{fixed_versions}}) {
&transcript("'reopen' is deprecated when a bug has been closed with a version;\nuse 'found' or 'submitter' as appropriate instead.\n");
m/^submitter\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($newsubmitter=$2, 1) : 0) {
$ok++;
$ref= $1;
m/^submitter\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($newsubmitter=$2, 1) : 0) {
$ok++;
$ref= $1;
if ($ref =~ m/^-\d+$/ && defined $clonebugs{$ref}) {
$ref = $clonebugs{$ref};
}
if ($ref =~ m/^-\d+$/ && defined $clonebugs{$ref}) {
$ref = $clonebugs{$ref};
}
} elsif (m/^forwarded\s+\#?(-?\d+)\s+(\S.*\S)$/i) {
$ok++;
$ref= $1; $whereto= $2;
} elsif (m/^forwarded\s+\#?(-?\d+)\s+(\S.*\S)$/i) {
$ok++;
$ref= $1; $whereto= $2;
if (&setbug) {
if (length($data->{forwarded})) {
$action= "Forwarded-to-address changed from $data->{forwarded} to $whereto.";
if (&setbug) {
if (length($data->{forwarded})) {
$action= "Forwarded-to-address changed from $data->{forwarded} to $whereto.";
} elsif (m/^notforwarded\s+\#?(-?\d+)$/i) {
$ok++;
$ref= $1;
} elsif (m/^notforwarded\s+\#?(-?\d+)$/i) {
$ok++;
$ref= $1;
if (&setbug) {
if (!length($data->{forwarded})) {
&transcript("$gBug is not marked as having been forwarded.\n\n");
if (&setbug) {
if (!length($data->{forwarded})) {
&transcript("$gBug is not marked as having been forwarded.\n\n");
m/^priority\s+\#?(-?\d+)\s+([-0-9a-z]+)$/i) {
$ok++;
$ref= $1;
m/^priority\s+\#?(-?\d+)\s+([-0-9a-z]+)$/i) {
$ok++;
$ref= $1;
$newseverity= $2;
if (!grep($_ eq $newseverity, @gSeverityList, "$gDefaultSeverity")) {
&transcript("Severity level \`$newseverity' is not known.\n".
$newseverity= $2;
if (!grep($_ eq $newseverity, @gSeverityList, "$gDefaultSeverity")) {
&transcript("Severity level \`$newseverity' is not known.\n".
} elsif (m/^tags?\s+\#?(-?\d+)\s+(([=+-])\s*)?(\S.*)?$/i) {
$ok++;
$ref = $1; $addsubcode = $3; $tags = $4;
} elsif (m/^tags?\s+\#?(-?\d+)\s+(([=+-])\s*)?(\S.*)?$/i) {
$ok++;
$ref = $1; $addsubcode = $3; $tags = $4;
$addsub = "add";
if (defined $addsubcode) {
$addsub = "sub" if ($addsubcode eq "-");
$addsub = "add";
if (defined $addsubcode) {
$addsub = "sub" if ($addsubcode eq "-");
} elsif (m/^retitle\s+\#?(-?\d+)\s+(\S.*\S)\s*$/i) {
$ok++;
$ref= $1; $newtitle= $2;
} elsif (m/^retitle\s+\#?(-?\d+)\s+(\S.*\S)\s*$/i) {
$ok++;
$ref= $1; $newtitle= $2;
if ($ref =~ m/^-\d+$/ && defined $clonebugs{$ref}) {
$ref = $clonebugs{$ref};
}
if ($ref =~ m/^-\d+$/ && defined $clonebugs{$ref}) {
$ref = $clonebugs{$ref};
}
} elsif (m/^unmerge\s+\#?(-?\d+)$/i) {
$ok++;
$ref= $1;
} elsif (m/^unmerge\s+\#?(-?\d+)$/i) {
$ok++;
$ref= $1;
+ $bug_affected{$ref} = 1;
if (&setbug) {
if (!length($data->{mergedwith})) {
&transcript("$gBug is not marked as being merged with any others.\n\n");
if (&setbug) {
if (!length($data->{mergedwith})) {
&transcript("$gBug is not marked as being merged with any others.\n\n");
$action= "Disconnected #$ref from all other report(s).";
@newmergelist= split(/ /,$data->{mergedwith});
$discref= $ref;
$action= "Disconnected #$ref from all other report(s).";
@newmergelist= split(/ /,$data->{mergedwith});
$discref= $ref;
+ @bug_affected{@newmergelist} = 1 x @newmergelist;
do {
&addmaintainers($data);
$data->{mergedwith}= ($ref == $discref) ? ''
do {
&addmaintainers($data);
$data->{mergedwith}= ($ref == $discref) ? ''
for $ref (@newmergelist) {
&getbug || die "huh ? $gBug $ref disappeared during merge";
&addmaintainers($data);
for $ref (@newmergelist) {
&getbug || die "huh ? $gBug $ref disappeared during merge";
&addmaintainers($data);
+ @bug_affected{@newmergelist} = 1 x @newmergelist;
$data->{mergedwith}= join(' ',grep($_ ne $ref,@newmergelist));
$data->{keywords}= join(' ', keys %tags);
$data->{found_versions}= [sort keys %found];
$data->{mergedwith}= join(' ',grep($_ ne $ref,@newmergelist));
$data->{keywords}= join(' ', keys %tags);
$data->{found_versions}= [sort keys %found];
$newbugsneeded = scalar(@newclonedids);
$ref = $origref;
$newbugsneeded = scalar(@newclonedids);
$ref = $origref;
+ $bug_affected{$ref} = 1;
if (&setbug) {
if (length($data->{mergedwith})) {
&transcript("$gBug is marked as being merged with others.\n\n");
if (&setbug) {
if (length($data->{mergedwith})) {
&transcript("$gBug is marked as being merged with others.\n\n");
&getnextbug;
my $ohash = get_hashname($origref);
$ref = $firstref;
&getnextbug;
my $ohash = get_hashname($origref);
$ref = $firstref;
+ @bug_affected{@newclonedids} = 1 x @newclonedids;
for $newclonedid (@newclonedids) {
$clonebugs{$newclonedid} = $ref;
for $newclonedid (@newclonedids) {
$clonebugs{$newclonedid} = $ref;
m/^owner\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($newowner = $2, 1) : 0) {
$ok++;
$ref = $1;
m/^owner\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($newowner = $2, 1) : 0) {
$ok++;
$ref = $1;
+ $bug_affected{$ref} = 1;
if (&setbug) {
if (length $data->{owner}) {
$action = "Owner changed from $data->{owner} to $newowner.";
if (&setbug) {
if (length $data->{owner}) {
$action = "Owner changed from $data->{owner} to $newowner.";
} elsif (m/^noowner\s+\#?(-?\d+)$/i) {
$ok++;
$ref = $1;
} elsif (m/^noowner\s+\#?(-?\d+)$/i) {
$ok++;
$ref = $1;
+ $bug_affected{$ref} = 1;
if (&setbug) {
if (length $data->{owner}) {
$action = "Removed annotation that $gBug was owned by " .
if (&setbug) {
if (length $data->{owner}) {
$action = "Removed annotation that $gBug was owned by " .
$maintccs .= "Cc: " . join(",\n ",@maintccs) . "\n";
}
$maintccs .= "Cc: " . join(",\n ",@maintccs) . "\n";
}
+# Add Bcc's to subscribed bugs
+push @bcc, map {"bugs=$_\@$gListDomain"} keys %bug_affected;
+
if (!defined $header{'subject'} || $header{'subject'} eq "") {
$header{'subject'} = "your mail";
}
if (!defined $header{'subject'} || $header{'subject'} eq "") {
$header{'subject'} = "your mail";
}