-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
_version.py
Copy pathMore file actions
113 lines (88 loc) · 3.05 KB
/
_version.py
File metadata and controls
113 lines (88 loc) · 3.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""
Versioning: we use a hard-coded version number, because it's simple and always
works. For dev installs we add extra version info from Git.
"""
import logging
import subprocess
from pathlib import Path
# This is the reference version number, to be bumped before each release.
# The build system detects this definition when building a distribution.
__version__ = "0.6.1"
# Allow using nearly the same code in different projects
project_name = "fastplotlib"
logger = logging.getLogger(project_name.lower())
# Get whether this is a repo. If so, repo_dir is the path, otherwise repo_dir is None.
repo_dir = Path(__file__).parents[1]
repo_dir = repo_dir if repo_dir.joinpath(".git").is_dir() else None
def get_version():
"""Get the version string."""
if repo_dir:
return get_extended_version()
else:
return __version__
def get_extended_version():
"""Get an extended version string with information from git."""
release, post, labels = get_version_info_from_git()
# Sample first 3 parts of __version__
base_release = ".".join(__version__.split(".")[:3])
# Check release
if not release:
release = base_release
elif release != base_release:
logger.warning(
f"{project_name} version from git ({release}) and __version__ ({base_release}) don't match."
)
# Build the total version
version = release
if post and post != "0":
version += f".post{post}"
if labels:
version += "+" + ".".join(labels)
return version
def get_version_info_from_git():
"""Get (release, post, labels) from Git.
With `release` the version number from the latest tag, `post` the
number of commits since that tag, and `labels` a tuple with the
git-hash and optionally a dirty flag.
"""
# Call out to Git
command = [
"git",
"describe",
"--long",
"--always",
"--tags",
"--dirty",
"--first-parent",
]
try:
p = subprocess.run(command, cwd=repo_dir, capture_output=True)
except Exception as e:
logger.warning(f"Could not get {project_name} version: {e}")
p = None
# Parse the result into parts
if p is None:
parts = (None, None, "unknown")
else:
output = p.stdout.decode(errors="ignore")
if p.returncode:
stderr = p.stderr.decode(errors="ignore")
logger.warning(
f"Could not get {project_name} version.\n\nstdout: "
+ output
+ "\n\nstderr: "
+ stderr
)
parts = (None, None, "unknown")
else:
parts = output.strip().lstrip("v").split("-")
if len(parts) <= 2:
# No tags (and thus also no post). Only git hash and maybe 'dirty'
parts = (None, None, *parts)
# Return unpacked parts
release, post, *labels = parts
return release, post, labels
__version__ = get_version()
version_info = tuple(
int(i) if i.isnumeric() else i for i in __version__.split("+")[0].split(".")
)