]> git.donarmstrong.com Git - debbugs.git/blobdiff - Debbugs/DB/Load.pm
switch to compatibility level 12
[debbugs.git] / Debbugs / DB / Load.pm
index 1af6c6517162517e3afa757f6ba01e8580178395..03ab770636eb8ec3a1d554ad78815f1f17794d8f 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;
@@ -176,36 +177,45 @@ sub load_bug {
     my $b = $s->resultset('Bug')->update_or_create($bug) or
         die "Unable to update or create bug $bug->{id}";
     $s->txn_do(sub {
-                $b->set_related_packages('binpackages',
-                                         [grep {defined $_ and
-                                                  length $_ and $_ !~ /^src:/}
-                                          make_list($data->{package})],
-                                         $param{packages},
-                                        );
-                $b->set_related_packages('srcpackages',
-                                         [map {s/src://;
-                                                $_}
-                                           grep {defined $_ and
-                                                  $_ =~ /^src:/}
-                                          make_list($data->{package})],
-                                         $param{packages},
-                                        );
-                $b->set_related_packages('affects_binpackages',
-                                         [grep {defined $_ and
-                                                  length $_ and $_ !~ /^src:/}
-                                          make_list($data->{affects})
-                                         ],
-                                         $param{packages},
-                                        );
-                $b->set_related_packages('affects_srcpackages',
-                                         [map {s/src://;
-                                                $_}
-                                           grep {defined $_ and
-                                                  $_ =~ /^src:/}
-                                          make_list($data->{affects})],
-                                         $param{packages},
-                                        );
-                for my $ff (qw(found fixed)) {
+                   my @unknown_packages;
+                   my @unknown_affects_packages;
+                   push @unknown_packages,
+                       $b->set_related_packages('binpackages',
+                                                [grep {defined $_ and
+                                                           length $_ and $_ !~ /^src:/}
+                                                 make_list($data->{package})],
+                                                $param{packages},
+                                               );
+                   push @unknown_packages,
+                       $b->set_related_packages('srcpackages',
+                                                [map {s/src://;
+                                                      $_}
+                                                 grep {defined $_ and
+                                                           $_ =~ /^src:/}
+                                                 make_list($data->{package})],
+                                                $param{packages},
+                                               );
+                   push @unknown_affects_packages,
+                       $b->set_related_packages('affects_binpackages',
+                                                [grep {defined $_ and
+                                                           length $_ and $_ !~ /^src:/}
+                                                 make_list($data->{affects})
+                                                ],
+                                                $param{packages},
+                                               );
+                   push @unknown_affects_packages,
+                       $b->set_related_packages('affects_srcpackages',
+                                                [map {s/src://;
+                                                      $_}
+                                                 grep {defined $_ and
+                                                           $_ =~ /^src:/}
+                                                 make_list($data->{affects})],
+                                                $param{packages},
+                                               );
+                   $b->unknown_packages(join(', ',@unknown_packages));
+                   $b->unknown_affects(join(', ',@unknown_affects_packages));
+                   $b->update();
+                   for my $ff (qw(found fixed)) {
                       my @elements = $s->resultset('BugVer')->search({bug => $data->{bug_num},
                                                                       found  => $ff eq 'found'?1:0,
                                                                      });
@@ -252,19 +262,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 +309,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;
                       }
-                     );
-       }
+                  );
     }
 }
 
@@ -495,7 +515,7 @@ sub load_debinfo {
     if (not defined $cache->{bp}{$binname}) {
         $cache->{bp}{$binname} =
             $s->resultset('BinPkg')->
-            get_bin_pkg_id($binname);
+            get_or_create_bin_pkg_id($binname);
     }
     $bp = $cache->{bp}{$binname};
     $s->resultset('BinVer')->
@@ -605,7 +625,7 @@ sub load_packages {
            sub {
                for my $svm (@_) {
                    my $s_id = $schema->resultset('SrcPkg')->
-                       get_src_pkg_id($svm->[0]);
+                       get_or_create_src_pkg_id($svm->[0]);
                    my $sv_id = $schema->resultset('SrcVer')->
                        get_src_ver_id($s_id,$svm->[1],$maints->{$svm->[2]});
                    $schema->resultset('SrcAssociation')->
@@ -672,11 +692,11 @@ sub load_packages {
        sub {
            for my $bvm (@_) {
                my $s_id = $schema->resultset('SrcPkg')->
-                   get_src_pkg_id($bvm->{source});
+                   get_or_create_src_pkg_id($bvm->{source});
                my $sv_id = $schema->resultset('SrcVer')->
                    get_src_ver_id($s_id,$bvm->{src_ver},$maints->{$bvm->{maint}});
                my $b_id = $schema->resultset('BinPkg')->
-                   get_bin_pkg_id($bvm->{bin});
+                   get_or_create_bin_pkg_id($bvm->{bin});
                my $bv_id = $schema->resultset('BinVer')->
                    get_bin_ver_id($b_id,$bvm->{bin_ver},
                                   $archs->{$bvm->{arch}},$sv_id);