10 open(F, '<', $fn) || die("$fn: $!\n");
14 splice(@control, 0, 3) if @control > 3 && $control[0] =~ /^-----BEGIN/;
18 my $c = shift @control;
19 last if $c eq ''; # new paragraph
20 my ($tag, $data) = split(':', $c, 2);
21 next unless defined $data;
24 while (@control && $control[0] =~ /^\s/) {
25 $data .= "\n".substr(shift @control, 1);
31 $tag{'__seq'} = \@seq;
37 open(F, '>', $fn) || die("$fn: $!\n");
38 my @seq = @{$tags->{'__seq'} || []};
39 my %seq = map {uc($_) => 1} @seq;
40 for (sort keys %$tags) {
41 push @seq, ucfirst(lc($_)) unless $seq{$_};
45 my $d = $tags->{$ucseq};
46 next unless defined $d;
58 open(F, '-|', 'tar', '--numeric-owner', '-tvf', $tar) || die("tar: $!\n");
60 next unless /^([-dlbcp])(.........)\s+\d+\/\d+\s+(\S+) \d\d\d\d-\d\d-\d\d \d\d:\d\d(?::\d\d)? (.*)$/;
61 my ($type, $mode, $size, $name) = ($1, $2, $3, $4);
63 die("debian tar contains link: $name\n") if $type eq 'l';
64 die("debian tar contains unexpected file type: $name\n") if $type ne '-';
66 $name =~ s/^debian\///;
67 push @c, {'name' => $name, 'size' => $size};
69 close(F) || die("tar: $!\n");
74 my ($tar, $tardir, $origin, @c) = @_;
76 open(F, '-|', 'tar', '-xOf', $tar) || die("tar: $!\n");
81 my $l = sysread(F, $file, $s, length($file));
82 die("tar read error\n") unless $l;
85 next if $origin && $origin->{$c->{'name'}} ne $tar;
86 my @file = split("\n", $file);
87 print DIFF "--- $tardir.orig/debian/$c->{'name'}\n";
88 print DIFF "+++ $tardir/debian/$c->{'name'}\n";
90 print DIFF "\@\@ -0,0 +1,".scalar(@file)." \@\@\n";
91 print DIFF "+$_\n" for @file;
97 my ($file, $tardir, $dfile) = @_;
99 open(F, '<', $file) || die("$file: $!\n");
103 print DIFF "--- $tardir.orig/$dfile\n";
104 print DIFF "+++ $tardir/$dfile\n";
106 print DIFF "\@\@ -0,0 +1,".scalar(@file)." \@\@\n";
107 print DIFF "+$_\n" for @file;
111 my ($series, $tardir) = @_;
115 $dir = '.' if $dir eq '';
117 open(F, '<', $series) || die("$series: $!\n");
121 for my $patch (@series) {
122 $patch =~ s/(^|\s+)#.*//;
123 next if $patch =~ /^\s*$/;
125 $level = $1 if $patch =~ /\s.*-p\s*(\d+)/;
127 open(F, '<', "$dir/$patch") || die("$dir/$patch: $!\n");
130 if ((/^--- ./ || /^\+\+\+ ./) && !/^... \/dev\/null/) {
131 my $start = substr($_, 0, 4);
135 last unless s/.*?\///;
138 if ($start eq '--- ') {
139 print DIFF "$start$tardir.orig/$_\n";
141 print DIFF "$start$tardir/$_\n";
156 open(F, '<', $file) || die("$file: $!\n");
158 my $ctx = Digest::MD5->new;
161 my $md5 = $ctx->hexdigest();
162 return "$md5 $size $base";
167 if (@ARGV > 1 && $ARGV[0] eq '--changelog') {
169 $changelog = shift @ARGV;
171 die("usage: debtransform [--changelog <changelog>] <srcdir> <dscfile> <outdir>\n") unless @ARGV == 3;
177 die("$out: $!\n") unless -d $out;
179 my $tags = parsedsc($dsc);
181 opendir(D, $dir) || die("$dir: $!\n");
182 my @dir = grep {$_ ne '.' && $_ ne '..'} readdir(D);
184 my %dir = map {$_ => 1} @dir;
186 my $tarfile = $tags->{'DEBTRANSFORM-TAR'};
188 if ($tags->{'DEBTRANSFORM-FILES-TAR'}) {
189 @debtarfiles = split(' ', $tags->{'DEBTRANSFORM-FILES-TAR'});
192 if (!$tarfile || !@debtarfiles) {
193 my @tars = grep {/\.tar(?:\.gz|\.bz2)?$/} @dir;
194 my @debtars = grep {/^debian\.tar(?:\.gz|\.bz2)?$/} @tars;
196 @tars = grep {!/^debian\.tar(?:\.gz|\.bz2)?$/} @tars;
198 my %debtarfiles = map {$_ => 1} @debtarfiles;
199 @tars = grep {!$debtarfiles{$_}} @tars;
201 die("package contains no tar file\n") unless @tars;
202 die("package contains more than one tar file: @tars\n") if @tars > 1;
205 if (@debtars && !exists($tags->{'DEBTRANSFORM-FILES-TAR'})) {
206 die("package contains more than one debian tar file\n") if @debtars > 1;
207 @debtarfiles = ($debtars[0]);
211 my $name = $tags->{'SOURCE'};
212 die("dsc file contains no source\n") unless defined($name);
213 my $version = $tags->{'VERSION'};
214 die("dsc file contains no version\n") unless defined($version);
215 $version =~ s/^\d+://; # no epoch in version, please
219 if ($tarfile =~ /\.tar\.bz2/) {
221 $tarfile =~ s/\.tar\.bz2/\.tar\.gz/;
222 $tmptar = "$out/$tarfile";
223 print "converting $dir/$old to $tarfile\n";
224 system( ( "debtransformbz2", "$dir/$old", "$tmptar" )) == 0 || die("cannot transform .tar.bz2 to .tar.gz");
226 if ($tarfile =~ /\.zip/) {
228 $tarfile =~ s/\.zip/\.tar\.gz/;
229 $tmptar = "$out/$tarfile";
230 print "converting $dir/$old to $tarfile\n";
231 system( ( "debtransformzip", "$dir/$old", "$tmptar" )) == 0 || die("cannot transform .zip to .tar.gz");
234 my $tardir = $tarfile;
235 $tardir =~ s/\.orig\.tar/\.tar/;
236 $tardir =~ s/\.tar.*?$//;
241 $tarfile =~ /.*(\.tar.*?)$/;
242 my $ntarfile = "${name}_$v.orig$1";
244 link("$tmptar", "$out/$ntarfile") || die("link $dir/$tarfile $out/$ntarfile: $!\n");
247 link("$dir/$tarfile", "$out/$ntarfile") || die("link $dir/$tarfile $out/$ntarfile: $!\n");
249 push @files, addfile("$out/$ntarfile");
251 open(DIFF, '>', "$out/${name}_$version.diff") || die("$out/${name}_$version.diff: $!\n");
253 undef $changelog if $dir{'debian.changelog'};
257 for my $debtarfile (@debtarfiles) {
258 my @c = listtar("$dir/$debtarfile");
259 $debtarcontent{$debtarfile} = \@c;
261 die("debian tar and directory both contain '$_->{'name'}'\n") if $dir{"debian.$_->{'name'}"};
262 undef $changelog if $_->{'name'} eq 'changelog';
263 $debtarorigin{$_->{'name'}} = "$dir/$debtarfile";
267 dofile($changelog, $tardir, 'debian/changelog') if defined $changelog;
269 for my $debtarfile (@debtarfiles) {
270 dotar("$dir/$debtarfile", $tardir, \%debtarorigin, @{$debtarcontent{$debtarfile} });
273 for my $file (grep {/^debian\./} @dir) {
274 next if $file eq 'debian.series';
275 next if $file =~ /\.tar$/;
276 next if $file =~ /\.tar\./;
277 dofile("$dir/$file", $tardir, 'debian/'.substr($file, 7));
280 if ($tags->{'DEBTRANSFORM-SERIES'}) {
281 doseries("$dir/$tags->{'DEBTRANSFORM-SERIES'}", $tardir);
282 } elsif ($dir{"debian.series"}) {
283 doseries("$dir/debian.series", $tardir);
284 } elsif ($dir{"patches.series"}) {
285 doseries("$dir/patches.series", $tardir);
290 if (! -s "$out/${name}_$version.diff") {
291 unlink("$out/${name}_$version.diff");
293 system('gzip', '-9', "$out/${name}_$version.diff");
294 if (-f "$out/${name}_$version.diff.gz") {
295 push @files, addfile("$out/${name}_$version.diff.gz");
297 push @files, addfile("$out/${name}_$version.diff");
301 $tags->{'FILES'} = "\n".join("\n", @files);
302 delete $tags->{'DEBTRANSFORM-SERIES'};
303 delete $tags->{'DEBTRANSFORM-TAR'};
304 delete $tags->{'DEBTRANSFORM-FILES-TAR'};
305 writedsc("$out/${name}_$version.dsc", $tags);