summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/Dpkg/Compression.pm133
-rw-r--r--scripts/Dpkg/Compression/CompressedFile.pm7
-rw-r--r--scripts/Dpkg/Compression/Compressor.pm8
-rw-r--r--scripts/Dpkg/Source/Package.pm5
-rw-r--r--scripts/Dpkg/Source/Package/V1.pm2
-rw-r--r--scripts/Dpkg/Source/Package/V2.pm15
-rw-r--r--scripts/Dpkg/Source/Package/V3/bzr.pm4
-rw-r--r--scripts/Dpkg/Source/Package/V3/git.pm4
-rw-r--r--scripts/Dpkg/Source/Package/V3/native.pm4
-rwxr-xr-xscripts/dpkg-buildpackage.pl9
-rwxr-xr-xscripts/dpkg-genchanges.pl7
-rwxr-xr-xscripts/dpkg-scansources.pl5
-rwxr-xr-xscripts/dpkg-source.pl9
13 files changed, 160 insertions, 52 deletions
diff --git a/scripts/Dpkg/Compression.pm b/scripts/Dpkg/Compression.pm
index f858c9db6..7c9d16149 100644
--- a/scripts/Dpkg/Compression.pm
+++ b/scripts/Dpkg/Compression.pm
@@ -1,3 +1,5 @@
+# Copyright © 2010 Raphaël Hertzog <hertzog@debian.org>
+#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
@@ -17,27 +19,126 @@ use strict;
use warnings;
use base qw(Exporter);
-our @EXPORT = qw(@comp_supported %comp_supported %comp_ext $comp_regex
- %comp_prog %comp_decomp_prog
- get_compression_from_filename);
-
-our @comp_supported = qw(gzip bzip2 lzma xz);
-our %comp_supported = map { $_ => 1 } @comp_supported;
-our %comp_ext = (gzip => 'gz', bzip2 => 'bz2', lzma => 'lzma', xz => 'xz');
-our $comp_regex = '(?:gz|bz2|lzma|xz)';
-our %comp_prog = (gzip => 'gzip', bzip2 => 'bzip2', lzma => 'lzma',
- xz => 'xz');
-our %comp_decomp_prog = (gzip => 'gunzip', bzip2 => 'bunzip2', lzma => 'unlzma',
- xz => 'unxz');
-
-sub get_compression_from_filename {
+our @EXPORT = qw($compression_re_file_ext compression_get_list
+ compression_is_supported compression_get_property
+ compression_guess_from_filename);
+
+=head1 NAME
+
+Dpkg::Compression - simple database of available compression methods
+
+=head1 DESCRIPTION
+
+This modules provides a few public funcions and a public regex to
+interact with the set of supported compression methods.
+
+=head1 EXPORTED VARIABLES
+
+=over 4
+
+=cut
+
+my $COMP = {
+ "gzip" => {
+ "file_ext" => "gz",
+ "comp_prog" => "gzip",
+ "decomp_prog" => "gunzip",
+ },
+ "bzip2" => {
+ "file_ext" => "bz2",
+ "comp_prog" => "bzip2",
+ "decomp_prog" => "bunzip2",
+ },
+ "lzma" => {
+ "file_ext" => "lzma",
+ "comp_prog" => "lzma",
+ "decomp_prog" => "unlzma",
+ },
+ "xz" => {
+ "file_ext" => "xz",
+ "comp_prog" => "xz",
+ "decomp_prog" => "unxz",
+ },
+};
+
+=item $compression_re_file_ext
+
+A regex that matches a file extension of a file compressed with one of the
+supported compression methods.
+
+=back
+
+=cut
+
+my $regex = join "|", map { $_->{"file_ext"} } values %$COMP;
+our $compression_re_file_ext = qr/(?:$regex)/;
+
+=head1 EXPORTED FUNCTIONS
+
+=over 4
+
+=item my @list = compression_get_list()
+
+Returns a list of supported compression methods (sorted alphabetically).
+
+=cut
+
+sub compression_get_list {
+ return sort keys %$COMP;
+}
+
+=item compression_is_supported($comp)
+
+Returns a boolean indicating whether the give compression method is
+known and supported.
+
+=cut
+
+sub compression_is_supported {
+ return exists $COMP->{$_[0]};
+}
+
+=item compression_get_property($comp, $property)
+
+Returns the requested property of the compression method. Returns undef if
+either the property or the compression method doesn't exist. Valid
+properties currently include "file_ext" for the file extension,
+"comp_prog" for the name of the compression program and "decomp_prog" for
+the name of the decompression program.
+
+=cut
+
+sub compression_get_property {
+ my ($comp, $property) = @_;
+ return undef unless compression_is_supported($comp);
+ return $COMP->{$comp}{$property} if exists $COMP->{$comp}{$property};
+ return undef;
+}
+
+=item compression_guess_from_filename($filename)
+
+Returns the compression method that is likely used on the indicated
+filename based on its file extension.
+
+=cut
+
+sub compression_guess_from_filename {
my $filename = shift;
- foreach my $comp (@comp_supported) {
- if ($filename =~ /^(.*)\.\Q$comp_ext{$comp}\E$/) {
+ foreach my $comp (compression_get_list()) {
+ my $ext = compression_get_property($comp, "file_ext");
+ if ($filename =~ /^(.*)\.\Q$ext\E$/) {
return $comp;
}
}
return undef;
}
+=back
+
+=head1 AUTHOR
+
+Raphaël Hertzog <hertzog@debian.org>.
+
+=cut
+
1;
diff --git a/scripts/Dpkg/Compression/CompressedFile.pm b/scripts/Dpkg/Compression/CompressedFile.pm
index 1a85ba059..ffa471eb9 100644
--- a/scripts/Dpkg/Compression/CompressedFile.pm
+++ b/scripts/Dpkg/Compression/CompressedFile.pm
@@ -291,7 +291,7 @@ sub set_filename {
if (defined($add_comp_ext)) {
*$self->{"add_comp_ext"} = $add_comp_ext;
}
- if (*$self->{"add_comp_ext"} and $filename =~ /\.$comp_regex$/) {
+ if (*$self->{"add_comp_ext"} and $filename =~ /\.$compression_re_file_ext$/) {
warning("filename %s already has an extension of a compressed file " .
"and add_comp_ext is active", $filename);
}
@@ -317,7 +317,8 @@ sub get_filename {
} elsif ($comp eq "none") {
return *$self->{"filename"};
} else {
- return *$self->{"filename"} . "." . $comp_ext{$comp};
+ return *$self->{"filename"} . "." .
+ compression_get_property($comp, "file_ext");
}
} else {
return *$self->{"filename"};
@@ -339,7 +340,7 @@ sub use_compression {
if ($comp eq "none") {
return 0;
} elsif ($comp eq "auto") {
- $comp = get_compression_from_filename($self->get_filename());
+ $comp = compression_guess_from_filename($self->get_filename());
*$self->{"compressor"}->set_compression($comp) if $comp;
}
return $comp;
diff --git a/scripts/Dpkg/Compression/Compressor.pm b/scripts/Dpkg/Compression/Compressor.pm
index 4ca4ff454..4da35a129 100644
--- a/scripts/Dpkg/Compression/Compressor.pm
+++ b/scripts/Dpkg/Compression/Compressor.pm
@@ -32,7 +32,7 @@ our $default_compression_level = 9;
sub set_default_compression {
my ($self, $method) = @_;
error(_g("%s is not a supported compression"), $method)
- unless $comp_supported{$method};
+ unless compression_is_supported($method);
$default_compression = $method;
}
@@ -58,7 +58,7 @@ sub new {
sub set_compression {
my ($self, $method) = @_;
error(_g("%s is not a supported compression method"), $method)
- unless $comp_supported{$method};
+ unless compression_is_supported($method);
$self->{"compression"} = $method;
}
@@ -71,7 +71,7 @@ sub set_compression_level {
sub get_compress_cmdline {
my ($self) = @_;
- my @prog = ($comp_prog{$self->{"compression"}});
+ my @prog = (compression_get_property($self->{"compression"}, "comp_prog"));
my $level = "-" . $self->{"compression_level"};
$level = "--" . $self->{"compression_level"}
if $self->{"compression_level"} =~ m/best|fast/;
@@ -81,7 +81,7 @@ sub get_compress_cmdline {
sub get_uncompress_cmdline {
my ($self) = @_;
- return ($comp_decomp_prog{$self->{"compression"}});
+ return (compression_get_property($self->{"compression"}, "decomp_prog"));
}
sub _sanity_check {
diff --git a/scripts/Dpkg/Source/Package.pm b/scripts/Dpkg/Source/Package.pm
index 902b152c6..4d8351def 100644
--- a/scripts/Dpkg/Source/Package.pm
+++ b/scripts/Dpkg/Source/Package.pm
@@ -242,7 +242,7 @@ sub get_basename {
sub find_original_tarballs {
my ($self, $ext) = @_;
- $ext ||= $comp_regex;
+ $ext ||= $compression_re_file_ext;
my $basename = $self->get_basename();
my @tar;
foreach my $dir (".", $self->{'basedir'}, $self->{'options'}{'origtardir'}) {
@@ -332,7 +332,8 @@ sub extract {
my $basename = $self->get_basename();
my ($dirname, $destdir) = fileparse($newdirectory);
$destdir ||= "./";
- foreach my $orig (grep { /^\Q$basename\E\.orig(-\w+)?\.tar\.$comp_regex$/ }
+ my $ext = $compression_re_file_ext;
+ foreach my $orig (grep { /^\Q$basename\E\.orig(-\w+)?\.tar\.$ext$/ }
$self->get_files())
{
my $src = File::Spec->catfile($self->{'basedir'}, $orig);
diff --git a/scripts/Dpkg/Source/Package/V1.pm b/scripts/Dpkg/Source/Package/V1.pm
index a7e81327d..319e9c290 100644
--- a/scripts/Dpkg/Source/Package/V1.pm
+++ b/scripts/Dpkg/Source/Package/V1.pm
@@ -292,7 +292,7 @@ sub do_build {
my ($ntfh, $newtar) = tempfile("$tarname.new.XXXXXX",
DIR => getcwd(), UNLINK => 0);
my $tar = Dpkg::Source::Archive->new(filename => $newtar,
- compression => get_compression_from_filename($tarname),
+ compression => compression_guess_from_filename($tarname),
compression_level => $self->{'options'}{'comp_level'});
$tar->create(options => \@tar_ignore, 'chdir' => $tardirbase);
$tar->add_directory($tardirname);
diff --git a/scripts/Dpkg/Source/Package/V2.pm b/scripts/Dpkg/Source/Package/V2.pm
index 2a8f7e966..bcacea887 100644
--- a/scripts/Dpkg/Source/Package/V2.pm
+++ b/scripts/Dpkg/Source/Package/V2.pm
@@ -89,16 +89,17 @@ sub do_extract {
my $basenamerev = $self->get_basename(1);
my ($tarfile, $debianfile, %origtar, %seen);
+ my $re_ext = $compression_re_file_ext;
foreach my $file ($self->get_files()) {
- (my $uncompressed = $file) =~ s/\.$comp_regex$//;
+ (my $uncompressed = $file) =~ s/\.$re_ext$//;
error(_g("duplicate files in %s source package: %s.*"), "v2.0",
$uncompressed) if $seen{$uncompressed};
$seen{$uncompressed} = 1;
- if ($file =~ /^\Q$basename\E\.orig\.tar\.$comp_regex$/) {
+ if ($file =~ /^\Q$basename\E\.orig\.tar\.$re_ext$/) {
$tarfile = $file;
- } elsif ($file =~ /^\Q$basename\E\.orig-([\w-]+)\.tar\.$comp_regex$/) {
+ } elsif ($file =~ /^\Q$basename\E\.orig-([\w-]+)\.tar\.$re_ext$/) {
$origtar{$1} = $file;
- } elsif ($file =~ /^\Q$basenamerev\E\.debian\.tar\.$comp_regex$/) {
+ } elsif ($file =~ /^\Q$basenamerev\E\.debian\.tar\.$re_ext$/) {
$debianfile = $file;
} else {
error(_g("unrecognized file for a %s source package: %s"),
@@ -201,7 +202,7 @@ sub apply_patches {
sub can_build {
my ($self, $dir) = @_;
foreach ($self->find_original_tarballs()) {
- return 1 if /\.orig\.tar\.$comp_regex$/;
+ return 1 if /\.orig\.tar\.$compression_re_file_ext$/;
}
return (0, _g("no orig.tar file found"));
}
@@ -250,7 +251,7 @@ sub do_build {
my ($tarfile, %origtar);
my @origtarballs;
foreach (sort $self->find_original_tarballs()) {
- if (/\.orig\.tar\.$comp_regex$/) {
+ if (/\.orig\.tar\.$compression_re_file_ext$/) {
if (defined($tarfile)) {
error(_g("several orig.tar files found (%s and %s) but only " .
"one is allowed"), $tarfile, $_);
@@ -258,7 +259,7 @@ sub do_build {
$tarfile = $_;
push @origtarballs, $_;
$self->add_file($_);
- } elsif (/\.orig-([\w-]+)\.tar\.$comp_regex$/) {
+ } elsif (/\.orig-([\w-]+)\.tar\.$compression_re_file_ext$/) {
$origtar{$1} = $_;
push @origtarballs, $_;
$self->add_file($_);
diff --git a/scripts/Dpkg/Source/Package/V3/bzr.pm b/scripts/Dpkg/Source/Package/V3/bzr.pm
index b30c17a8e..dd5d1444c 100644
--- a/scripts/Dpkg/Source/Package/V3/bzr.pm
+++ b/scripts/Dpkg/Source/Package/V3/bzr.pm
@@ -177,9 +177,9 @@ sub do_extract {
error(_g("format v3.0 uses only one source file"));
}
my $tarfile = $files[0];
- if ($tarfile !~ /^\Q$basenamerev\E\.bzr\.tar\.$comp_regex$/) {
+ if ($tarfile !~ /^\Q$basenamerev\E\.bzr\.tar\.$compression_re_file_ext$/) {
error(_g("expected %s, got %s"),
- "$basenamerev.bzr.tar.$comp_regex", $tarfile);
+ "$basenamerev.bzr.tar.$compression_re_file_ext", $tarfile);
}
erasedir($newdirectory);
diff --git a/scripts/Dpkg/Source/Package/V3/git.pm b/scripts/Dpkg/Source/Package/V3/git.pm
index a2dd1335d..d3b72a983 100644
--- a/scripts/Dpkg/Source/Package/V3/git.pm
+++ b/scripts/Dpkg/Source/Package/V3/git.pm
@@ -241,9 +241,9 @@ sub do_extract {
error(_g("format v3.0 uses only one source file"));
}
my $tarfile = $files[0];
- if ($tarfile !~ /^\Q$basenamerev\E\.git\.tar\.$comp_regex$/) {
+ if ($tarfile !~ /^\Q$basenamerev\E\.git\.tar\.$compression_re_file_ext$/) {
error(_g("expected %s, got %s"),
- "$basenamerev.git.tar.$comp_regex", $tarfile);
+ "$basenamerev.git.tar.$compression_re_file_ext", $tarfile);
}
erasedir($newdirectory);
diff --git a/scripts/Dpkg/Source/Package/V3/native.pm b/scripts/Dpkg/Source/Package/V3/native.pm
index a0c1b20ce..189b8d6ab 100644
--- a/scripts/Dpkg/Source/Package/V3/native.pm
+++ b/scripts/Dpkg/Source/Package/V3/native.pm
@@ -44,7 +44,7 @@ sub do_extract {
my $tarfile;
foreach my $file ($self->get_files()) {
- if ($file =~ /^\Q$basenamerev\E\.tar\.$comp_regex$/) {
+ if ($file =~ /^\Q$basenamerev\E\.tar\.$compression_re_file_ext$/) {
error(_g("multiple tarfiles in v1.0 source package")) if $tarfile;
$tarfile = $file;
} else {
@@ -85,7 +85,7 @@ sub do_build {
my ($dirname, $dirbase) = fileparse($dir);
my $tar = Dpkg::Source::Archive->new(filename => $newtar,
- compression => get_compression_from_filename($tarname),
+ compression => compression_guess_from_filename($tarname),
compression_level => $self->{'options'}{'comp_level'});
$tar->create(options => \@tar_ignore, 'chdir' => $dirbase);
$tar->add_directory($dirname);
diff --git a/scripts/dpkg-buildpackage.pl b/scripts/dpkg-buildpackage.pl
index 3bcd7ae35..66363de19 100755
--- a/scripts/dpkg-buildpackage.pl
+++ b/scripts/dpkg-buildpackage.pl
@@ -448,11 +448,12 @@ close OUT or syserr(_g('write changes file'));
my $srcmsg;
sub fileomitted($) { return $files !~ /$_[0]/ }
+my $ext = $compression_re_file_ext;
if (fileomitted '\.deb') {
# source only upload
- if (fileomitted "\.diff\.$comp_regex" and fileomitted "\.debian\.tar\.$comp_regex") {
+ if (fileomitted "\.diff\.$ext" and fileomitted "\.debian\.tar\.$ext") {
$srcmsg = _g('source only upload: Debian-native package');
- } elsif (fileomitted "\.orig\.tar\.$comp_regex") {
+ } elsif (fileomitted "\.orig\.tar\.$ext") {
$srcmsg = _g('source only, diff-only upload (original source NOT included)');
} else {
$srcmsg = _g('source only upload (original source is included)');
@@ -461,9 +462,9 @@ if (fileomitted '\.deb') {
$srcmsg = _g('full upload (original source is included)');
if (fileomitted '\.dsc') {
$srcmsg = _g('binary only upload (no source included)');
- } elsif (fileomitted "\.diff\.$comp_regex" and fileomitted "\.debian\.tar\.$comp_regex") {
+ } elsif (fileomitted "\.diff\.$ext" and fileomitted "\.debian\.tar\.$ext") {
$srcmsg = _g('full upload; Debian-native package (full source is included)');
- } elsif (fileomitted "\.orig\.tar\.$comp_regex") {
+ } elsif (fileomitted "\.orig\.tar\.$ext") {
$srcmsg = _g('binary and diff upload (original source NOT included)');
} else {
$srcmsg = _g('full upload (original source is included)');
diff --git a/scripts/dpkg-genchanges.pl b/scripts/dpkg-genchanges.pl
index 9a1f500b0..d83623206 100755
--- a/scripts/dpkg-genchanges.pl
+++ b/scripts/dpkg-genchanges.pl
@@ -440,15 +440,16 @@ if (!is_binaryonly) {
$include_tarball = 1;
}
+ my $ext = $compression_re_file_ext;
if ((($sourcestyle =~ m/i/ && not($include_tarball)) ||
$sourcestyle =~ m/d/) &&
- grep(m/\.(debian\.tar|diff)\.$comp_regex$/,@sourcefiles))
+ grep(m/\.(debian\.tar|diff)\.$ext$/, @sourcefiles))
{
$origsrcmsg= _g("not including original source code in upload");
- @sourcefiles= grep(!m/\.orig(-.+)?\.tar\.$comp_regex$/,@sourcefiles);
+ @sourcefiles= grep(!m/\.orig(-.+)?\.tar\.$ext$/, @sourcefiles);
} else {
if ($sourcestyle =~ m/d/ &&
- !grep(m/\.(debian\.tar|diff)\.$comp_regex$/,@sourcefiles)) {
+ !grep(m/\.(debian\.tar|diff)\.$ext$/, @sourcefiles)) {
warning(_g("ignoring -sd option for native Debian package"));
}
$origsrcmsg= _g("including full source code in upload");
diff --git a/scripts/dpkg-scansources.pl b/scripts/dpkg-scansources.pl
index 1a66a69e9..d922eef5d 100755
--- a/scripts/dpkg-scansources.pl
+++ b/scripts/dpkg-scansources.pl
@@ -160,10 +160,11 @@ sub load_src_override {
$file = $user_file;
}
elsif (defined $regular_file) {
- my $comp = get_compression_from_filename($regular_file);
+ my $comp = compression_guess_from_filename($regular_file);
if (defined($comp)) {
$file = $regular_file;
- $file =~ s/\.$comp_ext{$comp}$/.src.$comp_ext{$comp}/;
+ my $ext = compression_get_property($comp, "file_ext");
+ $file =~ s/\.$ext$/.src.$ext/;
} else {
$file = "$regular_file.src";
}
diff --git a/scripts/dpkg-source.pl b/scripts/dpkg-source.pl
index 5f78feec1..043238f96 100755
--- a/scripts/dpkg-source.pl
+++ b/scripts/dpkg-source.pl
@@ -60,7 +60,7 @@ my %options = (
# Compression related
compression => $Dpkg::Compression::Compressor::default_compression,
comp_level => $Dpkg::Compression::Compressor::default_compression_level,
- comp_ext => $comp_ext{$Dpkg::Compression::Compressor::default_compression},
+ comp_ext => compression_get_property($Dpkg::Compression::Compressor::default_compression, "file_ext"),
# Ignore files
tar_ignore => [],
diff_ignore_regexp => '',
@@ -126,9 +126,9 @@ while (@options) {
} elsif (m/^-(?:Z|-compression=)(.*)$/) {
my $compression = $1;
$options{'compression'} = $compression;
- $options{'comp_ext'} = $comp_ext{$compression};
+ $options{'comp_ext'} = compression_get_property($compression, "file_ext");
usageerr(_g("%s is not a supported compression"), $compression)
- unless $comp_supported{$compression};
+ unless compression_is_supported($compression);
Dpkg::Compression::Compressor->set_default_compression($compression);
} elsif (m/^-(?:z|-compression-level=)(.*)$/) {
my $comp_level = $1;
@@ -449,7 +449,8 @@ See dpkg-source(1) for more info.") . "\n",
$progname,
$Dpkg::Source::Package::diff_ignore_default_regexp,
join(' ', map { "-I$_" } @Dpkg::Source::Package::tar_ignore_default_pattern),
- $Dpkg::Compression::Compressor::default_compression, "@comp_supported",
+ $Dpkg::Compression::Compressor::default_compression,
+ join(" ", compression_get_list()),
$Dpkg::Compression::Compressor::default_compression_level;
}