]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/DB/Load.pm
zero out blocks/mergedwith even if there are no blocks/mergedwith
[debbugs.git] / Debbugs / DB / Load.pm
index e768df97609195a90a8209a847861685c83ae46d..40187911555d16d1485474aa168296c75bd982c8 100644 (file)
@@ -23,6 +23,7 @@ None known.
 
 use warnings;
 use strict;
+use v5.10;
 use vars qw($VERSION $DEBUG %EXPORT_TAGS @EXPORT_OK @EXPORT);
 use base qw(Exporter);
 
@@ -42,7 +43,7 @@ BEGIN{
 }
 
 use Params::Validate qw(validate_with :types);
-use List::MoreUtils qw(natatime);
+use List::AllUtils qw(natatime);
 
 use Debbugs::Status qw(read_bug split_status_fields);
 use Debbugs::DB;
@@ -252,19 +253,22 @@ sub load_bug {
     # because these bugs reference other bugs which might not exist
     # yet, we can't handle them until we've loaded all bugs. queue
     # them up.
-    for my $merge_block (qw(merged block)) {
-        my $data_key = $merge_block;
-        $data_key .= 'with' if $merge_block eq 'merged';
-        if (@{$data->{$data_key}||[]}) {
-            my $count = $s->resultset('Bug')->search({id => [@{$data->{$data_key}}]})->count();
-            if ($count == @{$data->{$data_key}}) {
-                handle_load_bug_queue(db=>$s,
-                                      queue => {$merge_block,
-                                               {$data->{bug_num},[@{$data->{$data_key}}]}
-                                               });
-            } else {
-                $queue->{$merge_block}{$data->{bug_num}} = [@{$data->{$data_key}}];
-            }
+    for my $merge_block (qw(mergedwith blocks)) {
+        my $count = 0;
+        if (@{$data->{$merge_block}}) {
+            $count =
+                $s->resultset('Bug')->
+                search({id => [@{$data->{$merge_block}}]})->
+                count();
+        }
+        # if all of the bugs exist, immediately fix the merge/blocks
+        if ($count == @{$data->{$merge_block}}) {
+            handle_load_bug_queue(db=>$s,
+                                  queue => {$merge_block,
+                                           {$data->{bug_num},[@{$data->{$merge_block}}]}
+                                           });
+        } else {
+            $queue->{$merge_block}{$data->{bug_num}} = [@{$data->{$merge_block}}];
         }
     }
 
@@ -296,26 +300,33 @@ sub handle_load_bug_queue{
     my $s = $param{db};
     my $queue = $param{queue};
     my %queue_types =
-       (merged => {set => 'BugMerged',
-                   columns => [qw(bug merged)],
-                   bug => 'bug',
-                  },
+       (mergedwith => {set => 'BugMerged',
+                        columns => [qw(bug merged)],
+                        bug => 'bug',
+                       },
         blocks => {set => 'BugBlock',
-                   columns => [qw(bug blocks)],
-                   bug => 'bug',
-                  },
+                    columns => [qw(bug blocks)],
+                    bug => 'bug',
+                   },
        );
     for my $queue_type (keys %queue_types) {
-       for my $bug (%{$queue->{$queue_type}}) {
-           my $qt = $queue_types{$queue_type};
-           $s->txn_do(sub {
-                          $s->resultset($qt->{set})->search({$qt->{bug},$bug})->delete();
-                          $s->populate($qt->{set},[[@{$qt->{columns}}],
-                                                    map {[$bug,$_]} @{$queue->{$queue_type}{$bug}}]) if
-                              @{$queue->{$queue_type}{$bug}//[]};
+        my $qt = $queue_types{$queue_type};
+        my @bugs = keys %{$queue->{$queue_type}};
+        next unless @bugs;
+        my @entries;
+        for my $bug (@bugs) {
+            push @entries,
+                map {[$bug,$_]}
+                @{$queue->{$queue_type}{$bug}};
+        }
+        $s->txn_do(sub {
+                       $s->resultset($qt->{set})->
+                           search({$qt->{bug}=>\@bugs})->delete();
+                       $s->resultset($qt->{set})->
+                           populate([[@{$qt->{columns}}],
+                                     @entries]) if @entries;
                       }
-                     );
-       }
+                  );
     }
 }
 
@@ -385,8 +396,12 @@ sub load_bug_log {
                                subject => $subject
                               });
            eval {
-               $m->sent_date(DateTime::Format::Mail->
-                             parse_datetime($entity->head->get('Date',0)));
+               my $date = DateTime::Format::Mail->
+                    parse_datetime($entity->head->get('Date',0));
+                if (abs($date->offset) >= 60 * 60 * 12) {
+                    $date = $date->set_time_zone('UTC');
+                }
+                $m->sent_date($date);
            };
            my $spam = $entity->head->get('X-Spam-Status',0)//'';
            if ($spam=~ /score=([\d\.]+)/) {
@@ -400,9 +415,11 @@ sub load_bug_log {
            my @cors;
            for my $type (keys %corr) {
                for my $addr (@{$corr{$type}}) {
+                    my $cor = $s->resultset('Correspondent')->
+                        get_correspondent_id($addr);
+                    next unless defined $cor;
                    push @cors,
-                       {correspondent => $s->resultset('Correspondent')->
-                        get_correspondent_id($addr),
+                       {correspondent => $cor,
                         correspondent_type => $type,
                        };
                }
@@ -410,7 +427,8 @@ sub load_bug_log {
            $m->update();
            $s->txn_do(sub {
                           $m->message_correspondents()->delete();
-                          $m->add_to_message_correspondents(@cors);
+                          $m->add_to_message_correspondents(@cors) if
+                               @cors;
                       }
                      );
        }