Skip to content

Commit a1f476e

Browse files
Implement Specfile.bump_release() method (#399)
Implement `Specfile.bump_release()` method Fixes #364. RELEASE NOTES BEGIN It is now possible to bump a release in a manner similar to rpmdev-bumpspec using Specfile.bump_release() method. RELEASE NOTES END Reviewed-by: Miroslav Suchý <[email protected]>
2 parents 2f17aef + ebe2f24 commit a1f476e

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

specfile/specfile.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,3 +989,50 @@ def handle_prerelease(version):
989989
return version[:base_end] + "~" + version[suffix_start:]
990990

991991
self.update_tag("Version", handle_prerelease(version))
992+
993+
@staticmethod
994+
def _bump_release_string(release_string: str) -> str:
995+
"""
996+
Bumps release string. Follows the logic of `rpmdev-bumpspec`.
997+
998+
Args:
999+
release_string: Release string to be bumped.
1000+
1001+
Returns:
1002+
Bumped release string.
1003+
"""
1004+
m = re.match(
1005+
r"^(?P<func>%release_func\s+)?(?P<pre>0\.)?(?P<rel>\d+)(?P<post>.*)$",
1006+
release_string,
1007+
)
1008+
if m and (
1009+
m.group("pre")
1010+
or all(x not in m.group("post") for x in ["alpha", "beta", "rc"])
1011+
):
1012+
return (
1013+
(m.group("func") or "")
1014+
+ (m.group("pre") or "")
1015+
+ str(int(m.group("rel")) + 1)
1016+
+ m.group("post")
1017+
)
1018+
m = re.match(r"^(?P<pre>.+\.)(?P<rel>\d+)$", release_string)
1019+
if m:
1020+
return m.group("pre") + str(int(m.group("rel")) + 1)
1021+
return release_string + ".1"
1022+
1023+
def bump_release(self) -> None:
1024+
"""
1025+
Tries to bump release. Follows the logic of `rpmdev-bumpspec`, first trying to update
1026+
macro definitions that seem to define a release, then trying to update value
1027+
of the Release tag.
1028+
"""
1029+
if self.has_autorelease:
1030+
return
1031+
1032+
with self.macro_definitions() as macro_definitions:
1033+
for md in macro_definitions:
1034+
if md.name.lower() in ["release", "baserelease"]:
1035+
md.body = self._bump_release_string(md.body)
1036+
return
1037+
1038+
self.raw_release = self._bump_release_string(self.raw_release)

tests/unit/test_specfile.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,31 @@ def test_split_raw_release(raw_release, release, dist, minorbump):
3232
)
3333
def test_get_updated_release(raw_release, release, result):
3434
assert Specfile._get_updated_release(raw_release, release) == result
35+
36+
37+
@pytest.mark.parametrize(
38+
"release, bumped_release",
39+
[
40+
("1%{?dist}", "2%{?dist}"),
41+
("0.1%{?dist}", "0.2%{?dist}"),
42+
("%release_func 26", "%release_func 27"),
43+
("0.24.rc1%{?dist}", "0.25.rc1%{?dist}"),
44+
("0.2.%{prerel}%{?dist}", "0.3.%{prerel}%{?dist}"),
45+
(
46+
"0.8.%{commitdate}%{shortcommit}%{?dist}",
47+
"0.9.%{commitdate}%{shortcommit}%{?dist}",
48+
),
49+
(
50+
"3.%{git_date}git%{git_commit_short}%{?dist}",
51+
"4.%{git_date}git%{git_commit_short}%{?dist}",
52+
),
53+
("1%{?rcrel}%{?dist}.1", "1%{?rcrel}%{?dist}.2"),
54+
(
55+
"%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}",
56+
"%{?beta_ver:0.}%{fedora_rel}%{?beta_ver:.%beta_ver}%{?dist}%{flagrel}%{?extrarel}.1",
57+
),
58+
("4.rc2%{?dist}", "4.rc2%{?dist}.1"),
59+
],
60+
)
61+
def test_bump_release_string(release, bumped_release):
62+
assert Specfile._bump_release_string(release) == bumped_release

0 commit comments

Comments
 (0)