Compare commits

...

No commits in common. "c10s" and "a9-epel9" have entirely different histories.

7 changed files with 322 additions and 22 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
/rpmautospec-*.tar.gz
rpmautospec-*.tar.gz

View File

@ -0,0 +1 @@
596f116dfef91883bce4c80cd15c600c3fe440485f836818a92ed5bde10edfda80a199845ed3fb62178c8a35e82aa5ed19310df2cc272352ab4963e71a2b9f6d SOURCES/rpmautospec-0.7.3.tar.gz

View File

@ -0,0 +1,241 @@
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 +
5 files changed, 99 insertions(+), 5 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 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)
- if self.specfile.name in commit.tree:
+ if (
+ self.specfile.name in commit.tree
+ and (
+ not commit_result["magic-comment-result"].is_almalinux
+ and len(commit.parents) == 1
+ )
+ ):
release_number += 1
release_number = max(release_number, commit_result["magic-comment-result"].bump_release)
commit_result["release-number"] = release_number
+ is_parent_almalinux = any(
+ res.get("almalinux-release-number") for res in parent_results if res
+ )
+
+ 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
@@ -26,7 +26,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 do_process_distgit(
@@ -112,9 +112,14 @@ def process_distgit(
# Process the spec file into a temporary file...
used_features = []
+ almalinux_suffix = ""
+ if result["almalinux-release-complete"]:
+ 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}",
)
--
--
2.39.5 (Apple Git-154)

View File

@ -6,8 +6,16 @@
]
%endif
# The pytest-xdist package is not available when bootstrapping or for EL builds
%bcond xdist %{undefined rhel}
# Set this to 1 when bootstrapping
%bcond bootstrap 0
%bcond tests 1
# While bootstrapping, ignore manpages
%bcond manpages %{without bootstrap}
# The pytest-xdist package is not available when bootstrapping or on RHEL
%bcond xdist %[%{without bootstrap} && %{undefined rhel}]
# Package the placeholder rpm-macros (moved to redhat-rpm-config in F40)
%if ! (0%{?fedora} >= 40 || 0%{?rhel} >= 10)
@ -16,6 +24,9 @@
%bcond rpmmacropkg 0
%endif
%if %{with bootstrap}
%bcond poetry 0
%else
%if ! 0%{?fedora}%{?rhel} || 0%{?fedora} || 0%{?epel} >= 9
%bcond poetry 1
# Appease old Poetry versions (<1.2.0a2)
@ -27,44 +38,55 @@
%else
%bcond poetry 0
%endif
%if ! 0%{?fedora}%{?rhel} || 0%{?fedora} || 0%{?epel} >= 9 || 0%{?rhel} >= 10
%bcond manpage_manual_title 1
%else
%bcond manpage_manual_title 0
%endif
%global srcname rpmautospec
Name: python-%{srcname}
Version: 0.6.5
Version: 0.7.3
%if %{with bootstrap}
Release: 0%{?dist}
%else
Release: %autorelease
%endif
Summary: Package and CLI tool to generate release fields and changelogs
License: MIT
URL: https://github.com/fedora-infra/%{srcname}
Source0: https://github.com/fedora-infra/%{srcname}/releases/download/%{version}/%{srcname}-%{version}.tar.gz
Patch1000: 0001-Added-AlmaLinux-change-identifier-0.7.3.patch
%if 0%{!?pyproject_files:1}
%global pyproject_files %{_builddir}/%{name}-%{version}-%{release}.%{_arch}-pyproject-files
%endif
BuildArch: noarch
BuildRequires: argparse-manpage
BuildRequires: git
# the langpacks are needed for tests
BuildRequires: glibc-langpack-de
BuildRequires: glibc-langpack-en
BuildRequires: python3-devel >= 3.9.0
# Needed to build man pages
%if %{with manpages}
BuildRequires: python3dist(click-man)
%endif
%if %{with tests}
# The dependencies needed for testing dont get auto-generated.
BuildRequires: python3dist(pytest)
%if %{with xdist}
BuildRequires: python3dist(pytest-xdist)
%endif
%endif
BuildRequires: python3dist(pyyaml)
BuildRequires: sed
%if %{without poetry}
BuildRequires: python3dist(babel)
BuildRequires: python3dist(click)
BuildRequires: python3dist(click-plugins)
BuildRequires: python3dist(pygit2)
BuildRequires: python3dist(rpm)
BuildRequires: python3dist(rpmautospec-core)
@ -106,7 +128,10 @@ enabled packages locally.
%endif
%prep
%autosetup -n %{srcname}-%{version}
%autosetup -n %{srcname}-%{version} -p1
%if %{without poetry}
sed -i -e 's/\[project\]/#\&/g' pyproject.toml
%endif
%if %{with old_poetry}
sed -i \
-e 's/\[tool\.poetry\.group\.dev\.dependencies\]/[tool.poetry.dev-dependencies]/g' \
@ -137,32 +162,66 @@ cat << EOF > %{pyproject_files}
EOF
%endif
install -d %{buildroot}%{_mandir}/man1
PYTHONPATH=%{buildroot}%{python3_sitelib} argparse-manpage \
%if %{with manpage_manual_title}
--manual-title "User Commands" \
%if %{with manpages}
# Man pages
PYTHONPATH=%{buildroot}%{python3_sitelib} click-man rpmautospec
install -m755 -d %{buildroot}%{_mandir}/man1
install -m644 man/*.1 %{buildroot}%{_mandir}/man1
%endif
--project-name rpmautospec \
--module rpmautospec.cli \
--function get_arg_parser > %{buildroot}%{_mandir}/man1/rpmautospec.1
# RPM macros
%if %{with rpmmacropkg}
mkdir -p %{buildroot}%{rpmmacrodir}
install -m 644 rpm/macros.d/macros.rpmautospec %{buildroot}%{rpmmacrodir}/
install -m 644 rpm/macros.d/macros.rpmautospec %{buildroot}%{rpmmacrodir}/
%endif
# Shell completion
for shell_path in \
bash:%{bash_completions_dir}/rpmautospec \
fish:%{fish_completions_dir}/rpmautospec.fish \
zsh:%{zsh_completions_dir}/_rpmautospec; do
shell="${shell_path%%:*}"
path="${shell_path#*:}"
dir="${path%/*}"
install -m 755 -d "%{buildroot}${dir}"
PYTHONPATH=%{buildroot}%{python3_sitelib} \
_RPMAUTOSPEC_COMPLETE="${shell}_source" \
%{__python3} -c \
"import sys; sys.argv[0] = 'rpmautospec'; from rpmautospec.cli import cli; sys.exit(cli())" \
> "%{buildroot}${path}"
done
%check
# Always run the import checks, even when other tests are disabled
%if %{with poetry}
%pyproject_check_import
%else
%py3_check_import rpmautospec rpmautospec.cli
%endif
%if %{with tests}
%pytest -v \
%if %{with xdist}
--numprocesses=auto
%endif
%endif
%files -n python3-%{srcname} -f %{pyproject_files}
%doc README.rst
%files -n %{srcname}
%{_bindir}/rpmautospec
%{_mandir}/man1/rpmautospec.1*
%if %{with manpages}
%{_mandir}/man1/rpmautospec*.1*
%endif
%dir %{bash_completions_dir}
%{bash_completions_dir}/rpmautospec
%dir %{fish_completions_dir}
%{fish_completions_dir}/rpmautospec.fish
%dir %{zsh_completions_dir}
%{zsh_completions_dir}/_rpmautospec
%if %{with rpmmacropkg}
%files -n rpmautospec-rpm-macros
@ -170,4 +229,4 @@ install -m 644 rpm/macros.d/macros.rpmautospec %{buildroot}%{rpmmacrodir}/
%endif
%changelog
%autochangelog
%{?autochangelog}

View File

@ -1 +0,0 @@
SHA512 (rpmautospec-0.6.5.tar.gz) = 4740a471d25896314cbb37ab7a34d24fa7d3b6512ea4d5d7444528e0669bca79cb23a180b8a591378a40e832df4a6673ac20930f38672d268d9c70fb49748771