Skip to content

Commit 0fa8bee

Browse files
Prepare git archival style testing
1 parent 5ae39d4 commit 0fa8bee

9 files changed

+86
-3
lines changed

.git_archival.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node: $Format:%H$
2+
node-date: $Format:%cI$
3+
describe-name: $Format:%(describe)$
4+
ref-names: $Format:%D$

.gitattributes

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.git_archival.txt export-subst

MANIFEST.in

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
exclude *.nix
22
exclude .pre-commit-config.yaml
3+
exclude .git_archival.txt
34
include *.py
45
include testing/*.py
56
include tox.ini

setup.cfg

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ setuptools_scm.parse_scm =
5959
.git = setuptools_scm.git:parse
6060
setuptools_scm.parse_scm_fallback =
6161
.hg_archival.txt = setuptools_scm.hg:parse_archival
62+
.git_archival.txt = setuptools_scm.git:parse_archival
6263
PKG-INFO = setuptools_scm.hacks:parse_pkginfo
6364
pip-egg-info = setuptools_scm.hacks:parse_pip_egg_info
6465
setup.py = setuptools_scm.hacks:fallback_version

src/setuptools_scm/.git_archival.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node: $Format:%H$
2+
node-date: $Format:%cI$
3+
describe-name: $Format:%(describe)$
4+
ref-names: $Format:%D$

src/setuptools_scm/git.py

+32
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import re
23
import warnings
34
from datetime import date
45
from datetime import datetime
@@ -8,10 +9,15 @@
89

910
from .config import Configuration
1011
from .scm_workdir import Workdir
12+
from .utils import data_from_mime
1113
from .utils import do_ex
1214
from .utils import require_command
1315
from .utils import trace
1416
from .version import meta
17+
from .version import tags_to_versions
18+
19+
REF_TAG_RE = re.compile(r"(?<=\btag: )([^,]+)\b")
20+
DESCRIBE_UNSUPPORTED = "%(describe"
1521

1622
# If testing command in shell make sure to quote the match argument like
1723
# '*[0-9]*' as it will expand before being sent to git if there are any matching
@@ -231,3 +237,29 @@ def search_parent(dirname):
231237

232238
if not tail:
233239
return None
240+
241+
242+
def archival_to_version(data, config=None):
243+
trace("data", data)
244+
archival_describe = data.get("describe-name", DESCRIBE_UNSUPPORTED)
245+
if DESCRIBE_UNSUPPORTED in archival_describe:
246+
warnings.warn("git archive did not support describe output")
247+
else:
248+
tag, number, node, _ = _git_parse_describe(archival_describe)
249+
return meta(
250+
tag,
251+
config=config,
252+
distance=None if number == 0 else number,
253+
node=node,
254+
)
255+
versions = tags_to_versions(REF_TAG_RE.findall(data.get("ref-names", "")))
256+
if versions:
257+
return meta(versions[0], config=config)
258+
else:
259+
return meta("0.0", node=data.get("node"), config=config)
260+
261+
262+
def parse_archival(root, config=None):
263+
archival = os.path.join(root, ".git_archival.txt")
264+
data = data_from_mime(archival)
265+
return archival_to_version(data, config=config)

testing/Dockerfile.rawhide-git

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
FROM fedora:rawhide
2+
RUN dnf install git -y
3+
RUN git --version
4+
USER 1000:1000
5+
VOLUME /repo
6+
WORKDIR /repo
7+
ENTRYPOINT mkdir git-archived && git archive HEAD -o git-archived/archival.tar.gz

testing/test_git.py

+35-3
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99

1010
import pytest
1111

12+
from setuptools_scm import Configuration
13+
from setuptools_scm import format_version
1214
from setuptools_scm import git
1315
from setuptools_scm import integration
1416
from setuptools_scm import NonNormalizedVersion
1517
from setuptools_scm.file_finder_git import git_find_files
18+
from setuptools_scm.git import archival_to_version
1619
from setuptools_scm.utils import do
1720
from setuptools_scm.utils import has_command
1821

@@ -395,9 +398,7 @@ def parse_date():
395398
assert meta.node_date == today
396399

397400

398-
def test_git_getdate_badgit(
399-
wd,
400-
):
401+
def test_git_getdate_badgit(wd):
401402
wd.commit_testfile()
402403
git_wd = git.GitWorkdir(os.fspath(wd.cwd))
403404
with patch.object(git_wd, "do_ex", Mock(return_value=("%cI", "", 0))):
@@ -435,3 +436,34 @@ def test_git_getdate_signed_commit(signed_commit_wd):
435436
signed_commit_wd.commit_testfile(signed=True)
436437
git_wd = git.GitWorkdir(os.fspath(signed_commit_wd.cwd))
437438
assert git_wd.get_head_date() == today
439+
440+
441+
@pytest.mark.parametrize(
442+
"expected, from_data",
443+
[
444+
(
445+
"1.0",
446+
{"describe-name": "1.0-0-g0000"},
447+
),
448+
(
449+
"1.1.dev3+g0000",
450+
{
451+
"describe-name": "1.0-3-g0000",
452+
"node": "0" * 20,
453+
},
454+
),
455+
("0.0", {"node": "0" * 20}),
456+
("1.2.2", {"describe-name": "release-1.2.2-0-g00000"}),
457+
("1.2.2.dev0", {"ref-names": "tag: release-1.2.2.dev"}),
458+
],
459+
)
460+
@pytest.mark.filterwarnings("ignore:git archive did not support describe output")
461+
def test_git_archival_to_version(expected, from_data):
462+
config = Configuration()
463+
version = archival_to_version(from_data, config=config)
464+
assert (
465+
format_version(
466+
version, version_scheme="guess-next-dev", local_scheme="node-and-date"
467+
)
468+
== expected
469+
)

tox.ini

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ testpaths=testing
66
filterwarnings=
77
error
88
ignore:.*tool\.setuptools_scm.*
9+
ignore:.*git archive did not support describe output.*:UserWarning
910
markers=
1011
issue(id): reference to github issue
1112
skip_commit: allows to skip committing in the helpers

0 commit comments

Comments
 (0)