diff --git a/build.sh b/build.sh index 627c276..a5c5e75 100755 --- a/build.sh +++ b/build.sh @@ -37,8 +37,14 @@ echo "Cleaning previous build artifacts..." rm -rf build/ dist/ echo "Starting PyInstaller build..." +GIT_VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "Unknown") +echo "__version__ = \"$GIT_VERSION\"" > src/core/_baked_version.py + pyinstaller --clean disco-reaper.spec +echo "Cleaning up baked version file..." +rm -f src/core/_baked_version.py + echo "Generating Launch-Reaper.sh launcher..." cat << 'EOF' > dist/Launch-Reaper.sh #!/bin/bash diff --git a/src/core/utils.py b/src/core/utils.py index 5bb8a62..1375ef5 100644 --- a/src/core/utils.py +++ b/src/core/utils.py @@ -67,3 +67,25 @@ def resolve_discord_links(content: str, state: MigrationState, platform: str, ta if result != content: logger.debug(f"resolve_discord_links: Content resolved to (len {len(result)}): {result[:100]!r}") return result + +import subprocess + +def get_app_version() -> str: + """Gets the dynamic app version from baked file or git.""" + try: + from src.core._baked_version import __version__ + return f"Reaper-{__version__}" + except ImportError: + pass + + try: + version = subprocess.check_output( + ["git", "describe", "--tags", "--always"], + stderr=subprocess.DEVNULL, + universal_newlines=True + ).strip() + if not version: + return "Reaper-Unknown" + return f"Reaper-{version}" + except Exception: + return "Reaper-Unknown-git" diff --git a/src/ui/main_app.py b/src/ui/main_app.py index 66d94e1..5bad17b 100644 --- a/src/ui/main_app.py +++ b/src/ui/main_app.py @@ -17,6 +17,7 @@ from src.core.configuration import ( get_available_configs, create_new_config, load_config, save_config, ) from src.ui.widgets import RamDisplay, Footnote +from src.core.utils import get_app_version # ────────────────────────────────────────────────────────────────────────────── @@ -94,7 +95,7 @@ class ConfigSelectionScreen(Screen): def compose(self) -> ComposeResult: yield Header(show_clock=True) with Container(id="config_sel_container"): - yield Label("Disco Reaper — Select Configuration", id="config_sel_title") + yield Label(f"{get_app_version()} — Select Configuration", id="config_sel_title") with VerticalScroll(id="config_list_container"): yield ListView(id="config_list") with Horizontal(id="config_sel_actions"): @@ -476,6 +477,7 @@ class ConfigScreen(Screen): # ────────────────────────────────────────────────────────────────────────────── class ReaperApp(App): + TITLE = get_app_version() SCREENS = { "config_selection": ConfigSelectionScreen, }