use Debbugs::DB;
use DateTime;
use File::stat;
-
+use List::AllUtils qw(natatime uniq);
+use POSIX qw(ceil);
my %options =
(debug => 0,
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+',
my %subcommands =
('update' => {function => \&update_cache,
+ arguments => {'suites|suite=s@' => 0,
+ },
},
'help' => {function => sub {pod2usage({verbose => 2});}}
);
# 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,
}
}
};
- 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;
}