Package: pristine-tar
Version: 0.17
Severity: wishlist
Tags: patch

On Mac OS X 10.3 with tar from MacPorts installed, /usr/bin/tar is GNU
tar 1.13.25 (from 2001) while /opt/local/bin/gnutar is GNU tar 1.20.
For some reason, I learned not to trust the old version of tar.  Maybe
it doesn't like the pax header that "git archive" adds.  So I wished
pristine-tar would use gnutar instead of tar.

I've attached a patch adding a variable $tarprog to specify a program to
use instead of tar.  It would probably be better to add a configuration
file or environment variable so that the user doesn't have to modify
three different files, but this was enough to scratch my itch.

If you have ideas about how to do this better, I would be glad to try
them out and send another patch.  Thanks for writing pristine-tar and
etckeeper - they have been incredibly helpful.

--- %< cut here ---
Subject: make tar command configurable

On some systems, the "tar" program that appears first on the PATH
is buggy or old, so that users may want to use "gnutar", "gtar",
or "/path/to/some/specific/tar" instead.

With this patch applied, one can specify a program to use instead
of "tar" by modifying the 'my $tarprog = "tar";' line in each
pristine-{tar,bz2,gz} script.
---
 pristine-bz2 |    5 +++--
 pristine-gz  |    5 +++--
 pristine-tar |   23 ++++++++++++-----------
 3 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/pristine-bz2 b/pristine-bz2
index 212e350..1080917 100755
--- a/pristine-bz2
+++ b/pristine-bz2
@@ -86,6 +86,7 @@ my @supported_bzip2_programs = qw(bzip2 pbzip2);
 my $verbose=0;
 my $debug=0;
 my $keep=0;
+my $tarprog="tar";
 
 sub usage {
        print STDERR "Usage: pristine-bz2 [-vdk] genbz2 delta file\n";
@@ -221,7 +222,7 @@ sub genbz2 {
                close OUT;
        }
 
-       doit("tar", "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
+       doit($tarprog, "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
        if (! -e "$tempdir/type") {
                die "failed to genbz2 delta $delta\n";
        }
@@ -298,7 +299,7 @@ sub gendelta {
        print OUT "$program\n";
        close OUT;
 
-       doit("tar", "czf", $delta, "-C", $tempdir, @files);
+       doit($tarprog, "czf", $delta, "-C", $tempdir, @files);
 
        if ($stdout) {
                doit("cat", $delta);
diff --git a/pristine-gz b/pristine-gz
index b2ca53a..a89726b 100755
--- a/pristine-gz
+++ b/pristine-gz
@@ -118,6 +118,7 @@ use constant {
 my $verbose=0;
 my $debug=0;
 my $keep=0;
+my $tarprog="tar";
 
 sub usage {
        print STDERR "Usage: pristine-gz [-vdk] gengz delta file\n";
@@ -319,7 +320,7 @@ sub gengz {
                close OUT;
        }
        
-       doit("tar", "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
+       doit($tarprog, "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
        if (! -e "$tempdir/type") {
                die "failed to gengz delta $delta\n";
        }
@@ -410,7 +411,7 @@ sub gendelta {
        print OUT "$timestamp\n";
        close OUT;
 
-       doit("tar", "czf", $delta, "-C", $tempdir, @files);
+       doit($tarprog, "czf", $delta, "-C", $tempdir, @files);
 
        if ($stdout) {
                doit("cat", $delta);
diff --git a/pristine-tar b/pristine-tar
index 2837f48..c7b8d5a 100755
--- a/pristine-tar
+++ b/pristine-tar
@@ -139,7 +139,8 @@ my $verbose=0;
 my $debug=0;
 my $keep=0;
 my $message;
-       
+my $tarprog="tar";
+
 # Force locale to C since tar may output utf-8 filenames differently
 # depending on the locale.
 $ENV{LANG}='C';
@@ -308,9 +309,9 @@ sub recreatetarball {
 
        my $ret="$tempdir/recreatetarball";
 
-       doit("tar", "cf", $ret, "--owner", 0, "--group", 0, 
+       doit($tarprog, "cf", $ret, "--owner", 0, "--group", 0,
                "--numeric-owner", "-C", "$tempdir/workdir",
-               "--no-recursion", "--mode", "0644", 
+               "--no-recursion", "--mode", "0644",
                "--files-from", "$tempdir/manifest");
        
        return $ret;
@@ -332,7 +333,7 @@ sub gentar {
                close OUT;
        }
 
-       doit("tar", "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
+       doit($tarprog, "xf", File::Spec->rel2abs($delta), "-C", $tempdir);
        if (! -e "$tempdir/type") {
                error "failed to gentar delta $delta";
        }
@@ -357,10 +358,10 @@ sub gentar {
        doit("xdelta", "patch", "$tempdir/delta", $recreatetarball, $out);
 
        if (-e "$tempdir/wrapper") {
-               my $type=`tar xOzf $tempdir/wrapper type`;
+               my $type=`$tarprog xOzf $tempdir/wrapper type`;
                chomp $type;
                if ($type eq 'gz') {
-                       doit("pristine-gz", 
+                       doit("pristine-gz",
                                ($verbose ? "-v" : "--no-verbose"),
                                ($debug ? "-d" : "--no-debug"),
                                ($keep ? "-k" : "--no-keep"),
@@ -385,7 +386,7 @@ sub genmanifest {
        my $tarball=shift;
        my $manifest=shift;
 
-       open(IN, "tar tf $tarball |") || die "tar tf: $!";
+       open(IN, $tarprog . " tf $tarball |") || die $tarprog . " tf: $!";
        open(OUT, ">", $manifest) || die "$!";
        while (<IN>) {
                chomp;
@@ -393,7 +394,7 @@ sub genmanifest {
                s/^\.?\/+//;
                print OUT "$_\n" if length $_;
        }
-       close IN || error "tar tf exited nonzero";
+       close IN || error $tarprog . " tf exited nonzero";
        close OUT;
 }
 
@@ -451,7 +452,7 @@ sub gendelta {
        if (! exists $opts{recreatetarball}) {
                my $sourcedir="$tempdir/tmp";
                doit("mkdir", $sourcedir);
-               doit("tar", "xf", File::Spec->rel2abs($tarball), "-C", 
$sourcedir);
+               doit($tarprog, "xf", File::Spec->rel2abs($tarball), "-C", 
$sourcedir);
                # if all files were in a subdir, use the subdir as the sourcedir
                my @out=grep { $_ ne "$sourcedir/.." && $_ ne "$sourcedir/." }
                        (glob("$sourcedir/*"), glob("$sourcedir/.*"));
@@ -477,7 +478,7 @@ sub gendelta {
        print OUT "tar\n";
        close OUT;
 
-       doit("tar", "czf", $delta, "-C", $tempdir, @files);
+       doit($tarprog, "czf", $delta, "-C", $tempdir, @files);
 
        if ($stdout) {
                doit("cat", $delta);
@@ -534,7 +535,7 @@ sub export {
                        }
                }
 
-               doit("git archive --format=tar \Q$id\E | (cd '$dest' && tar 
x)");
+               doit("git archive --format=tar \Q$id\E | (cd '$dest' && 
$tarprog x)");
        }
        else {
                die "unsupported vcs $vcs";
-- 
1.5.6.3.549.g8ca11




-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to