X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FControl.pm;h=a89a7eb7386594c888bb55e71fddf2291390f1b5;hb=6f33f786cb1fbce5eb684a46a7ff86314cbe2ae8;hp=a8a54c108dea292ba0f098d36ea076b27218f34c;hpb=a60f1cac1e6f06f8a2a16aa604440f1d4b9f2f29;p=debbugs.git diff --git a/Debbugs/Control.pm b/Debbugs/Control.pm index a8a54c1..a89a7eb 100644 --- a/Debbugs/Control.pm +++ b/Debbugs/Control.pm @@ -459,8 +459,7 @@ sub set_blocks { push @changed, 'removed blocking bug(s) of '.$data->{bug_num}.': '.english_join([keys %removed_blockers]) if keys %removed_blockers; $action = ucfirst(join ('; ',@changed)) if @changed; if (not @changed) { - print {$transcript} "Ignoring request to alter blocking bugs of bug #$data->{bug_num} to the same blocks previously set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to alter blocking bugs of bug #$data->{bug_num} to the same blocks previously set\n"; next; } $data->{blockedby} = join(' ',keys %blockers); @@ -696,8 +695,7 @@ sub set_tag { push @changed, 'removed tag(s) '.english_join([keys %tag_removed]) if keys %tag_removed; $action = ucfirst(join ('; ',@changed)) if @changed; if (not @changed) { - print {$transcript} "Ignoring request to alter tags of bug #$data->{bug_num} to the same tags previously set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to alter tags of bug #$data->{bug_num} to the same tags previously set\n"; next; } $action .= '.'; @@ -953,8 +951,8 @@ sub set_done { for my $data (@data) { my $old_data = dclone($data); my $hash = get_hashname($data->{bug_num}); - my $report_fh = IO::File->new("db-h/$hash/$data->{bug_num}.report",'r') or - die "Unable to open original report db-h/$hash/$data->{bug_num}.report for reading: $!"; + my $report_fh = IO::File->new("$config{spool_dir}/db-h/$hash/$data->{bug_num}.report",'r') or + die "Unable to open original report $config{spool_dir}/db-h/$hash/$data->{bug_num}.report for reading: $!"; my $orig_report; { local $/; @@ -1109,8 +1107,7 @@ sub set_submitter { (not defined $data->{originator} or not length $data->{originator})) or (defined $param{submitter} and defined $data->{originator} and $param{submitter} eq $data->{originator})) { - print {$transcript} "Ignoring request to change the submitter of bug#$data->{bug_num} to the same value\n" - unless __internal_request(); + print {$transcript} "Ignoring request to change the submitter of bug#$data->{bug_num} to the same value\n"; next; } else { @@ -1222,8 +1219,7 @@ sub set_forwarded { if (__all_undef_or_equal($param{forwarded},$data->{forwarded}) or (not defined $param{forwarded} and defined $data->{forwarded} and not length $data->{forwarded})) { - print {$transcript} "Ignoring request to change the forwarded-to-address of bug#$data->{bug_num} to the same value\n" - unless __internal_request(); + print {$transcript} "Ignoring request to change the forwarded-to-address of bug#$data->{bug_num} to the same value\n"; next; } else { @@ -1311,8 +1307,7 @@ sub set_title { print {$debug} "Going to change bug title\n"; if (defined $data->{subject} and length($data->{subject}) and $data->{subject} eq $param{title}) { - print {$transcript} "Ignoring request to change the title of bug#$data->{bug_num} to the same title\n" - unless __internal_request(); + print {$transcript} "Ignoring request to change the title of bug#$data->{bug_num} to the same title\n"; next; } else { @@ -1416,8 +1411,7 @@ sub set_package { print {$debug} "Going to change assigned package\n"; if (defined $data->{package} and length($data->{package}) and $data->{package} eq $new_package) { - print {$transcript} "Ignoring request to reassign bug #$data->{bug_num} to the same package\n" - unless __internal_request(); + print {$transcript} "Ignoring request to reassign bug #$data->{bug_num} to the same package\n"; next; } else { @@ -1581,6 +1575,12 @@ sub set_found { if (not @svers) { @svers = $version; } + else { + if (exists $found_versions{$version}) { + delete $found_versions{$version}; + $found_removed{$version} = 1; + } + } for my $sver (@svers) { if (not exists $found_versions{$sver}) { $found_versions{$sver} = 1; @@ -1649,8 +1649,7 @@ sub set_found { $action .= " and reopened" } if (not $reopened and not @changed) { - print {$transcript} "Ignoring request to alter found versions of bug #$data->{bug_num} to the same values previously set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to alter found versions of bug #$data->{bug_num} to the same values previously set\n"; next; } $action .= '.'; @@ -1793,6 +1792,12 @@ sub set_fixed { if (not @svers) { @svers = $version; } + else { + if (exists $fixed_versions{$version}) { + $fixed_removed{$version} = 1; + delete $fixed_versions{$version}; + } + } for my $sver (@svers) { if (not exists $fixed_versions{$sver}) { $fixed_versions{$sver} = 1; @@ -1858,8 +1863,7 @@ sub set_fixed { $action .= " and reopened" } if (not $reopened and not @changed) { - print {$transcript} "Ignoring request to alter fixed versions of bug #$data->{bug_num} to the same values previously set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to alter fixed versions of bug #$data->{bug_num} to the same values previously set\n"; next; } $action .= '.'; @@ -2084,66 +2088,69 @@ sub set_merged { croak "Did not alter merged bugs"; } } - my ($change_bug) = keys %{$changes}; - $bug_changed{$change_bug}++; - print {$transcript} __bug_info($data{$change_bug}) if - $param{show_bug_info} and not __internal_request(1); - $bug_info_shown{$change_bug} = 1; - __allow_relocking($param{locks},[keys %data]); - for my $change (@{$changes->{$change_bug}}) { - if ($change->{field} eq 'blockedby' or $change->{field} eq 'blocks') { - my %target_blockedby; - @target_blockedby{@{$change->{func_value}}} = (1) x @{$change->{func_value}}; - my %unhandled_targets = %target_blockedby; - my @blocks_to_remove; - for my $key (split / /,$change->{orig_value}) { - delete $unhandled_targets{$key}; - next if exists $target_blockedby{$key}; - set_blocks(bug => $change->{field} eq 'blocks' ? $key : $change->{bug}, - block => $change->{field} eq 'blocks' ? $change->{bug} : $key, - remove => 1, - hash_slice(%param, - keys %common_options, - keys %append_action_options), - ); + my @bugs_to_change = keys %{$changes}; + for my $change_bug (@bugs_to_change) { + next unless exists $changes->{$change_bug}; + $bug_changed{$change_bug}++; + print {$transcript} __bug_info($data{$change_bug}) if + $param{show_bug_info} and not __internal_request(1); + $bug_info_shown{$change_bug} = 1; + __allow_relocking($param{locks},[keys %data]); + for my $change (@{$changes->{$change_bug}}) { + if ($change->{field} eq 'blockedby' or $change->{field} eq 'blocks') { + my %target_blockedby; + @target_blockedby{@{$change->{func_value}}} = (1) x @{$change->{func_value}}; + my %unhandled_targets = %target_blockedby; + my @blocks_to_remove; + for my $key (split / /,$change->{orig_value}) { + delete $unhandled_targets{$key}; + next if exists $target_blockedby{$key}; + set_blocks(bug => $change->{field} eq 'blocks' ? $key : $change->{bug}, + block => $change->{field} eq 'blocks' ? $change->{bug} : $key, + remove => 1, + hash_slice(%param, + keys %common_options, + keys %append_action_options), + ); + } + for my $key (keys %unhandled_targets) { + set_blocks(bug => $change->{field} eq 'blocks' ? $key : $change->{bug}, + block => $change->{field} eq 'blocks' ? $change->{bug} : $key, + add => 1, + hash_slice(%param, + keys %common_options, + keys %append_action_options), + ); + } } - for my $key (keys %unhandled_targets) { - set_blocks(bug => $change->{field} eq 'blocks' ? $key : $change->{bug}, - block => $change->{field} eq 'blocks' ? $change->{bug} : $key, - add => 1, - hash_slice(%param, - keys %common_options, - keys %append_action_options), - ); + else { + $change->{function}->(bug => $change->{bug}, + $change->{key}, $change->{func_value}, + exists $change->{options}?@{$change->{options}}:(), + hash_slice(%param, + keys %common_options, + keys %append_action_options), + ); } } - else { - $change->{function}->(bug => $change->{bug}, - $change->{key}, $change->{func_value}, - exists $change->{options}?@{$change->{options}}:(), - hash_slice(%param, - keys %common_options, - keys %append_action_options), - ); - } + __disallow_relocking($param{locks}); + my ($data,$n_locks) = + __lock_and_load_merged_bugs(bugs_to_load => [keys %merging], + data => \@data, + locks => $param{locks}, + debug => $debug, + reload_all => 1, + ); + $new_locks += $n_locks; + $locks += $n_locks; + %data = %{$data}; + @data = values %data; + ($merge_status,$bugs_to_merge) = + __calculate_merge_status(\@data,\%data,$param{bug},$merge_status); + ($disallowed_changes,$changes) = + __calculate_merge_changes(\@data,$merge_status,\%param); + $attempts = max(values %bug_changed); } - __disallow_relocking($param{locks}); - my ($data,$n_locks) = - __lock_and_load_merged_bugs(bugs_to_load => [keys %merging], - data => \@data, - locks => $param{locks}, - debug => $debug, - reload_all => 1, - ); - $new_locks += $n_locks; - $locks += $n_locks; - %data = %{$data}; - @data = values %data; - ($merge_status,$bugs_to_merge) = - __calculate_merge_status(\@data,\%data,$param{bug}); - ($disallowed_changes,$changes) = - __calculate_merge_changes(\@data,$merge_status,\%param); - $attempts = max(values %bug_changed); } if ($param{show_bug_info} and not __internal_request(1)) { for my $data (sort {$a->{bug_num} <=> $b->{bug_num}} @data) { @@ -2152,12 +2159,16 @@ sub set_merged { } } if (keys %{$changes} or @{$disallowed_changes}) { - print {$transcript} "Unable to modify bugs so that they could be merged\n"; + print {$transcript} "After four attempts, the following changes were unable to be made:\n"; for (1..$new_locks) { unfilelock($param{locks}); $locks--; } __end_control(%info); + for my $change (values %{$changes}, @{$disallowed_changes}) { + print {$transcript} "$change->{field} of #$change->{bug} is '$change->{text_orig_value}' not '$change->{text_value}'\n"; + } + die "Unable to modify bugs so they could be merged"; return; } @@ -2191,8 +2202,9 @@ sub set_merged { sub __allow_relocking{ my ($locks,$bugs) = @_; - for my $bug (@{$bugs}) { - my @lockfiles = grep {m{/\Q$bug\E$}} keys %{$locks->{locks}}; + my @locks = (@{$bugs},'merge'); + for my $lock (@locks) { + my @lockfiles = grep {m{/\Q$lock\E$}} keys %{$locks->{locks}}; next unless @lockfiles; $locks->{relockable}{$lockfiles[0]} = 0; } @@ -2273,8 +2285,8 @@ sub __lock_and_load_merged_bugs{ sub __calculate_merge_status{ - my ($data_a,$data_h,$master_bug,$merge) = @_; - my %merge_status; + my ($data_a,$data_h,$master_bug,$merge_status) = @_; + my %merge_status = %{$merge_status // {}}; my %merged_bugs; my $bugs_to_merge = 0; for my $data (@{$data_a}) { @@ -2292,9 +2304,9 @@ sub __calculate_merge_status{ $merge_status{$_} = $data->{$_} } } - if (not $merge) { - next unless $data->{bug_num} == $master_bug; - } + if (defined $merge_status) { + next unless $data->{bug_num} == $master_bug; + } $merge_status{tag} = {} if not exists $merge_status{tag}; for my $tag (split /\s+/, $data->{keywords}) { $merge_status{tag}{$tag} = 1; @@ -2393,6 +2405,19 @@ sub __calculate_merge_changes{ next if join(' ', sort @{$data->{$field}}) eq join(' ',sort keys %{$merge_status->{$field}}); } + elsif ($field eq 'done') { + # for done, we only care if the bug is done or not + # done, not the value it's set to. + if (defined $merge_status->{$field} and length $merge_status->{$field} and + defined $data->{$field} and length $data->{$field}) { + next; + } + elsif ((not defined $merge_status->{$field} or not length $merge_status->{$field}) and + (not defined $data->{$field} or not length $data->{$field}) + ) { + next; + } + } elsif ($merge_status->{$field} eq $data->{$field}) { next; } @@ -2408,7 +2433,7 @@ sub __calculate_merge_changes{ function => $force_functions{$field}{func}, key => $force_functions{$field}{key}, options => $force_functions{$field}{options}, - allowed => exists $force_functions{$field}{allowed} ? 0 : $force_functions{$field}{allowed}, + allowed => exists $force_functions{$field}{allowed} ? $force_functions{$field}{allowed} : 0, }; $change->{text_value} = ref($change->{func_value}) eq 'ARRAY'?join(' ',@{$change->{func_value}}):$change->{func_value}; $change->{text_orig_value} = ref($change->{orig_value}) eq 'ARRAY'?join(' ',@{$change->{orig_value}}):$change->{orig_value}; @@ -2567,8 +2592,7 @@ sub affects { } } if (not length $action) { - print {$transcript} "Ignoring request to set affects of bug $data->{bug_num} to the same value previously set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to set affects of bug $data->{bug_num} to the same value previously set\n"; next; } my $old_data = dclone($data); @@ -2729,8 +2753,7 @@ sub summary { if (((not defined $summary or not length $summary) and (not defined $data->{summary} or not length $data->{summary})) or $summary eq $data->{summary}) { - print {$transcript} "Ignoring request to change the summary of bug $param{bug} to the same value\n" - unless __internal_request(); + print {$transcript} "Ignoring request to change the summary of bug $param{bug} to the same value\n"; next; } if (length $summary) { @@ -2947,8 +2970,7 @@ sub owner { print {$debug} "Owner is currently '$data->{owner}' for bug $data->{bug_num}\n"; if (not defined $param{owner} or not length $param{owner}) { if (not defined $data->{owner} or not length $data->{owner}) { - print {$transcript} "Ignoring request to unset the owner of bug #$data->{bug_num} which was not set\n" - unless __internal_request(); + print {$transcript} "Ignoring request to unset the owner of bug #$data->{bug_num} which was not set\n"; next; } $param{owner} = ''; @@ -3059,7 +3081,6 @@ sub bug_archive { print {$transcript} "Bug $param{bug} cannot be archived\n"; die "Bug $param{bug} cannot be archived"; } - print {$debug} "$param{bug} considering\n"; if (not $param{archive_unarchived} and not exists $data[0]{unarchived} ) { @@ -3573,7 +3594,8 @@ sub __begin_control { ); my $new_locks; my ($debug,$transcript) = __handle_debug_transcript(@_); - print {$debug} "$param{bug} considering\n"; + print {$debug} "considering bug $param{bug} for ".(exists $param{command}?$param{command}:scalar caller())."\n"; +# print {$debug} Data::Dumper->Dump([[caller(1)],\%param],[qw(caller param)])."\n"; $lockhash = $param{locks} if exists $param{locks}; my @data = (); my $old_die = $SIG{__DIE__};