From 1410f0fe254364de6f12736e42a923f9f08b5591 Mon Sep 17 00:00:00 2001 From: mjallen18 Date: Thu, 22 Jan 2026 12:55:23 -0600 Subject: [PATCH] package upd tui --- scripts/version_tui.py | 111 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/scripts/version_tui.py b/scripts/version_tui.py index 7042544..2a11998 100755 --- a/scripts/version_tui.py +++ b/scripts/version_tui.py @@ -305,10 +305,86 @@ class PackagesScreen(ScreenBase): while True: self.stdscr.clear() h, w = self.stdscr.getmaxyx() - self.stdscr.addstr(0, 0, "Packages (version.json)") - for i, (name, _path) in enumerate(self.packages[:h-3], start=0): + + # Determine split layout + left_w = max(30, min(60, w // 3)) + right_x = left_w + 1 + right_w = max(0, w - right_x) + + # Left pane: package list + self.stdscr.addstr(0, 0, "Packages (version.json)"[:max(0, left_w-1)]) + max_rows = h - 3 + for i, (name, _path) in enumerate(self.packages[:max_rows], start=0): sel = ">" if i == self.idx else " " - self.stdscr.addstr(1+i, 0, f"{sel} {name}"[:w-1]) + self.stdscr.addstr(1 + i, 0, f"{sel} {name}"[:max(0, left_w-1)]) + + # Right pane: preview of selected package (non-interactive summary) + if right_w >= 20 and self.packages: + try: + name, path = self.packages[self.idx] + self.stdscr.addstr(0, right_x, f"{name}"[:max(0, right_w-1)]) + self.stdscr.addstr(1, right_x, f"{path}"[:max(0, right_w-1)]) + self.stdscr.addstr(2, right_x, "Sources:"[:max(0, right_w-1)]) + + spec = load_json(path) + merged_vars, merged_srcs, _ = merged_view(spec, None) + snames = sorted(list(merged_srcs.keys())) + max_src_rows = max(0, h - 6) + for i2, sname in enumerate(snames[:max_src_rows], start=0): + comp = merged_srcs[sname] + fetcher = comp.get("fetcher", "none") + # Construct concise reference similar to detail view + display_ref = comp.get("tag") or comp.get("rev") or comp.get("version") or "" + if fetcher == "github": + rendered = render_templates(comp, merged_vars) + tag = rendered.get("tag") + rev = rendered.get("rev") + owner = (rendered.get("owner") or merged_vars.get("owner") or "") + repo = (rendered.get("repo") or merged_vars.get("repo") or "") + if tag and owner and repo: + display_ref = f"{owner}/{repo}@{tag}" + elif tag: + display_ref = tag + elif rev and owner and repo: + display_ref = f"{owner}/{repo}@{rev[:7]}" + elif rev: + display_ref = rev[:12] + elif fetcher == "url": + rendered = render_templates(comp, merged_vars) + url = rendered.get("url") or rendered.get("urlTemplate") or "" + if url: + owner = str(merged_vars.get("owner", "") or "") + repo = str(merged_vars.get("repo", "") or "") + rp = str(merged_vars.get("releasePrefix", "") or "") + rs = str(merged_vars.get("releaseSuffix", "") or "") + base = str(merged_vars.get("base", "") or "") + rel = str(merged_vars.get("release", "") or "") + tag = f"{rp}{base}-{rel}{rs}" if (base and rel) else "" + parsed = urlparse(url) + filename = os.path.basename(parsed.path) if parsed and parsed.path else "" + if owner and repo and tag and filename: + display_ref = f"{owner}/{repo}@{tag} ยท {filename}" + elif filename: + display_ref = filename + else: + display_ref = url + else: + display_ref = "" + # Truncate reference to fit right pane + if isinstance(display_ref, str): + max_ref = max(0, right_w - 30) + ref_short = (display_ref[:max_ref] + ("..." if len(display_ref) > max_ref else "")) + else: + ref_short = display_ref + self.stdscr.addstr(3 + i2, right_x, f"{sname:<20} {fetcher:<7} {ref_short}"[:max(0, right_w-1)]) + + # Hint line for workflow + hint = "Enter: open details | k/j: move | q: quit" + if h >= 5: + self.stdscr.addstr(h - 5, right_x, hint[:max(0, right_w-1)]) + except Exception as e: + self.stdscr.addstr(2, right_x, f"Failed to load: {e}"[:max(0, right_w-1)]) + self.draw_status(h, w) self.stdscr.refresh() ch = self.stdscr.getch() @@ -661,6 +737,35 @@ class PackageDetailScreen(ScreenBase): ref_short = display_ref if not isinstance(display_ref, str) else (display_ref[:60] + ("..." if len(display_ref) > 60 else "")) sel = ">" if i == self.sidx else " " self.stdscr.addstr(3+i, 0, f"{sel} {name:<20} {fetcher:<7} ref={ref_short}"[:w-1]) + + # Latest candidates section for selected component (auto-fetched) + if self.snames: + _sel_name = self.snames[self.sidx] + _comp = self.merged_srcs[_sel_name] + _fetcher = _comp.get("fetcher", "none") + # Preload candidates lazily for selected item + if _fetcher in ("github", "git", "url") and _sel_name not in self.candidates: + self.fetch_candidates_for(_sel_name) + y_latest = h - 6 + if y_latest >= 3: + self.stdscr.addstr(y_latest, 0, "Latest:"[:w-1]) + if _fetcher in ("github", "git"): + _cand = self.candidates.get(_sel_name, {}) + _line = f" release={_cand.get('release') or '-'} tag={_cand.get('tag') or '-'} commit={( (_cand.get('commit') or '')[:12] ) or '-'}" + self.stdscr.addstr(y_latest+1, 0, _line[:w-1]) + elif _fetcher == "url": + _cand_u = self.url_candidates.get(_sel_name, {}) or {} + _tag = _cand_u.get("tag") or (self.candidates.get(_sel_name, {}).get("release") or "-") + _line = f" tag={_tag} base={_cand_u.get('base') or '-'} release={_cand_u.get('release') or '-'}" + self.stdscr.addstr(y_latest+1, 0, _line[:w-1]) + else: + if self.pkg_name == "linux-cachyos" and _sel_name == "linux": + _suffix = self.cachyos_suffix() + _latest = self.fetch_cachyos_linux_latest(_suffix) + self.stdscr.addstr(y_latest+1, 0, f" linux from PKGBUILD: {_latest or '-'}"[:w-1]) + else: + self.stdscr.addstr(y_latest+1, 0, " -"[:w-1]) + # Footer instructions self.stdscr.addstr(h-4, 0, "Enter: component actions | r: refresh candidates | h: prefetch hash | e: edit field | s: save | Backspace: back | q: quit") self.draw_status(h, w)