From bcb9483d0aa75d051b820824e3c323ac85ae5429 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Sat, 23 Aug 2025 15:04:50 +0200 Subject: [PATCH] added function to not overwrite existing files --- zipdir.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/zipdir.py b/zipdir.py index 0c2ec1d..3ef657b 100755 --- a/zipdir.py +++ b/zipdir.py @@ -152,6 +152,25 @@ def collect_files(src_dir: Path, excludes: Iterable[str]) -> List[Path]: return include_files +def next_available_path(path: Path) -> Path: + """ + If `path` exists, return 'stem-1.suffix', 'stem-2.suffix', ... until unused. + Example: out.zip -> out-1.zip -> out-2.zip ... + """ + path = path.resolve() + if not path.exists(): + return path + + parent = path.parent + stem = path.stem + suffix = path.suffix + i = 1 + while True: + candidate = parent / f"{stem}-{i}{suffix}" + if not candidate.exists(): + return candidate + i += 1 + def make_zip(src_dir: Path, zip_path: Path, extra_excludes: Iterable[str] = ()) -> int: """ Create zip_path from src_dir while skipping default and extra_excludes patterns. @@ -202,16 +221,20 @@ def main(argv: List[str] | None = None) -> int: ignore_file = ns.zipignore if ns.zipignore is not None else (src / ".zipignore") extra.extend(load_ignore_file(ignore_file)) - files = collect_files(src, extra) + # Choose a non-clobbering output path (appends -1, -2, ...) + final_out = next_available_path(out) if ns.list: - print(f"Would include {len(files)} files:\n") + files = collect_files(src, extra) + print(f"Would create {final_out} with {len(files)} files:\n") for fp in files: print(fp.relative_to(src).as_posix()) return 0 - count = make_zip(src, out, extra_excludes=extra) - print(f"Created {out} with {count} files from {src}") + count = make_zip(src, final_out, extra_excludes=extra) + if final_out != out: + print(f"Note: '{out}' already exists. Using '{final_out.name}'.") + print(f"Created {final_out} with {count} files from {src}") return 0 if __name__ == "__main__":