summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2023-04-03 17:08:18 +0200
committerRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2023-04-03 17:08:18 +0200
commitf6d8be8caff12d4a9e35c91aada14841cdbcae86 (patch)
tree19346e9f0ea91a3b141ea364766131893f4f2de7
parentc74126382c636f364382508d97cf43c1df58b347 (diff)
downloadsetuptools-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.rst3
-rw-r--r--pyproject.toml3
-rw-r--r--src/setuptools_scm/git.py21
-rw-r--r--src/setuptools_scm/version.py10
-rw-r--r--testing/test_functions.py45
-rw-r--r--testing/test_git.py9
-rw-r--r--testing/test_integration.py2
-rw-r--r--testing/test_regressions.py2
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)