mirror of
https://github.com/dw-0/kiauh.git
synced 2025-12-15 19:44:29 +05:00
feat: allow configuration of multiple repos in kiauh.cfg (#668)
* remove existing simple_config_parser directory * Squashed 'kiauh/core/submodules/simple_config_parser/' content from commit da22e6a git-subtree-dir: kiauh/core/submodules/simple_config_parser git-subtree-split: da22e6ad9ca4bc121c39dc3bc6c63175a72e78a2 * Squashed 'kiauh/core/submodules/simple_config_parser/' changes from da22e6a..9ae5749 9ae5749 fix: comment out file writing in test 1ac4e3d refactor: improve section writing git-subtree-dir: kiauh/core/submodules/simple_config_parser git-subtree-split: 9ae574930dfe82107a3712c7c72b3aa777588996 * Squashed 'kiauh/core/submodules/simple_config_parser/' changes from 9ae5749..53e8408 53e8408 fix: do not add a blank line before writing a section header dc77569 test: add test for removing option before writing git-subtree-dir: kiauh/core/submodules/simple_config_parser git-subtree-split: 53e840853f12318dcac68196fb74c1843cb75808 * Squashed 'kiauh/core/submodules/simple_config_parser/' changes from 53e8408..4a6e5f2 4a6e5f2 refactor: full rework of the internal storage of the parsed config git-subtree-dir: kiauh/core/submodules/simple_config_parser git-subtree-split: 4a6e5f23cb1f298f0a3efbf042186b16c91763c7 * refactor!: switching repos now offers list of repositories to choose from this rework aligns more with the feature provided in kiauh v5. Signed-off-by: Dominik Willner <th33xitus@gmail.com> --------- Signed-off-by: Dominik Willner <th33xitus@gmail.com>
This commit is contained in:
@@ -9,20 +9,17 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import textwrap
|
||||
from pathlib import Path
|
||||
from typing import Literal, Tuple, Type
|
||||
from typing import Type
|
||||
|
||||
from components.klipper import KLIPPER_DIR, KLIPPER_REPO_URL
|
||||
from components.klipper.klipper_utils import get_klipper_status
|
||||
from components.moonraker import MOONRAKER_DIR, MOONRAKER_REPO_URL
|
||||
from components.moonraker.utils.utils import get_moonraker_status
|
||||
from core.logger import DialogType, Logger
|
||||
from core.menus import Option
|
||||
from core.menus.base_menu import BaseMenu
|
||||
from core.settings.kiauh_settings import KiauhSettings, RepoSettings
|
||||
from core.menus.repo_select_menu import RepoSelectMenu
|
||||
from core.settings.kiauh_settings import KiauhSettings
|
||||
from core.types.color import Color
|
||||
from procedures.switch_repo import run_switch_repo_routine
|
||||
from utils.input_utils import get_confirm, get_string_input
|
||||
from core.types.component_status import ComponentStatus
|
||||
|
||||
|
||||
# noinspection PyUnusedLocal
|
||||
@@ -37,8 +34,14 @@ class SettingsMenu(BaseMenu):
|
||||
self.mainsail_unstable: bool | None = None
|
||||
self.fluidd_unstable: bool | None = None
|
||||
self.auto_backups_enabled: bool | None = None
|
||||
|
||||
na: str = "Not available!"
|
||||
self.kl_repo_url: str = Color.apply(na, Color.RED)
|
||||
self.kl_branch: str = Color.apply(na, Color.RED)
|
||||
self.mr_repo_url: str = Color.apply(na, Color.RED)
|
||||
self.mr_branch: str = Color.apply(na, Color.RED)
|
||||
|
||||
self._load_settings()
|
||||
print(self.klipper_status)
|
||||
|
||||
def set_previous_menu(self, previous_menu: Type[BaseMenu] | None) -> None:
|
||||
from core.menus.main_menu import MainMenu
|
||||
@@ -47,54 +50,39 @@ class SettingsMenu(BaseMenu):
|
||||
|
||||
def set_options(self) -> None:
|
||||
self.options = {
|
||||
"1": Option(method=self.set_klipper_repo),
|
||||
"2": Option(method=self.set_moonraker_repo),
|
||||
"1": Option(method=self.switch_klipper_repo),
|
||||
"2": Option(method=self.switch_moonraker_repo),
|
||||
"3": Option(method=self.toggle_mainsail_release),
|
||||
"4": Option(method=self.toggle_fluidd_release),
|
||||
"5": Option(method=self.toggle_backup_before_update),
|
||||
}
|
||||
|
||||
def print_menu(self) -> None:
|
||||
color = Color.CYAN
|
||||
checked = f"[{Color.apply('x', Color.GREEN)}]"
|
||||
unchecked = "[ ]"
|
||||
|
||||
kl_repo: str = Color.apply(self.klipper_status.repo, color)
|
||||
kl_branch: str = Color.apply(self.klipper_status.branch, color)
|
||||
kl_owner: str = Color.apply(self.klipper_status.owner, color)
|
||||
mr_repo: str = Color.apply(self.moonraker_status.repo, color)
|
||||
mr_branch: str = Color.apply(self.moonraker_status.branch, color)
|
||||
mr_owner: str = Color.apply(self.moonraker_status.owner, color)
|
||||
o1 = checked if self.mainsail_unstable else unchecked
|
||||
o2 = checked if self.fluidd_unstable else unchecked
|
||||
o3 = checked if self.auto_backups_enabled else unchecked
|
||||
menu = textwrap.dedent(
|
||||
f"""
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
║ Klipper: ║
|
||||
║ ● Repo: {kl_repo:51} ║
|
||||
║ ● Owner: {kl_owner:51} ║
|
||||
║ ● Branch: {kl_branch:51} ║
|
||||
║ 1) Switch Klipper source repository ║
|
||||
║ ● Current repository: ║
|
||||
║ └► Repo: {self.kl_repo_url:50} ║
|
||||
║ └► Branch: {self.kl_branch:48} ║
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
║ Moonraker: ║
|
||||
║ ● Repo: {mr_repo:51} ║
|
||||
║ ● Owner: {mr_owner:51} ║
|
||||
║ ● Branch: {mr_branch:51} ║
|
||||
║ 2) Switch Moonraker source repository ║
|
||||
║ ● Current repository: ║
|
||||
║ └► Repo: {self.mr_repo_url:50} ║
|
||||
║ └► Branch: {self.mr_branch:48} ║
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
║ Install unstable releases: ║
|
||||
║ {o1} Mainsail ║
|
||||
║ {o2} Fluidd ║
|
||||
║ 3) {o1} Mainsail ║
|
||||
║ 4) {o2} Fluidd ║
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
║ Auto-Backup: ║
|
||||
║ {o3} Automatic backup before update ║
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
║ 1) Set Klipper source repository ║
|
||||
║ 2) Set Moonraker source repository ║
|
||||
║ ║
|
||||
║ 3) Toggle unstable Mainsail releases ║
|
||||
║ 4) Toggle unstable Fluidd releases ║
|
||||
║ ║
|
||||
║ 5) Toggle automatic backups before updates ║
|
||||
║ 5) {o3} Backup before update ║
|
||||
╟───────────────────────────────────────────────────────╢
|
||||
"""
|
||||
)[1:]
|
||||
@@ -106,103 +94,43 @@ class SettingsMenu(BaseMenu):
|
||||
self.mainsail_unstable = self.settings.mainsail.unstable_releases
|
||||
self.fluidd_unstable = self.settings.fluidd.unstable_releases
|
||||
|
||||
# by default, we show the status of the installed repositories
|
||||
self.klipper_status = get_klipper_status()
|
||||
self.moonraker_status = get_moonraker_status()
|
||||
# if the repository is not installed, we show the status of the settings from the config file
|
||||
if self.klipper_status.repo == "-":
|
||||
url_parts = self.settings.klipper.repo_url.split("/")
|
||||
self.klipper_status.repo = url_parts[-1]
|
||||
self.klipper_status.owner = url_parts[-2]
|
||||
self.klipper_status.branch = self.settings.klipper.branch
|
||||
if self.moonraker_status.repo == "-":
|
||||
url_parts = self.settings.moonraker.repo_url.split("/")
|
||||
self.moonraker_status.repo = url_parts[-1]
|
||||
self.moonraker_status.owner = url_parts[-2]
|
||||
self.moonraker_status.branch = self.settings.moonraker.branch
|
||||
klipper_status: ComponentStatus = get_klipper_status()
|
||||
moonraker_status: ComponentStatus = get_moonraker_status()
|
||||
|
||||
def _gather_input(
|
||||
self, repo_name: Literal["klipper", "moonraker"], repo_dir: Path
|
||||
) -> Tuple[str, str]:
|
||||
warn_msg = [
|
||||
"There is only basic input validation in place! "
|
||||
"Make sure your the input is valid and has no typos or invalid characters!"
|
||||
]
|
||||
def trim_repo_url(repo: str) -> str:
|
||||
return repo.replace(".git", "").replace("https://", "").replace("git@", "")
|
||||
|
||||
if repo_dir.exists():
|
||||
warn_msg.extend(
|
||||
[
|
||||
"For the change to take effect, the new repository will be cloned. "
|
||||
"A backup of the old repository will be created.",
|
||||
"\n\n",
|
||||
"Make sure you don't have any ongoing prints running, as the services "
|
||||
"will be restarted during this process! You will loose any ongoing print!",
|
||||
]
|
||||
)
|
||||
if not klipper_status.repo == "-":
|
||||
url = trim_repo_url(klipper_status.repo_url)
|
||||
self.kl_repo_url = Color.apply(url, Color.CYAN)
|
||||
self.kl_branch = Color.apply(klipper_status.branch, Color.CYAN)
|
||||
if not moonraker_status.repo == "-":
|
||||
url = trim_repo_url(moonraker_status.repo_url)
|
||||
self.mr_repo_url = Color.apply(url, Color.CYAN)
|
||||
self.mr_branch = Color.apply(moonraker_status.branch, Color.CYAN)
|
||||
|
||||
Logger.print_dialog(DialogType.ATTENTION, warn_msg)
|
||||
|
||||
repo = get_string_input(
|
||||
"Enter new repository URL",
|
||||
regex=r"^[\w/.:-]+$",
|
||||
default=KLIPPER_REPO_URL if repo_name == "klipper" else MOONRAKER_REPO_URL,
|
||||
)
|
||||
branch = get_string_input(
|
||||
"Enter new branch name", regex=r"^.+$", default="master"
|
||||
)
|
||||
|
||||
return repo, branch
|
||||
|
||||
def _set_repo(
|
||||
self, repo_name: Literal["klipper", "moonraker"], repo_dir: Path
|
||||
) -> None:
|
||||
repo_url, branch = self._gather_input(repo_name, repo_dir)
|
||||
display_name = repo_name.capitalize()
|
||||
def _warn_no_repos(self, name: str) -> None:
|
||||
Logger.print_dialog(
|
||||
DialogType.CUSTOM,
|
||||
[
|
||||
f"New {display_name} repository URL:",
|
||||
f"● {repo_url}",
|
||||
f"New {display_name} repository branch:",
|
||||
f"● {branch}",
|
||||
],
|
||||
DialogType.WARNING,
|
||||
[f"No {name} repositories configured in kiauh.cfg!"],
|
||||
center_content=True,
|
||||
)
|
||||
|
||||
if get_confirm("Apply changes?", allow_go_back=True):
|
||||
repo: RepoSettings = self.settings[repo_name]
|
||||
repo.repo_url = repo_url
|
||||
repo.branch = branch
|
||||
|
||||
self.settings.save()
|
||||
self._load_settings()
|
||||
|
||||
Logger.print_ok("Changes saved!")
|
||||
else:
|
||||
Logger.print_info(
|
||||
f"Changing of {display_name} source repository canceled ..."
|
||||
)
|
||||
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()
|
||||
|
||||
self._switch_repo(repo_name, repo_dir)
|
||||
|
||||
def _switch_repo(
|
||||
self, name: Literal["klipper", "moonraker"], repo_dir: Path
|
||||
) -> None:
|
||||
if not repo_dir.exists():
|
||||
def switch_moonraker_repo(self, **kwargs) -> None:
|
||||
name = "Moonraker"
|
||||
repos = self.settings.moonraker.repositories
|
||||
if not repos:
|
||||
self._warn_no_repos(name)
|
||||
return
|
||||
|
||||
Logger.print_status(
|
||||
f"Switching to {name.capitalize()}'s new source repository ..."
|
||||
)
|
||||
|
||||
repo: RepoSettings = self.settings[name]
|
||||
run_switch_repo_routine(name, repo)
|
||||
|
||||
def set_klipper_repo(self, **kwargs) -> None:
|
||||
self._set_repo("klipper", KLIPPER_DIR)
|
||||
|
||||
def set_moonraker_repo(self, **kwargs) -> None:
|
||||
self._set_repo("moonraker", MOONRAKER_DIR)
|
||||
RepoSelectMenu(name.lower(), 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