Jaarvis / scripts /push_tree.py
abc1181's picture
Deploy a0eb25b (3) [432/432]
1f9dbd9 verified
Raw History Blame Contribute Delete
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())