Skip to content

Commit ae16c2d

Browse files
authored
fix pep440 build errors with releases with alpha, beta and dev suffixes (#4360)
#### Testing ``` [bacalhau]→ python3 convert_git_version_to_pep440_compatible.py Testing convert_git_version_to_pep440_compatible Testing v1.2.3 -> 1.2.3 Testing v1.2.3-4-g5c6d7e8 -> 1.2.3.dev4+g5c6d7e8 Testing v1.2.3-4-g5c6d7e8-dirty -> 1.2.3.dev4+g5c6d7e8.dirty Testing v1.2.2-rc1-113-g5b54992f2-dirty -> 1.2.2.rc1.dev113+g5b54992f2.dirty Testing v1.5.0-dev2 -> 1.5.0.dev2 Testing v1.5.0-alpha1 -> 1.5.0.alpha1 Testing v1.5.0-beta2 -> 1.5.0.beta2 Testing v1.5.0-alpha1-dev3 -> 1.5.0.alpha1.dev3 Testing v1.5.0-beta2-5-g1234567 -> 1.5.0.beta2.dev5+g1234567 All tests passed successfully! ```
1 parent 2fbea74 commit ae16c2d

File tree

1 file changed

+45
-27
lines changed

1 file changed

+45
-27
lines changed

scripts/convert_git_version_to_pep440_compatible.py

+45-27
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,36 @@
1212

1313
EXAMPLE_STRINGS = [
1414
{"v1.2.3": "1.2.3"},
15-
{"v1.2.3-4-g5c6d7e8": "1.2.3.dev4.g5c6d7e8"},
16-
{"v1.2.3-4-g5c6d7e8-dirty": "1.2.3.dev4.g5c6d7e8.dirty"},
17-
{"v1.2.2-rc1-113-g5b54992f2-dirty": "1.2.2.rc1.dev113.g5b54992f2.dirty"},
15+
{"v1.2.3-4-g5c6d7e8": "1.2.3.dev4+g5c6d7e8"},
16+
{"v1.2.3-4-g5c6d7e8-dirty": "1.2.3.dev4+g5c6d7e8.dirty"},
17+
{"v1.2.2-rc1-113-g5b54992f2-dirty": "1.2.2.rc1.dev113+g5b54992f2.dirty"},
18+
{"v1.5.0-dev2": "1.5.0.dev2"},
19+
{"v1.5.0-alpha1": "1.5.0.alpha1"},
20+
{"v1.5.0-beta2": "1.5.0.beta2"},
21+
{"v1.5.0-alpha1-dev3": "1.5.0.alpha1.dev3"},
22+
{"v1.5.0-beta2-5-g1234567": "1.5.0.beta2.dev5+g1234567"},
1823
]
1924

2025

2126
def convert_to_pep440(version_string):
22-
# Remove the leading 'v'
23-
version_string = version_string[1:]
27+
# Remove the leading 'v' if present
28+
if version_string.startswith("v"):
29+
version_string = version_string[1:]
2430

2531
# Regular expressions to match different parts of the version string
2632
main_version_pattern = r"^(\d+\.\d+\.\d+)"
27-
pre_release_pattern = r"(?:-rc(\d+))?"
28-
dev_release_pattern = r"(?:-(\d+)+)?"
33+
pre_release_pattern = r"(?:-(alpha|beta|rc)(\d+))?"
34+
dev_release_pattern = r"(?:-dev(\d+))?"
35+
commit_count_pattern = r"(?:-(\d+))?"
2936
commit_hash_pattern = r"(?:-g([^\-\.]+))?"
30-
dirty_pattern = r"([-.]dirty)?$"
37+
dirty_pattern = r"(-dirty)?$"
3138

3239
# Combine the patterns
3340
full_pattern = (
3441
main_version_pattern
3542
+ pre_release_pattern
3643
+ dev_release_pattern
44+
+ commit_count_pattern
3745
+ commit_hash_pattern
3846
+ dirty_pattern
3947
)
@@ -44,39 +52,49 @@ def convert_to_pep440(version_string):
4452
if not match:
4553
raise ValueError(f"Invalid version string: {version_string}")
4654

47-
components = {}
48-
4955
# Extract the components
5056
main_version = match.group(1)
51-
if len(match.groups()) > 1:
52-
components["pre_release"] = match.group(2)
53-
if len(match.groups()) > 2:
54-
components["dev_release"] = match.group(3)
55-
if len(match.groups()) > 3:
56-
components["commit_hash"] = match.group(4)
57-
if len(match.groups()) > 4:
58-
components["dirty"] = match.group(5)
59-
57+
pre_release_type = match.group(2)
58+
pre_release_num = match.group(3)
59+
dev_release = match.group(4)
60+
commit_count = match.group(5)
61+
commit_hash = match.group(6)
62+
dirty = match.group(7)
63+
64+
# Construct the PEP440 compatible version
6065
pep440_version = main_version
61-
if "dev_release" in components and components["dev_release"] is not None:
62-
pep440_version += f".dev{components['dev_release']}"
66+
67+
if pre_release_type and pre_release_num:
68+
pep440_version += f".{pre_release_type}{pre_release_num}"
69+
70+
if dev_release:
71+
pep440_version += f".dev{dev_release}"
72+
elif commit_count:
73+
pep440_version += f".dev{commit_count}"
74+
75+
if commit_hash:
76+
pep440_version += f"+g{commit_hash}"
77+
78+
if dirty:
79+
pep440_version += ".dirty"
6380

6481
return pep440_version
6582

6683

6784
def test_convert_git_version_to_pep440_compatible():
6885
print("Testing convert_git_version_to_pep440_compatible")
6986

70-
# Test the example strings
7187
for example in EXAMPLE_STRINGS:
72-
git_version, pep440_version = example.popitem()
73-
print(f"Testing {git_version} -> {pep440_version}")
88+
git_version, expected_pep440_version = list(example.items())[0]
89+
print(f"Testing {git_version} -> {expected_pep440_version}")
7490

7591
converted = convert_to_pep440(git_version)
7692

77-
assert pep440_version == converted or print(
78-
f"Failed: \n Expected: {pep440_version}\n Got: {converted}"
79-
)
93+
assert (
94+
expected_pep440_version == converted
95+
), f"Failed: \n Expected: {expected_pep440_version}\n Got: {converted}"
96+
97+
print("All tests passed successfully!")
8098

8199

82100
if __name__ == "__main__":

0 commit comments

Comments
 (0)