python-rpmautospec/0001-Added-AlmaLinux-change-identifier-0.6.5.patch

256 lines
11 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From d128484a6502f76a2dc3f70551efbc880583c075 Mon Sep 17 00:00:00 2001
From: eabdullin <ed.abdullin.1@gmail.com>
Date: Wed, 30 Oct 2024 12:38:20 +0300
Subject: [PATCH] Added AlmaLinux change identifier
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
When modifying a package in AlmaLinux relative to upstream, we do not increment the packages version/release number. Instead, we use almalinux.{almalinux_release_number}.
Therefore, the ability to identify AlmaLinux-specific changes was added, using the comment "AlmaLinux change: ".
If this comment is used, the base release number of the package remains unchanged, but the suffix almalinux.{almalinux_release_number} is appended.
The almalinux_release_number counter increments with each AlmaLinux-specific change to the package and resets upon version/release updates of the package.
---
rpmautospec/changelog.py | 2 +
rpmautospec/magic_comments.py | 7 +-
rpmautospec/pkg_history.py | 85 +++++++++++++++++++++-
rpmautospec/subcommands/process_distgit.py | 9 ++-
tests/rpmautospec/test_magic_comments.py | 1 +
tests/rpmautospec/subcommands/test_process_distgit.py | 3 ++-
6 files changed, 101 insertions(+), 6 deletions(-)
diff --git a/rpmautospec/changelog.py b/rpmautospec/changelog.py
index cb3e74f..b123bbe 100644
--- a/rpmautospec/changelog.py
+++ b/rpmautospec/changelog.py
@@ -106,6 +106,8 @@ class ChangelogEntry(dict):
changelog_evr = f" - {entry_info['epoch-version']}"
if entry_info["release-complete"]:
changelog_evr += f"-{entry_info['release-complete']}"
+ if "almalinux-release-complete" in entry_info and entry_info["almalinux-release-complete"]:
+ changelog_evr += f".{entry_info['almalinux-release-complete']}"
else:
changelog_evr = ""
changelog_header = f"* {changelog_date} {entry_info['authorblurb']}{changelog_evr}"
diff --git a/rpmautospec/magic_comments.py b/rpmautospec/magic_comments.py
index d56086e..4c1c06c 100644
--- a/rpmautospec/magic_comments.py
+++ b/rpmautospec/magic_comments.py
@@ -3,19 +3,24 @@ from typing import NamedTuple
magic_comment_re = re.compile(r"^\s*\[(?P<magic>.*)\]\s*$")
skip_changelog_re = re.compile(r"\s*skip\s+changelog\s*")
+is_almalinux_re = re.compile(r"almalinux\s+change", re.IGNORECASE)
bump_release_re = re.compile(r"\s*bump\s+release\s*(?::\s*)?(?P<bump_value>\d+)\s*")
class MagicCommentResult(NamedTuple):
skip_changelog: bool
+ is_almalinux: bool
bump_release: int
def parse_magic_comments(message: str) -> MagicCommentResult:
skip_changelog = False
+ is_almalinux = False
bump_release = 0
for line in message.split("\n"):
+ if is_almalinux_re.match(line):
+ is_almalinux = True
if l_match := magic_comment_re.match(line):
for part in l_match.group("magic").split(","):
if skip_changelog_re.match(part):
@@ -23,4 +28,4 @@ def parse_magic_comments(message: str) -> MagicCommentResult:
if br_match := bump_release_re.match(part):
bump_release = max(bump_release, int(br_match.group("bump_value")))
- return MagicCommentResult(skip_changelog=skip_changelog, bump_release=bump_release)
+ return MagicCommentResult(skip_changelog=skip_changelog, bump_release=bump_release, is_almalinux=is_almalinux)
diff --git a/rpmautospec/pkg_history.py b/rpmautospec/pkg_history.py
index 9dabf10..3524383 100644
--- a/rpmautospec/pkg_history.py
+++ b/rpmautospec/pkg_history.py
@@ -313,13 +313,61 @@ class PkgHistoryProcessor:
)
release_number = max(parent_release_numbers, default=0)
+ is_parent_almalinux = any(
+ res.get("almalinux-release-number") for res in parent_results if res
+ )
+
- if self.specfile.name in commit.tree:
+ if (
+ self.specfile.name in commit.tree
+ and (
+ not commit_result["magic-comment-result"].is_almalinux and
+ not is_parent_almalinux
+ )
+ ):
release_number += 1
release_number = max(release_number, commit_result["magic-comment-result"].bump_release)
commit_result["release-number"] = release_number
+ is_almalinux_commit = (
+ commit_result["magic-comment-result"].is_almalinux or is_parent_almalinux
+ )
+
+ if is_almalinux_commit:
+ log.debug("\tHas AlmaLinux changes or parent Almalinux release")
+
+ parent_almalinux_release_numbers = tuple(
+ (
+ res.get("almalinux-release-number", 0)
+ if res and (
+ epoch_version is None or res["epoch-version"] is None or epoch_version == res["epoch-version"]
+ )
+ else 0
+ )
+ for res in parent_results
+ )
+ almalinux_release_number = max(parent_almalinux_release_numbers, default=0)
+
+ if commit_result["magic-comment-result"].is_almalinux:
+ almalinux_release_number += 1
+
+ if (
+ release_number > max(parent_release_numbers, default=0) or
+ (is_parent_almalinux and len(commit.parents) > 1)
+ ):
+ almalinux_release_number = 1
+ elif epoch_version != commit_verflags.get("epoch-version"):
+ almalinux_release_number = 1
+
+ commit_result["almalinux-release-number"] = almalinux_release_number
+ almalinux_release_number_with_base = almalinux_release_number + base - 1
+ commit_result["almalinux-release-complete"] = f"alma.{almalinux_release_number_with_base}"
+ log.debug("\talmalinux_release_number: %s", almalinux_release_number)
+ else:
+ commit_result["almalinux-release-number"] = 0
+ commit_result["almalinux-release-complete"] = ""
+
log.debug("\trelease_number: %s", release_number)
prerel_str = "0." if prerelease else ""
@@ -410,6 +458,7 @@ class PkgHistoryProcessor:
"commitlog": commit.message,
"epoch-version": commit_result["epoch-version"],
"release-complete": commit_result["release-complete"],
+ "almalinux-release-complete": commit_result["almalinux-release-complete"]
}
)
@@ -442,13 +491,17 @@ class PkgHistoryProcessor:
else:
log.debug("\tno parent to follow")
previous_changelog = ()
+ second_parent = None
for candidate in parent_results:
if not candidate:
continue
if candidate["commit-id"] == parent_to_follow.id:
previous_changelog = candidate.get("changelog", ())
skip_for_changelog = True
- break
+ else:
+ second_parent = candidate.get("changelog", ())
+ if second_parent is not None:
+ previous_changelog = self._add_missing_changes(previous_changelog, second_parent)
log.debug("\tskip_for_changelog: %s", skip_for_changelog)
@@ -461,6 +514,34 @@ class PkgHistoryProcessor:
yield commit_result
+ @staticmethod
+ def _add_missing_changes(changelog1, changelog2):
+ def add_unique_entries(entries, new_changelog, added_entries):
+ for entry in entries:
+ key = (entry['epoch-version'], entry['release-complete'], entry['almalinux-release-complete'])
+ if key not in added_entries:
+ new_changelog.append(entry)
+ added_entries.add(key)
+
+ new_changelog = []
+ added_entries = set()
+
+ max_release2 = changelog2[0]['release-complete']
+ max_version2 = changelog2[0]['epoch-version']
+
+ for entry in changelog1:
+ key = (entry['epoch-version'], entry['release-complete'], entry['almalinux-release-complete'])
+ if (entry['epoch-version'], entry['release-complete']) == (max_version2, max_release2):
+ break
+ new_changelog.append(entry)
+ added_entries.add(key)
+
+ add_unique_entries(changelog2, new_changelog, added_entries)
+
+ add_unique_entries(changelog1, new_changelog, added_entries)
+
+ return tuple(new_changelog)
+
@staticmethod
def _merge_info(f1: dict[str, Any], f2: dict[str, Any]) -> dict[str, Any]:
"""Merge dicts containing info of previously run visitors."""
diff --git a/rpmautospec/subcommands/process_distgit.py b/rpmautospec/subcommands/process_distgit.py
index 25a03f4..55b0fd1 100644
--- a/rpmautospec/subcommands/process_distgit.py
+++ b/rpmautospec/subcommands/process_distgit.py
@@ -24,7 +24,7 @@ AUTORELEASE_TEMPLATE = """
release_number = {autorelease_number:d};
base_release_number = tonumber(rpm.expand("%{{?-b*}}%{{!?-b:1}}"));
print(release_number + base_release_number - 1);
-}}%{{?-e:.%{{-e*}}}}%{{?-s:.%{{-s*}}}}%{{!?-n:%{{?dist}}}}""" # noqa: E501
+}}%{{?-e:.%{{-e*}}}}%{{?-s:.%{{-s*}}}}%{{!?-n:%{{?dist}}}}{almalinux_suffix}""" # noqa: E501
def register_subcommand(subparsers):
@@ -112,9 +112,14 @@ def process_distgit(
# Process the spec file into a temporary file...
used_features = []
+ almalinux_suffix = ""
+ if result.get("almalinux-release-complete", False):
+ almalinux_suffix = f'.{result["almalinux-release-complete"]}'
+
if features.has_autorelease:
autorelease_blurb_if_needed = AUTORELEASE_TEMPLATE.format(
- autorelease_number=autorelease_number
+ autorelease_number=autorelease_number,
+ almalinux_suffix=almalinux_suffix
)
used_features.append("autorelease")
else:
diff --git a/tests/rpmautospec/test_magic_comments.py b/tests/rpmautospec/test_magic_comments.py
index 2801cd7..3938dcd 100644
--- a/tests/rpmautospec/test_magic_comments.py
+++ b/tests/rpmautospec/test_magic_comments.py
@@ -26,6 +26,7 @@ def _read_commitlog_magic_comments_testdata():
MagicCommentResult(
skip_changelog=d.get("skip_changelog", False),
bump_release=d.get("bump_release", 0),
+ is_almalinux=d.get("is_almalinux", False),
),
id=f"commit-{variant}",
)
diff --git a/tests/rpmautospec/subcommands/test_process_distgit.py b/tests/rpmautospec/subcommands/test_process_distgit.py
index d57d2df..7a9e972 100644
--- a/tests/rpmautospec/subcommands/test_process_distgit.py
+++ b/tests/rpmautospec/subcommands/test_process_distgit.py
@@ -132,7 +132,8 @@ def fuzz_spec_file(
"w", encoding="utf-8"
) as new:
if is_processed:
- autorelease_blurb = process_distgit.AUTORELEASE_TEMPLATE.format(autorelease_number=15)
+ almalinux_suffix = ""
+ autorelease_blurb = process_distgit.AUTORELEASE_TEMPLATE.format(autorelease_number=15, almalinux_suffix=almalinux_suffix)
print(
process_distgit.RPMAUTOSPEC_TEMPLATE.format(
version=__version__,
--
2.39.5 (Apple Git-154)