From: Don Armstrong Date: Sun, 17 Jun 2007 13:48:46 +0000 (+0100) Subject: * Allow bughook archive to trigger multiple bugs in one shot X-Git-Tag: release/2.6.0~546^2~9 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f7cdbf935ade36f9f5c1216e8291de0217452abe;p=debbugs.git * Allow bughook archive to trigger multiple bugs in one shot --- diff --git a/Debbugs/Control.pm b/Debbugs/Control.pm index 1d2fe4e1..fe25f6fe 100644 --- a/Debbugs/Control.pm +++ b/Debbugs/Control.pm @@ -245,8 +245,8 @@ sub bug_archive { } unlink(map {"db-h/$dir/$_"} @files_to_remove); print {$transcript} "deleted $bug (from $param{bug})\n"; - bughook_archive($bug); } + bughook_archive(@bugs); if (exists $param{bugs_affected}) { @{$param{bugs_affected}}{@bugs} = (1) x @bugs; } diff --git a/Debbugs/Status.pm b/Debbugs/Status.pm index ae1d7a11..d8a1f05a 100644 --- a/Debbugs/Status.pm +++ b/Debbugs/Status.pm @@ -1111,32 +1111,41 @@ sub isstrongseverity { =cut sub update_realtime { - my ($file, $bug, $new) = @_; + my ($file, %bugs) = @_; # update realtime index.db open(IDXDB, "<$file") or die "Couldn't open $file"; open(IDXNEW, ">$file.new"); + my $min_bug = min(keys %bugs); my $line; my @line; + my %changed_bugs; while($line = ) { - @line = split /\s/, $line; - last if ($line[1] >= $bug); - print IDXNEW $line; - $line = ""; - } - - if ($new eq "NOCHANGE") { - print IDXNEW $line if ($line ne "" and $line[1] == $bug); - } elsif ($new eq "REMOVE") { - 0; - } else { - print IDXNEW $new; - } - if (defined $line and $line ne "" and @line and $line[1] > $bug) { - print IDXNEW $line; - $line = ""; + @line = split /\s/, $line; + last unless (keys %bugs) > 0; + # Two cases; replacing existing line or adding new line + if (exists $bugs{$line[1]}) { + my $new = $bugs{$line[1]}; + delete $bugs{$line[1]}; + $min_bug = min(keys %bugs); + if ($new eq "NOCHANGE") { + print IDXNEW $line; + $changed_bugs{$line[1]} = $line; + } elsif ($new eq "REMOVE") { + $changed_bugs{$line[1]} = $line; + } else { + print IDXNEW $new; + $changed_bugs{$line[1]} = $line; + } + } + elsif ($line[1] > $min_bug) { + print IDXNEW $bugs{$min_bug}; + delete $bugs{$min_bug}; + $min_bug = min(keys %bugs); + $changed_bugs{$line[1]} = ''; + } } print IDXNEW while(); @@ -1146,42 +1155,44 @@ sub update_realtime { rename("$file.new", $file); - return $line; + return %changed_bugs; } sub bughook_archive { - my $ref = shift; + my @refs = @_; &filelock("debbugs.trace.lock"); - &appendfile("debbugs.trace","archive $ref\n"); - my $line = update_realtime( - "$config{spool_dir}/index.db.realtime", - $ref, - "REMOVE"); + &appendfile("debbugs.trace","archive ".join(',',@refs)."\n"); + my %bugs = update_realtime("$config{spool_dir}/index.db.realtime", + map{($_,'REMOVE')} @refs); update_realtime("$config{spool_dir}/index.archive.realtime", - $ref, $line); + %bugs); &unfilelock; } sub bughook { - my ( $type, $ref, $data ) = @_; + my ( $type, %bugs_temp ) = @_; &filelock("debbugs.trace.lock"); - &appendfile("debbugs.trace","$type $ref\n",makestatus($data, 1)); - - my $whendone = "open"; - my $severity = $config{default_severity}; - (my $pkglist = $data->{package}) =~ s/[,\s]+/,/g; - $pkglist =~ s/^,+//; - $pkglist =~ s/,+$//; - $whendone = "forwarded" if defined $data->{forwarded} and length $data->{forwarded}; - $whendone = "done" if defined $data->{done} and length $data->{done}; - $severity = $data->{severity} if length $data->{severity}; - - my $k = sprintf "%s %d %d %s [%s] %s %s\n", - $pkglist, $ref, $data->{date}, $whendone, - $data->{originator}, $severity, $data->{keywords}; - - update_realtime("$config{spool_dir}/index.db.realtime", $ref, $k); + my %bugs; + for my $bug (keys %bugs_temp) { + my $data = $bugs_temp{$bug}; + &appendfile("debbugs.trace","$type $bug\n",makestatus($data, 1)); + + my $whendone = "open"; + my $severity = $config{default_severity}; + (my $pkglist = $data->{package}) =~ s/[,\s]+/,/g; + $pkglist =~ s/^,+//; + $pkglist =~ s/,+$//; + $whendone = "forwarded" if defined $data->{forwarded} and length $data->{forwarded}; + $whendone = "done" if defined $data->{done} and length $data->{done}; + $severity = $data->{severity} if length $data->{severity}; + + my $k = sprintf "%s %d %d %s [%s] %s %s\n", + $pkglist, $bug, $data->{date}, $whendone, + $data->{originator}, $severity, $data->{keywords}; + $bugs{$bug} = $k; + } + update_realtime("$config{spool_dir}/index.db.realtime", %bugs); &unfilelock; }