my $rhelcvsroot=q{:pserver:anonymous:@192.168.67.2:3401/cvs/dist};
my $arch_i386=qr{(?:x86|i\d86|ia32)}io;
my $arch_x86_64=qr{(?:x8664|x86_64|em64t)}io;
+my $resultdir=$ENV{"HOME"}."/.hammock-result";
my @arches=qw(i386 x86_64);
my $error=0;
}
}
-sub newdir($)
+# "-p", "mayexist"
+sub newdir($;@)
{
- my($dir)=@_;
+ my($dir,@opt)=@_;
- warn "+ mkdir $dir\n";
- mkdir $dir or die "mkdir $dir: $!";
+ my %opt=map(($_=>1),@opt);
+ warn "+ mkdir".($opt{"-p"} ? " -p" : "")." $dir\n";
+ mkdir $dir or ($opt{"mayexist"} && $!{EEXIST}) or die "mkdir $dir: $!";
}
my $log;
-sub spawn($)
+# "bare"
+sub spawn($;%)
{
- my($cmd)=@_;
-
- $cmd="set -ex; $cmd";
- my $ok="$log.ok" if $log;
- $cmd="($cmd; touch $ok) 2>&1|tee -a $log; test -f $ok" if $log;
- unlink $ok if $ok;
+ my($cmd,@opt)=@_;
+
+ my %opt=map(($_=>1),@opt);
+ my $ok;
+ if (!$opt{"bare"}) {
+ $cmd="set -ex; $cmd";
+ $ok="$log.ok" if $log;
+ $cmd="($cmd; touch $ok) 2>&1|tee -a $log; test -f $ok" if $log;
+ unlink $ok if $ok;
+ } else {
+ warn "+ $cmd\n";
+ }
# warn "+ $cmd\n";
system $cmd and die "$cmd: $!";
unlink $ok if $ok;
}
my $basedir=$ENV{"HOME"}."/hammock";
--d $basedir or newdir $basedir;
+newdir $basedir,"mayexist";
my $idbase=strftime("%Y%m%d",localtime());
my $id;
my $dir;
spawn "renice 20 -p $$";
newdir $dir;
$log="$dir/log";
+my $resultid="$resultdir/$id";
+my $resultidxz="$resultid.tar.xz";
+newdir $resultdir,"mayexist";
+spawn "rm -rf $resultid" if -d $resultid && $force;
+newdir $resultid;
+unlink $resultidxz or $!{ENOENT} or die "unlink $resultidxz: $!";
spawn "uname -r >$dir/kernel";
my %dump=(
"path"=>$path,
"configure"=>$configure,
);
while (my($name,$val)=each(%dump)) {
- writefile "$dir/$name","$val\n" if $val;
+ next if !$val;
+ writefile "$dir/$name","$val\n";
+ link "$dir/$name","$resultid/$name" or warn "link $dir/$name $resultid/$name: $!";
+}
+for my $file (@file) {
+ newdir "$dir/file.d","mayexist";
+ (my $base=$file)=~s{^.*/}{};
+ my $d="$dir/file.d/$base";
+ link $file,$d or die "link $file $d: $!";
+ newdir "$resultid/file.d","mayexist";
+ link $d,"$resultid/file.d/$base" or warn "link $file $resultid/file.d/$base: $!";
}
sub subst
spawn "gdbunpack $log";
}
+ my $resultout="$resultdir/$id/$distrodirbase";
+ newdir $resultout;
+ $resultout.="/out";
+ newdir $resultout;
+ for my $fname (glob "$out/*") {
+ (my $base=$fname)=~s{^.*/}{};
+ my $d="$resultout/$base";
+ warn "+ link $fname $d\n";
+ link $fname,$d or warn $!;
+ }
+
exit 0 if $parallel>1;
}
die if keys(%child);
die if @distrouse;
+spawn "(set -e -o pipefail;cd $resultdir;tar cf - $id|xz -9e >$resultidxz;rm -rf $id)&","bare";
+
sub timestr($)
{
my($sec)=@_;