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

286 lines
12 KiB
Diff
Raw Permalink 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 40925bdbca94349ae42108e3d9ac4fb8c1513770 Mon Sep 17 00:00:00 2001
From: eabdullin <ed.abdullin.1@gmail.com>
Date: Fri, 6 Dec 2024 09:44:47 +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 | 108 +++++++++++++++++-
rpmautospec/subcommands/process_distgit.py | 9 +-
.../subcommands/test_process_distgit.py | 3 +-
tests/rpmautospec/test_magic_comments.py | 1 +
6 files changed, 124 insertions(+), 6 deletions(-)
diff --git a/rpmautospec/changelog.py b/rpmautospec/changelog.py
index cb3e74f..599df6f 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..e0a80d3 100644
--- a/rpmautospec/pkg_history.py
+++ b/rpmautospec/pkg_history.py
@@ -20,6 +20,7 @@ except ImportError: # pragma: no cover
from rpmautospec_core import AUTORELEASE_MACRO
import rpm
+from functools import cmp_to_key
from .changelog import ChangelogEntry
from .magic_comments import parse_magic_comments
@@ -313,13 +314,61 @@ class PkgHistoryProcessor:
)
release_number = max(parent_release_numbers, default=0)
- if self.specfile.name in commit.tree:
+ is_parent_almalinux = any(
+ res.get("almalinux-release-number") for res in parent_results if res
+ )
+
+ 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 +459,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 +492,19 @@ class PkgHistoryProcessor:
else:
log.debug("\tno parent to follow")
previous_changelog = ()
+ second_parent = None
+ is_almalinux = False
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", ())
+ is_almalinux = any(entry['almalinux-release-complete'] for entry in second_parent)
+ if second_parent is not None and is_almalinux:
+ previous_changelog = self._add_missing_changes(previous_changelog, second_parent)
log.debug("\tskip_for_changelog: %s", skip_for_changelog)
@@ -461,6 +517,54 @@ 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:
+ evra = (
+ entry['epoch-version'].split(':', 1)[0] or "0",
+ entry['epoch-version'].split(':', 1)[-1] or "0",
+ entry['release-complete'] + entry['almalinux-release-complete']
+ )
+ new_changelog[evra] = entry
+ added_entries.add(key)
+
+ def compare_evra(a, b):
+ return rpm.labelCompare(a, b)
+
+ 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
+ evra = (
+ entry['epoch-version'].split(':', 1)[0] or "0",
+ entry['epoch-version'].split(':', 1)[-1] or "0",
+ entry['release-complete'] + entry['almalinux-release-complete']
+ )
+ new_changelog[evra] = entry
+ added_entries.add(key)
+
+ add_unique_entries(changelog2, new_changelog, added_entries)
+
+ add_unique_entries(changelog1, new_changelog, added_entries)
+
+ sorted_changelog = sorted(
+ new_changelog.items(),
+ key=cmp_to_key(lambda x, y: compare_evra(x[0], y[0])),
+ reverse=True
+ )
+
+ return tuple(entry for _, entry in sorted_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..760e4aa 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/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__,
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}",
)
--
2.39.5 (Apple Git-154)