feat(core): add repository management to settings (#718)

Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
dw-0
2025-08-28 16:22:02 +02:00
committed by GitHub
parent 393dd1d5bf
commit afdde34721
2 changed files with 96 additions and 21 deletions

View File

@@ -10,14 +10,17 @@ from __future__ import annotations
from typing import List, Literal, Type 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 import Option
from core.menus.base_menu import BaseMenu from core.menus.base_menu import BaseMenu
from core.settings.kiauh_settings import KiauhSettings, Repository from core.settings.kiauh_settings import KiauhSettings, Repository
from core.types.color import Color from core.types.color import Color
from procedures.switch_repo import run_switch_repo_routine 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): class RepoSelectMenu(BaseMenu):
def __init__( def __init__(
self, self,
@@ -48,26 +51,27 @@ class RepoSelectMenu(BaseMenu):
def set_options(self) -> None: def set_options(self) -> None:
self.options = {} self.options = {}
if self.repos:
if not self.repos: for idx, repo in enumerate(self.repos, start=1):
return self.options[str(idx)] = Option(
method=self.select_repository, opt_data=repo
for idx, repo in enumerate(self.repos, start=1): )
self.options[str(idx)] = Option( self.options["a"] = Option(method=self.add_repository)
method=self.select_repository, opt_data=repo self.options["r"] = Option(method=self.remove_repository)
) self.options["b"] = Option(method=self.go_back)
def print_menu(self) -> None: def print_menu(self) -> None:
menu = "╟───────────────────────────────────────────────────────╢\n" menu = "╟───────────────────────────────────────────────────────╢\n"
menu += "║ Available Repositories: ║\n" menu += "║ Available Repositories: ║\n"
menu += "╟───────────────────────────────────────────────────────╢\n" menu += "╟───────────────────────────────────────────────────────╢\n"
for idx, repo in enumerate(self.repos, start=1): for idx, repo in enumerate(self.repos, start=1):
url = f"● Repo: {repo.url.replace('.git', '')}" url = f"● Repo: {repo.url.replace('.git', '')}"
branch = f"└► Branch: {repo.branch}" branch = f"└► Branch: {repo.branch}"
menu += f"{idx}) {Color.apply(url, Color.CYAN):<59}\n" menu += f"{idx}) {Color.apply(url, Color.CYAN):<59}\n"
menu += f"{Color.apply(branch, 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" menu += "╟───────────────────────────────────────────────────────╢\n"
print(menu, end="") print(menu, end="")
@@ -77,3 +81,82 @@ class RepoSelectMenu(BaseMenu):
f"Switching to {self.name.capitalize()}'s new source repository ..." f"Switching to {self.name.capitalize()}'s new source repository ..."
) )
run_switch_repo_routine(self.name, repo.url, repo.branch) 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()

View File

@@ -117,20 +117,12 @@ class SettingsMenu(BaseMenu):
) )
def switch_klipper_repo(self, **kwargs) -> None: def switch_klipper_repo(self, **kwargs) -> None:
name = "Klipper"
repos = self.settings.klipper.repositories repos = self.settings.klipper.repositories
if not repos: RepoSelectMenu("klipper", repos=repos, previous_menu=self.__class__).run()
self._warn_no_repos(name)
return
RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run()
def switch_moonraker_repo(self, **kwargs) -> None: def switch_moonraker_repo(self, **kwargs) -> None:
name = "Moonraker"
repos = self.settings.moonraker.repositories repos = self.settings.moonraker.repositories
if not repos: RepoSelectMenu("moonraker", repos=repos, previous_menu=self.__class__).run()
self._warn_no_repos(name)
return
RepoSelectMenu(name.lower(), repos=repos, previous_menu=self.__class__).run()
def toggle_mainsail_release(self, **kwargs) -> None: def toggle_mainsail_release(self, **kwargs) -> None:
self.mainsail_unstable = not self.mainsail_unstable self.mainsail_unstable = not self.mainsail_unstable