From 19110a30d53263136f7682b29f17e41134a06841 Mon Sep 17 00:00:00 2001 From: Daniel Lysfjord Date: Sun, 18 Aug 2019 21:22:10 +0200 Subject: [PATCH] Moved downloading to main job loop, changed print values, so that . = no update, D = downloaded update, F = program failure, E = error downloading file, | = retry --- pcurse | 114 ++++++++++++++++++++++++++---------------------------- pcurse.pm | 12 +++--- 2 files changed, 61 insertions(+), 65 deletions(-) diff --git a/pcurse b/pcurse index 546c6e7..13ec148 100755 --- a/pcurse +++ b/pcurse @@ -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; diff --git a/pcurse.pm b/pcurse.pm index e0f80e7..27b18c3 100644 --- a/pcurse.pm +++ b/pcurse.pm @@ -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' }; } }, });