File size: 2,550 Bytes
f3156fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ffce82d
f3156fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ffce82d
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
import gradio as gr
import tempfile
import shutil
from git import Repo
from github import Github
import os

def clone_and_push(hf_username, hf_space_name, github_repo_name, github_token):
    tmp_dir = None
    try:
        # Prepare the git URL for the Hugging Face Spaces repository
        hf_repo_url = f"https://huggingface.co/spaces/{hf_username}/{hf_space_name}.git"
        
        # Create a temporary directory to clone the repository
        tmp_dir = tempfile.mkdtemp()
        
        # Clone the Hugging Face Spaces repository
        repo = Repo.clone_from(hf_repo_url, tmp_dir)
        
        # Authenticate with GitHub using the provided token
        g = Github(github_token)
        user = g.get_user()
        
        # Create a new GitHub repository
        github_repo = user.create_repo(github_repo_name)
        
        # Remove the existing 'origin' remote pointing to Hugging Face
        repo.delete_remote(repo.remotes.origin)
        
        # Construct the authenticated GitHub URL
        github_username = user.login
        github_remote_url = f"https://{github_username}:{github_token}@github.com/{github_username}/{github_repo_name}.git"
        
        # Add the new 'origin' remote pointing to GitHub
        repo.create_remote('origin', github_remote_url)
        
        # Push the code to the new GitHub repository
        repo.git.push('origin', 'HEAD:refs/heads/main', set_upstream=True)
        
        return f"Successfully pushed to GitHub repository: {github_repo.html_url}"
    except Exception as e:
        return f"An error occurred: {str(e)}"
    finally:
        # Clean up the temporary directory
        if tmp_dir and os.path.exists(tmp_dir):
            shutil.rmtree(tmp_dir)

iface = gr.Interface(
    theme="Nymbo/Nymbo_Theme",
    fn=clone_and_push,
    inputs=[
        gr.Textbox(label="Hugging Face Username", placeholder="e.g., john_doe"),
        gr.Textbox(label="Hugging Face Spaces Name", placeholder="e.g., my-space"),
        gr.Textbox(label="GitHub Repository Name", placeholder="e.g., my-new-repo"),
        gr.Textbox(label="GitHub Personal Access Token", type="password"),
    ],
    outputs="text",
    title="Hugging Face Spaces to GitHub Repo",
    description="""
    Enter the details to clone a Hugging Face Spaces repository and push it to a new GitHub repository.

    **Note:** Your GitHub personal access token must have permissions to create repositories and push code (usually the 'repo' scope).
    """,
)

if __name__ == "__main__":
    iface.launch()