]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/DB/Load.pm
switch all uses of MoreUtils to AllUtils
[debbugs.git] / Debbugs / DB / Load.pm
index 77423a0017533aef54bc645af602dc9a5cf1e8d4..4ad36d9f17fd1b895951f1bf1d7f2a6e4c20a66c 100644 (file)
@@ -42,7 +42,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;
@@ -123,8 +123,8 @@ sub load_bug {
         $queue = {};
     }
     my %tags;
-    my $s_data = split_status_fields($data);
-    for my $tag (make_list($s_data->{keywords})) {
+    $data = split_status_fields($data);
+    for my $tag (make_list($data->{keywords})) {
        next unless defined $tag and length $tag;
        # this allows for invalid tags. But we'll use this to try to
        # find those bugs and clean them up
@@ -183,7 +183,9 @@ sub load_bug {
                                          $param{packages},
                                         );
                 $b->set_related_packages('srcpackages',
-                                         [grep {defined $_ and
+                                         [map {s/src://;
+                                                $_}
+                                           grep {defined $_ and
                                                   $_ =~ /^src:/}
                                           make_list($data->{package})],
                                          $param{packages},
@@ -196,7 +198,9 @@ sub load_bug {
                                          $param{packages},
                                         );
                 $b->set_related_packages('affects_srcpackages',
-                                         [grep {defined $_ and
+                                         [map {s/src://;
+                                                $_}
+                                           grep {defined $_ and
                                                   $_ =~ /^src:/}
                                           make_list($data->{affects})],
                                          $param{packages},
@@ -353,17 +357,19 @@ sub load_bug_log {
         next if defined $msg_id and $msg_id =~ /handler\..+\.ack(?:info)?\@/;
         my $entity = parse_to_mime_entity($record);
         # search for a message with this message id in the database
-        $msg_id = $entity->head->get('Message-Id:');
+        $msg_id = $entity->head->get('Message-Id') //
+            $entity->head->get('Resent-Message-ID') //
+            '';
        $msg_id =~ s/^\s*\<//;
        $msg_id =~ s/>\s*$//;
        # check to see if the subject, to, and from match. if so, it's
         # probably the same message.
-       my $subject = decode_rfc1522($entity->head->get('Subject:'));
-       $subject =~ s/\n(?:(\s)\s*|\s*$)/$1/g;
-       my $to = decode_rfc1522($entity->head->get('To:'));
-       $to =~ s/\n(?:(\s)\s*|\s*$)/$1/g;
-       my $from = decode_rfc1522($entity->head->get('From:'));
-       $from =~ s/\n(?:(\s)\s*|\s*$)/$1/g;
+       my $subject = decode_rfc1522($entity->head->get('Subject')//'');
+       $subject =~ s/\n(?:(\s)\s*|\s*$)//g;
+       my $to = decode_rfc1522($entity->head->get('To')//'');
+       $to =~ s/\n(?:(\s)\s*|\s*$)//g;
+       my $from = decode_rfc1522($entity->head->get('From')//'');
+       $from =~ s/\n(?:(\s)\s*|\s*$)//g;
        my $m = $s->resultset('Message')->
            find({msgid => $msg_id,
                  from_complete => $from,
@@ -379,24 +385,30 @@ 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);
+           my $spam = $entity->head->get('X-Spam-Status',0)//'';
            if ($spam=~ /score=([\d\.]+)/) {
                $m->spam_score($1);
            }
            my %corr;
            @{$corr{from}} = getparsedaddrs($from);
            @{$corr{to}} = getparsedaddrs($to);
-           @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc:'));
+           @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc'));
            # add correspondents if necessary
            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,
                        };
                }
@@ -404,12 +416,13 @@ 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;
                       }
                      );
        }
        my $recv;
-       if ($entity->head->get('Received:',0)
+       if ($entity->head->get('Received',0)
            =~ /via spool by (\S+)/) {
            $recv = $s->resultset('Correspondent')->
                get_correspondent_id($1);
@@ -441,23 +454,58 @@ Commands to handle src and package version loading from debinfo files
 =cut
 
 sub load_debinfo {
-    my ($schema,$binname, $binver, $binarch, $srcname, $srcver) = @_;
-    my $sp = $schema->resultset('SrcPkg')->find_or_create({pkg => $srcname});
-    my $sv = $schema->resultset('SrcVer')->find_or_create({src_pkg=>$sp->id(),
-                                                           ver => $srcver});
-    my $arch = $schema->resultset('Arch')->find_or_create({arch => $binarch});
-    my $bp = $schema->resultset('BinPkg')->find_or_create({pkg => $binname});
-    $schema->resultset('BinVer')->find_or_create({bin_pkg_id => $bp->id(),
-                                                  src_ver_id => $sv->id(),
-                                                  arch_id    => $arch->id(),
-                                                  ver        => $binver,
-                                                 });
+    my ($s,$binname, $binver, $binarch, $srcname, $srcver,$ct_date,$cache) = @_;
+    $cache //= {};
+    my $sp;
+    if (not defined $cache->{sp}{$srcname}) {
+        $cache->{sp}{$srcname} =
+            $s->resultset('SrcPkg')->find_or_create({pkg => $srcname});
+    }
+    $sp = $cache->{sp}{$srcname};
+    # update the creation date if the data we have is earlier
+    if (defined $ct_date and
+        (not defined $sp->creation or
+         $ct_date < $sp->creation)) {
+        $sp->creation($ct_date);
+        $sp->last_modified(DateTime->now);
+        $sp->update;
+    }
+    my $sv;
+    if (not defined $cache->{sv}{$srcname}{$srcver}) {
+        $cache->{sv}{$srcname}{$srcver} =
+            $s->resultset('SrcVer')->
+            find_or_create({src_pkg =>$sp->id(),
+                            ver => $srcver});
+    }
+    $sv = $cache->{sv}{$srcname}{$srcver};
+    if (defined $ct_date and
+        (not defined $sv->upload_date() or $ct_date < $sv->upload_date())) {
+        $sv->upload_date($ct_date);
+        $sv->update;
+    }
+    my $arch;
+    if (not defined $cache->{arch}{$binarch}) {
+        $cache->{arch}{$binarch} =
+            $s->resultset('Arch')->
+            find_or_create({arch => $binarch},
+                          )->id();
+    }
+    $arch = $cache->{arch}{$binarch};
+    my $bp;
+    if (not defined $cache->{bp}{$binname}) {
+        $cache->{bp}{$binname} =
+            $s->resultset('BinPkg')->
+            get_bin_pkg_id($binname);
+    }
+    $bp = $cache->{bp}{$binname};
+    $s->resultset('BinVer')->
+        get_bin_ver_id($bp,$binver,$arch,$sv->id());
 }
 
 
 =back
 
-=head Packages
+=head2 Packages
 
 =over
 
@@ -571,8 +619,15 @@ sub load_packages {
     }
     # remove associations for packages not in this suite
     if (@sa_to_del) {
-       $schema->resultset('SrcAssociation')->
-           search_rs({id => \@sa_to_del})->delete();
+        $it = natatime 1000, @sa_to_del;
+        while (my @v = $it->()) {
+            $schema->
+                txn_do(sub {
+                           $schema->resultset('SrcAssociation')->
+                               search_rs({id => \@v})->
+                               delete();
+                       });
+        }
     }
     # update packages in this suite to have a modification time of now
     $schema->resultset('SrcAssociation')->
@@ -635,8 +690,15 @@ sub load_packages {
                   scalar @v) if defined $p;
     }
     if (@bin_to_del) {
-       $schema->resultset('BinAssociation')->
-           search_rs({id => \@bin_to_del})->delete();
+        $it = natatime 1000, @bin_to_del;
+        while (my @v = $it->()) {
+            $schema->
+                txn_do(sub {
+                           $schema->resultset('BinAssociation')->
+                               search_rs({id => \@v})->
+                               delete();
+                       });
+        }
     }
     $schema->resultset('BinAssociation')->
        search_rs({suite => $suite_id})->
@@ -649,7 +711,7 @@ sub load_packages {
 
 =cut
 
-=head Suites
+=head2 Suites
 
 =over
 
@@ -683,3 +745,7 @@ sub load_suite {
 
 
 __END__
+# Local Variables:
+# indent-tabs-mode: nil
+# cperl-indent-level: 4
+# End: