Download scripts/push_tree.py from abc1181/Jaarvis: direct link, hf CLI and curl.
- Browser
- Download file 3.1 kB
-
https://huggingface.co/spaces/abc1181/Jaarvis/resolve/main/scripts/push_tree.py
- Command line
-
hf download hf://spaces/abc1181/Jaarvis/scripts/push_tree.py
-
curl -L -o push_tree.py https://huggingface.co/spaces/abc1181/Jaarvis/resolve/main/scripts/push_tree.py
3.1 kB
| #!/usr/bin/env python3 | |
| """Push a commit's file set to the Space in chunks (git push is not usable here: | |
| scripts/deploy_hf.py has been creating commits on the Space outside our local | |
| history, so the refs diverge and the transport fights us). | |
| python3 scripts/push_tree.py 58b36ef [--chunk 350] | |
| Only the files named by that commit are uploaded, the deny-list from | |
| deploy_hf.py is enforced, and every chunk is committed on top of whatever the | |
| Space already has. The token comes from HF_TOKEN or the repo-local .hf_token | |
| and is never printed. | |
| """ | |
| from __future__ import annotations | |
| import argparse | |
| import fnmatch | |
| import os | |
| import subprocess | |
| import sys | |
| import time | |
| from pathlib import Path | |
| ROOT = Path(__file__).resolve().parent.parent | |
| REPO_ID = "abc1181/Jaarvis" | |
| def token() -> str: | |
| t = os.environ.get("HF_TOKEN", "").strip() | |
| if not t: | |
| f = ROOT / ".hf_token" | |
| if f.exists(): | |
| t = f.read_text().strip() | |
| if not t: | |
| sys.exit("no HF token: set HF_TOKEN or create .hf_token") | |
| return t | |
| def denied(rel: str) -> bool: | |
| """Never upload these: secrets, and the vendored node_modules.""" | |
| globs = ("*api_keys.json", "config/certs/*", "config/whatsapp_web/*", | |
| "*credentials*", "*client_secret*", "*token*.json", ".env", ".env.*", | |
| "*.env", ".hf_token", "*.pem", "*.key", "jarvisd.json", "*agents.json", | |
| "dashboard_auth.json", "*/node_modules/*", "node_modules/*") | |
| if "node_modules" in rel: | |
| return True | |
| return any(fnmatch.fnmatch(rel, g) or fnmatch.fnmatch(rel, f"*/{g}") | |
| for g in globs) | |
| def main() -> int: | |
| ap = argparse.ArgumentParser() | |
| ap.add_argument("commit") | |
| ap.add_argument("--chunk", type=int, default=350) | |
| args = ap.parse_args() | |
| raw = subprocess.run(["git", "show", "--name-only", "--format=", args.commit], | |
| cwd=str(ROOT), capture_output=True, text=True, check=True).stdout | |
| files = [f for f in (x.strip() for x in raw.splitlines()) | |
| if f and not f.startswith("godseye/_server/node_modules") | |
| and not denied(f)] | |
| missing = [f for f in files if not (ROOT / f).exists()] | |
| files = [f for f in files if f not in missing] | |
| total = sum((ROOT / f).stat().st_size for f in files) | |
| print(f"{len(files)} files, {total/1e6:.1f} MB" | |
| + (f" (skipped {len(missing)} absent)" if missing else "")) | |
| from huggingface_hub import HfApi, CommitOperationAdd | |
| api = HfApi(token=token()) | |
| for i in range(0, len(files), args.chunk): | |
| part = files[i:i + args.chunk] | |
| ops = [CommitOperationAdd(path_in_repo=rel, path_or_fileobj=(ROOT / rel).read_bytes()) | |
| for rel in part] | |
| api.create_commit( | |
| repo_id=REPO_ID, repo_type="space", operations=ops, | |
| commit_message=f"Deploy {args.commit} ({i//args.chunk + 1})" | |
| f" [{i + len(part)}/{len(files)}]") | |
| print(f" chunk {i//args.chunk + 1}: {len(part)} files", flush=True) | |
| print("PUSH OK") | |
| return 0 | |
| if __name__ == "__main__": | |
| sys.exit(main()) | |