File size: 3,449 Bytes
773d305
45d62c0
2e046cf
 
773d305
5d41aef
2e046cf
 
 
 
 
 
5d41aef
2e046cf
 
b99b7f1
2e046cf
 
5d41aef
 
 
 
 
 
 
2e046cf
5d41aef
 
2e046cf
 
b99b7f1
2e046cf
 
 
5d41aef
b99b7f1
4e6838c
5d41aef
 
 
4e6838c
 
5d41aef
2e046cf
 
b99b7f1
 
5d41aef
0dcf350
2e046cf
 
 
 
 
 
 
 
 
5d41aef
5adb7c6
d491d15
 
 
 
 
 
 
5d41aef
2e046cf
 
d8c7865
2e046cf
 
 
 
 
 
 
0dcf350
2e046cf
5d41aef
 
 
 
 
 
2f5a34e
 
 
2e046cf
773d305
5d41aef
773d305
 
 
5d41aef
 
 
 
773d305
28323ea
2f5a34e
0ca59b4
09488af
773d305
 
 
5d41aef
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import gradio as gr
from huggingface_hub import create_repo, whoami, Repository
import subprocess
import os, shutil


def fork(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)
    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.
        create_repo(
            dst_id,
            token=token,
            organization=org,
            repo_type=repo_type,
            space_sdk="gradio",
        )
    else:
        create_repo(dst_id, token=token)

    # Clone source repo
    endpoint = "https://huggingface.co/"
    if repo_type in ["space", "dataset"]:
        endpoint += repo_type
    full_path = 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)

    # Change remote origin
    command = f"git remote set-url origin https://user:{token}@huggingface.co/"
    if repo_type in ["space", "dataset"]:
        # Can we not have to add the s here? Why do we use singular and plural inconsistently?
        command += repo_type + "s/"

    command += dst_repo
    subprocess.run(
        command.split(),
        stderr=subprocess.PIPE,
        stdout=subprocess.PIPE,
        encoding="utf-8",
        check=True,
        cwd=local_dir,
    )

    subprocess.run(
        "git lfs install --force --local".split(),
        stderr=subprocess.PIPE,
        stdout=subprocess.PIPE,
        encoding="utf-8",
        check=True,
        cwd=local_dir,
    )

    # Push!
    subprocess.run(
        "git push --force origin main".split(),
        stderr=subprocess.PIPE,
        stdout=subprocess.PIPE,
        encoding="utf-8",
        check=True,
        cwd=local_dir,
    )

    # 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)

    # Same as above...
    if repo_type in ["space", "dataset"]:
        endpoint += "s"
    return endpoint + "/" + dst_repo


interface = gr.Interface(
    fn=fork,
    inputs=[
        gr.Textbox(placeholder="Source repository (e.g. osanseviero/src)"),
        gr.Textbox(placeholder="Destination repository (e.g. osanseviero/dst)"),
        gr.Textbox(placeholder="Write access token"),
        gr.Dropdown(choices=["model", "dataset", "space"]),
    ],
    outputs=["textbox"],
    title="Fork your repo!",
    description="Fork 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()