From d128484a6502f76a2dc3f70551efbc880583c075 Mon Sep 17 00:00:00 2001 From: eabdullin 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 package’s 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.*)\]\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\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)