Moved downloading to main job loop, changed print values, so that . = no update, D = downloaded update, F = program failure, E = error downloading file, | = retry

This commit is contained in:
2019-08-18 21:22:10 +02:00
parent be02db85ff
commit 19110a30d5
2 changed files with 61 additions and 65 deletions

114
pcurse
View File

@ -3,6 +3,7 @@ use strict;
no warnings 'all';
use feature ':5.10';
use IO::Tee;
use Data::Dumper;
use lib '.';
use pcurse;
@ -47,7 +48,9 @@ if(defined($opts->{'add'})) {
my $pool = pcurse::init_pool($conf->{'workers'});
my $worki = 0;
print 'Checking for updates ';
my %tounpack;
my @errors;
print 'Updating ';
foreach my $addon(@{$addons}) {
my $workid = $pool->job('check',$addon);
$jobs{$workid}{'todo'} = 'check';
@ -57,72 +60,61 @@ foreach my $addon(@{$addons}) {
}
while(scalar(keys %jobs)) {
my $jobid;
if(my @jres = $pool->result_any(\$jobid)) {
if($jres[0] == 1) {
my $a = $jres[1]; #Addon data structure
my $i = $jobs{$jobid}{'i'}; #ID from @{$addons}
my $v = $jres[1]->{'targetversion'}; #Version we're trying to fetch
die "Not enough params: a: $a, i: $i, v: $v" unless(defined($a) && defined($i) && defined($v));
my $nextjob = [ $i, $a, $v ];
push(@toupd,$nextjob);
} elsif($jres[1] eq 'No need to update') {
} else {
if(exists($jobs{$jobid}->{'retried'})) {
say 'Error during check: '.$jres[1];
if(my $jres = $pool->result_any(\$jobid)) {
if($jres->{'did'} eq 'check') {
if($jres->{'retval'} == 1) {
my $addon = $jres->{'addon'}; #Addon data structure
my $id = $jobs{$jobid}{'i'}; #ID from @{$addons}
my $version = $jres->{'addon'}->{'targetversion'}; #Version we're trying to fetch
die "Not enough params: addon: $addon, id: $id, version: $version" unless(defined($addon) && defined($id) && defined($version));
my $workid = $pool->job('download', $addon->{'downloaduri'},$addon->{'fileid'});
$jobs{$workid}{'todo'} = 'download';
$jobs{$workid}{'job'} = [ $addon->{'downloaduri'},$addon->{'fileid'} ];
$jobs{$workid}{'id'} = $id;
$jobs{$workid}{'tv'} = $version;
} elsif($jres->{'result'} eq 'No need to update') {
print '.';
} else {
print '|';
$jobs{$jobid}{'job'}->{'retried'} = 1;
my $workid = $pool->job('check', $jobs{$jobid}{'job'});
$jobs{$workid}{'todo'} = 'check';
$jobs{$workid}{'job'} = $jobs{$jobid}{'job'};
$jobs{$workid}{'i'} = $jobs{$jobid}{'i'};
if(exists($jobs{$jobid}->{'retried'})) {
push(@errors,'Error during check: '.$jres->{'addon'}->{'name'})
} else {
print '|';
$jobs{$jobid}{'job'}->{'retried'} = 1;
my $workid = $pool->job('check', $jobs{$jobid}{'job'});
$jobs{$workid}{'todo'} = 'check';
$jobs{$workid}{'job'} = $jobs{$jobid}{'job'};
$jobs{$workid}{'i'} = $jobs{$jobid}{'i'};
}
}
} elsif($jres->{'did'} eq 'download') {
if($jres->{'retval'} == 1) {
my $ret = $jres->{'retval'};
my $filename = $jres->{'filename'};
my $file = $jres->{'filecontent'};
my $version = $jobs{$jobid}{'tv'};
if(defined($filename)) {
$tounpack{$filename} = [ $jobs{$jobid}{'id'},$file,$version ];
print 'D';
} else {
print 'F';
my $ai = $jobs{$jobid}{'id'};
my $an = $addons->[$ai]->{'name'};
push(@errors,'Passed an empty filename? in update '.$an)
}
} else {
print 'E';
my $uri = $jres->{'uri'};
push(@errors, 'Download failed for '.$uri);
}
} else {
print Dumper $jres;
}
delete $jobs{$jobid};
print '.';
}
}
print "\n";
print 'Downloading updates ' if(scalar(@toupd));
foreach my $a(@toupd) {
my $id = $a->[0];
my $addon = $a->[1];
my $version = $a->[2];
my $workid = $pool->job('download',$addon->{'downloaduri'},$addon->{'fileid'});
$jobs{$workid}{'todo'} = 'download';
$jobs{$workid}{'job'} = [ $addon->{'downloaduri'},$addon->{'fileid'} ];
$jobs{$workid}{'id'} = $id;
$jobs{$workid}{'tv'} = $version;
}
my %tounpack;
while(scalar(keys %jobs)) {
my $jobid;
if(my @jres = $pool->result_any(\$jobid)) {
if($jres[0]{'retval'} == 1) {
my $ret = $jres[0]{'retval'};
my $filename = $jres[0]{'filename'};
my $file = $jres[0]{'filecontent'};
my $version = $jobs{$jobid}{'tv'};
if(defined($filename)) {
$tounpack{$filename} = [ $jobs{$jobid}{'id'},$file,$version ];
} else {
my $ai = $jobs{$jobid}{'id'};
my $an = $addons->[$ai]->{'name'};
say 'Passed an empty filename? in update';
}
} else {
my $uri = shift;
say 'Download failed for '.$uri;
}
delete $jobs{$jobid};
print '.';
}
}
$pool->shutdown;
print "\n" if(scalar(@toupd));
print "\n";
say 'Unpacking updates ' if(scalar(keys %tounpack));
foreach my $unpacking(keys %tounpack) {
@ -137,6 +129,10 @@ foreach my $unpacking(keys %tounpack) {
}
}
foreach my $err(@errors) {
say $err;
}
($ret,$msg) = pcurse::save_config($conf->{'addons'},$addons);
print $msg."\n" unless($ret);
close $lf;

View File

@ -326,22 +326,22 @@ sub init_pool {
$addon->{'downloaduri'} = $addon->{'host'}.$addon->{'uri'}.'/download/'.$fileid.'/file';
}
$addon->{'targetversion'} = $version;
return (1,$addon);
return { retval => 1, did => 'check', addon => $addon };
}
} else {
return (0,'No need to update');
return { retval => 0, did => 'check', result => 'No need to update', addon => $addon };
}
} else {
return (0,'Could not find file id for '.$addon->{'name'});
return { retval => 0, did => 'check', result => 'Could not find file id for '.$addon->{'name'} };
}
} elsif($todo eq 'download') {
my $uri = shift;
my $fileid = shift;
my ($ret,$filename,$file) = pcurse::download_update($uri,$fileid);
return { retval => $ret, filename => $filename, filecontent => $file } if($ret);
return { retval => 0, filename => undef, filecontent => undef };
return { retval => $ret, did => 'download', filename => $filename, filecontent => $file } if($ret);
return { retval => 0, did => 'download', filename => undef, filecontent => undef, uri => $uri };
} else {
return (0,'Unknown task');
return { retval => 0, result => 'Unknown task' };
}
},
});