From bbe8e1f53bda5941e7eaf338faf824f314c3db73 Mon Sep 17 00:00:00 2001 From: Ryan Brown Date: Fri, 14 Oct 2016 12:19:36 -0400 Subject: [PATCH] Fix `archive` truncating archived file names based on prefix length (#3124) When archiving multiple files, the full length of the calculated `arcroot` would be removed from the beginning of all file names. If there was no arcroot, the first two characters of all files would be removed, so `file.txt` would become `le.txt`. This patch uses the regular expressions substitution anchored to the start of the string, so the arcroot is only removed if it is actually present. --- lib/ansible/modules/extras/files/archive.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/ansible/modules/extras/files/archive.py b/lib/ansible/modules/extras/files/archive.py index 2b927e39c1..3b11d86b33 100644 --- a/lib/ansible/modules/extras/files/archive.py +++ b/lib/ansible/modules/extras/files/archive.py @@ -245,6 +245,7 @@ def main(): elif format == 'tar': arcfile = tarfile.open(dest, 'w') + match_root = re.compile('^%s' % re.escape(arcroot)) for path in archive_paths: if os.path.isdir(path): # Recurse into directories @@ -254,7 +255,7 @@ def main(): for dirname in dirnames: fullpath = dirpath + dirname - arcname = fullpath[len(arcroot):] + arcname = match_root.sub('', fullpath) try: if format == 'zip': @@ -268,7 +269,7 @@ def main(): for filename in filenames: fullpath = dirpath + filename - arcname = fullpath[len(arcroot):] + arcname = match_root.sub('', fullpath) if not filecmp.cmp(fullpath, dest): try: @@ -283,9 +284,9 @@ def main(): errors.append('Adding %s: %s' % (path, str(e))) else: if format == 'zip': - arcfile.write(path, path[len(arcroot):]) + arcfile.write(path, match_root.sub('', path)) else: - arcfile.add(path, path[len(arcroot):], recursive=False) + arcfile.add(path, match_root.sub('', path), recursive=False) successes.append(path)