Skip to content

Commit cf6ccc8

Browse files
committed
RedundantVersionCheck: add --stable-only option
Add an option for considering only stable versions when checking for redundant versions. Signed-off-by: Arthur Zamarin <arthurzam@gentoo.org>
1 parent 63f52ac commit cf6ccc8

2 files changed

Lines changed: 69 additions & 19 deletions

File tree

src/pkgcheck/checks/cleanup.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ class RedundantVersionCheck(Check):
3333
_source = sources.PackageRepoSource
3434
known_results = frozenset([RedundantVersion])
3535

36+
@staticmethod
37+
def mangle_argparser(parser):
38+
parser.plugin.add_argument(
39+
'--stable-only', action='store_true',
40+
help='consider redundant versions only within stable',
41+
docs="""
42+
If enabled, for each slot, only consider redundant versions
43+
with stable keywords. This is useful for cases of cleanup after
44+
successful stabilization.
45+
""")
46+
3647
def feed(self, pkgset):
3748
if len(pkgset) == 1:
3849
return
@@ -62,10 +73,12 @@ def feed(self, pkgset):
6273
# also, yes, have to use list comp here- we're adding as we go
6374
curr_set.update([f'~{x}' for x in curr_set if not x.startswith('~')])
6475

65-
stack.append([pkg, curr_set])
76+
stack.append((pkg, curr_set))
6677
if matches:
6778
bad.append((pkg, matches))
6879

6980
for pkg, matches in reversed(bad):
7081
later_versions = (x.fullver for x in sorted(matches))
82+
if self.options.stable_only and all(key.startswith('~') for x in matches for key in x.keywords):
83+
continue
7184
yield RedundantVersion(pkg.slot, later_versions, pkg=pkg)

tests/checks/test_cleanup.py

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,102 @@
11
from pkgcheck.checks import cleanup
2+
from snakeoil.cli import arghparse
23

34
from .. import misc
45

6+
def mk_pkg(ver, keywords=("x86", "amd64"), slot="0", **kwds):
7+
return misc.FakePkg(
8+
f"dev-util/diffball-{ver}",
9+
data={**kwds, "KEYWORDS": ' '.join(keywords), "SLOT": slot})
510

611
class TestRedundantVersion(misc.ReportTestCase):
712

813
check_kls = cleanup.RedundantVersionCheck
9-
check = cleanup.RedundantVersionCheck(None)
10-
11-
def mk_pkg(self, ver, keywords=("x86", "amd64"), slot="0", **kwds):
12-
return misc.FakePkg(
13-
f"dev-util/diffball-{ver}",
14-
data={**kwds, "KEYWORDS": ' '.join(keywords), "SLOT": slot})
14+
check = cleanup.RedundantVersionCheck(arghparse.Namespace(stable_only=None))
1515

1616
def test_single_version(self):
17-
self.assertNoReport(self.check, [self.mk_pkg("0.7.1")])
17+
self.assertNoReport(self.check, [mk_pkg("0.7.1")])
1818

1919
def test_live_version(self):
2020
self.assertNoReport(
21-
self.check, [self.mk_pkg('0.7'), self.mk_pkg('0.9', PROPERTIES='live')])
21+
self.check, [mk_pkg('0.7'), mk_pkg('0.9', PROPERTIES='live')])
2222
self.assertNoReport(
23-
self.check, [self.mk_pkg('0.7'), self.mk_pkg('9999', PROPERTIES='live')])
23+
self.check, [mk_pkg('0.7'), mk_pkg('9999', PROPERTIES='live')])
2424

2525
def test_no_keywords(self):
2626
self.assertNoReport(
27-
self.check, [self.mk_pkg('0.7'), self.mk_pkg('0.9', keywords=())])
27+
self.check, [mk_pkg('0.7'), mk_pkg('0.9', keywords=())])
2828

2929
def test_disabled_keywords(self):
3030
self.assertNoReport(
31-
self.check, [self.mk_pkg('0.7'), self.mk_pkg('0.9', keywords=('-x86', '-amd64'))])
31+
self.check, [mk_pkg('0.7'), mk_pkg('0.9', keywords=('-x86', '-amd64'))])
3232

3333
def test_single_redundant(self):
3434
r = self.assertReport(
35-
self.check, [self.mk_pkg(x) for x in ("0.7", "0.8")])
35+
self.check, [mk_pkg(x) for x in ("0.7", "0.8")])
3636
assert isinstance(r, cleanup.RedundantVersion)
3737
assert r.later_versions == ("0.8",)
3838
assert 'slot(0) keywords are overshadowed by version: 0.8' in str(r)
3939

4040
def test_multiple_redundants(self):
4141
reports = self.assertReports(
42-
self.check, [self.mk_pkg(x) for x in ("0.7", "0.8", "0.9")])
42+
self.check, [mk_pkg(x) for x in ("0.7", "0.8", "0.9")])
4343
assert (
4444
[list(x.later_versions) for x in reports] ==
4545
[["0.8", "0.9"], ["0.9"]])
4646
for x in reports:
4747
assert isinstance(x, cleanup.RedundantVersion)
4848

4949
def test_multiple_slots(self):
50-
l = [self.mk_pkg("0.7", slot="1"), self.mk_pkg("0.8"),
51-
self.mk_pkg("0.9", slot="1")]
50+
l = [mk_pkg("0.7", slot="1"), mk_pkg("0.8"),
51+
mk_pkg("0.9", slot="1")]
5252
r = self.assertReport(self.check, l)
5353
assert r.later_versions == ("0.9",)
5454
assert isinstance(r, cleanup.RedundantVersion)
5555
assert 'slot(1) keywords are overshadowed by version: 0.9' in str(r)
5656

57-
l.append(self.mk_pkg("0.10", keywords=("x86", "amd64", "~sparc")))
57+
l.append(mk_pkg("0.10", keywords=("x86", "amd64", "~sparc")))
5858
reports = self.assertReports(self.check, l)
5959
assert ([list(x.later_versions) for x in reports] == [["0.9"], ["0.10"]])
6060

6161
def test_multiple_keywords(self):
62-
l = [self.mk_pkg("0.1", keywords=("~x86", "~amd64")),
63-
self.mk_pkg("0.2", keywords=("x86", "~amd64", "~sparc"))]
62+
l = [mk_pkg("0.1", keywords=("~x86", "~amd64")),
63+
mk_pkg("0.2", keywords=("x86", "~amd64", "~sparc"))]
6464
r = self.assertReport(self.check, l)
6565
assert r.later_versions == ("0.2",)
66+
67+
68+
class TestRedundantVersionByStable(misc.ReportTestCase):
69+
70+
check_kls = cleanup.RedundantVersionCheck
71+
check = cleanup.RedundantVersionCheck(arghparse.Namespace(stable_only=True))
72+
73+
def test_only_unstable(self):
74+
l = [mk_pkg("0.1", keywords=("~x86", "~amd64")),
75+
mk_pkg("0.2", keywords=("~x86", "~amd64"))]
76+
self.assertNoReport(self.check, l)
77+
78+
def test_only_stable(self):
79+
l = [mk_pkg("0.1", keywords=("x86", "amd64")),
80+
mk_pkg("0.2", keywords=("x86", "amd64"))]
81+
r = self.assertReport(self.check, l)
82+
assert r.later_versions == ("0.2",)
83+
84+
def test_mixed_stable(self):
85+
l = [mk_pkg("0.1", keywords=("x86", "amd64", "~sparc")),
86+
mk_pkg("0.2", keywords=("x86", "amd64", "~sparc"))]
87+
r = self.assertReport(self.check, l)
88+
assert r.later_versions == ("0.2",)
89+
90+
def test_mixed_history(self):
91+
l = [mk_pkg("0.1", keywords=("amd64")),
92+
mk_pkg("0.2", keywords=("~x86", "~amd64")),
93+
mk_pkg("0.3", keywords=("x86", "amd64")),
94+
mk_pkg("0.4", keywords=("~x86", "~amd64")),
95+
mk_pkg("0.5", keywords=("~x86", "~amd64"))]
96+
r = self.assertReport(self.check, l)
97+
assert r.later_versions == ("0.3", "0.4", "0.5")
98+
99+
def test_no_redundant(self):
100+
l = [mk_pkg("0.1", keywords=("x86", "amd64")),
101+
mk_pkg("0.2", keywords=("x86", "~amd64"))]
102+
self.assertNoReport(self.check, l)

0 commit comments

Comments
 (0)