prole/installer/build.py
chrisfu 0e01595de0 refactor: switch to environment wrapper; standardize env.sh usage and improve $PROLE_HOME management
- Replace direct script invocation with `$PROLE_HOME/env.sh` wrapper for consistent environment setup across all components.
- Update runtime processes to dynamically resolve `$PROLE_HOME` or fallback to `$HOME/.prole`.
- Deprecate `init-port-forwards.sh` script bundling; remove from LaunchAgentManager and build system.
- Overhaul `env.sh` generation to include execution capability, customizable paths, and improved error handling.
- Standardize app name and paths to "Prole Tools" across all files and UI elements.
- Adjust build output to align with new structure, including executable naming and resource packaging.
2025-12-15 22:00:32 -08:00

54 lines
2.2 KiB
Python

"""
Build helpers for the Prole installer (root-level package).
UI-agnostic command composition for the Prole macOS app build.
"""
from __future__ import annotations
from pathlib import Path
import tkinter as tk
from tkinter import ttk, scrolledtext
from . import main as inst_main
from . import screen as ui
def get_build_command(project_root: Path, env: str | None) -> str:
"""Return the Prole app build command with an env comment suffix.
Example output:
cd "/path/to/repo" && PROLE_VERBOSE=1 bash -lc 'export PROLE_HOME="${PROLE_HOME:-$HOME/.prole}"; "$PROLE_HOME/env.sh" ./prole-tools-app/build.sh build --verbose' # Dev
"""
env_label = (env or "Dev").strip().title()
prole_root = str(project_root)
# Ensure we apply the stable bash environment via the executable env.sh wrapper
# Avoid static analyzers tripping on $PROLE_HOME by breaking the token
env_default = '"${' + 'PROLE_HOME:-$HOME/.prole}"'
prole_home_token = '"$' + 'PROLE_HOME"'
cmd = (
f"cd \"{prole_root}\" && PROLE_VERBOSE=1 bash -lc 'export PROLE_HOME={env_default}; {prole_home_token}/env.sh ./prole-tools-app/build.sh build --verbose' # {env_label}"
)
return cmd
# ---------------- Screen (UI) helpers ----------------
def create_build_page(app):
"""Create the Build page UI and register it via installer.main."""
f = ttk.Frame(app.page_area)
f.place(x=0, y=0, relwidth=1, relheight=1)
ttk.Label(f, text='Build', style='Title.TLabel').pack(anchor='w', padx=24, pady=(24, 6))
ttk.Label(f, text='Choose a target and build the artifacts.', style='Body.TLabel').pack(anchor='w', padx=24)
wrap = ttk.Frame(f)
wrap.pack(anchor='w', padx=24, pady=12)
ttk.Label(wrap, text='Target Environment:', style='Body.TLabel').pack(side='left')
app.deploy_env_var = tk.StringVar(value='Dev')
ttk.Combobox(wrap, textvariable=app.deploy_env_var, values=['Dev', 'Service', 'Prod'], state='readonly', width=18).pack(side='left', padx=10)
# Build output console
app.build_output = scrolledtext.ScrolledText(f, height=12, bg='#fafafa', fg='#1d1d1f')
app.build_output.pack(fill='both', expand=True, padx=24, pady=12)
inst_main.register_page(app, 'build', f)
return f