]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/Control.pm
read report from the spool directory even if we're not in it
[debbugs.git] / Debbugs / Control.pm
index 924e7d4de5518c7e49fc80caf8fc9ef18aa6b207..a89a7eb7386594c888bb55e71fddf2291390f1b5 100644 (file)
@@ -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},$merge_status);
-       ($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;
     }
 
@@ -2394,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;
            }
@@ -2568,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);
@@ -2730,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) {
@@ -2948,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} = '';
@@ -3060,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}
        ) {
@@ -3574,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__};