summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle Keen <keenerd@gmail.com>2015-06-26 20:19:10 -0400
committerKyle Keen <keenerd@gmail.com>2015-10-30 20:37:32 -0400
commit936197cadcf9e4d4d9b25b73344a1ac49a14a7e2 (patch)
tree10817373342390a5d153db178037a44923d90409
parentf75df6960d9d11e4d23b7ee7fe517d5cd1cc8107 (diff)
downloadnamcap-936197cadcf9e4d4d9b25b73344a1ac49a14a7e2.tar.gz
namcap-936197cadcf9e4d4d9b25b73344a1ac49a14a7e2.zip
Better handling of dependency loops
-rw-r--r--Namcap/depends.py27
-rw-r--r--Namcap/tests/test_depends.py14
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: