From: Don Armstrong Date: Thu, 6 Apr 2006 22:12:39 +0000 (-0700) Subject: * Add forcemerge support; bugs which are in the same package can be X-Git-Tag: release/2.6.0~615^2~4 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=7491c13db123956338883b59b4518b725cad76c9;p=debbugs.git * Add forcemerge support; bugs which are in the same package can be forcibly merged, where the subsequent bugs listed take on the same values as the first bug listed. --- diff --git a/scripts/service.in b/scripts/service.in index 6dee299a..28482218 100755 --- a/scripts/service.in +++ b/scripts/service.in @@ -914,6 +914,66 @@ END &transcript("$action\n\n"); } &endmerge; + } elsif (m/^forcemerge\s+\#?(-?\d+(\s+\#?-?\d+)+)\s*$/i) { + $ok++; + my @tomerge = split /\s+\#?/,$1; + my $master_bug = shift @tomerge; + my $master_bug_data; + @tomerge = ($master_bug, sort { $a <=> $b } @tomerge); + @newmergelist= (); + my %tags = (); + my %found = (); + my %fixed = (); + # Here we try to do the right thing. + # First, if the bugs are in the same package, we merge all of the found, fixed, and tags. + # If not, we discard the found and fixed. + # Everything else we set to the values of the first bug. + &getmerge; + while (defined($ref= shift(@tomerge))) { + &transcript("D| checking merge $ref\n") if $dl; + $ref+= 0; + if ($ref =~ m/^-\d+$/ && defined $clonebugs{$ref}) { + $ref = $clonebugs{$ref}; + } + next if grep($_ eq $ref,@newmergelist); + if (!&getbug) { ¬foundbug; @newmergelist=(); last } + if (!&checkpkglimit) { &cancelbug; @newmergelist=(); last; } + &foundbug; + &transcript("D| adding $ref ($data->{mergedwith})\n") if $dl; + $master_bug_data = $data if not defined $master_bug_data; + if ($data->{package} ne $master_bug_data->{package}) { + &transcript("Mismatch - only $gBugs in the same package can be forcibly merged:\n". + "$gBug $ref is not in the same package as $master_bug\n"); + &cancelbug; @newmergelist=(); last; + } + for my $t (split /\s+/,$data->{keywords}) { + $tags{$t} = 1; + } + @found{@{$data->{found_versions}}} = (1) x @{$data->{found_versions}}; + @fixed{@{$data->{fixed_versions}}} = (1) x @{$data->{fixed_versions}}; + push(@newmergelist,$ref); + push(@tomerge,split(/ /,$data->{mergedwith})); + &cancelbug; + } + if (@newmergelist) { + @newmergelist= sort { $a <=> $b } @newmergelist; + $action= "Forcibly Merged @newmergelist."; + delete @fixed{keys %found}; + 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->{fixed_versions}= [sort keys %fixed]; + my @field_list = qw(forwarded package severity blocks blockedby owner done); + @{$data}{@field_list} = @{$master_bug_data}{@field_list} + &savebug; + } + &transcript("$action\n\n"); + } + &endmerge; } elsif (m/^clone\s+#?(\d+)\s+((-\d+\s+)*-\d+)\s*$/i) { $ok++;