File Coverage

blib/lib/Arepa/CommandManager.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package Arepa::CommandManager;
2              
3 1     1   2150 use strict;
  1         2  
  1         30  
4 1     1   5 use warnings;
  1         1  
  1         26  
5              
6 1     1   1166 use File::Temp;
  1         9119  
  1         62  
7 1     1   416 use TheSchwartz;
  0            
  0            
8              
9             use Arepa::BuilderFarm;
10             use Arepa::Repository;
11             use Arepa::Builder;
12             use Arepa::Config;
13             use Arepa::Job::CompilePackage;
14              
15             my $ui_module = 'Arepa::UI::Text';
16              
17             sub ui_module {
18             my ($self, $module) = @_;
19              
20             Arepa::Builder->ui_module($module);
21             if (defined $module) {
22             $ui_module = $module;
23             }
24             eval qq(use $ui_module;);
25             die $@ if $@;
26             return $ui_module;
27             }
28              
29             sub print {
30             my ($self, @args) = @_;
31             $self->ui_module->print(@args);
32             }
33              
34             sub new {
35             my ($class, $config_file) = @_;
36              
37             return bless {
38             config_file => $config_file,
39             farm => Arepa::BuilderFarm->new($config_file),
40             repository => Arepa::Repository->new($config_file),
41             },
42             $class;
43             }
44              
45             sub _farm { $_[0]->{farm} }
46             sub _repository { $_[0]->{repository} }
47              
48             sub build_pending {
49             my ($self) = @_;
50              
51             my $conf = Arepa::Config->new($self->{config_file});
52             my $client = TheSchwartz->new(databases => [
53             { dsn => "dbi:SQLite:dbname=" . $conf->get_key('package_db') }
54             ]);
55             $client->can_do('Arepa::Job::CompilePackage');
56             $Arepa::Job::CompilePackage::PrintMessages = 1;
57             $client->work_until_done();
58             }
59              
60             sub recompile_request {
61             my ($self, $request_id) = @_;
62              
63             my %req = $self->_farm->package_db->
64             get_compilation_request_by_id($request_id);
65              
66             # Find out the builder for this compilation. If it's not claimed by any
67             # builder, get the first matching (there should be only one, really)
68             my $builder = $req{builder};
69             if (!$builder) {
70             ($builder) = $self->_farm->get_matching_builders($req{architecture},
71             $req{distribution});
72             }
73              
74             my %source_attrs = $self->_farm->package_db->
75             get_source_package_by_id($req{source_package_id});
76             $self->print("Compiling request id $req{id}\n");
77             $self->print("$source_attrs{name} ");
78             $self->print("$source_attrs{full_version} ");
79             $self->print("(arch: $req{architecture}, ");
80             $self->print("distro: $req{distribution}) ");
81             $self->print("with builder $builder...\n");
82             my $temp_dir = File::Temp::tempdir();
83             if ($self->_farm->compile_package_from_queue($builder,
84             $req{id},
85             output_dir => $temp_dir)) {
86             $self->print(" done.\n");
87             foreach my $deb_package (glob('*.deb')) {
88             $self->print("Adding $deb_package to the repository\n");
89             if ($self->_repository->
90             insert_binary_package($deb_package,
91             $req{distribution})) {
92             unlink $deb_package;
93             }
94             }
95             $self->_repository->sign_distribution($req{distribution});
96             }
97             else {
98             $self->print(" failed.\n");
99             $self->print("Log:\n".$self->_farm->last_build_log."\n");
100             }
101             rmtree($temp_dir);
102             }
103              
104             sub build_dsc {
105             my ($self, $builder, $dsc_file) = @_;
106              
107             my $temp_dir = File::Temp::tempdir();
108             $self->_farm->compile_package_from_dsc($builder, $dsc_file,
109             output_dir => $temp_dir);
110             foreach my $deb_package (glob('*.deb')) {
111             $self->print("Adding $deb_package to the repository\n");
112             if ($self->_repository->insert_binary_package($deb_package)) {
113             unlink $deb_package;
114             }
115             }
116             rmtree($temp_dir);
117             }
118              
119             sub request_source_pkg_compilation {
120             my ($self, $source_pkg, $distro, $arch) = @_;
121              
122             my $pkg_db = $self->_farm->package_db;
123             my $source_id = $pkg_db->get_source_package_id($source_pkg, '*latest*');
124             if ($source_id) {
125             my @targets = $self->_farm->get_compilation_targets($source_id);
126             my $target_found = 0;
127             foreach my $target (@targets) {
128             my ($target_arch, $target_distro) = @$target;
129              
130             if ((!defined($arch) || $target_arch eq $arch) &&
131             $target_distro eq $distro) {
132             $target_found = 1;
133             $pkg_db->request_compilation($source_id,
134             $target_arch,
135             $target_distro);
136             }
137             }
138             if (! $target_found) {
139             die "Distribution $distro (arch $arch) is not a valid target " .
140             "for $source_pkg.\nValid targets are: " .
141             join(", ", map { "$_->[0]/$_->[1]" } @targets) . "\n";
142             }
143             }
144             else {
145             die "Couldn't find source package $source_pkg\n";
146             }
147             }
148              
149             1;