diff options
author | Kyle Keen <keenerd@gmail.com> | 2015-06-26 20:19:10 -0400 |
---|---|---|
committer | Kyle Keen <keenerd@gmail.com> | 2015-10-30 20:37:32 -0400 |
commit | 936197cadcf9e4d4d9b25b73344a1ac49a14a7e2 (patch) | |
tree | 10817373342390a5d153db178037a44923d90409 | |
parent | f75df6960d9d11e4d23b7ee7fe517d5cd1cc8107 (diff) | |
download | namcap-936197cadcf9e4d4d9b25b73344a1ac49a14a7e2.tar.gz namcap-936197cadcf9e4d4d9b25b73344a1ac49a14a7e2.zip |
Better handling of dependency loops
-rw-r--r-- | Namcap/depends.py | 27 | ||||
-rw-r--r-- | Namcap/tests/test_depends.py | 14 |
2 files changed, 28 insertions, 13 deletions
diff --git a/Namcap/depends.py b/Namcap/depends.py index f7ba8e4..d80dd9f 100644 --- a/Namcap/depends.py +++ b/Namcap/depends.py @@ -29,25 +29,30 @@ from Namcap.ruleclass import * import Namcap.tags from Namcap import package -def getcovered(dependlist): - """ - Returns full coverage tree set, without packages - from dependlist (iterable of package names) - """ +def single_covered(depend): + "Returns full coverage tree of one package, with loops broken" covered = set() - given = set(dependlist) - todo = list(given) + todo = set([depend]) while todo: i = todo.pop() - if i in covered: - continue covered.add(i) pac = package.load_from_db(i) if pac is None: continue - todo.extend(pac["depends"]) + todo |= set(pac["depends"]) - covered + + return covered - set([depend]) - return covered - given +def getcovered(dependlist): + """ + Returns full coverage tree set, without packages + from self-loops (iterable of package names) + """ + + covered = set() + for d in dependlist: + covered |= single_covered(d) + return covered def getcustom(pkginfo): custom_name = {'^mingw-': ['mingw-w64-crt'],} diff --git a/Namcap/tests/test_depends.py b/Namcap/tests/test_depends.py index 5b487aa..7c6a9dc 100644 --- a/Namcap/tests/test_depends.py +++ b/Namcap/tests/test_depends.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# namcap tests - tests fro the depends module +# namcap tests - tests for the depends module # Copyright (C) 2011 Rémy Oudompheng <remy@archlinux.org> # # This program is free software; you can redistribute it and/or modify @@ -49,13 +49,23 @@ class DependsTests(unittest.TestCase): [('depends-by-namcap-sight depends=(%s)', '')]) def test_satisfied(self): + # false positive test self.pkginfo["depends"] = {"readline": []} self.pkginfo.detected_deps = {"glibc": [], "readline": []} e, w, i = Namcap.depends.analyze_depends(self.pkginfo) + unexpected_w = [('dependency-already-satisfied %s', 'readline')] self.assertEqual(e, []) - # failure: w == [('dependency-already-satisfied %s', 'readline')] self.assertEqual(w, []) # info is verbose and beyond scope, skip it + def test_satisfied2(self): + # false negative test + self.pkginfo["depends"] = {"pyalpm": [], "python": []} + self.pkginfo.detected_deps = {"pyalpm": [], "python": []} + e, w, i = Namcap.depends.analyze_depends(self.pkginfo) + expected_w = [('dependency-already-satisfied %s', 'python')] + self.assertEqual(e, []) + self.assertEqual(w, expected_w) + # info is verbose and beyond scope, skip it # vim: set ts=4 sw=4 noet: |