Attached patch (to be applied after the first one) has these improvements: - sort blocking data fields so merge works - fix merge check for Blocked-By fields - fix cloning of bugs that are blockers or blocked - deal properly with changing blocking status of sets of merged bugs
-- see shy jo
diff --exclude=CVS -ur old/source/scripts/service.in debbugs/scripts/service.in --- old/source/scripts/service.in 2005-03-16 21:55:19.000000000 -0500 +++ debbugs/scripts/service.in 2005-03-16 21:50:30.000000000 -0500 @@ -509,7 +509,18 @@ $ref=$b; if (&getbug) { push @okayblocks, $b; - &cancelbug; # done checking the bug exists + + # add to the list all bugs that are merged with $b, + # because all of their data must be kept in sync + @thisbugmergelist= split(/ /,$data->{mergedwith}); + &cancelbug; + + foreach $ref (@thisbugmergelist) { + if (&getbug) { + push @okayblocks, $ref; + &cancelbug; + } + } } else { ¬foundbug; @@ -545,11 +556,9 @@ my @oldblocklist = split ' ', $data->{blocks}; $data->{blocks} = '' if ($addsub eq "set"); foreach my $b (@okayblocks) { - $data->{blocks} = join ' ', grep $_ ne $b, - split ' ', $data->{blocks}; - $data->{blocks} = "$b $data->{blocks}" unless $addsub eq "sub"; + $data->{blocks} = manipset($data->{blocks}, $b, + ($addsub ne "sub")); } - $data->{blocks} =~ s/\s*$//; foreach my $b (@oldblocklist) { if (! grep { $_ eq $b } split ' ', $data->{blocks}) { @@ -568,18 +577,15 @@ foreach $ref (keys %addedblocks) { if (&getbug) { foreach my $b (@{$addedblocks{$ref}}) { - $data->{blockedby} = join ' ', grep $_ ne $b, - split ' ', $data->{blockedby}; - $data->{blockedby} = "$b $data->{blockedby}"; + $data->{blockedby} = manipset($data->{blockedby}, $b, 1); } &savebug; } } foreach $ref (keys %removedblocks) { if (&getbug) { - foreach my $b (@{$addedblocks{$ref}}) { - $data->{blockedby} = join ' ', grep $_ ne $b, - split ' ', $data->{blockedby}; + foreach my $b (@{$removedblocks{$ref}}) { + $data->{blockedby} = manipset($data->{blockedby}, $b, 0); } &savebug; } @@ -646,7 +652,7 @@ $data->{severity} = '$gDefaultSeverity' if $data->{severity} eq ''; &checkmatch('severity','m_severity',$data->{severity}); &checkmatch('blocks','m_blocks',$data->{blocks}); - &checkmatch('blocked-by','m_blocked-by',$data->{blockedby}); + &checkmatch('blocked-by','m_blockedby',$data->{blockedby}); &checkmatch('done mark','m_done',length($data->{done}) ? 'done' : 'open'); &checkmatch('owner','m_owner',$data->{owner}); foreach my $t (split /\s+/, $data->{keywords}) { $tags{$t} = 1; } @@ -699,20 +705,37 @@ } else { $action= "$gBug $origref cloned as bugs $firstref-$lastref."; } + + my $blocks = $data->{blocks}; + my $blockedby = $data->{blockedby}; + &getnextbug; my $ohash = get_hashname($origref); - $ref = $firstref; + my $clone = $firstref; for $newclonedid (@newclonedids) { - $clonebugs{$newclonedid} = $ref; + $clonebugs{$newclonedid} = $clone; - my $hash = get_hashname($ref); - copy("db-h/$ohash/$origref.log", "db-h/$hash/$ref.log"); - copy("db-h/$ohash/$origref.status", "db-h/$hash/$ref.status"); - copy("db-h/$ohash/$origref.summary", "db-h/$hash/$ref.summary"); - copy("db-h/$ohash/$origref.report", "db-h/$hash/$ref.report"); - &bughook('new', $ref, $data); + my $hash = get_hashname($clone); + copy("db-h/$ohash/$origref.log", "db-h/$hash/$clone.log"); + copy("db-h/$ohash/$origref.status", "db-h/$hash/$clone.status"); + copy("db-h/$ohash/$origref.summary", "db-h/$hash/$clone.summary"); + copy("db-h/$ohash/$origref.report", "db-h/$hash/$clone.report"); + &bughook('new', $clone, $data); + + # Update blocking info of bugs blocked by or blocking the + # cloned bug. + foreach $ref (split ' ', $blocks) { + &getbug; + $data->{blockedby} = manipset($data->{blockedby}, $clone, 1); + &savebug; + } + foreach $ref (split ' ', $blockedby) { + &getbug; + $data->{blocks} = manipset($data->{blocks}, $clone, 1); + &savebug; + } - $ref++; + $clone++; } } } @@ -891,6 +914,21 @@ } } +sub manipset { + my $list = shift; + my $elt = shift; + my $add = shift; + + my %h = map { $_ => 1 } split ' ', $list; + if ($add) { + $h{$elt}=1; + } + else { + delete $h{$elt}; + } + return join ' ', sort keys %h; +} + # High-level bug manipulation calls # Do announcements themselves #
signature.asc
Description: Digital signature