| #!/usr/bin/env python3 |
| import os |
| import re |
| from io import BytesIO, BufferedReader, BufferedRandom |
| import tarfile |
| |
| """ |
| This module tars and compresses a filder location and |
| all subdirectories. |
| """ |
| |
| # tar and compress a directory in memory and return the result. |
| def tar_directory(source_dir): |
| output = BytesIO() |
| with tarfile.open(fileobj=output, mode='w:gz') as archive: |
| archive.add(source_dir, arcname=os.path.basename(source_dir), recursive=True) |
| |
| return output |
| |
| # tar and compress the files in a directory, not to include the directory itself. |
| # 'nodescend' is a list of directories not to descend into, although the directory |
| # itself will be added. |
| def tar_directory_contents(source_dir, exclude=[]): |
| output = BytesIO() |
| curdir = os.getcwd() |
| os.chdir(source_dir) |
| |
| rexclude = [] |
| for pattern in exclude: |
| rexclude.append(re.compile(pattern)) |
| |
| with tarfile.open(fileobj=output, mode='w:gz') as archive: |
| for root, dirs, files in os.walk('.'): |
| for filename in files: |
| if root == '.': |
| filepath = filename |
| else: |
| rootnodot = os.path.normpath(root) |
| filepath = os.path.join(rootnodot, filename) |
| doexclude = False |
| for regexp in rexclude: |
| if re.match(regexp, filepath): |
| doexclude = True |
| break |
| if not doexclude: |
| try: |
| archive.add(filepath, recursive=False) |
| except PermissionError: |
| pass |
| for dirname in dirs[:]: |
| if root == '.': |
| dirpath = dirname |
| else: |
| rootnodot = os.path.normpath(root) |
| dirpath = os.path.join(rootnodot, dirname) |
| doexclude = False |
| for regexp in rexclude: |
| if re.match(regexp, dirpath): |
| doexclude = True |
| break |
| if doexclude: |
| dirs.remove(dirname) |
| else: |
| try: |
| archive.add(dirpath, recursive=False) |
| except PermissionError: |
| pass |
| |
| |
| os.chdir(curdir) |
| return output |
| |
| def tar_directory_contents_to_file(source_dir, tarballname, exclude=[]): |
| curdir = os.getcwd() |
| os.chdir(source_dir) |
| |
| rexclude = [] |
| for pattern in exclude: |
| rexclude.append(re.compile(pattern)) |
| |
| with tarfile.open(tarballname, mode='w:gz') as archive: |
| for root, dirs, files in os.walk('.'): |
| for filename in files: |
| if root == '.': |
| filepath = filename |
| else: |
| rootnodot = os.path.normpath(root) |
| filepath = os.path.join(rootnodot, filename) |
| doexclude = False |
| for regexp in rexclude: |
| if re.match(regexp, filepath): |
| doexclude = True |
| break |
| if not doexclude: |
| try: |
| archive.add(filepath, recursive=False) |
| except PermissionError: |
| pass |
| for dirname in dirs[:]: |
| if root == '.': |
| dirpath = dirname |
| else: |
| rootnodot = os.path.normpath(root) |
| dirpath = os.path.join(rootnodot, dirname) |
| doexclude = False |
| for regexp in rexclude: |
| if re.match(regexp, dirpath): |
| doexclude = True |
| break |
| if doexclude: |
| dirs.remove(dirname) |
| else: |
| try: |
| archive.add(dirpath, recursive=False) |
| except PermissionError: |
| pass |
| |
| os.chdir(curdir) |