aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Iurt/File.pm
diff options
context:
space:
mode:
authorPascal Terjan <pterjan@gmail.com>2016-02-06 19:25:30 +0000
committerPascal Terjan <pterjan@gmail.com>2016-02-06 19:32:23 +0000
commit864724bdc23083703d0ffd6e1688cd847e0aa64d (patch)
treee0542e7775e0045cd5f37b66e9b9a00b41fdf9a9 /lib/Iurt/File.pm
parentdb34c27b7fb2d558d733257041e3f28bf30c85a3 (diff)
downloadiurt-864724bdc23083703d0ffd6e1688cd847e0aa64d.tar
iurt-864724bdc23083703d0ffd6e1688cd847e0aa64d.tar.gz
iurt-864724bdc23083703d0ffd6e1688cd847e0aa64d.tar.bz2
iurt-864724bdc23083703d0ffd6e1688cd847e0aa64d.tar.xz
iurt-864724bdc23083703d0ffd6e1688cd847e0aa64d.zip
Better modules split
Diffstat (limited to 'lib/Iurt/File.pm')
-rw-r--r--lib/Iurt/File.pm208
1 files changed, 13 insertions, 195 deletions
diff --git a/lib/Iurt/File.pm b/lib/Iurt/File.pm
index 33be6a1..7f28628 100644
--- a/lib/Iurt/File.pm
+++ b/lib/Iurt/File.pm
@@ -9,208 +9,26 @@ use MDK::Common qw(cat_ find member partition);
use strict;
our @EXPORT = qw(
- get_upload_tree_state
- cleanup_failed_build
+ create_file
+ check_file_timeout
+ read_line
);
-sub apply_to_upload_tree {
- my ($tree_root, $func) = @_;
-
- # Squash double slashes for cosmetics
- $tree_root =~ s!/+!/!g;
-
- opendir(my $dir, $tree_root);
- plog('INFO', "check dir: $tree_root");
-
- foreach my $f (readdir $dir) {
- $f =~ /^\.{1,2}$/ and next;
- if (-d "$tree_root/$f") {
- plog('DEBUG', "checking target $tree_root/$f");
- opendir my $target_dir, "$tree_root/$f";
-
- foreach my $m (readdir $target_dir) {
- $m =~ /^\.{1,2}$/ and next;
- if (-d "$tree_root/$f/$m") {
- plog('DEBUG', "checking media $tree_root/$f/$m");
- opendir my $media_dir, "$tree_root/$f/$m";
-
- foreach my $s (readdir $media_dir) {
- $s =~ /^\.{1,2}$/ and next;
- if (-d "$tree_root/$f/$m/$s") {
- if ($func) {
- opendir my $submedia_dir, "$tree_root/$f/$m/$s";
- foreach my $r (readdir $submedia_dir) {
- $r =~ /^\.{1,2}$/ and next;
- $func->($tree_root, $f, $m, $s, $r);
- }
- }
- }
- }
- }
- }
- }
- }
-}
-
-sub cleanup_failed_build {
- my ($todo_dir, $done_dir, $fail_dir, $prefix, $ent, $arch, $config) = @_;
-
- my $mandatory_arch = get_mandatory_arch($config, $ent->{target});
- my $fatal_failure = member($arch, @$mandatory_arch) || $arch eq 'noarch';
-
- my ($failed_rpms, $kept_rpms);
- if ($fatal_failure) {
- plog('DEBUG', "failure is for mandatory arch $arch, aborting build");
- $failed_rpms = $ent->{rpms};
- } else {
- plog('DEBUG', "failure is for non-mandatory arch $arch, keeping other builds going");
- ($failed_rpms, $kept_rpms) = partition { /\.$arch\.rpm$/ } @{$ent->{rpms}};
- }
-
- foreach my $rpm (@$failed_rpms) {
- my $file = "$done_dir/${prefix}_$rpm";
- plog('DEBUG', "moving built rpm $file to $fail_dir/");
- move($file, "$fail_dir/${prefix}_$rpm");
- }
-
- if (!$fatal_failure) {
- # keep rpms for other architectures
- $ent->{rpms} = $kept_rpms;
- return;
- }
-
- # abort all remaining builds
- delete $ent->{rpms};
-
- foreach my $srpm (@{$ent->{srpms}}) {
- my $file = "$todo_dir/${prefix}_$srpm";
- plog('DEBUG', "moving $file to $fail_dir/");
- move($file, "$fail_dir/${prefix}_$srpm");
- # If one arch has been generated, we also have a src.rpm in done
- $file = "$done_dir/${prefix}_$srpm";
- if (-f $file) {
- plog('DEBUG', "deleting $file");
- unlink $file;
- }
- }
+sub create_file {
+ my $file = shift;
+ my @contents = @_;
- if (-d "$done_dir/$prefix") {
- make_path("$fail_dir/$prefix");
- foreach my $file (glob "$done_dir/$prefix/*") {
- plog('DEBUG', "moving $file to $fail_dir/$prefix/");
- move($file, "$fail_dir/$prefix/");
- }
- }
+ open my $FILE, ">$file" or die "FATAL: can't open $file for writing";
+ print $FILE "@contents";
}
-sub get_upload_tree_state {
- our ($config) = @_;
-
- our %pkg_tree;
- my $todo = "$config->{queue}/todo";
- my $done = "$config->{queue}/done";
-
- sub todo_func {
- my ($todo, $f, $m, $s, $r) = @_;
-
- my $media = "$m/$s";
-
- if ($r =~ /(\d{14}\.(\w+)\.\w+\.\d+)_(.*\.src\.rpm)$/) {
- my ($prefix, $user, $srpm) = ($1, $2, $3);
-
- plog('DEBUG', "found srpm $srpm ($prefix)");
- $pkg_tree{$prefix}{media}{$media}{path} = "/$f/$m/$s";
- $pkg_tree{$prefix}{target} = $f;
- $pkg_tree{$prefix}{user} = $user;
- push @{$pkg_tree{$prefix}{srpms}} , $srpm;
- my ($name) = $srpm =~ /(.*)-[^-]+-[^-]+\.src\.rpm$/;
-
- $pkg_tree{$prefix}{srpm_name}{$name} = $srpm;
- }
-
- if ($r =~ /(\d{14}\.\w+\.\w+\.\d+)_([\w-]+)\.(\w+)\.(\w+)\.(\d{14})\.(\d+)\.lock$/) {
- my ($prefix, $arch, $bot, $host, $date, $pid) = ($1, $2, $3, $4, $5, $6);
-
- # Set path here too has we may have a lock without the src.rpm
- $pkg_tree{$prefix}{media}{$media}{path} = "/$f/$m/$s";
-
- $arch = $config->{arch_translation}{$arch} if $config->{arch_translation}{$arch};
- plog('DEBUG', "found lock on $host/$arch for $prefix");
-
- if ($arch =~ /noarch/) {
- plog('DEBUG', "... and $prefix is noarch");
- $pkg_tree{$prefix}{media}{$media}{arch}{noarch} = 1;
- $arch =~ s/-.*//;
- }
-
- $pkg_tree{$prefix}{media}{$media}{arch}{$arch} = 1;
-
- my $time = read_line("$todo/$f/$m/$s/$r");
- $time = (split ' ', $time)[2];
- push @{$pkg_tree{$prefix}{media}{$media}{bot}}, {
- bot => $bot,
- host => $host,
- date => $date,
- pid => $pid,
- 'arch' => $arch,
- 'time' => $time
- };
- }
-
- if ($r =~ /(\d{14}\.\w+\.\w+\.\d+)_.*\.deps$/) {
- my $prefix = $1;
- my @deps = map { chomp(); $_ } cat_("$todo/$f/$m/$s/$r");
- plog('DEBUG', "Adding dependency $_ ($prefix)") foreach @deps;
-
- $pkg_tree{$prefix}{deps} = \@deps;
- }
- }
-
- sub done_func {
- my ($_todo, $f, $m, $s, $r) = @_;
-
- my $media = "$m/$s";
-
- if ($r =~ /^(\d{14}\.\w+\.\w+\.\d+)([_.].+)$/) {
- my ($prefix, $suffix) = ($1, $2);
- $pkg_tree{$prefix}{media}{$media}{path} = "/$f/$m/$s";
- if ($suffix =~ /^_(.*\.([^.]+)\.rpm)$/) {
- my ($rpm, $arch) = ($1, $2);
- $arch = $config->{arch_translation}{$arch} if $config->{arch_translation}{$arch};
- plog('DEBUG', "found already built rpm $rpm ($prefix) for media $media");
- $pkg_tree{$prefix}{target} = $f;
- if ($arch eq 'src') {
- $pkg_tree{$prefix}{media}{$media}{arch}{src} = 1;
- }
- push @{$pkg_tree{$prefix}{media}{$media}{rpms}} , $rpm;
- push @{$pkg_tree{$prefix}{rpms}} , $rpm;
- } elsif ($suffix =~ /^_(\w+)\.(\w+)$/) {
- my ($arch, $result) = ($1, $2);
- plog('DEBUG', "found .$result ($prefix) for $arch");
- if ($result eq 'done') {
- $pkg_tree{$prefix}{media}{$media}{arch}{$arch} = 1;
- } elsif ($result eq 'excluded') {
- $arch = $config->{arch_translation}{$arch} if $config->{arch_translation}{$arch};
- $pkg_tree{$prefix}{media}{$media}{excluded_arch}{$arch} = 1;
- } elsif ($result eq 'fail') {
- $pkg_tree{$prefix}{media}{$media}{failed_arch}{$arch} = 1;
- } else {
- plog('WARNING', "unknown state $arch.$result for $prefix");
- }
- } elsif ($suffix =~ /^\.(\w+)$/) {
- my $action = $1;
- if ($action eq 'upload') {
- plog('DEBUG', "found already uploaded ($prefix)");
- $pkg_tree{$prefix}{media}{$media}{uploaded} = 1;
- }
- }
- }
- }
+sub check_file_timeout {
+ my ($file, $time) = @_;
- apply_to_upload_tree($done, \&done_func);
- apply_to_upload_tree($todo, \&todo_func);
+ my $i = 0;
+ while ($i < $time && (!-f $file || -z $file)) { sleep 1; $i++ }
- return %pkg_tree;
+ $i == $time;
}
sub read_line {