From 265348aa3bfe0666606a71f669983f1975b2288b Mon Sep 17 00:00:00 2001 From: cjwatson <> Date: Fri, 29 Aug 2003 23:15:15 -0800 Subject: [PATCH] [project @ 2003-08-30 00:15:15 by cjwatson] Implement bug ownership. New 'owner' field in .summary files. New 'owner' and 'noowner' control commands. --- cgi/bugreport.cgi | 3 ++ cgi/common.pl | 2 + debian/changelog | 2 + html/server-control.html.in | 15 +++++++ scripts/db2html.in | 4 +- scripts/errorlib.in | 3 +- scripts/process.in | 9 +++- scripts/service.in | 88 ++++++++++++++++++++++++++++--------- 8 files changed, 102 insertions(+), 24 deletions(-) diff --git a/cgi/bugreport.cgi b/cgi/bugreport.cgi index 5fe8db5..c5339f1 100755 --- a/cgi/bugreport.cgi +++ b/cgi/bugreport.cgi @@ -177,6 +177,9 @@ $indexentry .= htmlpackagelinks($status{package}, 0); $indexentry .= "Reported by: " . htmlsanit($status{originator}) . ";\n"; +$indexentry .= "Owned by: " . htmlsanit($status{owner}) . ";\n" + if length $status{owner}; + my $dummy = strftime "%a, %e %b %Y %T UTC", localtime($status{date}); $indexentry .= "Date: ".$dummy.";\n
"; diff --git a/cgi/common.pl b/cgi/common.pl index be4421a..f639daa 100644 --- a/cgi/common.pl +++ b/cgi/common.pl @@ -220,6 +220,8 @@ sub htmlindexentrystatus { $result .= $showseverity; $result .= "Reported by: " . htmlsanit($status{originator}) . ""; + $result .= ";\nOwned by: " . htmlsanit($status{owner}) + if length $status{owner}; $result .= ";\nTags: " . htmlsanit(join(", ", sort(split(/\s+/, $status{tags})))) . "" diff --git a/debian/changelog b/debian/changelog index 5d8a4f6..208a154 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,8 @@ debbugs (2.4.2) UNRELEASED; urgency=low - Implement new .status format that's extensible and easier to read; it now lives in .summary rather than .status. Use debbugs-upgradestatus to convert existing bug databases. + - Implement bug ownership, with new 'owner' and 'noowner' commands + (closes: #133453). -- Colin Watson Fri, 20 Jun 2003 18:57:25 +0100 diff --git a/html/server-control.html.in b/html/server-control.html.in index 92a4cc8..5d768eb 100644 --- a/html/server-control.html.in +++ b/html/server-control.html.in @@ -232,6 +232,21 @@ mailservers is available via the WWW, in severity 234567 wishlist +
owner bugnumber address | ! + +
Sets address to be the "owner" of #bugnumber. + The owner of a $gBug claims responsibility for fixing it and will receive + all mail regarding it. This is useful to share out work in cases where a + package has a team of maintainers. + +

If you wish to become the owner of the $gBug yourself, you can use the + ! shorthand or specify your own email address.

+ +
noowner bugnumber + +
Forgets any idea that the $gBug has an owner other than the usual + maintainer. If the $gBug had no owner recorded then this will do nothing. +
quit
stop
thank... diff --git a/scripts/db2html.in b/scripts/db2html.in index dab1399..c0f20d8 100755 --- a/scripts/db2html.in +++ b/scripts/db2html.in @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: db2html.in,v 1.20 2003/08/23 13:17:32 cjwatson Exp $ +# $Id: db2html.in,v 1.21 2003/08/30 00:15:15 cjwatson Exp $ # usage: db2html [-diff] [-stampfile=] [-lastrun=] #load the necessary libraries/configuration @@ -158,6 +158,8 @@ for $f (@files) if length($data->{package}); $indexentry .= $showseverity; $indexentry .= "Reported by: ".&sani($data->{originator}); + $indexentry .= ";\nOwned by: ".&sani($data->{owner}) + if length($data->{owner}); $indexentry .= ";\nKeywords: ".&sani($data->{keywords}) if length($data->{keywords}); $linkto= $ref; $linkto =~ s,^..,$&/$&,; diff --git a/scripts/errorlib.in b/scripts/errorlib.in index 5e7b1a2..b8a9bd1 100755 --- a/scripts/errorlib.in +++ b/scripts/errorlib.in @@ -1,5 +1,5 @@ # -*- perl -*- -# $Id: errorlib.in,v 1.39 2003/08/23 15:33:42 cjwatson Exp $ +# $Id: errorlib.in,v 1.40 2003/08/30 00:15:15 cjwatson Exp $ use Mail::Address; @@ -83,6 +83,7 @@ my %fields = (originator => 'submitter', forwarded => 'forwarded-to', mergedwith => 'merged-with', severity => 'severity', + owner => 'owner', ); sub readbug { diff --git a/scripts/process.in b/scripts/process.in index 0eb6be1..9518b0c 100755 --- a/scripts/process.in +++ b/scripts/process.in @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: process.in,v 1.81 2003/08/23 13:50:45 cjwatson Exp $ +# $Id: process.in,v 1.82 2003/08/30 00:15:15 cjwatson Exp $ # # Usage: process nn # Temps: incoming/Pnn @@ -1108,4 +1108,11 @@ sub checkmaintainers { last; } } + + if (length $data->{owner}) { + print DEBUG "owner add >$data->{package}|$data->{owner}<\n"; + $addmaint = $data->{owner}; + push(@maintaddrs, $addmaint) unless + $addmaint eq $replyto or grep($_ eq $addmaint, @maintaddrs); + } } diff --git a/scripts/service.in b/scripts/service.in index e070828..a0cc06e 100755 --- a/scripts/service.in +++ b/scripts/service.in @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $Id: service.in,v 1.89 2003/08/23 15:12:57 cjwatson Exp $ +# $Id: service.in,v 1.90 2003/08/30 00:15:15 cjwatson Exp $ # # Usage: service .nn # Temps: incoming/P.nn @@ -137,6 +137,10 @@ my %limit_pkgs = (); my %clonebugs = (); my @bcc = (); +sub addbcc { + push @bcc, $_[0] unless grep { $_ eq $_[0] } @bcc; +} + for ($procline=0; $procline<=$#bodylines; $procline++) { $state eq 'idle' || print "$state ?\n"; $lowstate eq 'idle' || print "$lowstate ?\n"; @@ -248,7 +252,7 @@ END } else { $action= "$gBug closed, send any further explanations to $data->{originator}"; do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); if ( length( $gDoneList ) > 0 && length( $gListDomain ) > 0 ) { &addccaddress("$gDoneList\@$gListDomain"); } $data->{done}= $replyto; @@ -299,9 +303,9 @@ END $action= "$gBug assigned to package \`$newpackage'."; } do { - &addmaintainers($data->{package}, $data->{severity}); - &addmaintainers($newpackage); + &addmaintainers(%data); $data->{package}= $newpackage; + &addmaintainers(%data); } while (&getnextbug); } } elsif (m/^reopen\s+\#?(-?\d+)$/i ? ($noriginator='', 1) : @@ -319,7 +323,7 @@ END $noriginator eq '' ? "$gBug reopened, originator not changed." : "$gBug reopened, originator set to $noriginator."; do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{originator}= $noriginator eq '' ? $data->{originator} : $noriginator; $data->{done}= ''; } while (&getnextbug); @@ -334,7 +338,7 @@ END } if (&getbug) { &foundbug; - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $oldsubmitter= $data->{originator}; $data->{originator}= $newsubmitter; $action= "Changed $gBug submitter from $oldsubmitter to $newsubmitter."; @@ -386,7 +390,7 @@ END $extramessage= "(By the way, this $gBug is currently marked as done.)\n"; } do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); if (length($gForwardList)>0 && length($gListDomain)>0 ) { &addccaddress("$gForwardList\@$gListDomain"); } @@ -403,7 +407,7 @@ END } else { $action= "Removed annotation that $gBug had been forwarded to $data->{forwarded}."; do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{forwarded}= ''; } while (&getnextbug); } @@ -424,10 +428,9 @@ END $printseverity= "$gDefaultSeverity" if $printseverity eq ''; $action= "Severity set to \`$newseverity'."; do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); if (defined $gStrongList and isstrongseverity($newseverity)) { - my $addbcc = "$gStrongList\@$gListDomain"; - push @bcc, $addbcc unless grep { $_ eq $addbcc } @bccs; + addbcc("$gStrongList\@$gListDomain"); } $data->{severity}= $newseverity; } while (&getnextbug); @@ -468,7 +471,7 @@ END $action= "Tags removed: " . join(", ", @okaytags); } do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{keywords} = '' if ($addsub eq "set"); if ($addsub eq "sub") { foreach my $t (@badtags) { @@ -492,7 +495,7 @@ END } if (&getbug) { &foundbug; - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{subject}= $newtitle; $action= "Changed $gBug title."; &savebug; @@ -517,7 +520,7 @@ END @newmergelist= split(/ /,$data->{mergedwith}); $discref= $ref; do { - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{mergedwith}= ($ref == $discref) ? '' : join(' ',grep($_ ne $ref,@newmergelist)); } while (&getnextbug); @@ -560,7 +563,7 @@ END $action= "Merged @newmergelist."; for $ref (@newmergelist) { &getbug || die "huh ? $gBug $ref disappeared during merge"; - &addmaintainers($data->{package}, $data->{severity}); + &addmaintainers(%data); $data->{mergedwith}= join(' ',grep($_ ne $ref,@newmergelist)); $data->{keywords}= join(' ', keys %tags); &savebug; @@ -623,6 +626,41 @@ END %limit_pkgs = (); &transcript("Not ignoring any bugs.\n\n"); } + } elsif (m/^owner\s+\#?(-?\d+)\s+!$/i ? ($newowner = $replyto, 1) : + m/^owner\s+\#?(-?\d+)\s+(\S.*\S)$/i ? ($newowner = $2, 1) : 0) { + $ok++; + $ref = $1; + if (&setbug) { + if (length $data->{owner}) { + $action = "Owner changed from $data->{owner} to $newowner."; + } else { + $action = "Owner recorded as $newowner."; + } + if (length $data->{done}) { + $extramessage = "(By the way, this $gBug is currently " . + "marked as done.)\n"; + } + do { + &addmaintainers(%data); + $data->{owner} = $newowner; + } while (&getnextbug); + } + } elsif (m/^noowner\s+\#?(-?\d+)$/i) { + $ok++; + $ref = $1; + if (&setbug) { + if (length $data->{owner}) { + $action = "Removed annotation that $gBug was owned by " . + "$data->{owner}."; + do { + &addmaintainers(%data); + $data->{owner} = ''; + } while (&getnextbug); + } else { + &transcript("$gBug is not marked as having an owner.\n\n"); + &nochangebug; + } + } } else { &transcript("Unknown command or malformed arguments to command.\n\n"); if (++$unknowns >= 5) { @@ -1014,22 +1052,23 @@ sub addccaddress { sub addmaintainers { # Data structure is: # maintainer email address &c -> assoc of packages -> assoc of bug#'s + my %data = @_; my ($p, $addmaint, $pshow); &ensuremaintainersloaded; $anymaintfound=0; $anymaintnotfound=0; - for $p (split(m/[ \t?,()]+/,$_[0])) { + for $p (split(m/[ \t?,()]+/, $data{package})) { $p =~ y/A-Z/a-z/; $pshow= ($p =~ m/[-+.a-z0-9]+/ ? $& : ''); if (defined $gSubscriptionDomain) { if (defined($pkgsrc{$p})) { - push @bcc, "$pkgsrc{$p}\@$gSubscriptionDomain"; + addbcc("$pkgsrc{$p}\@$gSubscriptionDomain"); } else { - push @bcc, "$p\@$gSubscriptionDomain"; + addbcc("$p\@$gSubscriptionDomain"); } } - if (defined $_[1] and defined $gStrongList and - isstrongseverity($_[1])) { - push @bcc, "$gStrongList\@$gListDomain"; + if (defined $data{severity} and defined $gStrongList and + isstrongseverity($data{severity})) { + addbcc("$gStrongList\@$gListDomain"); } if (defined($maintainerof{$p})) { $addmaint= $maintainerof{$p}; @@ -1043,6 +1082,13 @@ sub addmaintainers { $maintccreasons{$gUnknownMaintainerEmail}{$p}{$ref}= 1; } } + + if (length $data{owner}) { + $addmaint = $data{owner}; + &transcript("MO|$addmaint|$data{package}|$ref|\n") if $dl>2; + $maintccreasons{$addmaint}{$data{package}}{$ref} = 1; + print "owner add >$data{package}|$addmaint<\n" if $debug; + } } sub ensuremaintainersloaded { -- 2.39.2