Skip to content

Commit 4bf964c

Browse files
Prepare git archival style testing
1 parent 18085da commit 4bf964c

9 files changed

+88
-4
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
@@ -56,6 +56,7 @@ setuptools_scm.parse_scm =
5656
.git = setuptools_scm.git:parse
5757
setuptools_scm.parse_scm_fallback =
5858
.hg_archival.txt = setuptools_scm.hg:parse_archival
59+
.git_archival.txt = setuptools_scm.git:parse_archival
5960
PKG-INFO = setuptools_scm.hacks:parse_pkginfo
6061
pip-egg-info = setuptools_scm.hacks:parse_pip_egg_info
6162
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
DEFAULT_DESCRIBE = "git describe --dirty --tags --long --match *[0-9]*"
1723

@@ -218,3 +224,29 @@ def search_parent(dirname):
218224

219225
if not tail:
220226
return None
227+
228+
229+
def archival_to_version(data, config=None):
230+
trace("data", data)
231+
archival_describe = data.get("describe-name", DESCRIBE_UNSUPPORTED)
232+
if DESCRIBE_UNSUPPORTED in archival_describe:
233+
warnings.warn("git archive did not support describe output")
234+
else:
235+
tag, number, node, _ = _git_parse_describe(archival_describe)
236+
return meta(
237+
tag,
238+
config=config,
239+
distance=None if number == 0 else number,
240+
node=node,
241+
)
242+
versions = tags_to_versions(REF_TAG_RE.findall(data.get("ref-names", "")))
243+
if versions:
244+
return meta(versions[0], config=config)
245+
else:
246+
return meta("0.0", node=data.get("node"), config=config)
247+
248+
249+
def parse_archival(root, config=None):
250+
archival = os.path.join(root, ".git_archival.txt")
251+
data = data_from_mime(archival)
252+
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
@@ -8,10 +8,13 @@
88

99
import pytest
1010

11+
from setuptools_scm import Configuration
12+
from setuptools_scm import format_version
1113
from setuptools_scm import git
1214
from setuptools_scm import integration
1315
from setuptools_scm import NonNormalizedVersion
1416
from setuptools_scm.file_finder_git import git_find_files
17+
from setuptools_scm.git import archival_to_version
1518
from setuptools_scm.utils import do
1619
from setuptools_scm.utils import has_command
1720

@@ -392,10 +395,39 @@ def parse_date():
392395
assert meta.node_date == today
393396

394397

395-
def test_git_getdate_badgit(
396-
wd,
397-
):
398+
def test_git_getdate_badgit(wd):
398399
wd.commit_testfile()
399400
git_wd = git.GitWorkdir(os.fspath(wd.cwd))
400401
with patch.object(git_wd, "do_ex", Mock(return_value=("%cI", "", 0))):
401402
assert git_wd.get_head_date() is None
403+
404+
405+
@pytest.mark.parametrize(
406+
"expected, from_data",
407+
[
408+
(
409+
"1.0",
410+
{"describe-name": "1.0-0-g0000"},
411+
),
412+
(
413+
"1.1.dev3+g0000",
414+
{
415+
"describe-name": "1.0-3-g0000",
416+
"node": "0" * 20,
417+
},
418+
),
419+
("0.0", {"node": "0" * 20}),
420+
("1.2.2", {"describe-name": "release-1.2.2-0-g00000"}),
421+
("1.2.2.dev0", {"ref-names": "tag: release-1.2.2.dev"}),
422+
],
423+
)
424+
@pytest.mark.filterwarnings("ignore:git archive did not support describe output")
425+
def test_git_archival_to_version(expected, from_data):
426+
config = Configuration()
427+
version = archival_to_version(from_data, config=config)
428+
assert (
429+
format_version(
430+
version, version_scheme="guess-next-dev", local_scheme="node-and-date"
431+
)
432+
== expected
433+
)

tox.ini

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ envlist=py{36,37,38,39,310}-test,flake8,check_readme,check-dist,py{37}-selfcheck
33

44
[pytest]
55
testpaths=testing
6-
filterwarnings=error
6+
filterwarnings=
7+
error
8+
ignore:.*git archive did not support describe output.*:UserWarning
79
markers=
810
issue(id): reference to github issue
911
# disable unraisable until investigated

0 commit comments

Comments
 (0)