This is an automated email from the git hooks/post-receive script. nomeata pushed a commit to branch master in repository devscripts.
commit ae87e001b54ddb7f08ac9ee976e8b61c01cee8c1 Author: Joachim Breitner <[email protected]> Date: Sun Mar 16 12:46:30 2014 +0100 Unify repackaging code, and add test cases Dpkg.Compression already provides functions to handle decompression and compression almost transparently, so use them. --- scripts/uscan.pl | 79 ++++++++++++++++++++++++++++---------------------------- test/test_uscan | 61 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 40 deletions(-) diff --git a/scripts/uscan.pl b/scripts/uscan.pl index 80445aa..b4e2ddf 100755 --- a/scripts/uscan.pl +++ b/scripts/uscan.pl @@ -79,6 +79,7 @@ sub quoted_regex_replace ($); sub safe_replace ($$); sub get_main_source_dir($$$$); sub compress_archive($$$); +sub decompress_archive($$); sub usage { print <<"EOF"; @@ -329,6 +330,12 @@ if ($opt_v) { version(); exit 0; } my $supported_compressions = compression_get_file_extension_regex(); +# This makes more sense in Dpkg:Compression +my $tarbase_regex = qr/^(.*)\.(tar\.gz |tgz + |tar\.bz2 |tbz2? + |tar.lzma |tlz(?:ma?)? + |tar.xz |txz)$/x; + # Now we can set the other variables according to the command line options $destdir = $opt_destdir if defined $opt_destdir; @@ -1446,42 +1453,6 @@ EOF or uscan_die("$progname warning: OpenPGP signature did not verify.\n"); } - if ($repack and $newfile_base =~ /^(.*)\.(tar\.bz2|tbz2?)$/ and - $repack_compression !~ /^bz2$/ ) { - print "-- Repacking from bzip2 to $repack_compression\n" if $verbose; - my $newfile_base_compression = "$1.tar.$repack_compression"; - my (undef, $fname) = tempfile(UNLINK => 1); - spawn(exec => ['bunzip2', '-c', "$destdir/$newfile_base"], - to_file => $fname, - wait_child => 1); - compress_archive("$fname", "$destdir/$newfile_base_compression", $repack_compression); - $newfile_base = $newfile_base_compression; - } - - if ($repack and $newfile_base =~ /^(.*)\.(tar\.lzma|tlz(?:ma?)?)$/ and - $repack_compression !~ /^lzma$/ ) { - print "-- Repacking from lzma to $repack_compression\n" if $verbose; - my $newfile_base_compression = "$1.tar.$repack_compression"; - my (undef, $fname) = tempfile(UNLINK => 1); - spawn(exec => ['xz', '-F', 'lzma', '-cd', "$destdir/$newfile_base"], - to_file => $fname, - wait_child => 1); - compress_archive("$fname", "$destdir/$newfile_base_compression", $repack_compression); - $newfile_base = $newfile_base_compression; - } - - if ($repack and $newfile_base =~ /^(.*)\.(tar\.xz|txz)$/ and - $repack_compression !~ /^xz$/ ) { - print "-- Repacking from xz to $repack_compression\n" if $verbose; - my $newfile_base_compression = "$1.tar.$repack_compression"; - my (undef, $fname) = tempfile(UNLINK => 1); - spawn(exec => ['xz', '-cd', "$destdir/$newfile_base"], - to_file => $fname, - wait_child => 1); - compress_archive("$fname", "$destdir/$newfile_base_compression", $repack_compression); - $newfile_base = $newfile_base_compression; - } - if ($repack and $newfile_base =~ /^(.*)\.(zip|jar)$/) { print "-- Repacking from zip to .tar.$repack_compression\n" if $verbose; @@ -1507,12 +1478,26 @@ EOF } chdir($cwd); $newfile_base = $newfile_base_compression; + + } elsif ($repack) { # Repacking from tar to tar, so just change the compression + my $comp = compression_guess_from_filename($newfile_base); + unless ($comp) { + uscan_die("Cannot determine compression method of $newfile_base"); + } + if ($comp ne $repack_compression) { + print "-- Repacking from $comp to $repack_compression\n" if $verbose; + my ($tarbase) = ($newfile_base =~ $tarbase_regex); + my $newfile_base_compression = "$1.tar.$repack_compression"; + + my (undef, $fname) = tempfile(UNLINK => 1); + decompress_archive("$destdir/$newfile_base", $fname); + compress_archive("$fname", "$destdir/$newfile_base_compression", $repack_compression); + $newfile_base = $newfile_base_compression; + } } - if ($newfile_base =~ /\.(tar\.gz|tgz - |tar\.bz2|tbz2? - |tar.lzma|tlz(?:ma?)? - |tar.xz|txz)$/x) { + + if ($newfile_base =~ $tarbase_regex){ my $filetype; eval { spawn(exec => ['file', '-b', '-k', "$destdir/$newfile_base"], @@ -2251,3 +2236,17 @@ sub compress_archive($$$) { wait_child => 1); unlink $from_file; } + +sub decompress_archive($$) { + my ($from_file, $to_file) = @_; + my $comp = compression_guess_from_filename($from_file); + unless ($comp) { + uscan_die("Cannot determine compression method of $from_file"); + } + + my $cmd = compression_get_property($comp, 'decomp_prog'); + spawn(exec => $cmd, + from_file => $from_file, + to_file => $to_file, + wait_child => 1); +} diff --git a/test/test_uscan b/test/test_uscan index 64293fa..c350b2a 100755 --- a/test/test_uscan +++ b/test/test_uscan @@ -38,6 +38,67 @@ containsName(){ . "${0%/*}/shunit2-helper-functions.sh" +# The following tests do the following: (1) create a minimal Debian package +# directory, containing minimal files debian/{changelog,watch,copyright}, +# (2) create a minimal repository, containing a tarball (built on the fly), +# (3) start an HTTP server that works offline, using the SimpleHTTPServer +# module of Python, and (4) run uscan inside that minimal universe. + + +# The following function tests the --repack feature +helperTestRepack() { + from_comp="$1" + to_comp="$2" + file_output="$3" + + PKG=foo + PORT=8000 + TMPDIR=$(mktemp -d) + + mkdir -p $TMPDIR/$PKG/debian + + cat <<END > $TMPDIR/$PKG/debian/watch +version=3 +http://localhost:$PORT/$PKG-(\d).tar.$from_comp +END + + cat <<END > $TMPDIR/$PKG/debian/changelog +$PKG (0-1) unstable; urgency=low + + * Initial release + + -- Joe Developer <[email protected]> Mon, 02 Nov 2013 22:21:31 -0100 +END + + mkdir -p $TMPDIR/repo/foo + touch $TMPDIR/repo/foo/content + + ( cd $TMPDIR/repo ; + tar cfa $PKG-1.tar.$from_comp * ; + python -m SimpleHTTPServer $PORT & + echo $! > pid ) + + OUTPUT=$( (cd $TMPDIR/$PKG ; $COMMAND --verbose --repack --repack-compression=$to_comp) ) + + TARBALL=${PKG}_1.orig.tar.$to_comp + assertTrue 'pristine tarball is not created' "[ -f $TMPDIR/$TARBALL ]" + assertNotNull "pristine tarball is not $to_comp-compressed" \ + "$( file -L $TMPDIR/$TARBALL | grep "$file_output" )" + CONTENTS="$(tar atf $TMPDIR/$TARBALL)" + assertTrue 'file contents missing' \ + $(containsName "$CONTENTS" content) + + cleanup + +} + +testRepackGZ_XZ() { helperTestRepack "gz" "xz" "XZ compressed data" ; } +testRepackGZ_BZ2() { helperTestRepack "gz" "bz2" "bzip2 compressed data" ; } +testRepackBZ2_GZ() { helperTestRepack "bz2" "gz" "gzip compressed data" ; } +testRepackGZ_GZ() { helperTestRepack "gz" "gz" "gzip compressed data" ; } +testRepackXZ_XZ() { helperTestRepack "xz" "xz" "XZ compressed data" ; } + + # The following function tests the Files-Excluded feature of uscan, which # allows the selective exclusion of files from the upstream tarball before # repacking it. -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/devscripts.git _______________________________________________ devscripts-devel mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/devscripts-devel
