+.config/yt-dlp.conf
[nethome.git] / bin / exx
1 #! /usr/bin/perl
2 #
3 #       $Id$
4
5 use strict;
6 use warnings;
7
8 use IO::Handle;
9 use Cwd qw(chdir cwd);
10
11 use constant FORMAT_TAR=>'tar xf $pathname;i=`echo *`;echo "$i"|grep -q " " || test * != $base ||'
12                          .'(mv "$i" "$i".$$;(set +x;mv "$i".$$/* .);rmdir "$i".$$)';
13 use constant FORMATS=>{
14         "rpm"    =>'rpm2cpio $pathname|cpio -id --quiet',       #-v #FIXME: --sparse doesn't work, why?
15         "zip"    =>'unzip -Lq $pathname',
16         "jar"    =>'unzip -Lq $pathname',
17         "xpi"    =>'unzip -Lq $pathname',
18         "crx"    =>'unzip -Lq $pathname',
19         "a"      =>'ar x $pathname',
20         "deb"    =>'ar x $pathname;'
21                    .'for i in *.tar.gz;do j=`basename $i .tar.gz`;mkdir -p $j;cd $j;tar xzf ../$i;cd ..;rm -f $i;done',
22         "arj"    =>'unarj x $pathname',
23         "tar"    =>FORMAT_TAR,
24         "tar.gz" =>do { $_=FORMAT_TAR; s/xf/xzf/; $_; },
25         "tgz"    =>"tar.gz",
26         "tar.bz2"=>do { $_=FORMAT_TAR; s/xf/xjf/; $_; },
27         "tar.bz" =>"tar.bz2",
28         "tbz"    =>"tar.bz",
29         "tar.xz" =>do { $_=FORMAT_TAR; s/xf/xJf/; $_; },
30         "txz"    =>do { $_=FORMAT_TAR; s/xf/xJf/; $_; },
31         "msi"    =>'cabextract -q $pathname',
32         };
33
34 die "Syntax: $0 <pathname((".join("|",map(".$_",sort keys %{+FORMATS})).")|=<ext>)>..."
35                 if !@ARGV;
36
37 my @extdirs;
38 my $origdir=cwd;
39 for my $fname (@ARGV) {
40         my @parsed;
41         for my $fmt (sort { length $b<=>length $a; } keys %{+FORMATS}) {
42                 last if @parsed=$fname=~m#^(.*?)([^/]+)([.=])(\Q$fmt\E)$#i;
43                 }
44         $parsed[3] or die "Extension not found for archive: $fname";
45         my($path,$base,$ext)=@parsed[0,1,3];
46         my($pathname)=($parsed[2] eq "=" ? "$path$base" : $fname);
47         my($cmdtry,$cmd)=(lc $ext);
48         do {
49                 $cmd=$cmdtry;
50                 $cmdtry=FORMATS->{$cmdtry};
51                 } while ($cmdtry);
52         -r $pathname && !-d $pathname or die "Archive not readable: $pathname";
53         my($extdir)=(-e $base && !-d $base ? "$base.dir" : $base);
54         # Extraction-overwriting cowardly not supported:
55                         # -d $extdir or ...
56         mkdir $extdir or die "Unable to create directory \"$extdir\": $!";
57         chdir $extdir or die "Unable to chdir to \"$extdir\": $!";
58         $pathname="../$pathname" if $pathname!~m#^/#;
59         $path    ="../$path"     if $path    !~m#^/#;
60         $cmd="set -ex;$cmd";
61         my %substvars=(
62                         "pathname"=>\$pathname,
63                         "path"    =>\$path,
64                         "base"    =>\$base,
65                         "ext"     =>\$ext,
66                         "extdir"  =>\$extdir,
67                         );
68         while (my($name,$var)=each %substvars) {
69                 ($_=$$var)=~s/'/'\\''/g;
70                 $cmd="$name='$_';$cmd";
71                 }
72         print "\t$extdir/:\n"; STDOUT->flush();
73         my $rc;
74         $rc=system $cmd and die "$cmd (rc=".($rc>>8)."): $!";
75         push @extdirs,$extdir;
76         }
77         continue {
78                 chdir $origdir;
79                 }
80 print "extdir=".$extdirs[0]."\n" if 1==@extdirs;
81 exit 0;