File size: 2,678 Bytes
a8cd886
a4d7e4d
 
 
644a2ce
a4d7e4d
 
 
 
 
 
a8cd886
64fdc3c
 
a4d7e4d
 
 
64fdc3c
a4d7e4d
a8cd886
a4d7e4d
 
64fdc3c
a1d6c04
a4d7e4d
 
deca531
a4d7e4d
 
 
 
 
 
 
 
64fdc3c
a8cd886
 
c33fac7
a8cd886
644a2ce
 
 
 
 
a4d7e4d
 
a1d6c04
a4d7e4d
 
 
 
a8cd886
 
a4d7e4d
 
 
64fdc3c
a8cd886
64fdc3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import requests
from huggingface_hub import whoami
from huggingface_hub.utils import build_hf_headers, hf_raise_for_status
from gradio_huggingfacehub_search import HuggingfaceHubSearch

ENDPOINT = "https://huggingface.co"
# ENDPOINT = "http://localhost:5564"

REPO_TYPES = ["model", "dataset", "space"]


def duplicate(source_repo, dst_repo, repo_type, private, oauth_token: gr.OAuthToken | None):
    print(oauth_token.token)
    try:
        if not repo_type in REPO_TYPES:
            raise ValueError("need to select valid repo type")
        _ = whoami(oauth_token.token)
        # ^ this will throw if token is invalid

        r = requests.post(
            f"{ENDPOINT}/api/{repo_type}s/{source_repo}/duplicate",
            headers=build_hf_headers(token=oauth_token.token),
            json={"repository": dst_repo, "private": private},
        )
        hf_raise_for_status(r)

        repo_url = r.json().get("url")

        return (
            f'Find your repo <a href=\'{repo_url}\' target="_blank" style="text-decoration:underline">here</a>',
            "sp.jpg",
        )

    except Exception as e:
        raise gr.Error(f"""Oops, you forgot to login. Please use the loggin button on the top left to migrate your repo {e}""")

interface = gr.Interface(
    fn=duplicate,
    inputs=[
        HuggingfaceHubSearch(
            placeholder="Source repository (e.g. osanseviero/src)",
            search_type=["model", "dataset", "space"],
            sumbit_on_select=False,
        ),
        gr.Textbox(placeholder="Destination repository (e.g. osanseviero/dst)"),
        gr.Dropdown(choices=REPO_TYPES, value="model"),
        gr.Checkbox(label="Make new repo private?"),
    ],
    outputs=[
        gr.Markdown(label="output"),
        gr.Image(show_label=False),
    ],
    title="Duplicate your repo!",
    description="Duplicate a Hugging Face repository! You need to specify a write token obtained in https://hf.co/settings/tokens. This Space is a an experimental demo.",
    article="<p>Find your write token at <a href='https://huggingface.co/settings/tokens' target='_blank'>token settings</a></p>",
    allow_flagging="never",
    live=False
)

def swap_visibilty(profile: gr.OAuthProfile | None):
    return gr.update(elem_classes=["main_ui_logged_in"]) if profile else gr.update(elem_classes=["main_ui_logged_out"])
        
css = '''
.main_ui_logged_out{opacity: 0.3; pointer-events: none}
'''
with gr.Blocks(css=css) as demo:
    gr.LoginButton()
    with gr.Column(elem_classes="main_ui_logged_out") as main_ui:
        interface.render()
    demo.load(fn=swap_visibilty, outputs=main_ui)
    
demo.queue()
demo.launch()