mirror of
https://github.com/dw-0/kiauh.git
synced 2025-10-25 23:46:07 +02:00
feat(core): add repository management to settings (#718)
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
@@ -10,14 +10,17 @@ from __future__ import annotations
|
||||
|
||||
from typing import List, Literal, Type
|
||||
|
||||
from core.logger import Logger
|
||||
from core.logger import Logger, DialogType
|
||||
from core.menus import Option
|
||||
from core.menus.base_menu import BaseMenu
|
||||
from core.settings.kiauh_settings import KiauhSettings, Repository
|
||||
from core.types.color import Color
|
||||
from procedures.switch_repo import run_switch_repo_routine
|
||||
from utils.input_utils import get_string_input, get_number_input, get_confirm
|
||||
|
||||
|
||||
# noinspection PyUnusedLocal
|
||||
# noinspection PyMethodMayBeStatic
|
||||
class RepoSelectMenu(BaseMenu):
|
||||
def __init__(
|
||||
self,
|
||||
@@ -48,26 +51,27 @@ class RepoSelectMenu(BaseMenu):
|
||||
|
||||
def set_options(self) -> None:
|
||||
self.options = {}
|
||||
|
||||
if not self.repos:
|
||||
return
|
||||
|
||||
for idx, repo in enumerate(self.repos, start=1):
|
||||
self.options[str(idx)] = Option(
|
||||
method=self.select_repository, opt_data=repo
|
||||
)
|
||||
if self.repos:
|
||||
for idx, repo in enumerate(self.repos, start=1):
|
||||
self.options[str(idx)] = Option(
|
||||
method=self.select_repository, opt_data=repo
|
||||
)
|
||||
self.options["a"] = Option(method=self.add_repository)
|
||||
self.options["r"] = Option(method=self.remove_repository)
|
||||
self.options["b"] = Option(method=self.go_back)
|
||||
|
||||
def print_menu(self) -> None:
|
||||
menu = "╟───────────────────────────────────────────────────────╢\n"
|
||||
menu += "║ Available Repositories: ║\n"
|
||||
menu += "╟───────────────────────────────────────────────────────╢\n"
|
||||
|
||||
for idx, repo in enumerate(self.repos, start=1):
|
||||
url = f"● Repo: {repo.url.replace('.git', '')}"
|
||||
branch = f"└► Branch: {repo.branch}"
|
||||
menu += f"║ {idx}) {Color.apply(url, Color.CYAN):<59} ║\n"
|
||||
menu += f"║ {Color.apply(branch, Color.CYAN):<59} ║\n"
|
||||
|
||||
menu += "╟───────────────────────────────────────────────────────╢\n"
|
||||
menu += "║ A) Add repository ║\n"
|
||||
menu += "║ R) Remove repository ║\n"
|
||||
menu += "╟───────────────────────────────────────────────────────╢\n"
|
||||
print(menu, end="")
|
||||
|
||||
@@ -77,3 +81,82 @@ class RepoSelectMenu(BaseMenu):
|
||||
f"Switching to {self.name.capitalize()}'s new source repository ..."
|
||||
)
|
||||
run_switch_repo_routine(self.name, repo.url, repo.branch)
|
||||
|
||||
def add_repository(self, **kwargs) -> None:
|
||||
while True:
|
||||
Logger.print_dialog(
|
||||
DialogType.CUSTOM,
|
||||
custom_title="Enter the repository URL",
|
||||
content=[
|
||||
"NOTE: There is no input validation in place, "
|
||||
"please check your input for correctness",
|
||||
],
|
||||
)
|
||||
url = get_string_input("Repository URL", allow_special_chars=True).strip()
|
||||
|
||||
Logger.print_dialog(
|
||||
DialogType.CUSTOM,
|
||||
custom_title="Enter the branch name",
|
||||
content=[ "Press Enter to use the default branch (master)." ],
|
||||
center_content=False,
|
||||
)
|
||||
branch = get_string_input("Branch", allow_special_chars=True, default="master").strip()
|
||||
Logger.print_dialog(
|
||||
DialogType.CUSTOM,
|
||||
custom_title="Summary",
|
||||
content=[
|
||||
f"● URL: {url}",
|
||||
f"● Branch: {branch}",
|
||||
],
|
||||
)
|
||||
confirm = get_confirm("Save repository")
|
||||
if confirm:
|
||||
repo = Repository(url, branch)
|
||||
if self.name == "klipper":
|
||||
self.settings.klipper.repositories.append(repo)
|
||||
self.settings.save()
|
||||
self.repos = self.settings.klipper.repositories
|
||||
else:
|
||||
self.settings.moonraker.repositories.append(repo)
|
||||
self.settings.save()
|
||||
self.repos = self.settings.moonraker.repositories
|
||||
Logger.print_ok("Repository added and saved.")
|
||||
|
||||
# Refresh menu to show new repo immediately and update options
|
||||
self.set_options()
|
||||
self.run()
|
||||
break
|
||||
else:
|
||||
Logger.print_info("Operation cancelled by user.")
|
||||
break
|
||||
|
||||
def remove_repository(self, **kwargs) -> None:
|
||||
repos = self.repos
|
||||
if not repos:
|
||||
Logger.print_info("No repositories configured.")
|
||||
return
|
||||
repo_lines = [f"{idx}) {repo.url} [{repo.branch}]" for idx, repo in enumerate(repos, start=1)]
|
||||
Logger.print_dialog(
|
||||
DialogType.CUSTOM,
|
||||
custom_title="Available Repositories",
|
||||
content=[*repo_lines],
|
||||
)
|
||||
idx = get_number_input("Select the repository to remove", 1, len(repos))
|
||||
removed = repos.pop(idx - 1)
|
||||
if self.name == "klipper":
|
||||
self.settings.klipper.repositories = repos
|
||||
self.settings.save()
|
||||
self.repos = self.settings.klipper.repositories
|
||||
else:
|
||||
self.settings.moonraker.repositories = repos
|
||||
self.settings.save()
|
||||
self.repos = self.settings.moonraker.repositories
|
||||
Logger.print_ok(f"Removed repository: {removed.url} [{removed.branch}]")
|
||||
|
||||
# Refresh menu to show updated repo list and options
|
||||
self.set_options()
|
||||
self.run()
|
||||
|
||||
def go_back(self, **kwargs) -> None:
|
||||
from core.menus.settings_menu import SettingsMenu
|
||||
SettingsMenu().run()
|
||||
|
||||
@@ -117,20 +117,12 @@ class SettingsMenu(BaseMenu):
|
||||
)
|
||||
|
||||
def switch_klipper_repo(self, **kwargs) -> None:
|
||||
name = "Klipper"
|
||||
repos = self.settings.klipper.repositories
|
||||
if not repos:
|
||||
self._warn_no_repos(name)
|
||||
return
|
||||
RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run()
|
||||
RepoSelectMenu("klipper", repos=repos, previous_menu=self.__class__).run()
|
||||
|
||||
def switch_moonraker_repo(self, **kwargs) -> None:
|
||||
name = "Moonraker"
|
||||
repos = self.settings.moonraker.repositories
|
||||
if not repos:
|
||||
self._warn_no_repos(name)
|
||||
return
|
||||
RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run()
|
||||
RepoSelectMenu("moonraker", repos=repos, previous_menu=self.__class__).run()
|
||||
|
||||
def toggle_mainsail_release(self, **kwargs) -> None:
|
||||
self.mainsail_unstable = not self.mainsail_unstable
|
||||
|
||||
Reference in New Issue
Block a user