]> git.donarmstrong.com Git - debbugs.git/commitdiff
* Add forcemerge support; bugs which are in the same package can be
authorDon Armstrong <don@volo>
Thu, 6 Apr 2006 22:12:39 +0000 (15:12 -0700)
committerDon Armstrong <don@volo>
Thu, 6 Apr 2006 22:12:39 +0000 (15:12 -0700)
   forcibly merged, where the subsequent bugs listed take on the same
   values as the first bug listed.

scripts/service.in

index 6dee299aec87478ebba5b1f06259c94463d6e68b..28482218d7fdd543acc88a832f6660d1ebe8423e 100755 (executable)
@@ -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) { &notfoundbug; @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++;