diff options
author | Kyle Keen <keenerd@gmail.com> | 2015-06-26 19:32:22 -0400 |
---|---|---|
committer | Kyle Keen <keenerd@gmail.com> | 2015-06-26 19:32:22 -0400 |
commit | f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107 (patch) | |
tree | 6d47d45d464dabeab7a7a8fc6b231e88727a7fde | |
parent | 94b2c08b1bcd45f740d48ae64dd59f8f1edff0c9 (diff) | |
download | namcap-f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107.tar.gz namcap-f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107.zip |
Fix false 'included but already satisfied' (FS#43970)
-rw-r--r-- | Namcap/depends.py | 46 | ||||
-rw-r--r-- | Namcap/tests/test_depends.py | 10 |
2 files changed, 35 insertions, 21 deletions
diff --git a/Namcap/depends.py b/Namcap/depends.py index d7c9bf5..f7ba8e4 100644 --- a/Namcap/depends.py +++ b/Namcap/depends.py @@ -29,23 +29,25 @@ from Namcap.ruleclass import * import Namcap.tags from Namcap import package -def getcovered(dependlist, covereddepend = None): +def getcovered(dependlist): """ - Fills covereddepend with the full dependency tree - of dependlist (iterable of package names) + Returns full coverage tree set, without packages + from dependlist (iterable of package names) """ - if covereddepend is None: - covereddepend = set() - - for i in dependlist: + covered = set() + given = set(dependlist) + todo = list(given) + while todo: + i = todo.pop() + if i in covered: + continue + covered.add(i) pac = package.load_from_db(i) - if pac != None and "depends" in pac: - newdeps = [j for j in pac["depends"] - if j != None and j not in covereddepend] - covereddepend.update(newdeps) - getcovered(newdeps, covereddepend) + if pac is None: + continue + todo.extend(pac["depends"]) - return covereddepend + return covered - given def getcustom(pkginfo): custom_name = {'^mingw-': ['mingw-w64-crt'],} @@ -55,14 +57,17 @@ def getcustom(pkginfo): custom_depend.update(custom_name[pattern]) return custom_depend -def getprovides(depends, provides): +def getprovides(depends): + provides = {} for i in depends: + provides[i] = [] pac = package.load_from_db(i) - - if pac != None and "provides" in pac and pac["provides"] != None and len(pac["provides"]) > 0: - provides[i] = pac["provides"] - else: - provides[i] = [] + if pac is None: + continue + if not pac["provides"]: + continue + provides[i] = pac["provides"] + return provides def analyze_depends(pkginfo): errors, warnings, infos = [], [], [] @@ -90,8 +95,7 @@ def analyze_depends(pkginfo): # Get the provides so we can reference them later # smartprovides : depend => (packages provided by depend) - smartprovides = {} - getprovides(smartdepend, smartprovides) + smartprovides = getprovides(smartdepend) # The set of all provides for detected dependencies allprovides = set() diff --git a/Namcap/tests/test_depends.py b/Namcap/tests/test_depends.py index 4a02345..5b487aa 100644 --- a/Namcap/tests/test_depends.py +++ b/Namcap/tests/test_depends.py @@ -48,4 +48,14 @@ class DependsTests(unittest.TestCase): self.assertEqual(i, [('depends-by-namcap-sight depends=(%s)', '')]) + def test_satisfied(self): + self.pkginfo["depends"] = {"readline": []} + self.pkginfo.detected_deps = {"glibc": [], "readline": []} + e, w, i = Namcap.depends.analyze_depends(self.pkginfo) + self.assertEqual(e, []) + # failure: w == [('dependency-already-satisfied %s', 'readline')] + self.assertEqual(w, []) + # info is verbose and beyond scope, skip it + + # vim: set ts=4 sw=4 noet: |