bz2 changes
authorJoey Hess <joey@kodama.kitenet.net>
Sat, 2 Feb 2008 18:07:44 +0000 (13:07 -0500)
committerJoey Hess <joey@kodama.kitenet.net>
Sat, 2 Feb 2008 18:07:44 +0000 (13:07 -0500)
change bz2 format -- type is "bz2" and the wrapper is just "wrapper" --
pristine-tar will look at the wrapper type to dispatch the right program

also, compacted the code to generate wrappers somewhat, avoid reopening the
file

delta-format.txt
pristine-bz2
pristine-tar

index 83e6262..f9e3453 100644 (file)
@@ -3,7 +3,7 @@ The delta file is a compressed tarball, containing the following files:
 version
        Currently "2.0".
 type
-       Type of file this is a delta for ("tar", "gz", or "bzip2").
+       Type of file this is a delta for ("tar", "gz", or "bz2").
 
 
 For tar files, it contains:
@@ -33,7 +33,7 @@ filename
        Filename of the original input file.
 
 
-For bzip2 files, wrapper-bz2 contains:
+For bzip2 files the wrapper contains:
 
 params
        Currently, only the compression level is detected (4th byte of the
index 14f7149..2c8ad78 100755 (executable)
@@ -233,8 +233,8 @@ sub genbz2 {
        if (open (IN, "$tempdir/type")) {
                my $type=<IN>;
                chomp $type;
-               if ($type ne "bzip2") {
-                       die "delta is for a $type, not a bzip2\n";
+               if ($type ne "bz2") {
+                       die "delta is for a $type, not a bz2\n";
                }
                close IN;
        }
@@ -287,7 +287,7 @@ sub gendelta {
        print OUT "2.0\n";
        close OUT;
        open(OUT, ">", "$tempdir/type") || die "$!";
-       print OUT "bzip2\n";
+       print OUT "bz2\n";
        close OUT;
        open(OUT, ">", "$tempdir/params") || die "$!";
        print OUT "@params\n";
index 1f1a48a..f6433dd 100755 (executable)
@@ -25,7 +25,7 @@ using sources in revision control, without the need to keep copies of
 upstream tarballs.
 
 pristine-tar supports compressed tarballs, calling out to pristine-gz(1)
-to produce the pristine gzip files.
+and pristine-bz2(1) to produce the pristine gzip and bzip2 files.
 
 =head1 COMMANDS
 
@@ -90,8 +90,7 @@ Don't clean up the temporary directory on exit.
 
 =head1 LIMITATIONS
 
-Only .tar, .tar.gz, and .tar.bz2 files are currently supported; .tar.bz2
-support is experimental, see pristine-bz2(1).
+Only .tar, .tar.gz, and .tar.bz2 files are currently supported.
 
 It could fail on certain spectacularly strange files. If it fails, it will
 fail during creation of the delta, since the delta is tested to make sure it
@@ -338,25 +337,31 @@ sub gentar {
        }
 
        recreatetarball($tempdir, getcwd, clobber_source => 0, %opts);
-       my $out=(-e "$tempdir/wrapper" || -e "$tempdir/wrapper-bz2") ? $tarball.".tmp" : $tarball;
+       my $out=(-e "$tempdir/wrapper") ? $tarball.".tmp" : $tarball;
        doit("xdelta", "patch", "$tempdir/delta", "$tempdir/recreatetarball", $out);
 
        if (-e "$tempdir/wrapper") {
-               doit("pristine-gz", 
-                       ($verbose ? "-v" : "--no-verbose"),
-                       ($debug ? "-d" : "--no-debug"),
-                       ($keep ? "-k" : "--no-keep"),
-                       "gengz", "$tempdir/wrapper", $out);
-               doit("mv", "-f", $out.".gz", $tarball);
-       }
-
-       if (-e "$tempdir/wrapper-bz2") {
-               doit("pristine-bz2",
-                       ($verbose ? "-v" : "--no-verbose"),
-                       ($debug ? "-d" : "--no-debug"),
-                       ($keep ? "-k" : "--no-keep"),
-                       "genbz2", "$tempdir/wrapper-bz2", $out);
-               doit("mv", "-f", $out.".bz2", $tarball);
+               my $type=`tar xOzf $tempdir/wrapper`;
+               chomp $type;
+               if ($type eq 'gz') {
+                       doit("pristine-gz", 
+                               ($verbose ? "-v" : "--no-verbose"),
+                               ($debug ? "-d" : "--no-debug"),
+                               ($keep ? "-k" : "--no-keep"),
+                               "gengz", "$tempdir/wrapper", $out);
+                       doit("mv", "-f", $out.".gz", $tarball);
+               }
+               elsif ($type eq 'bz2') {
+                       doit("pristine-bz2",
+                               ($verbose ? "-v" : "--no-verbose"),
+                               ($debug ? "-d" : "--no-debug"),
+                               ($keep ? "-k" : "--no-keep"),
+                               "genbz2", "$tempdir/wrapper", $out);
+                       doit("mv", "-f", $out.".bz2", $tarball);
+               }
+               else {
+                       error "unknown wrapper file type: $type";
+               }
        }
 }
        
@@ -390,40 +395,39 @@ sub gendelta {
 
        my @files=qw(delta manifest version type);
 
-       # Check to see if it's gzip-compressed.
+       # Check to see if it's compressed.
+       my $compression=undef;
        open (IN, "<", $tarball) || error "Cannot read $tarball: $!\n";
        my ($chars, $id1, $id2, $method);
        if (read(IN, $chars, 10) == 10 &&
            (($id1, $id2, $method) = unpack("CCC", $chars)) &&
            $id1 == GZIP_ID1 && $id2 == GZIP_ID2 &&
            $method == GZIP_METHOD_DEFLATE) {
-               doit("pristine-gz",
-                       ($verbose ? "-v" : "--no-verbose"),
-                       ($debug ? "-d" : "--no-debug"),
-                       ($keep ? "-k" : "--no-keep"),
-                       "gendelta", $tarball, "$tempdir/wrapper");
-               push @files, "wrapper";
+               $compression='gz';
                doit("zcat $tarball > $tempdir/origtarball");
-               $tarball="$tempdir/origtarball";
+       }
+       else {
+               seek(IN, 0, 0) || die "seek: $!";
+               if (read(IN, $chars, 3) == 3 &&
+                   (($id1, $id2, $method) = unpack("CCC", $chars)) &&
+                   $id1 == BZIP2_ID1 && $id2 == BZIP2_ID2 &&
+                   $method == BZIP2_METHOD_HUFFMAN) {
+                       $compression='bz2';
+                       $tarball="$tempdir/origtarball";
+               }
        }
        close IN;
-
-       # Check to see if it's bzip2-compressed.
-       open (IN, "<", $tarball) || error "Cannot read $tarball: $!\n";
-       if (read(IN, $chars, 3) == 3 &&
-            (($id1, $id2, $method) = unpack("CCC", $chars)) &&
-            $id1 == BZIP2_ID1 && $id2 == BZIP2_ID2 &&
-            $method == BZIP2_METHOD_HUFFMAN) {
-               doit("pristine-bz2",
+       
+       # Generate a wrapper file to recreate the compressed file.
+       if (defined $compression) {
+               doit("pristine-$compression",
                        ($verbose ? "-v" : "--no-verbose"),
                        ($debug ? "-d" : "--no-debug"),
                        ($keep ? "-k" : "--no-keep"),
-                       "gendelta", $tarball, "$tempdir/wrapper-bz2");
-               push @files, "wrapper-bz2";
-               doit("bzcat $tarball > $tempdir/origtarball");
+                       "gendelta", $tarball, "$tempdir/wrapper");
+               push @files, "wrapper";
                $tarball="$tempdir/origtarball";
        }
-       close IN;
 
        my $sourcedir="$tempdir/tmp";
        doit("mkdir", $sourcedir);