]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/Control.pm
Only search for the first Format-Version: and use it
[debbugs.git] / Debbugs / Control.pm
index 20f82dfc2741e1d527b89cb330dcbb2dc0a13b6c..02bb07e6f5fbb4036dfcc99a216fbac55a4814c4 100644 (file)
@@ -2089,6 +2089,7 @@ sub set_merged {
                $param{show_bug_info} and not __internal_request(1);
            $bug_info_shown{$change_bug} = 1;
            __allow_relocking($param{locks},[keys %data]);
+           eval {
            for my $change (@{$changes->{$change_bug}}) {
                if ($change->{field} eq 'blockedby' or $change->{field} eq 'blocks') {
                    my %target_blockedby;
@@ -2125,6 +2126,12 @@ sub set_merged {
                                         );
                }
            }
+       };
+           if ($@) {
+               __disallow_relocking($param{locks});
+               __end_control(%info);
+               croak "Failure while trying to adjust bugs, please report this as a bug: $@";
+           }
            __disallow_relocking($param{locks});
            my ($data,$n_locks) =
                __lock_and_load_merged_bugs(bugs_to_load => [keys %merging],
@@ -2291,13 +2298,22 @@ sub __calculate_merge_status{
            $merged_bugs{$data->{bug_num}} = 1;
            $bugs_to_merge = 1;
        }
+    }
+    for my $data (@{$data_a}) {
        # the master_bug is the bug that every other bug is made to
        # look like. However, if merge is set, tags, fixed and found
        # are merged.
        if ($data->{bug_num} == $master_bug) {
-           for (qw(package forwarded severity blocks blockedby done owner summary outlook affects)) {
+           for (qw(package forwarded severity done owner summary outlook affects)) {
                $merge_status{$_} = $data->{$_}
            }
+           # bugs which are in the newly merged set and are also
+           # blocks/blockedby must be removed before merging
+           for (qw(blocks blockedby)) {
+               $merge_status{$_} =
+                   join(' ',grep {not exists $merged_bugs{$_}}
+                        split / /,$data->{$_});
+           }
        }
        if (defined $merge_status) {
            next unless $data->{bug_num} == $master_bug;