xref: /aosp_15_r20/external/pciutils/maint/release.pm (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
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