#!/usr/bin/env python3 import argparse import os from huggingface_hub import HfApi def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Upload a local folder to a Hugging Face Space, respecting .gitignore and showing progress." ) parser.add_argument("repo_id", help="Space repository ID in the form 'username/space-name'") parser.add_argument( "--folder-path", "-f", default=".", help="Local folder path to upload (default: current directory)" ) parser.add_argument("--path-in-repo", "-p", default="", help="Target path in the repository (default: root)") parser.add_argument( "--commit-message", "-m", default="Upload folder via script", help="Commit message for the upload" ) parser.add_argument( "--token", "-t", default=None, help=( "Hugging Face access token (will use HF_TOKEN or HUGGINGFACE_HUB_TOKEN from environment if not provided)" ), ) parser.add_argument("--large", action="store_true", help="Use upload_large_folder for large uploads") return parser.parse_args() def main() -> None: args = parse_args() # Determine token from argument or environment token = args.token or os.getenv("HF_TOKEN") or os.getenv("HUGGINGFACE_HUB_TOKEN") if not token: print( "Warning: No token provided via --token or environment variable. " "Please set HF_TOKEN/HUGGINGFACE_HUB_TOKEN or run `huggingface-cli login`." ) api = HfApi() if args.large: api.upload_large_folder( folder_path=args.folder_path, repo_id=args.repo_id, repo_type="space", print_report=True ) else: api.upload_folder( folder_path=args.folder_path, path_in_repo=args.path_in_repo, repo_id=args.repo_id, repo_type="space", token=token, commit_message=args.commit_message, ) print(f"Successfully uploaded '{args.folder_path}' to '{args.repo_id}'.") if __name__ == "__main__": main()