Upgrade to Archive::Tar 1.36
Nicholas Clark [Sun, 16 Sep 2007 09:40:45 +0000 (09:40 +0000)]
(Portability fixes for VMS, as offered by Craig Berry)

p4raw-id: //depot/perl@31874

lib/Archive/Tar.pm
lib/Archive/Tar/Constant.pm
lib/Archive/Tar/t/src/long/bar.tar.packed
lib/Archive/Tar/t/src/long/foo.tgz.packed
lib/Archive/Tar/t/src/short/bar.tar.packed
lib/Archive/Tar/t/src/short/foo.tgz.packed

index 21d71bd..2b57b59 100644 (file)
@@ -14,7 +14,7 @@ use vars qw[$DEBUG $error $VERSION $WARN $FOLLOW_SYMLINK $CHOWN $CHMOD
 $DEBUG              = 0;
 $WARN               = 1;
 $FOLLOW_SYMLINK     = 0;
-$VERSION            = "1.34_01";
+$VERSION            = "1.36";
 $CHOWN              = 1;
 $CHMOD              = 1;
 $DO_NOT_USE_PREFIX  = 0;
@@ -547,20 +547,39 @@ sub _extract_file {
     ### it's a relative path ###
     } else {
         my $cwd     = (defined $self->{cwd} ? $self->{cwd} : cwd());
-        my @dirs;
-        if ( defined $alt ) { # It's a local-OS path
-            @dirs   = File::Spec->splitdir( $dirs );
-        } else {              # it's UNIX-style, likely straight from the tarball
-            @dirs   = File::Spec::Unix->splitdir( $dirs );
-        }
-        map tr/\./_/, @dirs if $^O eq 'VMS'; # '.' is the directory delimiter
+
+
+
+        my @dirs = defined $alt
+            ? File::Spec->splitdir( $dirs )         # It's a local-OS path
+            : File::Spec::Unix->splitdir( $dirs );  # it's UNIX-style, likely
+                                                    # straight from the tarball
+        
+        ### '.' is the directory delimiter, of which the first one has to
+        ### be escaped/changed.
+        map tr/\./_/, @dirs if ON_VMS;        
+
         my ($cwd_vol,$cwd_dir,$cwd_file) 
                     = File::Spec->splitpath( $cwd );
         my @cwd     = File::Spec->splitdir( $cwd_dir );
         push @cwd, $cwd_file if length $cwd_file;
-        $dir        = File::Spec->catpath( $cwd_vol, File::Spec->catdir( @cwd, @dirs ) );
 
-        # catdir() returns undef if the path is longer than 255 chars on VMS
+        ### We need to pass '' as the last elemant to catpath. Craig Berry
+        ### explains why (msgid <p0624083dc311ae541393@[172.16.52.1]>):
+        ### The root problem is that splitpath on UNIX always returns the 
+        ### final path element as a file even if it is a directory, and of
+        ### course there is no way it can know the difference without checking
+        ### against the filesystem, which it is documented as not doing.  When
+        ### you turn around and call catpath, on VMS you have to know which bits
+        ### are directory bits and which bits are file bits.  In this case we
+        ### know the result should be a directory.  I had thought you could omit
+        ### the file argument to catpath in such a case, but apparently on UNIX
+        ### you can't.
+        $dir        = File::Spec->catpath( 
+                            $cwd_vol, File::Spec->catdir( @cwd, @dirs ), '' 
+                        );
+
+        ### catdir() returns undef if the path is longer than 255 chars on VMS
         unless ( defined $dir ) {
             $^W && $self->_error( qq[Could not compose a path for '$dirs'\n] );
             return;
index 8cd56a4..00416d5 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
                 BLOCK_SIZE TAR_PAD TAR_END ON_UNIX BLOCK CAN_READLINK MAGIC 
                 TAR_VERSION UNAME GNAME CAN_CHOWN MODE CHECK_SUM UID GID 
                 GZIP_MAGIC_NUM MODE_READ LONGLINK LONGLINK_NAME PREFIX_LENGTH
-                LABEL NAME_LENGTH STRIP_MODE
+                LABEL NAME_LENGTH STRIP_MODE ON_VMS
             ];
 
     require Time::Local if $^O eq "MacOS";
@@ -73,5 +73,6 @@ use constant GZIP_MAGIC_NUM => qr/^(?:\037\213|\037\235)/;
 use constant CAN_CHOWN      => do { ($> == 0 and $^O ne "MacOS" and $^O ne "MSWin32") };
 use constant CAN_READLINK   => ($^O ne 'MSWin32' and $^O !~ /RISC(?:[ _])?OS/i and $^O ne 'VMS');
 use constant ON_UNIX        => ($^O ne 'MSWin32' and $^O ne 'MacOS' and $^O ne 'VMS');
+use constant ON_VMS         => $^O eq 'VMS'; 
 
 1;
index 2e86525..85e4706 100644 (file)
@@ -10,7 +10,7 @@ To recreate it use the following command:
 
      uupacktool.pl -p lib/Archive/Tar/t/src/long/bar.tar lib/Archive/Tar/t/src/long/bar.tar.packed
 
-Created at Wed Aug 15 15:56:07 2007
+Created at Sun Sep 16 10:56:54 2007
 #########################################################################
 __UU__
 M8P``````````````````````````````````````````````````````````
index 8ea6684..f7b9adc 100644 (file)
@@ -10,7 +10,7 @@ To recreate it use the following command:
 
      uupacktool.pl -p lib/Archive/Tar/t/src/long/foo.tgz lib/Archive/Tar/t/src/long/foo.tgz.packed
 
-Created at Wed Aug 15 15:56:07 2007
+Created at Sun Sep 16 10:56:54 2007
 #########################################################################
 __UU__
 M'XL(`````````^W72VZ#,!`&8*]S"BY`F,$/MCT`ET")25`<D"A1Q.UKR*M1
index e4cf9b8..09c7b88 100644 (file)
@@ -10,7 +10,7 @@ To recreate it use the following command:
 
      uupacktool.pl -p lib/Archive/Tar/t/src/short/bar.tar lib/Archive/Tar/t/src/short/bar.tar.packed
 
-Created at Wed Aug 15 15:56:07 2007
+Created at Sun Sep 16 10:56:55 2007
 #########################################################################
 __UU__
 M8P``````````````````````````````````````````````````````````
index 4cfb035..45524b0 100644 (file)
@@ -10,7 +10,7 @@ To recreate it use the following command:
 
      uupacktool.pl -p lib/Archive/Tar/t/src/short/foo.tgz lib/Archive/Tar/t/src/short/foo.tgz.packed
 
-Created at Wed Aug 15 15:56:07 2007
+Created at Sun Sep 16 10:56:55 2007
 #########################################################################
 __UU__
 M'XL(`````````^W300K",!"%X5GW%#G"3-JFYREJ080NJKU_A^A"$.RJ(\+_