Refactor zip and tarfile loops together, branch where calls are different

This fixed a few bugs and simplified the code
pull/18777/head
Ben Doherty 9 years ago committed by Matt Clay
parent 8fc2a22b4c
commit fb03fc8eb1

@ -220,58 +220,54 @@ def main():
if state != 'archive': if state != 'archive':
try: try:
# Easier compression using tarfile module
if compression == 'gz' or compression == 'bz2':
arcfile = tarfile.open(creates, 'w|' + compression)
arcfile.add(arcroot, os.path.basename(arcroot), recursive=False)
for path in archive_paths: # Slightly more difficult (and less efficient!) compression using zipfile module
basename = '' if compression == 'zip':
arcfile = zipfile.ZipFile(creates, 'w', zipfile.ZIP_DEFLATED)
# Prefix trees in the archive with their basename, unless specifically prevented with '.'
if os.path.isdir(path) and not path.endswith(os.sep + '.'):
basename = os.path.basename(path) + os.sep
try:
def exclude_creates(f):
if os.path.exists(f.name) and not filecmp.cmp(f.name, creates):
return f
return None # Easier compression using tarfile module
elif compression == 'gz' or compression == 'bz2':
arcfile = tarfile.open(creates, 'w|' + compression)
arcfile.add(path, basename + path[len(arcroot):], filter=exclude_creates) for path in archive_paths:
successes.append(path) basename = ''
except: # Prefix trees in the archive with their basename, unless specifically prevented with '.'
e = get_exception() if os.path.isdir(path) and not path.endswith(os.sep + '.'):
errors.append('error adding %s: %s' % (path, str(e))) basename = os.path.basename(path) + os.sep
# Slightly more difficult (and less efficient!) compression using zipfile module for dirpath, dirnames, filenames in os.walk(path, topdown=True):
elif compression == 'zip': for dirname in dirnames:
arcfile = zipfile.ZipFile(creates, 'w', zipfile.ZIP_DEFLATED) fullpath = dirpath + os.sep + dirname
for path in archive_paths: try:
basename = '' if compression == 'zip':
arcfile.write(fullpath, basename + dirname)
else:
arcfile.add(fullpath, basename + dirname, recursive=False)
# Prefix trees in the archive with their basename, unless specifically prevented with '.' except Exception:
if os.path.isdir(path) and not path.endswith(os.sep + '.'): e = get_exception()
basename = os.path.basename(path) + os.sep errors.append('%s: %s' % (fullpath, str(e)))
for dirpath, dirnames, filenames in os.walk(path, topdown=True): for filename in filenames:
for dirname in dirnames: fullpath = dirpath + os.sep + filename
arcfile.write(dirpath + os.sep + dirname, basename + dirname)
for filename in filenames:
fullpath = dirpath + os.sep + filename
if not filecmp.cmp(fullpath, creates): if not filecmp.cmp(fullpath, creates):
arcfile.write(fullpath, basename + filename) try:
if compression == 'zip':
arcfile.write(fullpath, basename + filename)
else:
arcfile.add(fullpath, basename + filename, recursive=False)
successes.append(path) successes.append(fullpath)
except Exception:
e = get_exception()
errors.append('Adding %s: %s' % (path, str(e)))
except OSError: except Exception:
e = get_exception() e = get_exception()
module.fail_json(msg='Error when writing %s archive at %s: %s' % (compression == 'zip' and 'zip' or ('tar.' + compression), creates, str(e))) return module.fail_json(msg='Error when writing %s archive at %s: %s' % (compression == 'zip' and 'zip' or ('tar.' + compression), creates, str(e)))
if arcfile: if arcfile:
arcfile.close() arcfile.close()

Loading…
Cancel
Save