Update to allow zip file creation

This commit is contained in:
Craig
2025-04-23 16:11:22 +01:00
parent cb64bb65f9
commit db117456dc
2 changed files with 39 additions and 11 deletions

View File

@@ -2,26 +2,52 @@
from pathlib import Path from pathlib import Path
import json import json
import tarfile import tarfile
import zipfile
import datetime import datetime
from functools import partial from functools import partial
import time import time
import os
def tar_filter(filters, tarinfo): def tar_filter(filters, tarinfo):
if any([filter_name in tarinfo.name for filter_name in filters]): if any([filter_name in tarinfo.name for filter_name in filters]):
print(f"\tFiltering: {tarinfo.name}") print(f"\tFiltering: {tarinfo.name}")
return None return None
return tarinfo return tarinfo
def local_backup(output_dir: Path, backup_name: str, inputs: list, ignore_patterns: list): def should_filter_file(filters, file_path):
return any([filter_name in str(file_path) for filter_name in filters])
def local_backup(output_dir: Path, backup_name: str, inputs: list, ignore_patterns: list, archive_type="tar"):
current_time = datetime.datetime.now().isoformat() current_time = datetime.datetime.now().isoformat()
start = time.time() start = time.time()
archive_path = output_dir / f"{backup_name}-{current_time}.tar.gz"
filter_function = partial(tar_filter, ignore_patterns) if archive_type == "zip":
print(archive_path) archive_path = output_dir / f"{backup_name}-{current_time}.zip"
with tarfile.open(archive_path, "w:xz") as f: print(archive_path)
for file_or_dir in inputs: with zipfile.ZipFile(archive_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
file_or_dir = Path(file_or_dir).expanduser().resolve() for file_or_dir in inputs:
print(f"Compressing: {file_or_dir}") file_or_dir = Path(file_or_dir).expanduser().resolve()
f.add(file_or_dir, filter=filter_function) print(f"Compressing: {file_or_dir}")
if file_or_dir.is_file():
if not should_filter_file(ignore_patterns, file_or_dir):
zipf.write(file_or_dir, arcname=file_or_dir.name)
else:
for root, dirs, files in os.walk(file_or_dir):
root_path = Path(root)
for file in files:
file_path = root_path / file
if not should_filter_file(ignore_patterns, file_path):
relative_path = file_path.relative_to(file_or_dir.parent)
zipf.write(file_path, arcname=str(relative_path))
else:
archive_path = output_dir / f"{backup_name}-{current_time}.tar.gz"
filter_function = partial(tar_filter, ignore_patterns)
print(archive_path)
with tarfile.open(archive_path, "w:xz") as f:
for file_or_dir in inputs:
file_or_dir = Path(file_or_dir).expanduser().resolve()
print(f"Compressing: {file_or_dir}")
f.add(file_or_dir, filter=filter_function)
print(f"Total time: {(time.time() - start) / 60}mins") print(f"Total time: {(time.time() - start) / 60}mins")
@@ -38,6 +64,7 @@ def backup_all():
inputs = config["inputs"] inputs = config["inputs"]
ignore_patterns = config["ignorePatterns"] ignore_patterns = config["ignorePatterns"]
backup_name = file.stem backup_name = file.stem
local_backup(output_dir, backup_name, inputs, ignore_patterns) archive_type = config.get("archiveType", "tar")
local_backup(output_dir, backup_name, inputs, ignore_patterns, archive_type)
if __name__ == "__main__": if __name__ == "__main__":
backup_all() backup_all()

View File

@@ -8,5 +8,6 @@
], ],
"ignorePatterns": [ "ignorePatterns": [
".git/" ".git/"
] ],
"archiveType": "zip"
} }