aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2014-04-11 00:45:04 -0400
committerJason R. Coombs <jaraco@jaraco.com>2014-04-11 00:45:04 -0400
commitc87de03d89ca07416bb2e2c252c7721313e5d9ec (patch)
treec6f7595991e1fbd6006263dfb2419240e08d329a
parentb118b5f25040715111699eff1345d1eb08457270 (diff)
downloadexternal_python_setuptools-c87de03d89ca07416bb2e2c252c7721313e5d9ec.tar.gz
external_python_setuptools-c87de03d89ca07416bb2e2c252c7721313e5d9ec.tar.bz2
external_python_setuptools-c87de03d89ca07416bb2e2c252c7721313e5d9ec.zip
Exclude children of excluded parents when doing package discovery. Fixes #184.3.4.4
-rw-r--r--CHANGES.txt7
-rw-r--r--setuptools/__init__.py17
2 files changed, 24 insertions, 0 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 512127b3..1c54ea5e 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -3,6 +3,13 @@ CHANGES
=======
-----
+3.4.4
+-----
+
+* Issue #184: Correct failure where find_package over-matched packages
+ when directory traversal isn't short-circuited.
+
+-----
3.4.3
-----
diff --git a/setuptools/__init__.py b/setuptools/__init__.py
index 6f588962..8d46b6dd 100644
--- a/setuptools/__init__.py
+++ b/setuptools/__init__.py
@@ -50,6 +50,7 @@ class PackageFinder(object):
explicitly excluded packages are removed from it.
"""
out = cls._find_packages_iter(convert_path(where))
+ out = cls.require_parents(out)
includes = cls._build_filter(*include)
excludes = cls._build_filter('ez_setup', '*__pycache__', *exclude)
out = filter(includes, out)
@@ -57,6 +58,22 @@ class PackageFinder(object):
return list(out)
@staticmethod
+ def require_parents(packages):
+ """
+ Exclude any apparent package that apparently doesn't include its
+ parent.
+
+ For example, exclude 'foo.bar' if 'foo' is not present.
+ """
+ found = []
+ for pkg in packages:
+ base, sep, child = pkg.rpartition('.')
+ if base and base not in found:
+ continue
+ found.append(pkg)
+ yield pkg
+
+ @staticmethod
def _all_dirs(base_path):
"""
Return all dirs in base_path, relative to base_path