diff options
Diffstat (limited to 'sb_builder/packages.py')
| -rw-r--r-- | sb_builder/packages.py | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/sb_builder/packages.py b/sb_builder/packages.py index 0a669bb..60e0425 100644 --- a/sb_builder/packages.py +++ b/sb_builder/packages.py @@ -31,10 +31,11 @@ from .ui import SP, action, chip, enable, group_label, search_field OVERLAYS = ("personal", "pentesting") STATUSES = ("ok", "failed", "never", "outdated", "newer") -COLUMNS = ("", "name", "category", "version", "built", "status", "maintainer") +COLUMNS = ("", "name", "category", "version", "built", "hint", "status", "maintainer") STATUS_COLOR = {"ok": STATUS["ok"], "failed": STATUS["failed"], "outdated": STATUS["aborted"], "newer": STATUS["bad"]} -FIELDS = {"cat": "category", "maint": "maintainer", "req": "requires", "status": "status"} +FIELDS = {"cat": "category", "maint": "maintainer", "req": "requires", "status": "status", + "hint": "hint"} PRE_RELEASE = ("alpha", "beta", "pre", "rc", "dev") @@ -63,6 +64,20 @@ def vercmp(a, b): return -sign if nxt in PRE_RELEASE else sign +def hint_kind(hints): + """One word for the Packages hint column: skip, pin, deps, other; "" without a hint.""" + if hints is None: + return "" + skip = hintlib._raw(hints.get("SKIP", "no")) + if skip.lower() != "no": + return "skip" + if "VERSION" in hints: + return "pin" + if hints and set(hints) <= {"DELREQUIRES", "ADDREQUIRES"}: + return "deps" + return "other" + + def status(row): # ponytail: compares versions only; slackrepo also rebuilds on SlackBuild # or dependency changes, which its preview shows @@ -109,6 +124,8 @@ def matches(row, terms, overlays=(), statuses=(), orphans=False): hay = f"{row['name']} {row['summary'] or ''}" elif field == "requires": hay = " ".join(row["requires"]) + elif field == "hint": + hay = row["hint"] or "none" else: hay = row[field] or "" if term not in hay.lower(): @@ -122,6 +139,7 @@ def load_rows(inventory): row = dict(zip(inventory["columns"], values)) row["category"], row["name"] = row["path"].split("/", 1) row["status"] = status(row) + row["hint"] = hint_kind(row["hints"]) rows.append(row) return rows @@ -169,9 +187,11 @@ class Model(QAbstractTableModel): if role == Qt.ItemDataRole.CheckStateRole and col == 0: return Qt.CheckState.Checked if row["name"] in self.checked else Qt.CheckState.Unchecked if role == Qt.ItemDataRole.DisplayRole: - return (None, row["name"], row["category"], row["version"], - row["built_version"] or "", row["status"], row["maintainer"] or "")[col] - if role == Qt.ItemDataRole.ForegroundRole and col == 5 and row["status"] in STATUS_COLOR: + return (None, row["name"], row["category"], row["version"], row["built_version"] or "", + row["hint"], row["status"], row["maintainer"] or "")[col] + if role == Qt.ItemDataRole.ToolTipRole and col == 5 and row["hints"]: + return ", ".join(sorted(row["hints"])) + if role == Qt.ItemDataRole.ForegroundRole and col == 6 and row["status"] in STATUS_COLOR: return QColor(STATUS_COLOR[row["status"]]) if role == Qt.ItemDataRole.UserRole: return row @@ -255,7 +275,7 @@ class PackagesTab(QWidget): self.proxy = Filter() self.proxy.setSourceModel(self.model) - self.query = search_field("search (cat: maint: req: status:)") + self.query = search_field("search (cat: maint: req: status: hint:)") self.query.textChanged.connect(self.refilter) self.chips = {} chips = QHBoxLayout() @@ -275,7 +295,7 @@ class PackagesTab(QWidget): self.table.setSelectionMode(QTableView.SelectionMode.SingleSelection) self.table.verticalHeader().hide() self.table.horizontalHeader().setStretchLastSection(True) - for col, width in enumerate((28, 220, 110, 120, 120, 80)): + for col, width in enumerate((28, 220, 110, 120, 120, 60, 80)): self.table.setColumnWidth(col, width) self.table.selectionModel().currentRowChanged.connect(self.show_detail) self.table.clicked.connect(self._toggle) |
