commit 960ddb2b3680afbcd15bacfa2e72401d44cc7af3 Author: Sofia Boldyreva Date: Wed Jan 29 15:14:31 2025 +0100 Initial commit diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..ff6e8d2 --- /dev/null +++ b/config.yaml @@ -0,0 +1,21 @@ +actions: + - replace: + - target: "spec" + find: "%autosetup -n %{srcname}-%{version}" + replace: "%autosetup -n %{srcname}-%{version} -p1" + count: 1 + + - modify_release: + - suffix: ".alma.1" + enabled: true + + - changelog_entry: + - name: "Eduard Abdullin" + email: "eabdullin@almalinux.org" + line: + - "Add AlmaLinux OS change identifier" + + - add_files: + - type: "patch" + name: "0001-Added-AlmaLinux-change-identifier-0.6.5.patch" + number: 1001 diff --git a/files/0001-Added-AlmaLinux-change-identifier-0.6.5.patch b/files/0001-Added-AlmaLinux-change-identifier-0.6.5.patch new file mode 100644 index 0000000..f0561ca --- /dev/null +++ b/files/0001-Added-AlmaLinux-change-identifier-0.6.5.patch @@ -0,0 +1,285 @@ +From 40925bdbca94349ae42108e3d9ac4fb8c1513770 Mon Sep 17 00:00:00 2001 +From: eabdullin +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 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 | 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.*)\]\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..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)