diff --git a/src/setuptools_scm/git.py b/src/setuptools_scm/git.py index 8f5c77e2..eb1d519a 100644 --- a/src/setuptools_scm/git.py +++ b/src/setuptools_scm/git.py @@ -5,6 +5,7 @@ import os import re import shlex +import sys import warnings from datetime import date @@ -119,6 +120,8 @@ def parse_timestamp(timestamp_text: str) -> date | None: if "%c" in timestamp_text: log.warning("git too old -> timestamp is %r", timestamp_text) return None + if sys.version_info < (3, 11) and timestamp_text.endswith("Z"): + timestamp_text = timestamp_text[:-1] + "+00:00" return datetime.fromisoformat(timestamp_text).date() res = run_git( diff --git a/testing/test_git.py b/testing/test_git.py index 7918f47c..15f4d097 100644 --- a/testing/test_git.py +++ b/testing/test_git.py @@ -498,6 +498,22 @@ def test_git_getdate_badgit( assert git_wd.get_head_date() is None +def test_git_getdate_git_2_45_0_plus( + wd: WorkDir, caplog: pytest.LogCaptureFixture, monkeypatch: pytest.MonkeyPatch +) -> None: + wd.commit_testfile() + git_wd = git.GitWorkdir(wd.cwd) + fake_date_result = CompletedProcess( + args=[], stdout="2024-04-30T22:33:10Z", stderr="", returncode=0 + ) + with patch.object( + git, + "run_git", + Mock(return_value=fake_date_result), + ): + assert git_wd.get_head_date() == date(2024, 4, 30) + + @pytest.fixture() def signed_commit_wd(monkeypatch: pytest.MonkeyPatch, wd: WorkDir) -> WorkDir: if not has_command("gpg", args=["--version"], warn=False):