aboutsummaryrefslogtreecommitdiffstats
path: root/sb_builder/packages.py
diff options
context:
space:
mode:
Diffstat (limited to 'sb_builder/packages.py')
-rw-r--r--sb_builder/packages.py32
1 files changed, 22 insertions, 10 deletions
diff --git a/sb_builder/packages.py b/sb_builder/packages.py
index a4d1f1b..ab6f3ce 100644
--- a/sb_builder/packages.py
+++ b/sb_builder/packages.py
@@ -64,12 +64,19 @@ def parse_query(text):
return terms
-def matches(row, terms, overlays=(), statuses=()):
+def orphaned(row):
+ # SBo marks them MAINTAINER="orphaned - no maintainer", EMAIL="NOEMAIL"
+ return (row["maintainer"] or "").startswith("orphaned")
+
+
+def matches(row, terms, overlays=(), statuses=(), orphans=False):
"""All terms match, and the row is in a toggled chip of each non-empty group."""
if overlays and overlay(row) not in overlays:
return False
if statuses and row["status"] not in statuses:
return False
+ if orphans and not orphaned(row):
+ return False
for field, term in terms:
if field is None:
hay = f"{row['name']} {row['summary'] or ''}"
@@ -148,15 +155,16 @@ class Model(QAbstractTableModel):
class Filter(QSortFilterProxyModel):
def __init__(self):
super().__init__()
- self.terms, self.overlays, self.statuses = [], set(), set()
+ self.terms, self.overlays, self.statuses, self.orphans = [], set(), set(), False
- def update(self, text, overlays, statuses):
+ def update(self, text, overlays, statuses, orphans=False):
self.terms, self.overlays, self.statuses = parse_query(text), overlays, statuses
+ self.orphans = orphans
self.invalidateFilter()
def filterAcceptsRow(self, source_row, _parent):
row = self.sourceModel().rows[source_row]
- return matches(row, self.terms, self.overlays, self.statuses)
+ return matches(row, self.terms, self.overlays, self.statuses, self.orphans)
def detail_html(row):
@@ -214,16 +222,15 @@ class PackagesTab(QWidget):
self.query.textChanged.connect(self.refilter)
self.chips = {}
chips = QHBoxLayout()
- for label, group in (("overlay", ("personal", "pentesting", "upstream")), ("status", STATUSES)):
+ for label, group in (("overlay", ("personal", "pentesting", "upstream")), ("status", STATUSES),
+ ("maint", ("orphaned",))): # the query prefix's name
chips.addWidget(group_label(label))
for name in group:
self.chips[name] = chip(name, STATUS_COLOR.get(name) if group is STATUSES else None)
self.chips[name].toggled.connect(self.refilter)
chips.addWidget(self.chips[name])
- chips.addSpacing(16)
+ chips.addSpacing(12)
chips.addStretch()
- self.count = QLabel()
- chips.addWidget(self.count)
self.table = QTableView(sortingEnabled=True)
self.table.setModel(self.proxy)
@@ -279,8 +286,12 @@ class PackagesTab(QWidget):
for key, slot in (("Ctrl+A", self.select_visible), ("Ctrl+Shift+A", self.clear))]
self.loaded = False
+ self.count = QLabel()
+ search = QHBoxLayout()
+ search.addWidget(self.query)
+ search.addWidget(self.count)
layout = QVBoxLayout(self)
- layout.addWidget(self.query)
+ layout.addLayout(search)
layout.addLayout(chips)
layout.addWidget(split, 1)
self.model.dataChanged.connect(lambda *_: self.update_count())
@@ -300,7 +311,8 @@ class PackagesTab(QWidget):
def refilter(self):
on = {n for n, b in self.chips.items() if b.isChecked()}
- self.proxy.update(self.query.text(), on - set(STATUSES), on & set(STATUSES))
+ self.proxy.update(self.query.text(), on - set(STATUSES) - {"orphaned"}, on & set(STATUSES),
+ "orphaned" in on)
self.update_count()
def update_count(self):