if (exists $args{"compression"}) {
$self->use_compression($args{"compression"});
}
- if (exists $args{"compression_level"}) {
- $self->set_compression_level($args{"compression_level"});
- }
if (exists $args{"filename"}) {
$self->set_filename($args{"filename"});
}
$self->{"compression"} = $method;
}
-sub set_compression_level {
- my ($self, $level) = @_;
- error(_g("%s is not a compression level"), $level)
- unless $level =~ /^([1-9]|fast|best)$/;
- $self->{"compression_level"} = $level;
-}
-
sub set_filename {
my ($self, $filename) = @_;
$self->{"filename"} = $filename;
# Check if compression is used
- foreach my $comp (@comp_supported) {
- if ($filename =~ /^(.*)\.\Q$comp_ext{$comp}\E$/) {
- $self->use_compression($comp);
- last;
- }
- }
+ my $comp = get_compression_from_filename($filename);
+ $self->use_compression($comp) if $comp;
}
sub get_filename {
compressed_filename => $self->get_filename(),
compression => $self->{"compression"},
);
- if ($self->{"compression_level"}) {
- $self->{"compressor"}->set_compression_level(
- $self->{"compression_level"});
- }
$self->{"compressor"}->compress(from_pipe => \$fork_opts{"to_handle"});
} else {
$fork_opts{"to_file"} = $self->get_filename();
use Dpkg::Changelog qw(parse_changelog);
use Dpkg::Source::Compressor;
use Dpkg::Source::Archiver;
+use Dpkg::IPC;
my @filesinarchive;
my %dirincluded;
$comp_ext = $comp_ext{$compression};
usageerr(_g("%s is not a supported compression"), $compression)
unless $comp_supported{$compression};
+ Dpkg::Source::Compressor->set_default_compression($compression);
} elsif (m/^-z/) {
$comp_level = $POSTMATCH;
usageerr(_g("%s is not a compression level"), $comp_level)
unless $comp_level =~ /^([1-9]|fast|best)$/;
+ Dpkg::Source::Compressor->set_default_compression_level($comp_level);
} elsif (m/^-s([akpursnAKPUR])$/) {
warning(_g("-s%s option overrides earlier -s%s option"), $1, $sourcestyle)
if $sourcestyle ne 'X';
|| &syserr(_g("write building diff message"));
my ($ndfh, $newdiffgz) = tempfile( "$diffname.new.XXXXXX",
DIR => &getcwd, UNLINK => 0 );
- &forkgzipwrite($newdiffgz);
+ my $compressor = Dpkg::Source::Compressor->new(
+ compressed_filename => $newdiffgz);
+ my $diff_handle;
+ $compressor->compress(from_pipe => \$diff_handle);
defined(my $c2 = open(FIND, "-|")) || syserr(_g("fork for find"));
if (!$c2) {
internerr(_g("unknown line from diff -u on %s: `%s'"),
$fn, $_);
}
- print(GZIP $_) || &syserr(_g("failed to write to compression pipe"));
+ print($diff_handle $_) || syserr(_g("failed to write to compression pipe"));
}
close(DIFFGEN); $/= "\0";
my $es;
}
}
close(FIND); $? && subprocerr("find on $dir");
- close(GZIP) || &syserr(_g("finish write to compression pipe"));
- &reapgzip;
+ close($diff_handle) || syserr(_g("finish write to compression pipe"));
+ $compressor->wait_end_process();
rename($newdiffgz, $diffname) ||
syserr(_g("unable to rename `%s' (newly created) to `%s'"),
$newdiffgz, $diffname);
for my $patch (@patches) {
printf(_g("%s: applying %s")."\n", $progname, $patch);
+ my ($diff_handle, $compressor);
if ($patch =~ /\.$comp_regex$/) {
- &forkgzipread($patch);
- *DIFF = *GZIP;
+ $compressor = Dpkg::Source::Compressor->new(filename => $patch);
+ $compressor->uncompress(to_pipe => \$diff_handle);
} else {
- open DIFF, $patch or error(_g("can't open diff `%s'"), $patch);
+ open $diff_handle, $patch or error(_g("can't open diff `%s'"), $patch);
}
- defined(my $c2 = fork) || syserr(_g("fork for patch"));
- if (!$c2) {
- open(STDIN,"<&DIFF") || &syserr(_g("reopen gzip for patch"));
- chdir($newdirectory) || syserr(_g("chdir to %s for patch"), $newdirectory);
- $ENV{'LC_ALL'}= 'C';
- $ENV{'LANG'}= 'C';
- exec('patch','-s','-t','-F','0','-N','-p1','-u',
- '-V','never','-g0','-b','-z','.dpkg-orig') or &syserr(_g("exec patch"));
- }
- close(DIFF);
- $c2 == waitpid($c2,0) || &syserr(_g("wait for patch"));
- $? && subprocerr("patch");
+ fork_and_exec(
+ 'exec' => [ 'patch', '-s', '-t', '-F', '0', '-N', '-p1', '-u',
+ '-V', 'never', '-g0', '-b', '-z', '.dpkg-orig' ],
+ 'chdir' => $newdirectory,
+ env => { LC_ALL => 'C', LANG => 'C' },
+ wait_child => 1,
+ from_handle => $diff_handle
+ );
- &reapgzip if $patch =~ /\.$comp_regex$/;
+ $compressor->wait_end_process() if $patch =~ /\.$comp_regex$/;
}
my $now = time;
sub checkdiff
{
my $diff = shift;
+ my ($diff_handle, $compressor);
if ($diff =~ /\.$comp_regex$/) {
- &forkgzipread($diff);
- *DIFF = *GZIP;
+ $compressor = Dpkg::Source::Compressor->new(filename => $diff);
+ $compressor->uncompress(to_pipe => \$diff_handle);
} else {
- open DIFF, $diff or error(_g("can't open diff `%s'"), $diff);
+ open $diff_handle, $diff or error(_g("can't open diff `%s'"), $diff);
}
- $/="\n";
- $_ = <DIFF>;
+ $/ = "\n";
+ $_ = <$diff_handle>;
HUNK:
- while (defined($_) || !eof(DIFF)) {
+ while (defined($_) || !eof($diff_handle)) {
# skip cruft leading up to patch (if any)
until (/^--- /) {
- last HUNK unless defined ($_ = <DIFF>);
+ last HUNK unless defined ($_ = <$diff_handle>);
}
# read file header (---/+++ pair)
s/\n$// or error(_g("diff `%s' is missing trailing newline"), $diff);
$diff);
$fn = $_;
- (defined($_= <DIFF>) and s/\n$//) or
+ (defined($_= <$diff_handle>) and s/\n$//) or
error(_g("diff `%s' finishes in middle of ---/+++ (line %d)"),
$diff, $.);
# read hunks
my $hunk = 0;
- while (defined($_ = <DIFF>) && !(/^--- / or /^Index:/)) {
+ while (defined($_ = <$diff_handle>) && !(/^--- / or /^Index:/)) {
# read hunk header (@@)
s/\n$// or error(_g("diff `%s' is missing trailing newline"), $diff);
next if /^\\ No newline/;
++$hunk;
# read hunk
while ($olines || $nlines) {
- defined($_ = <DIFF>) or
+ defined($_ = <$diff_handle>) or
error(_g("unexpected end of diff `%s'"), $diff);
s/\n$// or
error(_g("diff `%s' is missing trailing newline"), $diff);
}
$hunk or error(_g("expected ^\@\@ at line %d of diff `%s'"), $., $diff);
}
- close(DIFF);
+ close($diff_handle);
- &reapgzip if $diff =~ /\.$comp_regex$/;
+ $compressor->wait_end_process() if $diff =~ /\.$comp_regex$/;
}
sub checktype {
$ur++;
}
-sub forkgzipwrite {
- $compressor->set_compressed_filename($_[0]);
- $compressor->set_compression_level($comp_level);
-
- my $handle;
- $compressor->compress(from_pipe => \$handle);
- open(GZIP, ">>&=", $handle) || syserr(_g("cannot associate handle"));
- close($handle);
-}
-
-sub forkgzipread {
- $compressor->set_compressed_filename($_[0]);
- $compressor->set_compression_level($comp_level);
-
- my $handle;
- $compressor->uncompress(to_pipe => \$handle);
- open(GZIP, "<&=", $handle) || syserr(_g("cannot associate handle"));
- close($handle);
-}
-
-sub reapgzip {
- $compressor->wait_end_process();
-}
-
my %added_files;
sub addfile {
my ($fields, $filename)= @_;