Spaces:
Sleeping
Sleeping
| 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() | |