X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FControl.pm;h=32239afbf7426b221a802d32d6331b202bdf4923;hb=8a615efb55a87343bc3e059c4e966847f29987e4;hp=6f7420679beadd8339de6574877ec0758937d55e;hpb=9ba3b5ba7379ac06399d7b296e7796b65fad6149;p=debbugs.git diff --git a/Debbugs/Control.pm b/Debbugs/Control.pm index 6f74206..32239af 100644 --- a/Debbugs/Control.pm +++ b/Debbugs/Control.pm @@ -134,7 +134,7 @@ use Mail::RFC822::Address qw(); use POSIX qw(strftime); use Storable qw(dclone nfreeze); -use List::Util qw(first max); +use List::AllUtils qw(first max); use Encode qw(encode_utf8); use Carp; @@ -379,6 +379,7 @@ sub set_blocks { # throw an error if we are setting the blockers and there is a bad # blocker if (keys %bad_blockers and $mode eq 'set') { + __end_control(%info); croak "Unknown blocking bug(s):".join(', ',keys %bad_blockers). keys %ok_blockers?'':" and no known blocking bug(s)"; } @@ -387,6 +388,7 @@ sub set_blocks { if (not keys %ok_blockers and $mode ne 'set') { print {$transcript} "No valid blocking bug(s) given; not doing anything\n"; if (keys %bad_blockers) { + __end_control(%info); croak "Unknown blocking bug(s):".join(', ',keys %bad_blockers); } __end_control(%info); @@ -410,6 +412,7 @@ sub set_blocks { @bugs{@bugs} = (1) x @bugs; for my $blocker (@change_blockers) { if ($bugs{$blocker}) { + __end_control(%info); croak "It is nonsensical for a bug to block itself (or a merged partner): $blocker"; } } @@ -1975,8 +1978,11 @@ sub set_merged { $data->{mergedwith} = ''; } else { - $data->{mergedwith} = join(' ',sort grep {$_ != $data->{bug_num}} - keys %merged_bugs); + $data->{mergedwith} = + join(' ', + sort {$a <=> $b} + grep {$_ != $data->{bug_num}} + keys %merged_bugs); } append_action_to_log(bug => $data->{bug_num}, command => 'merge', @@ -2067,9 +2073,11 @@ sub set_merged { print {$transcript} "$change->{field} of #$change->{bug} is '$change->{text_orig_value}' not '$change->{text_value}'\n"; } if ($attempts > 0) { + __end_control(%info); croak "Some bugs were altered while attempting to merge"; } else { + __end_control(%info); croak "Did not alter merged bugs"; } } @@ -2081,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; @@ -2117,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], @@ -2157,11 +2172,14 @@ sub set_merged { } # finally, we can merge the bugs - my $action = "Merged ".join(' ',sort keys %merged_bugs); + my $action = "Merged ".join(' ',sort { $a <=> $b } keys %merged_bugs); for my $data (@data) { my $old_data = dclone($data); - $data->{mergedwith} = join(' ',sort grep {$_ != $data->{bug_num}} - keys %merged_bugs); + $data->{mergedwith} = + join(' ', + sort { $a <=> $b } + grep {$_ != $data->{bug_num}} + keys %merged_bugs); append_action_to_log(bug => $data->{bug_num}, command => 'merge', new_data => $data, @@ -2936,7 +2954,8 @@ sub clone_bug { for my $bug (split ' ', $data->{blocks}) { for my $new_bug (@new_bugs) { set_blocks(bug => $bug, - block => $new_bug, + block => $new_bug, + add => 1, hash_slice(%param, keys %common_options, keys %append_action_options), @@ -2947,7 +2966,8 @@ sub clone_bug { for my $bug (split ' ', $data->{blockedby}) { for my $new_bug (@new_bugs) { set_blocks(bug => $new_bug, - block => $bug, + block => $bug, + add => 1, hash_slice(%param, keys %common_options, keys %append_action_options), @@ -3790,7 +3810,7 @@ LIMIT: for my $limit (make_list($param{limit}{$field})) { } if (not $match) { $going_to_fail = 1; - print {$transcript} qq($field: ).join(', ',map{qq("$_")} make_list($data->{$field})). + print {$transcript} qq($field: ').join(', ',map{qq("$_")} make_list($data->{$field})). "' does not match at least one of ". join(', ',map {ref($_)?'(regex)':qq("$_")} make_list($param{limit}{$field}))."\n"; } @@ -3833,7 +3853,7 @@ sub __message_body_template{ $extra_var ||={}; my $hole_var = {'&bugurl' => sub{"$_[0]: ". - 'http://'.$config{cgi_domain}.'/'. + $config{cgi_domain}.'/'. Debbugs::CGI::bug_links(bug => $_[0], links_only => 1, );