diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3066bea4..ca667c7f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,3 +1,8 @@ +v1.15.4 +======= + +* fix issue #164: iterate all found entry points to avoid erros when pip remakes egg-info + v1.15.3 ======= diff --git a/default.nix b/default.nix index f791ac4c..06adc7d9 100644 --- a/default.nix +++ b/default.nix @@ -4,6 +4,12 @@ buildPythonPackage { name = "setuptools_scm"; src = ./.; version = "git"; - buildInputs = [setuptools pip pytest pkgs.git pkgs.mercurial]; + buildInputs = [ + setuptools + pip + pytest + pkgs.git + pkgs.mercurial + ]; } diff --git a/setuptools_scm/__init__.py b/setuptools_scm/__init__.py index b243443d..814dc1e0 100644 --- a/setuptools_scm/__init__.py +++ b/setuptools_scm/__init__.py @@ -8,7 +8,7 @@ from .utils import trace from .version import format_version, meta, ScmVersion -from .discover import find_matching_entrypoint +from .discover import iter_matching_entrypoints PRETEND_KEY = 'SETUPTOOLS_SCM_PRETEND_VERSION' @@ -32,9 +32,10 @@ def version_from_scm(root): def _version_from_entrypoint(root, entrypoint): - ep = find_matching_entrypoint(root, entrypoint) - if ep: - return ep.load()(root) + for ep in iter_matching_entrypoints(root, entrypoint): + version = ep.load()(root) + if version: + return version def dump_version(root, version, write_to, template=None): diff --git a/setuptools_scm/discover.py b/setuptools_scm/discover.py index 62be99df..40cdde5f 100644 --- a/setuptools_scm/discover.py +++ b/setuptools_scm/discover.py @@ -3,11 +3,11 @@ from .utils import trace -def find_matching_entrypoint(path, entrypoint): +def iter_matching_entrypoints(path, entrypoint): trace('looking for ep', entrypoint, path) for ep in iter_entry_points(entrypoint): if os.path.exists(os.path.join(path, ep.name)): if os.path.isabs(ep.name): trace('ignoring bad ep', ep) trace('found ep', ep) - return ep + yield ep diff --git a/setuptools_scm/integration.py b/setuptools_scm/integration.py index fefc3270..52fad073 100644 --- a/setuptools_scm/integration.py +++ b/setuptools_scm/integration.py @@ -2,7 +2,7 @@ from .version import _warn_if_setuptools_outdated from .utils import do -from .discover import find_matching_entrypoint +from .discover import iter_matching_entrypoints from . import get_version @@ -15,8 +15,9 @@ def version_keyword(dist, keyword, value): if getattr(value, '__call__', None): value = value() # this piece of code is a hack to counter the mistake in root finding - ep = find_matching_entrypoint('.', 'setuptools_scm.parse_scm_fallback') - if ep is not None: + matching_fallbacks = iter_matching_entrypoints( + '.', 'setuptools_scm.parse_scm_fallback') + if any(matching_fallbacks): value.pop('root', None) dist.metadata.version = get_version(**value) @@ -25,7 +26,8 @@ def find_files(path='.'): if not path: path = '.' abs = os.path.abspath(path) - ep = find_matching_entrypoint(abs, 'setuptools_scm.files_command') + ep = next(iter_matching_entrypoints( + abs, 'setuptools_scm.files_command'), None) if ep: command = ep.load() try: diff --git a/testing/test_regressions.py b/testing/test_regressions.py index 9d24d612..7abd6595 100644 --- a/testing/test_regressions.py +++ b/testing/test_regressions.py @@ -1,4 +1,5 @@ import sys +import subprocess from setuptools_scm import get_version from setuptools_scm.git import parse @@ -48,6 +49,15 @@ def test_pip_egg_info(tmpdir, monkeypatch): assert get_version(root=p.strpath) == '1.0' +@pytest.mark.issue(164) +def test_pip_download(tmpdir, monkeypatch): + monkeypatch.chdir(tmpdir) + subprocess.check_call([ + sys.executable, '-c', + 'import pip;pip.main()', 'download', 'lz4==0.9.0', + ]) + + def test_use_scm_version_callable(tmpdir, monkeypatch): """use of callable as use_scm_version argument""" monkeypatch.delenv("SETUPTOOLS_SCM_DEBUG")