zu 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/zu +118 -0
- metadata +63 -0
data/bin/zu
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
## Like "uz", but more featureful.
|
3
|
+
|
4
|
+
# TODO:
|
5
|
+
# - Refactor
|
6
|
+
# - Make this n00bish code less ugly
|
7
|
+
# - Extract lib/zu.rb so it's usable inside Ruby
|
8
|
+
# - Add -h/--help
|
9
|
+
# - Add -D/--deps
|
10
|
+
# - Make -d delete all archives on the args lit (use an options gem)
|
11
|
+
# - Build if given -b ?
|
12
|
+
# - Add these formats:
|
13
|
+
# .jar (zip)
|
14
|
+
# .lzma (unlzma)
|
15
|
+
# .tlz (unlzma)
|
16
|
+
# .7z (7z)
|
17
|
+
# .apk (zip?)
|
18
|
+
# ...?
|
19
|
+
|
20
|
+
class Array
|
21
|
+
def polite?
|
22
|
+
dir_match = %r[[^/]+/]
|
23
|
+
first = self[0][dir_match]
|
24
|
+
self.size == 1 or (
|
25
|
+
first and size == select do |e| e[dir_match] == first end.size
|
26
|
+
)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def redwarn msg
|
31
|
+
warn "\e[31m#{msg}\e[0m"
|
32
|
+
end
|
33
|
+
|
34
|
+
def maybe_download str
|
35
|
+
return str unless str[%r(^(?:ht|f)tp.+/(.+))]
|
36
|
+
$delete_afterward = true # just treat the download as temporary.
|
37
|
+
if File.exists? $1
|
38
|
+
redwarn "#$1 already exists. Not re-downloading."
|
39
|
+
exit 3
|
40
|
+
end
|
41
|
+
unless system 'wget', str
|
42
|
+
redwarn "#$1 appears to be a downloadable file, but download failed."
|
43
|
+
warn 'Please verify that `wget` is installed and available in your PATH.'
|
44
|
+
exit 4
|
45
|
+
end
|
46
|
+
$1
|
47
|
+
end
|
48
|
+
|
49
|
+
def rpm2tgz rpm_name
|
50
|
+
tgzname = File.basename(full_path, '.rpm') + '.tgz'
|
51
|
+
system 'rpm2tgz', full_path
|
52
|
+
tgzname
|
53
|
+
end
|
54
|
+
|
55
|
+
$delete_afterward = false
|
56
|
+
def extract e
|
57
|
+
if '-d' == e
|
58
|
+
$delete_afterward = true
|
59
|
+
return
|
60
|
+
end
|
61
|
+
f = maybe_download e
|
62
|
+
return redwarn "'#{f}' doesn't seem to exist." unless File.exists? f
|
63
|
+
full_path = File.expand_path f
|
64
|
+
basename = File.basename f
|
65
|
+
ext = File.extname f
|
66
|
+
simplename = basename.chomp ext
|
67
|
+
if '.tar' == File.extname(simplename)
|
68
|
+
simpename = simplename.chomp '.tar'
|
69
|
+
ext = '.tar' + ext
|
70
|
+
end
|
71
|
+
|
72
|
+
run_and_split = proc do |cmd_and_args|
|
73
|
+
IO.popen(cmd_and_args + ' ' + full_path).read.split /\n/
|
74
|
+
end
|
75
|
+
|
76
|
+
files_list, extract_cmd = *(
|
77
|
+
case ext.downcase
|
78
|
+
when '.zip'; [ run_and_split['zipinfo -1'], %w(unzip) ]
|
79
|
+
when '.tar', '.gem'; [ run_and_split['tar tf'], %w(tar xvf) ]
|
80
|
+
when '.tar.gz', '.tgz'; [ run_and_split['tar tzf'], %w(tar xvzf) ]
|
81
|
+
when '.tar.bz2', '.tbz2'; [ run_and_split['tar tjf'], %w(tar xvjf) ]
|
82
|
+
when '.tar.xz', '.txz'; [ run_and_split['tar tJf'], %w(tar xvJf) ]
|
83
|
+
when '.deb', '.ar'; [ run_and_split['ar t'], %w(ar xv) ]
|
84
|
+
when '.rpm'; return extract rpm2tgz[full_path]
|
85
|
+
when '.gz', '.xz', '.bz2'
|
86
|
+
[
|
87
|
+
[ simplename ],
|
88
|
+
{ '.gz' => %w(gunzip), '.xz' => %w(unxz), '.bz2' => %w(bunzip2) }[ext]
|
89
|
+
]
|
90
|
+
else
|
91
|
+
return redwarn "'#{f}' - Unknown extension. Doing nothing with it."
|
92
|
+
end)
|
93
|
+
|
94
|
+
extract = proc do
|
95
|
+
extract_cmd.push full_path
|
96
|
+
if system *extract_cmd
|
97
|
+
if $delete_afterward
|
98
|
+
File.exist? full_path and File.unlink full_path
|
99
|
+
end
|
100
|
+
else
|
101
|
+
redwarn "`#{extract_cmd.join ' '}` failed (#{$?})."
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if files_list.polite?
|
106
|
+
extract.call
|
107
|
+
else
|
108
|
+
puts "# Caught impoliteness. mkdir \e[34;1m#{simplename}\e[0m/, then."
|
109
|
+
Dir.mkdir simplename
|
110
|
+
Dir.chdir simplename do
|
111
|
+
extract.call
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
ARGV.each do |e|
|
117
|
+
extract e
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zu
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Bill
|
9
|
+
- Ted
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-08-11 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
15
|
+
description: ! "zu\n==\n\nUnzipper (in the tradition of `uz`, but better). Works for
|
16
|
+
.tgz, .xz, .zip,\n.deb, .rpm — you name it. (Literally. If you find an archive that
|
17
|
+
it doesn't\nopen, let me know about it and I'll add that.)\n\nIf you have an archive
|
18
|
+
sitting there of format `xyz`, then `zu foo.xyz` should\ntake care of it.\n\nIt
|
19
|
+
will:\n\n- Know how to extract the archive (based on extension ┈ though a version
|
20
|
+
that\n detects based on `file` is something we're considering)\n- Guard against
|
21
|
+
impoliteness. That is, if the archive only has one file, it\n will be permitted
|
22
|
+
to extract into the current directory, otherwise it will\n first `mkdir foo; cd
|
23
|
+
foo` then extract there. (The directory name will be\n the archive file minus the
|
24
|
+
extension.)\n- Download the file first, using `wget`, if the arg starts with `http:`,\n
|
25
|
+
\ `https:`, or `ftp:`\n- Remove the archive file if you pass `-d`\n\nDependencies\n------------\n\n`zu`
|
26
|
+
doesn't strive to be dependency-free by any means.\n\nFor starters, it expects Ruby.\n\nThen
|
27
|
+
it simply delegates to `unzip`, `gunzip`, `tar`, etc.\n\nNot sure if I ever plan
|
28
|
+
on changing this. The main purpose is to optimize the\ncommand-line extraction of
|
29
|
+
archives on a configured box.\n\nInstallation\n------------\n\n1. Have Ruby 1.8
|
30
|
+
(with gems) or 1.9\n2. `gem install zu`\n\nFeedback\n--------\n\nTell us. (exad-zu@sharpsaw.worg)[mailto:exad-zu@sharpsaw.org]\n"
|
31
|
+
email: exad-zu@sharpsaw.org
|
32
|
+
executables:
|
33
|
+
- zu
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- bin/zu
|
38
|
+
homepage: https://github.com/exad/zu/
|
39
|
+
licenses: []
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.8.24
|
59
|
+
signing_key:
|
60
|
+
specification_version: 3
|
61
|
+
summary: An omni-unzipper in the tradition of `uz`. Works with .zip, .tgz, .deb, etc.
|
62
|
+
test_files: []
|
63
|
+
has_rdoc:
|