import gradio as gr from huggingface_hub import create_repo, upload_file, Repository, whoami import subprocess import os, shutil def duplicate(source_repo, dst_repo, token, repo_type): # Creating repos has inconsistent API (https://github.com/huggingface/huggingface_hub/issues/47) repo_namespace, dst_id = dst_repo.split("/") username = whoami(token)["name"] org = None if repo_namespace != username: org = repo_namespace # Create the destination repo if repo_type in ["space", "dataset"]: # For some reason create_repo does not allow repo_type="model"..., even if documentation says # that's the default. url = create_repo(dst_id, token=token, organization=org, repo_type=repo_type, space_sdk="gradio", private=False) else: url = create_repo(dst_id, token=token, organization=org, private=False) # Clone source repo endpoint = "huggingface.co/" if repo_type in ["space", "dataset"]: endpoint += repo_type + "/" full_path = f"https://{username}:{token}@{endpoint}{source_repo}" local_dir = "hub/" + source_repo if repo_type in ["space", "dataset"]: # Same as above repo = Repository(local_dir=local_dir, clone_from=full_path, repo_type=repo_type) else: repo = Repository(local_dir=local_dir, clone_from=full_path) for root, dirs, files in os.walk(local_dir): if not root.startswith("."): if repo_type == "model": repo_type = None for f in files: if not f.startswith("."): if ".git" not in root: # remove hub/namespace/reponame directory_path_in_repo = "/".join(root.split("/")[3:]) path_in_repo = os.path.join(directory_path_in_repo, f) local_file_path = os.path.join(local_dir, path_in_repo) print("From: ", local_file_path, " to: ", path_in_repo) upload_file(path_or_fileobj=local_file_path, path_in_repo=path_in_repo, repo_id=dst_repo, token=token, repo_type=repo_type) # Clean up to be nice with the environment for filename in os.listdir(local_dir): file_path = os.path.join(local_dir, filename) if os.path.isfile(file_path) or os.path.islink(file_path): os.unlink(file_path) elif os.path.isdir(file_path): shutil.rmtree(file_path) return f"Find your repo here" interface = gr.Interface( fn=duplicate, inputs=[ gr.inputs.Textbox(placeholder="Source repository (e.g. osanseviero/src)"), gr.inputs.Textbox(placeholder="Destination repository (e.g. osanseviero/dst)"), gr.inputs.Textbox(placeholder="Write access token"), gr.inputs.Dropdown(choices=["model", "dataset", "space"]) ], outputs=["html", "image"] , title="Duplicate your repo!", description="Duplicate a Hugging Face repository! You need to specify a write token obtained in https://hf.co/settings/token. This Space is a an experimental demo.", article="

Find your write token at token settings

", allow_flagging=False, live=False, ) interface.launch(enable_queue=True)