FORMATS: +.tar.gz,.tgz,.tar.bz2,.tar.bz,.tbz
authorshort <>
Fri, 28 Jun 2002 00:51:59 +0000 (00:51 +0000)
committershort <>
Fri, 28 Jun 2002 00:51:59 +0000 (00:51 +0000)
 - FORMATS with '.'s in $ext are now supported
Substitution is now done by bash variables, no longer by '!' character
 - variables provided: pathname,path,base,ext,extdir

bin/exx

diff --git a/bin/exx b/bin/exx
index 88933d0..d176d27 100755 (executable)
--- a/bin/exx
+++ b/bin/exx
@@ -8,12 +8,20 @@ use warnings;
 use IO::Handle;
 use Cwd qw(chdir cwd);
 
 use IO::Handle;
 use Cwd qw(chdir cwd);
 
+use constant FORMAT_TAR_GZ=>'tar xzf $pathname;i=`echo *`;echo "$i"|grep -q " " || test * = $base &&'
+                            .'(mv "$i" "$i".$$;(set +x;mv "$i".$$/* .);rmdir "$i".$$)';
 use constant FORMATS=>{
 use constant FORMATS=>{
-       "rpm"=>'rpm2cpio !|cpio -id --quiet',   #-v #FIXME: --sparse doesn't work, why?
-       "zip"=>'unzip -Lq !',
-       "a"  =>'ar x !',
-       "deb"=>'ar x !;for i in *.tar.gz;do j=`basename $i .tar.gz`;mkdir -p $j;cd $j;tar xzf ../$i;cd ..;rm -f $i;done',
-       "arj"=>'unarj x !',
+       "rpm"    =>'rpm2cpio $pathname|cpio -id --quiet',       #-v #FIXME: --sparse doesn't work, why?
+       "zip"    =>'unzip -Lq $pathname',
+       "a"      =>'ar x $pathname',
+       "deb"    =>'ar x $pathname;'
+                  .'for i in *.tar.gz;do j=`basename $i .tar.gz`;mkdir -p $j;cd $j;tar xzf ../$i;cd ..;rm -f $i;done',
+       "arj"    =>'unarj x $pathname',
+       "tar.gz" =>FORMAT_TAR_GZ,
+       "tgz"    =>"tar.gz",
+       "tar.bz2"=>do { $_=FORMAT_TAR_GZ; s/xzf/xjf/; $_; },
+       "tar.bz" =>"tar.bz2",
+       "tbz"    =>"tar.bz",
        };
 
 die "Syntax: $0 <pathname((".join("|",map(".$_",sort keys %{+FORMATS})).")|=<ext>)>..."
        };
 
 die "Syntax: $0 <pathname((".join("|",map(".$_",sort keys %{+FORMATS})).")|=<ext>)>..."
@@ -21,19 +29,37 @@ die "Syntax: $0 <pathname((".join("|",map(".$_",sort keys %{+FORMATS})).")|=<ext
 
 my $origdir=cwd;
 for my $fname (@ARGV) {
 
 my $origdir=cwd;
 for my $fname (@ARGV) {
-       $fname=~m#([^/]+)([.=])(\L[^./]+\E)$# or die "Extension not found for archive: $fname";
-       my($path,$base,$ext)=($`,$1,$3);
-       my($pathname)=($2 eq "=" ? "$path$base" : $fname);
-       my $cmd=FORMATS->{$ext} or die "Extension \"$ext\" not known for archive: $fname";
+       my @parsed;
+       for my $fmt (sort { length $a<=>length $b; } keys %{+FORMATS}) {
+               (my $fmtt=$fmt)=~s/(\W)/\\$1/g;
+               last if @parsed=$fname=~m#^(.*?)([^/]+)([.=])($fmtt)$#i;
+               }
+       $parsed[3] or die "Extension not found for archive: $fname";
+       my($path,$base,$ext)=@parsed[0,1,3];
+       my($pathname)=($parsed[2] eq "=" ? "$path$base" : $fname);
+       my($cmdtry,$cmd)=($ext);
+       do {
+               $cmd=$cmdtry;
+               $cmdtry=FORMATS->{$cmdtry};
+               } while ($cmdtry);
        -r $pathname && !-d $pathname or die "Archive not readable: $pathname";
        my($extdir)=(-e $base && !-d $base ? "$base.dir" : $base);
        -d $extdir or mkdir $extdir or die "Unable to create directory \"$extdir\": $!";
        chdir $extdir or die "Unable to chdir to \"$extdir\": $!";
        $pathname="../$pathname" if $pathname!~m#^/#;
        -r $pathname && !-d $pathname or die "Archive not readable: $pathname";
        my($extdir)=(-e $base && !-d $base ? "$base.dir" : $base);
        -d $extdir or mkdir $extdir or die "Unable to create directory \"$extdir\": $!";
        chdir $extdir or die "Unable to chdir to \"$extdir\": $!";
        $pathname="../$pathname" if $pathname!~m#^/#;
-       $pathname=~s/'/'\\''/g;
-       $pathname="'$pathname'";
-       $cmd=~s/!/$pathname/g;
+       $path    ="../$path"     if $path    !~m#^/#;
        $cmd="set -ex;$cmd";
        $cmd="set -ex;$cmd";
+       my %substvars=(
+                       "pathname"=>\$pathname,
+                       "path"    =>\$path,
+                       "base"    =>\$base,
+                       "ext"     =>\$ext,
+                       "extdir"  =>\$extdir,
+                       );
+       while (my($name,$var)=each %substvars) {
+               ($_=$$var)=~s/'/'\\''/g;
+               $cmd="$name='$_';$cmd";
+               }
        print "\t$extdir/:\n"; STDOUT->flush();
        my $rc;
        $rc=system $cmd and die "$cmd (rc=".($rc>>8)."): $!";
        print "\t$extdir/:\n"; STDOUT->flush();
        my $rc;
        $rc=system $cmd and die "$cmd (rc=".($rc>>8)."): $!";