Spaces:
Running
Running
| 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 <a href='{url}' target=\"_blank\" style=\"text-decoration:underline\">here</a>", "sp.jpg" | |
| 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="<p>Find your write token at <a href='https://huggingface.co/settings/token' target='_blank'>token settings</a></p>", | |
| allow_flagging=False, | |
| live=False, | |
| ) | |
| interface.launch(enable_queue=True) |