1*c2e0c6b5SAndroid Build Coastguard Worker#!/usr/bin/perl 2*c2e0c6b5SAndroid Build Coastguard Worker# A simple system for making software releases 3*c2e0c6b5SAndroid Build Coastguard Worker# (c) 2003--2011 Martin Mares <[email protected]> 4*c2e0c6b5SAndroid Build Coastguard Worker 5*c2e0c6b5SAndroid Build Coastguard Workerpackage UCW::Release; 6*c2e0c6b5SAndroid Build Coastguard Workeruse strict; 7*c2e0c6b5SAndroid Build Coastguard Workeruse warnings; 8*c2e0c6b5SAndroid Build Coastguard Workeruse Getopt::Long; 9*c2e0c6b5SAndroid Build Coastguard Worker 10*c2e0c6b5SAndroid Build Coastguard Workerour $verbose = 0; 11*c2e0c6b5SAndroid Build Coastguard Worker 12*c2e0c6b5SAndroid Build Coastguard Workersub new($$) { 13*c2e0c6b5SAndroid Build Coastguard Worker my ($class,$basename) = @_; 14*c2e0c6b5SAndroid Build Coastguard Worker my $s = { 15*c2e0c6b5SAndroid Build Coastguard Worker "PACKAGE" => $basename, 16*c2e0c6b5SAndroid Build Coastguard Worker "rules" => [ 17*c2e0c6b5SAndroid Build Coastguard Worker # p=preprocess, s=subst, -=discard 18*c2e0c6b5SAndroid Build Coastguard Worker '(^|/)(CVS|\.arch-ids|{arch}|\.git|tmp)/' => '-', 19*c2e0c6b5SAndroid Build Coastguard Worker '\.sw[a-z]$' => '-', 20*c2e0c6b5SAndroid Build Coastguard Worker '\.(lsm|spec)$' => 'ps', 21*c2e0c6b5SAndroid Build Coastguard Worker '(^|/)README$' => 's' 22*c2e0c6b5SAndroid Build Coastguard Worker ], 23*c2e0c6b5SAndroid Build Coastguard Worker "directories" => [ 24*c2e0c6b5SAndroid Build Coastguard Worker ], 25*c2e0c6b5SAndroid Build Coastguard Worker "conditions" => { 26*c2e0c6b5SAndroid Build Coastguard Worker }, 27*c2e0c6b5SAndroid Build Coastguard Worker "DATE" => `date '+%Y-%m-%d' | tr -d '\n'`, 28*c2e0c6b5SAndroid Build Coastguard Worker "LSMDATE" => `date '+%y%m%d' | tr -d '\n'`, 29*c2e0c6b5SAndroid Build Coastguard Worker "distfiles" => [ 30*c2e0c6b5SAndroid Build Coastguard Worker ], 31*c2e0c6b5SAndroid Build Coastguard Worker "archivedir" => $ENV{HOME} . "/archives/sw/$basename", 32*c2e0c6b5SAndroid Build Coastguard Worker "uploads" => [ 33*c2e0c6b5SAndroid Build Coastguard Worker ], 34*c2e0c6b5SAndroid Build Coastguard Worker # Options 35*c2e0c6b5SAndroid Build Coastguard Worker "do_test" => 1, 36*c2e0c6b5SAndroid Build Coastguard Worker "do_patch" => 1, 37*c2e0c6b5SAndroid Build Coastguard Worker "diff_against" => "", 38*c2e0c6b5SAndroid Build Coastguard Worker "do_upload" => 1, 39*c2e0c6b5SAndroid Build Coastguard Worker "do_sign" => 1, 40*c2e0c6b5SAndroid Build Coastguard Worker }; 41*c2e0c6b5SAndroid Build Coastguard Worker bless $s; 42*c2e0c6b5SAndroid Build Coastguard Worker return $s; 43*c2e0c6b5SAndroid Build Coastguard Worker} 44*c2e0c6b5SAndroid Build Coastguard Worker 45*c2e0c6b5SAndroid Build Coastguard Workersub GetVersionFromFile($) { 46*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$file,$rx) = @_; 47*c2e0c6b5SAndroid Build Coastguard Worker open F, $file or die "Unable to open $file for version autodetection"; 48*c2e0c6b5SAndroid Build Coastguard Worker while (<F>) { 49*c2e0c6b5SAndroid Build Coastguard Worker chomp; 50*c2e0c6b5SAndroid Build Coastguard Worker if (/$rx/) { 51*c2e0c6b5SAndroid Build Coastguard Worker $s->{"VERSION"} = $1; 52*c2e0c6b5SAndroid Build Coastguard Worker print "Detected version $1 from $file\n" if $verbose; 53*c2e0c6b5SAndroid Build Coastguard Worker last; 54*c2e0c6b5SAndroid Build Coastguard Worker } 55*c2e0c6b5SAndroid Build Coastguard Worker } 56*c2e0c6b5SAndroid Build Coastguard Worker close F; 57*c2e0c6b5SAndroid Build Coastguard Worker if (!defined $s->{"VERSION"}) { die "Failed to auto-detect version"; } 58*c2e0c6b5SAndroid Build Coastguard Worker return $s->{"VERSION"}; 59*c2e0c6b5SAndroid Build Coastguard Worker} 60*c2e0c6b5SAndroid Build Coastguard Worker 61*c2e0c6b5SAndroid Build Coastguard Workersub GetVersionsFromChangelog($) { 62*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$file,$rx) = @_; 63*c2e0c6b5SAndroid Build Coastguard Worker open F, $file or die "Unable to open $file for version autodetection"; 64*c2e0c6b5SAndroid Build Coastguard Worker while (<F>) { 65*c2e0c6b5SAndroid Build Coastguard Worker chomp; 66*c2e0c6b5SAndroid Build Coastguard Worker if (/$rx/) { 67*c2e0c6b5SAndroid Build Coastguard Worker if (!defined $s->{"VERSION"}) { 68*c2e0c6b5SAndroid Build Coastguard Worker $s->{"VERSION"} = $1; 69*c2e0c6b5SAndroid Build Coastguard Worker print "Detected version $1 from $file\n" if $verbose; 70*c2e0c6b5SAndroid Build Coastguard Worker } elsif ($s->{"VERSION"} eq $1) { 71*c2e0c6b5SAndroid Build Coastguard Worker # do nothing 72*c2e0c6b5SAndroid Build Coastguard Worker } else { 73*c2e0c6b5SAndroid Build Coastguard Worker $s->{"OLDVERSION"} = $1; 74*c2e0c6b5SAndroid Build Coastguard Worker print "Detected previous version $1 from $file\n" if $verbose; 75*c2e0c6b5SAndroid Build Coastguard Worker last; 76*c2e0c6b5SAndroid Build Coastguard Worker } 77*c2e0c6b5SAndroid Build Coastguard Worker } 78*c2e0c6b5SAndroid Build Coastguard Worker } 79*c2e0c6b5SAndroid Build Coastguard Worker close F; 80*c2e0c6b5SAndroid Build Coastguard Worker if (!defined $s->{"VERSION"}) { die "Failed to auto-detect version"; } 81*c2e0c6b5SAndroid Build Coastguard Worker return $s->{"VERSION"}; 82*c2e0c6b5SAndroid Build Coastguard Worker} 83*c2e0c6b5SAndroid Build Coastguard Worker 84*c2e0c6b5SAndroid Build Coastguard Workersub InitDist($) { 85*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$dd) = @_; 86*c2e0c6b5SAndroid Build Coastguard Worker $s->{"DISTDIR"} = $dd; 87*c2e0c6b5SAndroid Build Coastguard Worker print "Initializing dist directory $dd\n" if $verbose; 88*c2e0c6b5SAndroid Build Coastguard Worker `rm -rf $dd`; die if $?; 89*c2e0c6b5SAndroid Build Coastguard Worker `mkdir -p $dd`; die if $?; 90*c2e0c6b5SAndroid Build Coastguard Worker} 91*c2e0c6b5SAndroid Build Coastguard Worker 92*c2e0c6b5SAndroid Build Coastguard Workersub ExpandVar($$) { 93*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$v) = @_; 94*c2e0c6b5SAndroid Build Coastguard Worker if (defined $s->{$v}) { 95*c2e0c6b5SAndroid Build Coastguard Worker return $s->{$v}; 96*c2e0c6b5SAndroid Build Coastguard Worker } else { 97*c2e0c6b5SAndroid Build Coastguard Worker die "Reference to unknown variable $v"; 98*c2e0c6b5SAndroid Build Coastguard Worker } 99*c2e0c6b5SAndroid Build Coastguard Worker} 100*c2e0c6b5SAndroid Build Coastguard Worker 101*c2e0c6b5SAndroid Build Coastguard Workersub CopyFile($$$$) { 102*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$f,$dir,$action) = @_; 103*c2e0c6b5SAndroid Build Coastguard Worker 104*c2e0c6b5SAndroid Build Coastguard Worker (my $d = $f) =~ s@(^|/)[^/]*$@@; 105*c2e0c6b5SAndroid Build Coastguard Worker $d = "$dir/$d"; 106*c2e0c6b5SAndroid Build Coastguard Worker -d $d || `mkdir -p $d`; die if $?; 107*c2e0c6b5SAndroid Build Coastguard Worker 108*c2e0c6b5SAndroid Build Coastguard Worker my $preprocess = ($action =~ /p/); 109*c2e0c6b5SAndroid Build Coastguard Worker my $subst = ($action =~ /s/); 110*c2e0c6b5SAndroid Build Coastguard Worker if ($preprocess || $subst) { 111*c2e0c6b5SAndroid Build Coastguard Worker open I, "$f" or die "open($f): $?"; 112*c2e0c6b5SAndroid Build Coastguard Worker open O, ">$dir/$f" or die "open($dir/$f): $!"; 113*c2e0c6b5SAndroid Build Coastguard Worker my @ifs = (); # stack of conditions, 1=satisfied 114*c2e0c6b5SAndroid Build Coastguard Worker my $empty = 0; # last line was empty 115*c2e0c6b5SAndroid Build Coastguard Worker my $is_makefile = ($f =~ /(Makefile|.mk)$/); 116*c2e0c6b5SAndroid Build Coastguard Worker while (<I>) { 117*c2e0c6b5SAndroid Build Coastguard Worker if ($subst) { 118*c2e0c6b5SAndroid Build Coastguard Worker s/@([0-9A-Za-z_]+)@/$s->ExpandVar($1)/ge; 119*c2e0c6b5SAndroid Build Coastguard Worker } 120*c2e0c6b5SAndroid Build Coastguard Worker if ($preprocess) { 121*c2e0c6b5SAndroid Build Coastguard Worker if (/^#/ || $is_makefile) { 122*c2e0c6b5SAndroid Build Coastguard Worker if (/^#?ifdef\s+(\w+)/) { 123*c2e0c6b5SAndroid Build Coastguard Worker if (defined ${$s->{"conditions"}}{$1}) { 124*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, ${$s->{"conditions"}}{$1}; 125*c2e0c6b5SAndroid Build Coastguard Worker next; 126*c2e0c6b5SAndroid Build Coastguard Worker } 127*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, 0; 128*c2e0c6b5SAndroid Build Coastguard Worker } elsif (/^#ifndef\s+(\w+)/) { 129*c2e0c6b5SAndroid Build Coastguard Worker if (defined ${$s->{"conditions"}}{$1}) { 130*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, -${$s->{"conditions"}}{$1}; 131*c2e0c6b5SAndroid Build Coastguard Worker next; 132*c2e0c6b5SAndroid Build Coastguard Worker } 133*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, 0; 134*c2e0c6b5SAndroid Build Coastguard Worker } elsif (/^#if\s+/) { 135*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, 0; 136*c2e0c6b5SAndroid Build Coastguard Worker } elsif (/^#?endif/) { 137*c2e0c6b5SAndroid Build Coastguard Worker my $x = pop @ifs; 138*c2e0c6b5SAndroid Build Coastguard Worker defined $x or die "Improper nesting of conditionals"; 139*c2e0c6b5SAndroid Build Coastguard Worker $x && next; 140*c2e0c6b5SAndroid Build Coastguard Worker } elsif (/^#?else/) { 141*c2e0c6b5SAndroid Build Coastguard Worker my $x = pop @ifs; 142*c2e0c6b5SAndroid Build Coastguard Worker defined $x or die "Improper nesting of conditionals"; 143*c2e0c6b5SAndroid Build Coastguard Worker push @ifs, -$x; 144*c2e0c6b5SAndroid Build Coastguard Worker $x && next; 145*c2e0c6b5SAndroid Build Coastguard Worker } 146*c2e0c6b5SAndroid Build Coastguard Worker } 147*c2e0c6b5SAndroid Build Coastguard Worker @ifs && $ifs[$#ifs] < 0 && next; 148*c2e0c6b5SAndroid Build Coastguard Worker if (/^$/) { 149*c2e0c6b5SAndroid Build Coastguard Worker $empty && next; 150*c2e0c6b5SAndroid Build Coastguard Worker $empty = 1; 151*c2e0c6b5SAndroid Build Coastguard Worker } else { $empty = 0; } 152*c2e0c6b5SAndroid Build Coastguard Worker } 153*c2e0c6b5SAndroid Build Coastguard Worker print O; 154*c2e0c6b5SAndroid Build Coastguard Worker } 155*c2e0c6b5SAndroid Build Coastguard Worker close O; 156*c2e0c6b5SAndroid Build Coastguard Worker close I; 157*c2e0c6b5SAndroid Build Coastguard Worker ! -x $f or chmod(0755, "$dir/$f") or die "chmod($dir/$f): $!"; 158*c2e0c6b5SAndroid Build Coastguard Worker } else { 159*c2e0c6b5SAndroid Build Coastguard Worker `cp -a "$f" "$dir/$f"`; die if $?; 160*c2e0c6b5SAndroid Build Coastguard Worker } 161*c2e0c6b5SAndroid Build Coastguard Worker} 162*c2e0c6b5SAndroid Build Coastguard Worker 163*c2e0c6b5SAndroid Build Coastguard Workersub GenPackage($) { 164*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 165*c2e0c6b5SAndroid Build Coastguard Worker $s->{"PKG"} = $s->{"PACKAGE"} . "-" . $s->{"VERSION"}; 166*c2e0c6b5SAndroid Build Coastguard Worker my $dd = $s->{"DISTDIR"}; 167*c2e0c6b5SAndroid Build Coastguard Worker my $pkg = $s->{"PKG"}; 168*c2e0c6b5SAndroid Build Coastguard Worker my $dir = "$dd/$pkg"; 169*c2e0c6b5SAndroid Build Coastguard Worker print "Generating $dir\n"; 170*c2e0c6b5SAndroid Build Coastguard Worker 171*c2e0c6b5SAndroid Build Coastguard Worker FILES: foreach my $f (`find . -type f`) { 172*c2e0c6b5SAndroid Build Coastguard Worker chomp $f; 173*c2e0c6b5SAndroid Build Coastguard Worker $f =~ s/^\.\///; 174*c2e0c6b5SAndroid Build Coastguard Worker my $action = ""; 175*c2e0c6b5SAndroid Build Coastguard Worker my @rules = @{$s->{"rules"}}; 176*c2e0c6b5SAndroid Build Coastguard Worker while (@rules) { 177*c2e0c6b5SAndroid Build Coastguard Worker my $rule = shift @rules; 178*c2e0c6b5SAndroid Build Coastguard Worker my $act = shift @rules; 179*c2e0c6b5SAndroid Build Coastguard Worker if ($f =~ $rule) { 180*c2e0c6b5SAndroid Build Coastguard Worker $action = $act; 181*c2e0c6b5SAndroid Build Coastguard Worker last; 182*c2e0c6b5SAndroid Build Coastguard Worker } 183*c2e0c6b5SAndroid Build Coastguard Worker } 184*c2e0c6b5SAndroid Build Coastguard Worker ($action =~ /-/) && next FILES; 185*c2e0c6b5SAndroid Build Coastguard Worker print "$f ($action)\n" if $verbose; 186*c2e0c6b5SAndroid Build Coastguard Worker $s->CopyFile($f, $dir, $action); 187*c2e0c6b5SAndroid Build Coastguard Worker } 188*c2e0c6b5SAndroid Build Coastguard Worker 189*c2e0c6b5SAndroid Build Coastguard Worker foreach my $d (@{$s->{"directories"}}) { 190*c2e0c6b5SAndroid Build Coastguard Worker `mkdir -p $dir/$d`; die if $?; 191*c2e0c6b5SAndroid Build Coastguard Worker } 192*c2e0c6b5SAndroid Build Coastguard Worker 193*c2e0c6b5SAndroid Build Coastguard Worker if (-f "$dir/Makefile") { 194*c2e0c6b5SAndroid Build Coastguard Worker print "Cleaning up\n"; 195*c2e0c6b5SAndroid Build Coastguard Worker `cd $dir && make distclean >&2`; die if $?; 196*c2e0c6b5SAndroid Build Coastguard Worker } 197*c2e0c6b5SAndroid Build Coastguard Worker 198*c2e0c6b5SAndroid Build Coastguard Worker print "Creating $dd/$pkg.tar.gz\n"; 199*c2e0c6b5SAndroid Build Coastguard Worker my $tarvv = $verbose ? "vv" : ""; 200*c2e0c6b5SAndroid Build Coastguard Worker `cd $dd && tar cz${tarvv}f $pkg.tar.gz $pkg >&2`; die if $?; 201*c2e0c6b5SAndroid Build Coastguard Worker push @{$s->{"distfiles"}}, "$dd/$pkg.tar.gz"; 202*c2e0c6b5SAndroid Build Coastguard Worker 203*c2e0c6b5SAndroid Build Coastguard Worker if ($s->{'do_sign'}) { 204*c2e0c6b5SAndroid Build Coastguard Worker print "Signing package\n"; 205*c2e0c6b5SAndroid Build Coastguard Worker system "gpg", "--armor", "--detach-sig", "$dd/$pkg.tar.gz"; 206*c2e0c6b5SAndroid Build Coastguard Worker die if $?; 207*c2e0c6b5SAndroid Build Coastguard Worker rename "$dd/$pkg.tar.gz.asc", "$dd/$pkg.tar.gz.sign" or die "No signature produced!?\n"; 208*c2e0c6b5SAndroid Build Coastguard Worker push @{$s->{"distfiles"}}, "$dd/$pkg.tar.gz.sign"; 209*c2e0c6b5SAndroid Build Coastguard Worker } 210*c2e0c6b5SAndroid Build Coastguard Worker 211*c2e0c6b5SAndroid Build Coastguard Worker my $adir = $s->{"archivedir"}; 212*c2e0c6b5SAndroid Build Coastguard Worker my $afile = "$adir/$pkg.tar.gz"; 213*c2e0c6b5SAndroid Build Coastguard Worker print "Archiving to $afile\n"; 214*c2e0c6b5SAndroid Build Coastguard Worker -d $adir or `mkdir -p $adir`; 215*c2e0c6b5SAndroid Build Coastguard Worker `cp $dd/$pkg.tar.gz $afile`; die if $?; 216*c2e0c6b5SAndroid Build Coastguard Worker 217*c2e0c6b5SAndroid Build Coastguard Worker return $dir; 218*c2e0c6b5SAndroid Build Coastguard Worker} 219*c2e0c6b5SAndroid Build Coastguard Worker 220*c2e0c6b5SAndroid Build Coastguard Workersub GenFile($$) { 221*c2e0c6b5SAndroid Build Coastguard Worker my ($s,$f) = @_; 222*c2e0c6b5SAndroid Build Coastguard Worker my $sf = $s->{"DISTDIR"} . "/" . $s->{"PKG"} . "/$f"; 223*c2e0c6b5SAndroid Build Coastguard Worker my $df = $s->{"DISTDIR"} . "/$f"; 224*c2e0c6b5SAndroid Build Coastguard Worker print "Generating $df\n"; 225*c2e0c6b5SAndroid Build Coastguard Worker `cp $sf $df`; die if $?; 226*c2e0c6b5SAndroid Build Coastguard Worker push @{$s->{"distfiles"}}, $df; 227*c2e0c6b5SAndroid Build Coastguard Worker} 228*c2e0c6b5SAndroid Build Coastguard Worker 229*c2e0c6b5SAndroid Build Coastguard Workersub ParseOptions($) { 230*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 231*c2e0c6b5SAndroid Build Coastguard Worker GetOptions( 232*c2e0c6b5SAndroid Build Coastguard Worker "verbose!" => \$verbose, 233*c2e0c6b5SAndroid Build Coastguard Worker "test!" => \$s->{"do_test"}, 234*c2e0c6b5SAndroid Build Coastguard Worker "patch!" => \$s->{"do_patch"}, 235*c2e0c6b5SAndroid Build Coastguard Worker "diff-against=s" => \$s->{"diff_against"}, 236*c2e0c6b5SAndroid Build Coastguard Worker "upload!" => \$s->{"do_upload"}, 237*c2e0c6b5SAndroid Build Coastguard Worker "sign!" => \$s->{"do_sign"}, 238*c2e0c6b5SAndroid Build Coastguard Worker ) || die "Syntax: release [--verbose] [--test] [--nopatch] [--diff-against=<version>] [--noupload] [--nosign]"; 239*c2e0c6b5SAndroid Build Coastguard Worker} 240*c2e0c6b5SAndroid Build Coastguard Worker 241*c2e0c6b5SAndroid Build Coastguard Workersub Test($) { 242*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 243*c2e0c6b5SAndroid Build Coastguard Worker my $dd = $s->{"DISTDIR"}; 244*c2e0c6b5SAndroid Build Coastguard Worker my $pkg = $s->{"PKG"}; 245*c2e0c6b5SAndroid Build Coastguard Worker my $log = "$dd/$pkg.log"; 246*c2e0c6b5SAndroid Build Coastguard Worker print "Doing a test compilation\n"; 247*c2e0c6b5SAndroid Build Coastguard Worker `( cd $dd/$pkg && make ) >$log 2>&1`; 248*c2e0c6b5SAndroid Build Coastguard Worker die "There were errors. Please inspect $log" if $?; 249*c2e0c6b5SAndroid Build Coastguard Worker `grep -q [Ww]arning $log`; 250*c2e0c6b5SAndroid Build Coastguard Worker $? or print "There were warnings! Please inspect $log.\n"; 251*c2e0c6b5SAndroid Build Coastguard Worker print "Cleaning up\n"; 252*c2e0c6b5SAndroid Build Coastguard Worker `cd $dd/$pkg && make distclean`; die if $?; 253*c2e0c6b5SAndroid Build Coastguard Worker} 254*c2e0c6b5SAndroid Build Coastguard Worker 255*c2e0c6b5SAndroid Build Coastguard Workersub MakePatch($) { 256*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 257*c2e0c6b5SAndroid Build Coastguard Worker my $dd = $s->{"DISTDIR"}; 258*c2e0c6b5SAndroid Build Coastguard Worker my $pkg1 = $s->{"PKG"}; 259*c2e0c6b5SAndroid Build Coastguard Worker my $oldver; 260*c2e0c6b5SAndroid Build Coastguard Worker if ($s->{"diff_against"} ne "") { 261*c2e0c6b5SAndroid Build Coastguard Worker $oldver = $s->{"diff_against"}; 262*c2e0c6b5SAndroid Build Coastguard Worker } elsif (defined $s->{"OLDVERSION"}) { 263*c2e0c6b5SAndroid Build Coastguard Worker $oldver = $s->{"OLDVERSION"}; 264*c2e0c6b5SAndroid Build Coastguard Worker } else { 265*c2e0c6b5SAndroid Build Coastguard Worker print "WARNING: No previous version known. No patch generated.\n"; 266*c2e0c6b5SAndroid Build Coastguard Worker return; 267*c2e0c6b5SAndroid Build Coastguard Worker } 268*c2e0c6b5SAndroid Build Coastguard Worker my $pkg0 = $s->{"PACKAGE"} . "-" . $oldver; 269*c2e0c6b5SAndroid Build Coastguard Worker 270*c2e0c6b5SAndroid Build Coastguard Worker my $oldarch = $s->{"archivedir"} . "/" . $pkg0 . ".tar.gz"; 271*c2e0c6b5SAndroid Build Coastguard Worker -f $oldarch or die "MakePatch: $oldarch not found"; 272*c2e0c6b5SAndroid Build Coastguard Worker print "Unpacking $pkg0 from $oldarch\n"; 273*c2e0c6b5SAndroid Build Coastguard Worker `cd $dd && tar xzf $oldarch`; die if $?; 274*c2e0c6b5SAndroid Build Coastguard Worker 275*c2e0c6b5SAndroid Build Coastguard Worker my $diff = $s->{"PACKAGE"} . "-" . $oldver . "-" . $s->{"VERSION"} . ".diff.gz"; 276*c2e0c6b5SAndroid Build Coastguard Worker print "Creating a patch from $pkg0 to $pkg1: $diff\n"; 277*c2e0c6b5SAndroid Build Coastguard Worker `cd $dd && diff -ruN $pkg0 $pkg1 | gzip >$diff`; die if $?; 278*c2e0c6b5SAndroid Build Coastguard Worker push @{$s->{"distfiles"}}, "$dd/$diff"; 279*c2e0c6b5SAndroid Build Coastguard Worker} 280*c2e0c6b5SAndroid Build Coastguard Worker 281*c2e0c6b5SAndroid Build Coastguard Workersub Upload($) { 282*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 283*c2e0c6b5SAndroid Build Coastguard Worker foreach my $u (@{$s->{"uploads"}}) { 284*c2e0c6b5SAndroid Build Coastguard Worker my $url = $u->{"url"}; 285*c2e0c6b5SAndroid Build Coastguard Worker print "Upload to $url :\n"; 286*c2e0c6b5SAndroid Build Coastguard Worker my @files = (); 287*c2e0c6b5SAndroid Build Coastguard Worker my $filter = $u->{"filter"} || ".*"; 288*c2e0c6b5SAndroid Build Coastguard Worker foreach my $f (@{$s->{"distfiles"}}) { 289*c2e0c6b5SAndroid Build Coastguard Worker if ($f =~ $filter) { 290*c2e0c6b5SAndroid Build Coastguard Worker print "\t$f\n"; 291*c2e0c6b5SAndroid Build Coastguard Worker push @files, $f; 292*c2e0c6b5SAndroid Build Coastguard Worker } 293*c2e0c6b5SAndroid Build Coastguard Worker } 294*c2e0c6b5SAndroid Build Coastguard Worker print "<confirm> "; <STDIN>; 295*c2e0c6b5SAndroid Build Coastguard Worker if ($url =~ m@^scp://([^/]+)(.*)@) { 296*c2e0c6b5SAndroid Build Coastguard Worker $, = " "; 297*c2e0c6b5SAndroid Build Coastguard Worker my $host = $1; 298*c2e0c6b5SAndroid Build Coastguard Worker my $dir = $2; 299*c2e0c6b5SAndroid Build Coastguard Worker $dir =~ s@^/~@~@; 300*c2e0c6b5SAndroid Build Coastguard Worker $dir =~ s@^/\./@@; 301*c2e0c6b5SAndroid Build Coastguard Worker my $cmd = "scp @files $host:$dir\n"; 302*c2e0c6b5SAndroid Build Coastguard Worker `$cmd`; die if $?; 303*c2e0c6b5SAndroid Build Coastguard Worker } elsif ($url =~ m@ftp://([^/]+)(.*)@) { 304*c2e0c6b5SAndroid Build Coastguard Worker my $host = $1; 305*c2e0c6b5SAndroid Build Coastguard Worker my $dir = $2; 306*c2e0c6b5SAndroid Build Coastguard Worker open FTP, "|ftp -v $host" or die; 307*c2e0c6b5SAndroid Build Coastguard Worker print FTP "cd $dir\n"; 308*c2e0c6b5SAndroid Build Coastguard Worker foreach my $f (@files) { 309*c2e0c6b5SAndroid Build Coastguard Worker (my $ff = $f) =~ s@.*\/([^/].*)@$1@; 310*c2e0c6b5SAndroid Build Coastguard Worker print FTP "put $f $ff\n"; 311*c2e0c6b5SAndroid Build Coastguard Worker } 312*c2e0c6b5SAndroid Build Coastguard Worker print FTP "bye\n"; 313*c2e0c6b5SAndroid Build Coastguard Worker close FTP; 314*c2e0c6b5SAndroid Build Coastguard Worker die if $?; 315*c2e0c6b5SAndroid Build Coastguard Worker } else { 316*c2e0c6b5SAndroid Build Coastguard Worker die "Don't know how to handle this URL scheme"; 317*c2e0c6b5SAndroid Build Coastguard Worker } 318*c2e0c6b5SAndroid Build Coastguard Worker } 319*c2e0c6b5SAndroid Build Coastguard Worker} 320*c2e0c6b5SAndroid Build Coastguard Worker 321*c2e0c6b5SAndroid Build Coastguard Workersub Dispatch($) { 322*c2e0c6b5SAndroid Build Coastguard Worker my ($s) = @_; 323*c2e0c6b5SAndroid Build Coastguard Worker $s->Test if $s->{"do_test"}; 324*c2e0c6b5SAndroid Build Coastguard Worker $s->MakePatch if $s->{"do_patch"}; 325*c2e0c6b5SAndroid Build Coastguard Worker $s->Upload if $s->{"do_upload"}; 326*c2e0c6b5SAndroid Build Coastguard Worker} 327*c2e0c6b5SAndroid Build Coastguard Worker 328*c2e0c6b5SAndroid Build Coastguard Worker1; 329