diff --git a/0001-Added-AlmaLinux-change-identifier-0.6.5.patch b/0001-Added-AlmaLinux-change-identifier-0.6.5.patch new file mode 100644 index 0000000..5ff8e72 --- /dev/null +++ b/0001-Added-AlmaLinux-change-identifier-0.6.5.patch @@ -0,0 +1,255 @@ +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) diff --git a/python-rpmautospec.spec b/python-rpmautospec.spec index dd64014..54c31d0 100644 --- a/python-rpmautospec.spec +++ b/python-rpmautospec.spec @@ -44,6 +44,8 @@ License: MIT URL: https://github.com/fedora-infra/%{srcname} Source0: https://github.com/fedora-infra/%{srcname}/releases/download/%{version}/%{srcname}-%{version}.tar.gz +Patch1001: 0001-Added-AlmaLinux-change-identifier-0.6.5.patch + %if 0%{!?pyproject_files:1} %global pyproject_files %{_builddir}/%{name}-%{version}-%{release}.%{_arch}-pyproject-files %endif @@ -106,7 +108,7 @@ enabled packages locally. %endif %prep -%autosetup -n %{srcname}-%{version} +%autosetup -n %{srcname}-%{version} -p1 %if %{with old_poetry} sed -i \ -e 's/\[tool\.poetry\.group\.dev\.dependencies\]/[tool.poetry.dev-dependencies]/g' \