]> git.donarmstrong.com Git - debbugs.git/blobdiff - bin/debbugs-updatesqlcache
Prefer the most recent debversion in the dependency list
[debbugs.git] / bin / debbugs-updatesqlcache
old mode 100644 (file)
new mode 100755 (executable)
index 9ca9a03..9422adf
@@ -96,7 +96,8 @@ use Debbugs::Status qw(bug_presence read_bug);
 use Debbugs::DB;
 use DateTime;
 use File::stat;
-
+use List::AllUtils qw(natatime uniq);
+use POSIX qw(ceil);
 
 my %options =
     (debug           => 0,
@@ -105,16 +106,18 @@ my %options =
      verbose         => 0,
      quiet           => 0,
      quick           => 0,
-     service         => $config{debbugs_db},
+     archived        => 0,
+     service         => $config{database},
      progress        => 0,
     );
 
 Getopt::Long::Configure('pass_through');
 GetOptions(\%options,
-           'quick|q',
+           'quick|q!',
            'service|s=s',
            'sysconfdir|c=s',
            'progress!',
+          'archived+',
            'spool_dir|spool-dir=s',
            'verbose|v+',
            'quiet+',
@@ -128,6 +131,8 @@ $DEBUG = $options{debug};
 
 my %subcommands =
     ('update' => {function => \&update_cache,
+                 arguments => {'suites|suite=s@' => 0,
+                              },
                },
      'help' => {function => sub {pod2usage({verbose => 2});}}
     );
@@ -190,38 +195,114 @@ sub update_cache {
     # get all of the possible architectures that we might care about
     # select distinct s.codename,a.arch from bin_associations ba join bin_ver bv on ba.bin=bv.id join suite s on ba.suite=s.id join arch a on bv.arch=a.id;
 
-    my @suites =
-       $s->resultset('Suite')->
-       search_rs({active => 1,
-                 },
-                {result_class => 'DBIx::Class::ResultClass::HashRefInflator'}
-                )->all();
+    my @suites;
+    if (exists $opts->{suites}) {
+       @suites =
+           $s->resultset('Suite')->
+           search_rs({active => 1,
+                      -or => {codename => [make_list($opts->{suites})],
+                              suite_name => [make_list($opts->{suites})],
+                             },
+                     },
+                    {result_class => 'DBIx::Class::ResultClass::HashRefInflator'}
+                    )->all();
+     } else {
+       @suites = 
+           $s->resultset('Suite')->
+           search_rs({active => 1,
+                     },
+                    {result_class => 'DBIx::Class::ResultClass::HashRefInflator'}
+                    )->all();
+    }
+    my @bugs;
     my $bugs;
-    if ($opts->{quick}) {
+    if ($options->{quick}) {
+       # identify the last time that we ran this query
+       my $last_query_time =
+           $s->resultset('BugStatusCache')->
+           search_rs(undef,
+                    {rows => 1,
+                     order_by => { -desc => 'asof' },
+                     columns => [qw(asof)],
+                    }
+                    )->first();
+       my $dtf = $s->storage->datetime_parser;
+       if (defined $last_query_time) {
+           $last_query_time = $last_query_time->asof();
+       } else {
+           $last_query_time = DateTime->from_epoch(0);
+       }
         # select last status update
+       $last_query_time = $dtf->format_datetime($last_query_time);
+       # select all bugs which are in packages which have had a binary
+       # association modified
+       push @bugs,
+           map {$_->{bug_binpackages}{bug}}
+           $s->resultset('BinAssociation')->
+           search_rs({'me.modified' => {'>=',$last_query_time},
+                     },
+                    {columns => [qw(bug_binpackages.bug)],
+                     join => {bin =>
+                             {bin_pkg =>
+                              'bug_binpackages'
+                             }},
+                     result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                    },
+                    )->all();
+       # or a source association modified
+       push @bugs,
+           map {$_->{bug_srcpackages}{bug}}
+           $s->resultset('SrcAssociation')->
+           search_rs({'me.modified' => {'>=',$last_query_time},
+                     },
+                    {columns => [qw(bug_srcpackages.bug)],
+                     join => {source =>
+                             {src_pkg =>
+                              'bug_srcpackages'
+                             }},
+                     result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                    },
+                    )->all();
+       # or bugs which have been modified since we last ran
+       push @bugs,
+           map {$_->{id}}
+           $s->resultset('Bug')->
+           search_rs({-or => {'me.log_modified' => {'>=',$last_query_time},
+                              'me.last_modified' => {'>=',$last_query_time},
+                             },
+                      archived => ! $options->{archived},
+                     },
+                    {columns => [qw(id)],
+                     result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                    },
+                    )->all();
+       @bugs = uniq(@bugs);
 
-       # select bugs which have been modified since the last updatex
     } else {
-        $bugs = $s->resultset('Bug')->
-           search_rs(undef,
-                    {rows => 100,
-                     page => 1,
-                    });
+       ## or just select all of them
+       push @bugs,
+           map {$_->{id}}
+           $s->resultset('Bug')->
+           search_rs({archived => ! $options->{archived}},
+                    {columns => [qw(id)],
+                     result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+                    },
+                    )->all();
     }
     my $update_bug =
        sub {
-           my @bugs = @_;
-           for my $bug (@bugs) {
-               my $status = read_bug(bug => $bug->id);
+           my @b = @_;
+           for my $bug (@b) {
+               my $status = read_bug(bug => $bug);
                next unless defined $status;
                for my $suite (@suites) {
                    my $presence =
-                       bug_presence(bug => $bug->id,
+                       bug_presence(bug => $bug,
                                     status => $status,
                                     dist => $suite->{suite_name},
                                    );
                    $s->resultset('BugStatusCache')->
-                       update_bug_status($bug->id,
+                       update_bug_status($bug,
                                          $suite->{id},
                                          undef,
                                          $presence,
@@ -229,21 +310,17 @@ sub update_cache {
                }
            }
        };
-    my $last_page = 1;
-    if ($bugs->is_paged) {
-       $last_page = 
-           $bugs->pager->last_page;
-    }
+    my $it = natatime 500,@bugs;
+    my $page = 0;
+    my $last_page = ceil(@bugs / 500);
     $p->target($last_page) if defined $p;
-    for my $page (1..$last_page) {
-       my $bugs_on_page = $bugs;
-       if ($bugs->is_paged) {
-           $bugs_on_page = $bugs->page($page);
-       }
+    while (my @b_sub = $it->()) {
        $s->txn_do($update_bug,
-                  $bugs_on_page->all());
-       $p->update($page);
+                  @b_sub);
+       $page++;
+       $p->update($page) if defined $p;
     }
+    $p->remove() if $p;
 }