summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle Keen <keenerd@gmail.com>2015-06-26 19:32:22 -0400
committerKyle Keen <keenerd@gmail.com>2015-06-26 19:32:22 -0400
commitf75df6960d9d11e4d23b7ee7fe517d5cd1cc8107 (patch)
tree6d47d45d464dabeab7a7a8fc6b231e88727a7fde
parent94b2c08b1bcd45f740d48ae64dd59f8f1edff0c9 (diff)
downloadnamcap-f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107.tar.gz
namcap-f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107.zip
Fix false 'included but already satisfied' (FS#43970)
-rw-r--r--Namcap/depends.py46
-rw-r--r--Namcap/tests/test_depends.py10
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: