diff options
author | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2023-04-03 17:08:18 +0200 |
---|---|---|
committer | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2023-04-03 17:08:18 +0200 |
commit | f6d8be8caff12d4a9e35c91aada14841cdbcae86 (patch) | |
tree | 19346e9f0ea91a3b141ea364766131893f4f2de7 | |
parent | c74126382c636f364382508d97cf43c1df58b347 (diff) | |
download | setuptools-scm-f6d8be8caff12d4a9e35c91aada14841cdbcae86.tar.gz |
breaking: unify version.distance to int
the difference between distance=0 and distance=None was hiding issues
-rw-r--r-- | CHANGELOG.rst | 3 | ||||
-rw-r--r-- | pyproject.toml | 3 | ||||
-rw-r--r-- | src/setuptools_scm/git.py | 21 | ||||
-rw-r--r-- | src/setuptools_scm/version.py | 10 | ||||
-rw-r--r-- | testing/test_functions.py | 45 | ||||
-rw-r--r-- | testing/test_git.py | 9 | ||||
-rw-r--r-- | testing/test_integration.py | 2 | ||||
-rw-r--r-- | testing/test_regressions.py | 2 |
8 files changed, 47 insertions, 48 deletions
diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 28fcc01..72efc1c 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,9 @@ breaking * migrate to hatchling * renamed setuptools_scm.hacks to setuptools_scm.fallbacks and drop support for pip-egg-info * remove trace function and use logging instead +* unify distance=None and distance=0 they should mean the same + and where hiding dirty states that are now explicitly dirty +* depend on later importlib for the full selectable api features -------- diff --git a/pyproject.toml b/pyproject.toml index 9cbd6e5..86a7402 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,6 +4,7 @@ build-backend = "hatchling.build" requires = [ "hatchling>=1.10", + 'importlib-metadata>=4.6; python_version < "3.10"', "packaging>=20", "setuptools>=55", 'tomli; python_version < "3.11"', @@ -40,7 +41,7 @@ dynamic = [ "version", ] dependencies = [ - 'importlib-metadata; python_version < "3.8"', + 'importlib-metadata>=4.6; python_version < "3.10"', "packaging>=20", "setuptools", 'tomli>=1; python_version < "3.11"', diff --git a/src/setuptools_scm/git.py b/src/setuptools_scm/git.py index e8fa295..239ca37 100644 --- a/src/setuptools_scm/git.py +++ b/src/setuptools_scm/git.py @@ -220,14 +220,11 @@ def version_from_describe( else: describe_res = wd.default_describe() - distance: int | None - node: str | None - if describe_res.returncode == 0: - tag, distance, node, dirty = _git_parse_describe(describe_res.stdout) - if distance == 0 and not dirty: - distance = None + def parse_describe(output: str) -> ScmVersion: + tag, distance, node, dirty = _git_parse_describe(output) return meta(tag=tag, distance=distance, dirty=dirty, node=node, config=config) - return None + + return _parse_success(describe_res, parse=parse_describe) def _git_parse_inner( @@ -247,14 +244,14 @@ def _git_parse_inner( node = wd.node() if node is None: distance = 0 + dirty = True else: distance = wd.count_all_nodes() node = "g" + node - dirty = wd.is_dirty() + dirty = wd.is_dirty() version = meta( tag=tag, distance=distance, dirty=dirty, node=node, config=config ) - branch = wd.get_branch() node_date = wd.get_head_date() or date.today() return dataclasses.replace(version, branch=branch, node_date=node_date) @@ -262,7 +259,7 @@ def _git_parse_inner( def _git_parse_describe( describe_output: str, -) -> tuple[str, int | None, str | None, bool]: +) -> tuple[str, int, str | None, bool]: # 'describe_output' looks e.g. like 'v1.5.0-0-g4060507' or # 'v1.15.1rc1-37-g9bd1298-dirty'. # It may also just be a bare tag name if this is a tagged commit and we are @@ -277,7 +274,7 @@ def _git_parse_describe( split = describe_output.rsplit("-", 2) if len(split) < 3: # probably a tagged commit tag = describe_output - number = None + number = 0 node = None else: tag, number_, node = split @@ -325,7 +322,7 @@ def archival_to_version( return meta( tag, config=config, - distance=None if number == 0 else number, + distance=number, node=node, ) diff --git a/src/setuptools_scm/version.py b/src/setuptools_scm/version.py index a164849..d090586 100644 --- a/src/setuptools_scm/version.py +++ b/src/setuptools_scm/version.py @@ -116,7 +116,7 @@ def _source_epoch_or_utc_now() -> datetime: class ScmVersion: tag: _v.Version | _v.NonNormalizedVersion | str config: _config.Configuration - distance: int | None = None + distance: int = 0 node: str | None = None dirty: bool = False preformatted: bool = False @@ -126,13 +126,9 @@ class ScmVersion: init=False, default_factory=_source_epoch_or_utc_now ) - def __post_init__(self) -> None: - if self.dirty and self.distance is None: - self.distance = 0 - @property def exact(self) -> bool: - return self.distance is None + return self.distance == 0 and not self.dirty def __repr__(self) -> str: return self.format_with( @@ -182,7 +178,7 @@ def _parse_tag( def meta( tag: str | _VersionT, *, - distance: int | None = None, + distance: int = 0, dirty: bool = False, node: str | None = None, preformatted: bool = False, diff --git a/testing/test_functions.py b/testing/test_functions.py index 0e07496..6b0bd39 100644 --- a/testing/test_functions.py +++ b/testing/test_functions.py @@ -38,36 +38,37 @@ def test_next_tag(tag: str, expected: str) -> None: VERSIONS = { - "exact": meta("1.1", distance=None, dirty=False, config=c), - "zerodistance": meta("1.1", distance=0, dirty=False, config=c), - "dirty": meta("1.1", distance=None, dirty=True, config=c), - "distance": meta("1.1", distance=3, dirty=False, config=c), - "distancedirty": meta("1.1", distance=3, dirty=True, config=c), + "exact": meta("1.1", distance=0, dirty=False, config=c), + "dirty": meta("1.1", distance=0, dirty=True, config=c), + "distance-clean": meta("1.1", distance=3, dirty=False, config=c), + "distance-dirty": meta("1.1", distance=3, dirty=True, config=c), } @pytest.mark.parametrize( - "version,scheme,expected", + "version,version_scheme, local_scheme,expected", [ - ("exact", "guess-next-dev node-and-date", "1.1"), - ("zerodistance", "guess-next-dev node-and-date", "1.2.dev0"), - ("zerodistance", "guess-next-dev no-local-version", "1.2.dev0"), - ("dirty", "guess-next-dev node-and-date", "1.2.dev0+d20090213"), - ("dirty", "guess-next-dev no-local-version", "1.2.dev0"), - ("distance", "guess-next-dev node-and-date", "1.2.dev3"), - ("distancedirty", "guess-next-dev node-and-date", "1.2.dev3+d20090213"), - ("distancedirty", "guess-next-dev no-local-version", "1.2.dev3"), - ("exact", "post-release node-and-date", "1.1"), - ("zerodistance", "post-release node-and-date", "1.1.post0"), - ("dirty", "post-release node-and-date", "1.1.post0+d20090213"), - ("distance", "post-release node-and-date", "1.1.post3"), - ("distancedirty", "post-release node-and-date", "1.1.post3+d20090213"), + ("exact", "guess-next-dev", "node-and-date", "1.1"), + ("dirty", "guess-next-dev", "node-and-date", "1.2.dev0+d20090213"), + ("dirty", "guess-next-dev", "no-local-version", "1.2.dev0"), + ("distance-clean", "guess-next-dev", "node-and-date", "1.2.dev3"), + ("distance-dirty", "guess-next-dev", "node-and-date", "1.2.dev3+d20090213"), + ("exact", "post-release", "node-and-date", "1.1"), + ("dirty", "post-release", "node-and-date", "1.1.post0+d20090213"), + ("distance-clean", "post-release", "node-and-date", "1.1.post3"), + ("distance-dirty", "post-release", "node-and-date", "1.1.post3+d20090213"), ], ) -def test_format_version(version: str, scheme: str, expected: str) -> None: +def test_format_version( + version: str, version_scheme: str, local_scheme: str, expected: str +) -> None: scm_version = VERSIONS[version] - vs, ls = scheme.split() - assert format_version(scm_version, version_scheme=vs, local_scheme=ls) == expected + assert ( + format_version( + scm_version, version_scheme=version_scheme, local_scheme=local_scheme + ) + == expected + ) def test_dump_version_doesnt_bail_on_value_error(tmp_path: Path) -> None: diff --git a/testing/test_git.py b/testing/test_git.py index 75e3664..53571cb 100644 --- a/testing/test_git.py +++ b/testing/test_git.py @@ -70,7 +70,7 @@ setup(use_scm_version={"root": "../..", """ ) res = run([sys.executable, "setup.py", "--version"], p) - assert res.stdout == "0.1.dev0" + assert res.stdout == "0.1.dev0+d20090213" def test_root_search_parent_directories( @@ -85,7 +85,7 @@ setup(use_scm_version={"search_parent_directories": True}) """ ) res = run([sys.executable, "setup.py", "--version"], p) - assert res.stdout == "0.1.dev0" + assert res.stdout == "0.1.dev0+d20090213" def test_git_gone(wd: WorkDir, monkeypatch: pytest.MonkeyPatch) -> None: @@ -146,7 +146,7 @@ def test_not_owner(wd: WorkDir) -> None: def test_version_from_git(wd: WorkDir) -> None: - assert wd.version == "0.1.dev0" + assert wd.version == "0.1.dev0+d20090213" parsed = git.parse(str(wd.cwd), Configuration(), git.DEFAULT_DESCRIBE) assert parsed is not None and parsed.branch in ("master", "main") @@ -253,7 +253,8 @@ def test_unicode_version_scheme(wd: WorkDir) -> None: def test_git_worktree(wd: WorkDir) -> None: wd.write("test.txt", "test2") # untracked files dont change the state - assert wd.version == "0.1.dev0" + assert wd.version == "0.1.dev0+d20090213" + wd("git add test.txt") assert wd.version.startswith("0.1.dev0+d") diff --git a/testing/test_integration.py b/testing/test_integration.py index ec0ec37..c0594ad 100644 --- a/testing/test_integration.py +++ b/testing/test_integration.py @@ -91,7 +91,7 @@ def test_pyproject_support_with_git(wd: WorkDir, metadata_in: str) -> None: wd.write("setup.py", SETUP_PY_FILES[metadata_in]) wd.write("setup.cfg", SETUP_CFG_FILES[metadata_in]) res = wd([sys.executable, "setup.py", "--version"]) - assert res.endswith("0.1.dev0") + assert res.endswith("0.1.dev0+d20090213") def test_pretend_version(monkeypatch: pytest.MonkeyPatch, wd: WorkDir) -> None: diff --git a/testing/test_regressions.py b/testing/test_regressions.py index 4c27ca9..018f37e 100644 --- a/testing/test_regressions.py +++ b/testing/test_regressions.py @@ -46,7 +46,7 @@ def test_pkginfo_noscmroot(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> N pass else: res = run([sys.executable, "setup.py", "--version"], p) - assert res.stdout == "0.1.dev0" + assert res.stdout == "0.1.dev0+d20090213" @pytest.mark.issue(164) |