summaryrefslogtreecommitdiff
path: root/src/setuptools_scm/git.py
diff options
context:
space:
mode:
authorRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2021-06-08 21:43:21 +0200
committerRonny Pfannschmidt <opensource@ronnypfannschmidt.de>2022-05-29 12:26:55 +0200
commit0fa8bee903b0f3f8f797a2101771d41698f61968 (patch)
tree84d16e7ad5a83c28c8dccf9a3726b4b37f70ed21 /src/setuptools_scm/git.py
parent5ae39d4d7ad9482b242218105d5557462898d547 (diff)
downloadsetuptools-scm-0fa8bee903b0f3f8f797a2101771d41698f61968.tar.gz
Prepare git archival style testing
Diffstat (limited to 'src/setuptools_scm/git.py')
-rw-r--r--src/setuptools_scm/git.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/setuptools_scm/git.py b/src/setuptools_scm/git.py
index f6933ff..1566a12 100644
--- a/src/setuptools_scm/git.py
+++ b/src/setuptools_scm/git.py
@@ -1,4 +1,5 @@
import os
+import re
import warnings
from datetime import date
from datetime import datetime
@@ -8,10 +9,15 @@ from os.path import samefile
from .config import Configuration
from .scm_workdir import Workdir
+from .utils import data_from_mime
from .utils import do_ex
from .utils import require_command
from .utils import trace
from .version import meta
+from .version import tags_to_versions
+
+REF_TAG_RE = re.compile(r"(?<=\btag: )([^,]+)\b")
+DESCRIBE_UNSUPPORTED = "%(describe"
# If testing command in shell make sure to quote the match argument like
# '*[0-9]*' as it will expand before being sent to git if there are any matching
@@ -231,3 +237,29 @@ def search_parent(dirname):
if not tail:
return None
+
+
+def archival_to_version(data, config=None):
+ trace("data", data)
+ archival_describe = data.get("describe-name", DESCRIBE_UNSUPPORTED)
+ if DESCRIBE_UNSUPPORTED in archival_describe:
+ warnings.warn("git archive did not support describe output")
+ else:
+ tag, number, node, _ = _git_parse_describe(archival_describe)
+ return meta(
+ tag,
+ config=config,
+ distance=None if number == 0 else number,
+ node=node,
+ )
+ versions = tags_to_versions(REF_TAG_RE.findall(data.get("ref-names", "")))
+ if versions:
+ return meta(versions[0], config=config)
+ else:
+ return meta("0.0", node=data.get("node"), config=config)
+
+
+def parse_archival(root, config=None):
+ archival = os.path.join(root, ".git_archival.txt")
+ data = data_from_mime(archival)
+ return archival_to_version(data, config=config)