70 lines
1.7 KiB
Python
70 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import sys
|
|
import zipfile
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
|
|
def run_git_command(args, repo_path: Path) -> bytes:
|
|
result = subprocess.run(
|
|
["git", *args],
|
|
cwd=repo_path,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
check=True,
|
|
)
|
|
return result.stdout
|
|
|
|
|
|
def get_files_to_archive(repo_path: Path) -> list[str]:
|
|
output = run_git_command(
|
|
["ls-files", "--cached", "--others", "--exclude-standard", "-z"],
|
|
repo_path,
|
|
)
|
|
files = output.decode("utf-8", errors="surrogateescape").split("\0")
|
|
return [f for f in files if f]
|
|
|
|
|
|
def make_zip(repo_path: Path, output_zip: Path) -> None:
|
|
files = get_files_to_archive(repo_path)
|
|
|
|
output_zip = output_zip.resolve()
|
|
if output_zip.exists():
|
|
output_zip.unlink()
|
|
|
|
with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED) as zf:
|
|
for rel_path in files:
|
|
abs_path = repo_path / rel_path
|
|
|
|
if not abs_path.exists():
|
|
continue
|
|
|
|
if abs_path.resolve() == output_zip:
|
|
continue
|
|
|
|
zf.write(abs_path, arcname=rel_path)
|
|
|
|
print(f"Utworzono archiwum: {output_zip}")
|
|
print(f"Dodano plików: {len(files)}")
|
|
|
|
|
|
def main():
|
|
repo_path = Path.cwd()
|
|
|
|
if len(sys.argv) > 1:
|
|
output_zip = Path(sys.argv[1])
|
|
else:
|
|
output_zip = repo_path / f"{repo_path.name}.zip"
|
|
|
|
try:
|
|
run_git_command(["rev-parse", "--show-toplevel"], repo_path)
|
|
except subprocess.CalledProcessError:
|
|
print("Błąd: ten katalog nie jest repozytorium Git.", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
make_zip(repo_path, output_zip)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |