import gradio as gr from huggingface_hub import HfApi from git import Repo import uuid from slugify import slugify import os import shutil def clone(progress=gr.Progress(), profile=None, oauth_token=None, repo_git=None, repo_hf=None, sdk_type=None): """Clones and deploys with progress updates.""" try: progress(0.1, desc="Cloning repository...") folder = str(uuid.uuid4()) Repo.clone_from(repo_git, folder) progress(0.4, desc="Creating Hugging Face Space...") api = HfApi(token=oauth_token.token) repo_id = f"{profile.username}/{slugify(repo_hf)}" api.create_repo(repo_id=repo_id, repo_type="space", space_sdk=sdk_type) progress(0.7, desc="Uploading files...") with open(os.path.join(folder, "space_config.json"), "w") as f: import json json.dump({"sdk": sdk_type}, f) api.upload_folder(folder_path=folder, repo_id=repo_id, repo_type="space") shutil.rmtree(folder) progress(1.0, desc="Deployment complete!") return f"Deployment successful! [View your space](https://huggingface.co/spaces/{repo_id})" except Exception as e: return f"Error: {e}" with gr.Blocks() as demo: gr.LoginButton() with gr.Row(): with gr.Column(): repo_git = gr.Textbox(label="GitHub Repo", placeholder="https://github.com/...", tooltip="Enter the GitHub repository URL.") repo_hf = gr.Textbox(label="Space Name", placeholder="my-space", tooltip="Enter a name for your Hugging Face Space.") sdk_choices = gr.Radio(["gradio", "streamlit", "docker", "static"], label="SDK", tooltip="Select the SDK for your Space.") with gr.Column(): output = gr.Markdown(label="Output") progress = gr.Progress() btn = gr.Button("Bring over!") btn.click(fn=clone, inputs=[progress, gr.OAuthProfile(), gr.OAuthToken(), repo_git, repo_hf, sdk_choices], outputs=output) if __name__ == "__main__": demo.launch(auth_required=True)