package upd tui
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user