Spaces:
Running
Running
File size: 3,350 Bytes
a8cd886 548e3f2 a8cd886 41c301c a8cd886 d9b47e0 a8cd886 d9b47e0 a8cd886 fc9e525 a8cd886 707bc6c a8cd886 050c83f a727211 050c83f f021afe 59e33b2 9c92c74 9e669b8 c60cd64 deca531 a8cd886 f096cd8 7f7a666 a8cd886 c33fac7 a8cd886 7f37cc9 a8cd886 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
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) |