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
|
from __future__ import annotations
import re
from . import _types as _t
def _strip_local(version_string: str) -> str:
public, sep, local = version_string.partition("+")
return public
def _add_post(version: str) -> str:
if "post" in version:
raise ValueError(
f"{version} already is a post release, refusing to guess the update"
)
return f"{version}.post1"
def _bump_dev(version: str) -> str | None:
if ".dev" not in version:
return None
prefix, tail = version.rsplit(".dev", 1)
if tail != "0":
raise ValueError(
"choosing custom numbers for the `.devX` distance "
"is not supported.\n "
f"The {version} can't be bumped\n"
"Please drop the tag or create a new supported one ending in .dev0"
)
return prefix
def _bump_regex(version: str) -> str:
match = re.match(r"(.*?)(\d+)$", version)
if match is None:
raise ValueError(
"{version} does not end with a number to bump, "
"please correct or use a custom version scheme".format(version=version)
)
else:
prefix, tail = match.groups()
return "%s%d" % (prefix, int(tail) + 1)
def _format_local_with_time(version: _t.SCMVERSION, time_format: str) -> str:
if version.exact or version.node is None:
return version.format_choice(
"", "+d{time:{time_format}}", time_format=time_format
)
else:
return version.format_choice(
"+{node}", "+{node}.d{time:{time_format}}", time_format=time_format
)
def _dont_guess_next_version(tag_version: _t.SCMVERSION) -> str:
version = _strip_local(str(tag_version.tag))
return _bump_dev(version) or _add_post(version)
|