|
| 1 | +from functools import partial |
| 2 | +import os |
| 3 | + |
| 4 | +from GitSavvy.common import util |
| 5 | +from GitSavvy.core.base_commands import GsWindowCommand |
| 6 | +from GitSavvy.core.ui_mixins.input_panel import show_single_line_input_panel |
| 7 | +from GitSavvy.core.utils import show_panel |
| 8 | +from GitSavvy.core.runtime import on_worker |
| 9 | +from GitSavvy.github import github |
| 10 | + |
| 11 | +from GitSavvy.core.base_commands import Args, GsCommand, Kont |
| 12 | + |
| 13 | + |
| 14 | +__all__ = ( |
| 15 | + "gs_github_create_repo", |
| 16 | +) |
| 17 | + |
| 18 | + |
| 19 | +def ask_for_repo_name(cmd: GsCommand, args: Args, done: Kont) -> None: |
| 20 | + suggestion = ( |
| 21 | + os.path.basename(folders[0]) |
| 22 | + if (folders := cmd.window.folders()) |
| 23 | + else "" |
| 24 | + ) |
| 25 | + |
| 26 | + def on_done(name: str) -> None: |
| 27 | + if name: |
| 28 | + done(name) |
| 29 | + |
| 30 | + show_single_line_input_panel("New Repo Name:", suggestion, on_done) |
| 31 | + |
| 32 | + |
| 33 | +def get_github_user_token(cmd: GsCommand, args: Args, done: Kont) -> None: |
| 34 | + fqdn = "github.com" |
| 35 | + token = cmd.savvy_settings.get("api_tokens", {}).get(fqdn) |
| 36 | + if not token: |
| 37 | + cmd.window.status_message(f"Abort, no API token found in the settings for {fqdn}.") |
| 38 | + return |
| 39 | + done(token) |
| 40 | + |
| 41 | + |
| 42 | +class gs_github_create_repo(GsWindowCommand): |
| 43 | + defaults = { |
| 44 | + "token": get_github_user_token, |
| 45 | + "name": ask_for_repo_name |
| 46 | + } |
| 47 | + |
| 48 | + @on_worker |
| 49 | + def run(self, token: str, name: str) -> None: |
| 50 | + payload = github.create_user_repo(token, name) |
| 51 | + self.window.status_message("The repo was created successfully.") |
| 52 | + urls = [payload["clone_url"], payload["ssh_url"]] |
| 53 | + |
| 54 | + def on_remote_name(name: str) -> None: |
| 55 | + show_panel(self.window, urls, partial(on_url, name)) |
| 56 | + |
| 57 | + def on_url(name: str, idx: int) -> None: |
| 58 | + url = urls[idx] |
| 59 | + self.git("remote", "add", name, url) |
| 60 | + self.window.status_message("The new remote was added successfully.") |
| 61 | + util.view.refresh_gitsavvy_interfaces(self.window) |
| 62 | + |
| 63 | + show_single_line_input_panel("Add repo as", "origin", on_remote_name) |
0 commit comments