7 use Fedora
::Rebuild
::Set
::Package
;
8 use Fedora
::Rebuild
::Package
;
9 use Fedora
::Rebuild
::Scheduler
;
17 rebuildlog - Back build logs up
21 rebuildlog [--config FILE] DIRECTORY
25 This tool copy build logs from configured Fedora::Rebuild location into given
30 my $cfgfile = File
::Spec
->catfile($ENV{HOME
}, '.rebuildperlrc');
47 =head2 --config I<FILE>
49 Read configuration from I<FILE>, or F<~/.rebuildperlrc> if not specified.
53 =head2 F<~/.rebuildperlrc>
55 Configuration is in L<Config::Tiny> format. Following options are needed:
60 failedtemp = failedtemp
69 my ($package, $destination) = @_;
71 my $directory = File
::Spec
->catfile($destination, 'packages',
73 File
::Path
::Tiny
::mk
($directory)
74 or die "Could not create directory `$directory': $!\n";
76 for (glob(File
::Spec
->catfile($package->mockdir, '*.log'))) {
77 copy
($_, $directory) or
78 die "Could not copy `$_' into `$directory': $!\n";
85 'config=s' => \
$cfgfile,
86 ) or die "Could not parse program options\n";
88 die "Missing directory name argument\n";
90 my $destination = $ARGV[0];
94 my $cfg = Config
::Tiny
->new->read($cfgfile);
96 print STDERR
"Could not parse `" . $cfgfile .
97 "' configuration file: " . $Config::Tiny
::errstr
. "\n";
100 foreach (keys %{$cfg->{_
}}) {
101 $config{$_} = $cfg->{_
}->{$_};
102 $config{$_} = eval $config{$_} if $_ eq 'buildrequiresfilter';
106 # Load list of packages
107 my $packages = Fedora
::Rebuild
::Set
::Package
->new();
108 print "Loading list of all packages...\n";
109 open(my $file, '<', $config{all
})
110 or die "Could not open file `$config{all}' for reading: $!\n";
111 while (local $_ = <$file>) {
113 if (m/^\s*$/) { next; }
114 if ($packages->contains($_)) { next; }
115 my $package = Fedora
::Rebuild
::Package
->new(name
=> $_,
116 workdir
=> $config{workdir
}, dist
=> $config{dist
},
117 pkgdist
=> $config{pkgdist
}, target
=> $config{target
},
118 message
=> $config{message
});
119 $packages->insert($package);
122 croak
"Could not read list of all packages: $!";
125 print "Number of packages: " . $packages->size() . "\n";
128 # Create destination directory
129 File
::Path
::Tiny
::mk
($destination)
130 or die "Could not create directory `$destination': $!\n";
131 # Copy package listings
132 for ('all', 'done', 'failed') {
133 my $output = File
::Spec
->catfile($destination, $_);
134 copy
($config{$_}, $output) or
135 die "Could not copy `$config{$_}' into `$output': $!\n";
140 my $scheduler = Fedora
::Rebuild
::Scheduler
->new(
141 limit
=> $config{loadthreads
},
142 name
=> 'Copying logs',
143 total
=> $packages->size
148 for my $package ($packages->packages) {
149 my $job = $scheduler->schedule(\
©logs
, $package, $destination);
150 if (! defined $job) {
153 $jobs{$job} = $package;
154 my %finished = $scheduler->finish(++$i < $packages->size);
156 while (my ($job, $status) = each %finished) {
157 my $package = $jobs{$job};
159 my ($retval, $exception) = @
$status;
161 print "Could not copy logs for package `", $package->name, "'";
162 if (defined $exception) {
163 print ": $exception";
167 print "Waiting for finishing scheduled jobs...\n";
168 $scheduler->finish(1);
169 print "All jobs have finished.\n";
170 croak
"Could not copy all logs.\n";