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,
+ archived => 0,
service => $config{debbugs_db},
progress => 0,
);
'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 ($options->{quick}) {
# identify the last time that we ran this query
}
# select last status update
$last_query_time = $dtf->format_datetime($last_query_time);
- $bugs = $s->resultset('Bug')->
- search_rs({-or => {'bin_associations.modified' => {'>=',$last_query_time},
- 'src_associations.modified' => {'>=',$last_query_time},
- 'me.log_modified' => {'>=',$last_query_time},
- 'me.last_modified' => {'>=',$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},
},
- {join => [{bug_binpackages =>
- {bin_pkg =>
- {bin_vers =>
- 'bin_associations'}}},
- {bug_srcpackages =>
+ {columns => [qw(bug_srcpackages.bug)],
+ join => {source =>
{src_pkg =>
- {src_vers =>
- 'src_associations'}}},
- ],
- columns => [qw(id)],
- distinct => 1,
- rows => 100,
- page => 1,
+ '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,
- columns => [qw(id)],
- });
+ ## 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());
+ @b_sub);
+ $page++;
$p->update($page) if defined $p;
}
+ $p->remove() if $p;
}