2010-08-02 11:14:18 -04:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# by Erik Osheim
|
|
|
|
#
|
|
|
|
# This program unboxes various archive
|
|
|
|
|
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
from subprocess import call
|
|
|
|
import sys
|
|
|
|
import tempfile
|
|
|
|
|
|
|
|
# list each kind of archive in terms of extension, and then program and
|
|
|
|
# arguments to use. Use None to indicate where the filename should be placed.
|
|
|
|
handlers = {
|
|
|
|
'.zip': ['unzip', None],
|
2012-02-01 09:05:55 -05:00
|
|
|
'.jar': ['unzip', None],
|
2010-08-02 11:14:18 -04:00
|
|
|
'.tgz': ['tar', 'xvzf', None],
|
|
|
|
'.tbz': ['tar', 'xvjf', None],
|
|
|
|
'.tar.gz': ['tar', 'xvzf', None],
|
|
|
|
'.tar.bz2': ['tar', 'xvjf', None],
|
|
|
|
#'.tar.xz': ['tar', 'xvJz', None],
|
|
|
|
}
|
|
|
|
|
|
|
|
# program usage
|
|
|
|
def usage(err=None):
|
|
|
|
retval = 0
|
|
|
|
if err:
|
|
|
|
retval = 1
|
|
|
|
print 'error: %s' % err
|
|
|
|
print 'usage: unbox ARCHIVE'
|
|
|
|
sys.exit(retval)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
args = sys.argv[1:]
|
|
|
|
if not args:
|
|
|
|
usage()
|
|
|
|
elif len(args) > 1:
|
|
|
|
usage('too many arguments')
|
|
|
|
path = args[0]
|
|
|
|
if not os.path.exists(path):
|
|
|
|
usage('path %r does not exist' % path)
|
|
|
|
|
|
|
|
cmd = None
|
|
|
|
for ext in handlers:
|
|
|
|
if path.endswith(ext):
|
|
|
|
cmd = handlers[ext]
|
|
|
|
base = path[:-len(ext)]
|
|
|
|
if not cmd:
|
|
|
|
usage("can't handle path %r" % path)
|
|
|
|
|
|
|
|
d = tempfile.mkdtemp(prefix='unbox-')
|
|
|
|
|
|
|
|
fd, path2 = tempfile.mkstemp(dir=d)
|
|
|
|
os.write(fd, open(path, 'rb').read())
|
|
|
|
os.close(fd)
|
|
|
|
|
|
|
|
cwd = os.getcwd()
|
|
|
|
print d
|
|
|
|
os.chdir(d)
|
|
|
|
|
|
|
|
base2 = os.path.basename(path2)
|
|
|
|
|
|
|
|
# put the path into the command
|
|
|
|
cmd = [x or base2 for x in cmd]
|
|
|
|
|
|
|
|
retcode = call(cmd)
|
|
|
|
if retcode != 0:
|
|
|
|
print 'error: %s failed (%d)' % (cmd[0], retcode)
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
os.unlink(path2)
|
|
|
|
|
|
|
|
items = os.listdir(d)
|
|
|
|
if len(items) == 1:
|
|
|
|
shutil.move(d + '/' + items[0], cwd)
|
|
|
|
shutil.rmtree(d)
|
|
|
|
else:
|
|
|
|
shutil.move(d, cwd + '/' + base)
|