diff --git a/lib/Cavil.pm b/lib/Cavil.pm index 74a814b77f..3823d0d391 100644 --- a/lib/Cavil.pm +++ b/lib/Cavil.pm @@ -130,7 +130,8 @@ sub startup { state $pkgs = Cavil::Model::Packages->new( checkout_dir => $config->{checkout_dir}, minion => $self->minion, - pg => shift->pg + pg => shift->pg, + log => $self->log ); } ); diff --git a/lib/Cavil/Model/Packages.pm b/lib/Cavil/Model/Packages.pm index d08a8a48fb..d5e709f5ac 100644 --- a/lib/Cavil/Model/Packages.pm +++ b/lib/Cavil/Model/Packages.pm @@ -19,7 +19,7 @@ use Mojo::Base -base; use Mojo::File 'path'; use Mojo::Util 'dumper'; -has [qw(checkout_dir minion pg)]; +has [qw(checkout_dir minion pg log)]; sub add { my ($self, %args) = @_; @@ -228,8 +228,8 @@ sub reindex { $db->delete('bot_reports', {package => $id}); my $unpacked = path( - $self->{checkout_dir}, $pkg->{name}, - $pkg->{checkout_dir}, '.postprocessed.json' + $self->checkout_dir, $pkg->{name}, + $pkg->{checkout_dir}, '.postprocessed.json' ); -f $unpacked ? $self->index($id, $priority) : $self->unpack($id, $priority); @@ -301,4 +301,62 @@ sub _enqueue { ); } +sub cleanup { + my ($self, $id) = @_; + + my $db = $self->pg->db; + return + unless my $pkg + = $db->select('bot_packages', ['name', 'checkout_dir'], {id => $id})->hash; + + my $tx = $db->begin; + $db->query('delete from bot_reports where package = ?', $id); + $db->query('delete from emails where package = ?', $id); + $db->query('delete from urls where package = ?', $id); + $db->query('delete from pattern_matches where package = ?', $id); + $db->query('delete from matched_files where package = ?', $id); + $tx->commit; + + my $dir = path($self->checkout_dir, $pkg->{name}, $pkg->{checkout_dir}); + return unless -d $dir; + + $self->log->info("[$id] Remove $pkg->{name}/$pkg->{checkout_dir}"); + $dir->remove_tree; +} + +sub reimport { + my ($self, $id) = @_; + my $db = $self->pg->db; + + my $pkg = $self->find($id); + my $source = $db->select('bot_sources', '*', {id => $pkg->{source}})->hash; + + my $priority; + for my $opkg ( + @{ + $db->select('bot_packages', 'id,priority', + {name => $pkg->{name}, id => {'!=', $pkg->{id}}, state => 'new'}) + ->hashes + } + ) + { + $priority = 2; + } + $priority = $pkg->{priority} if $pkg->{state} eq 'new'; + my $job = $self->obs_import( + $pkg->{id}, + { + api => $source->{api_url}, + project => $source->{project}, + pkg => $source->{package}, + srcpkg => $pkg->{name}, + srcmd5 => $source->{srcmd5}, + verifymd5 => $pkg->{checkout_dir}, + priority => $priority // 1 + }, + 9 + ); + return $job; +} + 1; diff --git a/lib/Cavil/Task/Cleanup.pm b/lib/Cavil/Task/Cleanup.pm index 78daaa4f32..c311e0bd3c 100644 --- a/lib/Cavil/Task/Cleanup.pm +++ b/lib/Cavil/Task/Cleanup.pm @@ -49,26 +49,7 @@ sub _cleanup_batch { my $log = $app->log; my $db = $app->pg->db; - for my $id (@ids) { - next - unless my $pkg - = $db->select('bot_packages', ['name', 'checkout_dir'], {id => $id}) - ->hash; - - my $dir - = path($app->config->{checkout_dir}, $pkg->{name}, $pkg->{checkout_dir}); - next unless -d $dir; - - $log->info("[$id] Remove $pkg->{name}/$pkg->{checkout_dir}"); - my $tx = $db->begin; - $db->query('delete from bot_reports where package = ?', $id); - $db->query('delete from emails where package = ?', $id); - $db->query('delete from urls where package = ?', $id); - $db->query('delete from pattern_matches where package = ?', $id); - $db->query('delete from matched_files where package = ?', $id); - $tx->commit; - $dir->remove_tree; - } + map { $app->packages->cleanup($_) } @ids; } sub _obsolete { diff --git a/lib/Cavil/Task/Import.pm b/lib/Cavil/Task/Import.pm index aea96fb7bb..449bf998b7 100644 --- a/lib/Cavil/Task/Import.pm +++ b/lib/Cavil/Task/Import.pm @@ -22,6 +22,19 @@ use Mojo::File 'path'; sub register { my ($self, $app) = @_; $app->minion->add_task(obs_import => \&_obs); + $app->minion->add_task(reimport => \&_reimport); +} + +sub _reimport { + my ($job, $id) = @_; + + my $app = $job->app; + my $log = $app->log; + + $app->packages->cleanup($id); + $app->pg->db->update('bot_packages', {indexed => undef}, {id => $id}); + $app->pg->db->delete('bot_reports', {package => $id}); + $app->packages->reimport($id); } sub _obs { @@ -33,6 +46,7 @@ sub _obs { my $checkout_dir = $app->config->{checkout_dir}; my ($srcpkg, $verifymd5, $api, $project, $pkg, $srcmd5, $priority) = @{$data}{qw(srcpkg verifymd5 api project pkg srcmd5 priority)}; + die "Missing args" unless $srcpkg && $verifymd5; my $dir = path($checkout_dir, $srcpkg, $verifymd5); my $obs = $app->obs;