diff --git a/setup.py b/setup.py index e37bbc69..b8eb063c 100644 --- a/setup.py +++ b/setup.py @@ -79,13 +79,10 @@ def scm_config(): .hg = setuptools_scm.hg:parse .git = setuptools_scm.git:parse - # those are left here for backward compatibility in the 1.x series - .hg_archival.txt = setuptools_scm.hg:parse_archival - PKG-INFO = setuptools_scm.hacks:parse_pkginfo - [setuptools_scm.parse_scm_fallback] .hg_archival.txt = setuptools_scm.hg:parse_archival PKG-INFO = setuptools_scm.hacks:parse_pkginfo + pip-egg-info = setuptools_scm.hacks:parse_pip_egg_info [setuptools_scm.files_command] .hg = setuptools_scm.hg:FILES_COMMAND diff --git a/setuptools_scm/__init__.py b/setuptools_scm/__init__.py index 04fd85a0..b243443d 100644 --- a/setuptools_scm/__init__.py +++ b/setuptools_scm/__init__.py @@ -79,7 +79,8 @@ def _do_parse(root, parse): root, 'setuptools_scm.parse_scm_fallback') else: # include fallbacks after dropping them from the main entrypoint - version = version_from_scm(root) + version = version_from_scm(root) or _version_from_entrypoint( + root, 'setuptools_scm.parse_scm_fallback') if version: return version diff --git a/setuptools_scm/hacks.py b/setuptools_scm/hacks.py index db13e9b4..2d298bec 100644 --- a/setuptools_scm/hacks.py +++ b/setuptools_scm/hacks.py @@ -11,3 +11,14 @@ def parse_pkginfo(root): version = data.get('Version') if version != 'UNKNOWN': return meta(version) + + +def parse_pip_egg_info(root): + pipdir = os.path.join(root, 'pip-egg-info') + if not os.path.isdir(pipdir): + return + items = os.listdir(pipdir) + trace('pip-egg-info', pipdir, items) + if not items: + return + return parse_pkginfo(os.path.join(pipdir, items[0])) diff --git a/setuptools_scm/integration.py b/setuptools_scm/integration.py index 5254cb00..fefc3270 100644 --- a/setuptools_scm/integration.py +++ b/setuptools_scm/integration.py @@ -14,7 +14,9 @@ def version_keyword(dist, keyword, value): value = {} if getattr(value, '__call__', None): value = value() - if os.path.exists('PKG-INFO'): + # 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: value.pop('root', None) dist.metadata.version = get_version(**value) diff --git a/setuptools_scm/version.py b/setuptools_scm/version.py index 1b245098..4f94e04f 100644 --- a/setuptools_scm/version.py +++ b/setuptools_scm/version.py @@ -23,6 +23,7 @@ def callable_or_entrypoint(group, callable_or_name): trace('ep', (group, callable_or_name)) if isinstance(callable_or_name, str): for ep in iter_entry_points(group, callable_or_name): + trace("ep found:", ep.name) return ep.load() else: return callable_or_name diff --git a/testing/conftest.py b/testing/conftest.py index 78a7c1f5..49a9d14b 100644 --- a/testing/conftest.py +++ b/testing/conftest.py @@ -61,6 +61,14 @@ def version(self): return version +@pytest.yield_fixture(autouse=True) +def debug_mode(): + from setuptools_scm import utils + utils.DEBUG = True + yield + utils.DEBUG = False + + @pytest.fixture def wd(tmpdir): return Wd(tmpdir.ensure('wd', dir=True)) diff --git a/testing/test_regressions.py b/testing/test_regressions.py index ac7ecfc8..4a067b34 100644 --- a/testing/test_regressions.py +++ b/testing/test_regressions.py @@ -1,9 +1,11 @@ import sys -import pytest +from setuptools_scm import get_version from setuptools_scm.git import parse from setuptools_scm.utils import do_ex, do +import pytest + def test_pkginfo_noscmroot(tmpdir, monkeypatch): """if we are indeed a sdist, the root does not apply""" @@ -29,6 +31,23 @@ def test_pkginfo_noscmroot(tmpdir, monkeypatch): assert res == '1.0' +def test_pip_egg_info(tmpdir, monkeypatch): + """if we are indeed a sdist, the root does not apply""" + + # we should get the version from pkg-info if git is broken + p = tmpdir.ensure('sub/package', dir=1) + tmpdir.mkdir('.git') + p.join('setup.py').write( + 'from setuptools import setup;' + 'setup(use_scm_version={"root": ".."})') + + with pytest.raises(LookupError): + get_version(root=p.strpath) + + p.ensure('pip-egg-info/random.egg-info/PKG-INFO').write('Version: 1.0') + assert get_version(root=p.strpath) == '1.0' + + def test_use_scm_version_callable(tmpdir, monkeypatch): """use of callable as use_scm_version argument""" monkeypatch.delenv("SETUPTOOLS_SCM_DEBUG")