|
|
|
@ -220,12 +220,15 @@ def main():
|
|
|
|
|
|
|
|
|
|
if state != 'archive':
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
|
|
# Slightly more difficult (and less efficient!) compression using zipfile module
|
|
|
|
|
if compression == 'zip':
|
|
|
|
|
arcfile = zipfile.ZipFile(creates, 'w', zipfile.ZIP_DEFLATED)
|
|
|
|
|
|
|
|
|
|
# Easier compression using tarfile module
|
|
|
|
|
if compression == 'gz' or compression == 'bz2':
|
|
|
|
|
elif 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:
|
|
|
|
|
basename = ''
|
|
|
|
|
|
|
|
|
@ -233,45 +236,38 @@ def main():
|
|
|
|
|
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
|
|
|
|
|
for dirpath, dirnames, filenames in os.walk(path, topdown=True):
|
|
|
|
|
for dirname in dirnames:
|
|
|
|
|
fullpath = dirpath + os.sep + dirname
|
|
|
|
|
|
|
|
|
|
arcfile.add(path, basename + path[len(arcroot):], filter=exclude_creates)
|
|
|
|
|
successes.append(path)
|
|
|
|
|
try:
|
|
|
|
|
if compression == 'zip':
|
|
|
|
|
arcfile.write(fullpath, basename + dirname)
|
|
|
|
|
else:
|
|
|
|
|
arcfile.add(fullpath, basename + dirname, recursive=False)
|
|
|
|
|
|
|
|
|
|
except:
|
|
|
|
|
except Exception:
|
|
|
|
|
e = get_exception()
|
|
|
|
|
errors.append('error adding %s: %s' % (path, str(e)))
|
|
|
|
|
|
|
|
|
|
# Slightly more difficult (and less efficient!) compression using zipfile module
|
|
|
|
|
elif compression == 'zip':
|
|
|
|
|
arcfile = zipfile.ZipFile(creates, 'w', zipfile.ZIP_DEFLATED)
|
|
|
|
|
|
|
|
|
|
for path in archive_paths:
|
|
|
|
|
basename = ''
|
|
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
errors.append('%s: %s' % (fullpath, str(e)))
|
|
|
|
|
|
|
|
|
|
for dirpath, dirnames, filenames in os.walk(path, topdown=True):
|
|
|
|
|
for dirname in dirnames:
|
|
|
|
|
arcfile.write(dirpath + os.sep + dirname, basename + dirname)
|
|
|
|
|
for filename in filenames:
|
|
|
|
|
fullpath = dirpath + os.sep + filename
|
|
|
|
|
|
|
|
|
|
if not filecmp.cmp(fullpath, creates):
|
|
|
|
|
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()
|
|
|
|
|
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:
|
|
|
|
|
arcfile.close()
|
|
|
|
|