From 4d209fd4edbfc0f1c71d6464df0f28cb34402449 Mon Sep 17 00:00:00 2001 From: karolinku Date: Thu, 30 Jul 2026 12:36:11 +0200 Subject: [PATCH] - Rebase to version 0.22.0 - Resolves: RHEL-188371 --- .gitignore | 1 + 0001-introduce-the-format_list-function.patch | 194 ----------- ...-unsupported-upgrade-path-from-tests.patch | 61 ---- ...ackit-add-new-upgrade-paths-to-tests.patch | 300 ------------------ ...update-actions-checkout-action-to-v6.patch | 48 --- ...e-actions-github-script-action-to-v8.patch | 34 -- ...e-peter-evans-create-or-update-comme.patch | 26 -- ...correct-converting-of-list-based-com.patch | 157 --------- ...fix-incorrect-converting-of-list-bas.patch | 171 ---------- ...test-deps-update-pytest-requirements.patch | 37 --- ...e-single-quoting-when-converting-rem.patch | 173 ---------- ...-normalize_schemas-for-conflicting-a.patch | 226 ------------- 0012-Makefile-add-test_no_lint.patch | 28 -- 0013-Bump-framework_version.patch | 26 -- ...update-actions-checkout-action-to-v7.patch | 48 --- ...e-actions-github-script-action-to-v9.patch | 34 -- ...e-sclorg-testing-farm-as-github-acti.patch | 26 -- leapp.spec | 41 +-- plans/tier0.fmf | 24 +- sources | 2 +- 20 files changed, 28 insertions(+), 1629 deletions(-) delete mode 100644 0001-introduce-the-format_list-function.patch delete mode 100644 0002-packit-remove-unsupported-upgrade-path-from-tests.patch delete mode 100644 0003-packit-add-new-upgrade-paths-to-tests.patch delete mode 100644 0004-chore-deps-update-actions-checkout-action-to-v6.patch delete mode 100644 0005-chore-deps-update-actions-github-script-action-to-v8.patch delete mode 100644 0006-chore-deps-update-peter-evans-create-or-update-comme.patch delete mode 100644 0007-reporting-fix-incorrect-converting-of-list-based-com.patch delete mode 100644 0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch delete mode 100644 0009-python-test-deps-update-pytest-requirements.patch delete mode 100644 0010-fix-reporting-use-single-quoting-when-converting-rem.patch delete mode 100644 0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch delete mode 100644 0012-Makefile-add-test_no_lint.patch delete mode 100644 0013-Bump-framework_version.patch delete mode 100644 0014-chore-deps-update-actions-checkout-action-to-v7.patch delete mode 100644 0015-chore-deps-update-actions-github-script-action-to-v9.patch delete mode 100644 0016-chore-deps-update-sclorg-testing-farm-as-github-acti.patch diff --git a/.gitignore b/.gitignore index daea59b..7a7156d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /leapp-0.19.0.tar.gz /leapp-0.20.0.tar.gz /leapp-0.21.0.tar.gz +/leapp-0.22.0.tar.gz diff --git a/0001-introduce-the-format_list-function.patch b/0001-introduce-the-format_list-function.patch deleted file mode 100644 index 5a1bb50..0000000 --- a/0001-introduce-the-format_list-function.patch +++ /dev/null @@ -1,194 +0,0 @@ -From d67332c2234e437113493bfdce37594c1e2ae417 Mon Sep 17 00:00:00 2001 -From: Petr Stodulka -Date: Wed, 3 Dec 2025 08:48:08 +0100 -Subject: [PATCH 01/10] introduce the format_list function - -The construction of report messages involving lists (e.g., package -names, file paths) lacked a consistent formatting which led to -inconsistencies and redefinitions when creating reports. - -This patch introduces the format_list function to provide a consistent -formatting option across all reports. The function is available from both -leapp.libraries.stdlib and leapp.reporting. It supports custom sorting, -item limits, and configurable separator. - -Jira-ref: RHEL-126447 ---- - docs/source/best-practices.md | 17 +++++++++++ - leapp/libraries/stdlib/__init__.py | 36 +++++++++++++++++++++-- - leapp/reporting/__init__.py | 5 +++- - packaging/leapp.spec | 2 +- - tests/scripts/test_format_list.py | 47 ++++++++++++++++++++++++++++++ - 5 files changed, 103 insertions(+), 4 deletions(-) - create mode 100644 tests/scripts/test_format_list.py - -diff --git a/docs/source/best-practices.md b/docs/source/best-practices.md -index 11f861a..913dcbd 100644 ---- a/docs/source/best-practices.md -+++ b/docs/source/best-practices.md -@@ -155,6 +155,23 @@ In case of [StopActorExecutionError](leapp.exceptions.StopActorExecutionError) t - - You can also use the [StopActorExecution](leapp.exceptions.StopActorExecution) and [StopActorExecutionError](leapp.exceptions.StopActorExecutionError) exceptions inside a private or shared library. - -+## Consistent list formatting in reports -+ -+When constructing report messages that include lists of items (e.g. package names, file paths), use the `format_list` function to ensure consistent formatting across all reports. The function is available from both `leapp.libraries.stdlib` and `leapp.reporting`. It supports custom sorting, item limits, and configurable separators. -+ -+```python -+from leapp.reporting import format_list -+ -+pkgs = ['kernel', 'bash', 'glibc'] -+msg = 'The following packages will be removed:{}'.format(format_list(pkgs)) -+ -+# Output: -+#The following packages will be removed: -+# - bash -+# - glibc -+# - kernel -+``` -+ - ## Use the LEAPP and LEAPP\_DEVEL prefixes for new envars - - In case you need to change a behaviour of actor(s) for testing or development purposes - e.g. be able to skip a functionality in your actor - use environment variables. Such environment variables should start with prefix *LEAPP\_DEVEL*. Such variables are not possible to use on production systems without special *LEAPP\_UNSUPPORTED* variable. This prevents users to break their systems by a mistake. -diff --git a/leapp/libraries/stdlib/__init__.py b/leapp/libraries/stdlib/__init__.py -index 89e59b2..efe2029 100644 ---- a/leapp/libraries/stdlib/__init__.py -+++ b/leapp/libraries/stdlib/__init__.py -@@ -8,12 +8,15 @@ import logging - import os - import sys - import uuid -+from itertools import islice - - from leapp.exceptions import LeappError --from leapp.utils.audit import create_audit_entry - from leapp.libraries.stdlib import api --from leapp.libraries.stdlib.call import _call, STDOUT -+from leapp.libraries.stdlib.call import STDOUT, _call - from leapp.libraries.stdlib.config import is_debug -+from leapp.utils.audit import create_audit_entry -+ -+FMT_LIST_SEPARATOR = '\n - ' - - - class CalledProcessError(LeappError): -@@ -214,3 +217,32 @@ def run(args, split=False, callback_raw=_console_logging_handler, callback_lineb - ) - api.current_logger().debug('External command has finished: {0}'.format(str(args))) - return result -+ -+ -+def format_list(data, sep=FMT_LIST_SEPARATOR, callback_sort=sorted, limit=0): -+ """ -+ Format an iterable into a string using a specified separator that is prepended to every item. -+ -+ This function can be used to consistently format lists in reports, logs, and error messages. -+ -+ :param data: Iterable of items to format. -+ :type data: Iterable -+ :param sep: Separator prepended to each item. Defaults to FMT_LIST_SEPARATOR. -+ :type sep: str -+ :param callback_sort: Callable returning a new list, called before the limit is applied. -+ Set to None to preserve original order. Defaults to sorted. -+ :type callback_sort: Callable or None -+ :param limit: Maximum number of items to include. Defaults to 0 (no limit). -+ :type limit: int -+ :returns: A string with each item prefixed by the specified separator. -+ :rtype: str -+ """ -+ items = data -+ if callback_sort is not None: -+ items = callback_sort(data) -+ -+ if limit > 0: -+ items = islice(items, limit) -+ -+ res = ['{}{}'.format(sep, item) for item in items] -+ return ''.join(res) -diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py -index 7a0e223..34af17a 100644 ---- a/leapp/reporting/__init__.py -+++ b/leapp/reporting/__init__.py -@@ -6,9 +6,12 @@ import os - import six - - from leapp.compat import string_types -+# NOTE(pstodulk): the format_list is imported to provide the function -+# also in this library. Its use is not planned here however. -+from leapp.libraries.stdlib import format_list -+from leapp.libraries.stdlib.api import produce - from leapp.models import fields, Model, ErrorModel - from leapp.topics import ReportTopic --from leapp.libraries.stdlib.api import produce - from leapp.utils.deprecation import deprecated - - -diff --git a/packaging/leapp.spec b/packaging/leapp.spec -index 1e32cf6..a06b141 100644 ---- a/packaging/leapp.spec -+++ b/packaging/leapp.spec -@@ -13,7 +13,7 @@ - # This is kind of help for more flexible development of leapp repository, - # so people do not have to wait for new official release of leapp to ensure - # it is installed/used the compatible one. --%global framework_version 6.2 -+%global framework_version 6.3 - - # IMPORTANT: everytime the requirements are changed, increment number by one - # - same for Provides in deps subpackage -diff --git a/tests/scripts/test_format_list.py b/tests/scripts/test_format_list.py -new file mode 100644 -index 0000000..1b0ca24 ---- /dev/null -+++ b/tests/scripts/test_format_list.py -@@ -0,0 +1,47 @@ -+import pytest -+ -+from leapp.libraries.stdlib import FMT_LIST_SEPARATOR, format_list -+ -+SEP = ', ' -+ -+ -+@pytest.mark.parametrize('data, kwargs, expected', [ -+ # Basic usage -+ ([], {}, ''), -+ (['c', 'a', 'b'], {}, '{0}a{0}b{0}c'.format(FMT_LIST_SEPARATOR)), -+ (['c', 'a', 'b'], {'sep': SEP}, ', a, b, c'), -+ (['a'], {'sep': SEP}, ', a'), -+ # Sorting -+ (['c', 'a', 'b'], {'sep': SEP, 'callback_sort': None}, ', c, a, b'), -+ (['c', 'a', 'b'], {'sep': SEP, 'callback_sort': lambda d: sorted(d, reverse=True)}, ', c, b, a'), -+ # Limit -+ (['c', 'a', 'b'], {'sep': SEP, 'limit': 2}, ', a, b'), -+ (['c', 'a', 'b'], {'sep': SEP, 'limit': 0}, ', a, b, c'), -+ (['b', 'a'], {'sep': SEP, 'limit': 10}, ', a, b'), -+ (['c', 'a', 'b'], {'sep': SEP, 'limit': -1}, ', a, b, c'), -+ # Non-list iterables -+ ({'a', 'b', 'c'}, {'sep': SEP, 'limit': 2}, ', a, b'), -+ (('a', 'b'), {'sep': SEP}, ', a, b'), -+ ({'b': 1, 'a': 2}, {'sep': SEP}, ', a, b'), -+ # Generators -+ ((x for x in ['c', 'a', 'b']), {'sep': SEP}, ', a, b, c'), -+ ((x for x in ['c', 'a', 'b']), {'sep': SEP, 'callback_sort': None, 'limit': 2}, ', c, a'), -+], ids=[ -+ 'empty_data', -+ 'single_item', -+ 'default_separator', -+ 'custom_separator', -+ 'no_sort', -+ 'reverse_sort', -+ 'limit', -+ 'limit_zero', -+ 'limit_larger_than_data', -+ 'negative_limit_ignored', -+ 'set_input', -+ 'tuple_input', -+ 'dict_keys_input', -+ 'generator_sorted', -+ 'generator_unsorted_with_limit', -+]) -+def test_format_list(data, kwargs, expected): -+ assert format_list(data, **kwargs) == expected --- -2.53.0 - diff --git a/0002-packit-remove-unsupported-upgrade-path-from-tests.patch b/0002-packit-remove-unsupported-upgrade-path-from-tests.patch deleted file mode 100644 index f497548..0000000 --- a/0002-packit-remove-unsupported-upgrade-path-from-tests.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 2f210e763a8b851f1804f518fb02466db9cb55fa Mon Sep 17 00:00:00 2001 -From: Peter Mocary -Date: Tue, 3 Mar 2026 16:30:31 +0100 -Subject: [PATCH 02/10] packit: remove unsupported upgrade path from tests - ---- - .packit.yaml | 31 ------------------------------- - 1 file changed, 31 deletions(-) - -diff --git a/.packit.yaml b/.packit.yaml -index 0566801..254b24b 100644 ---- a/.packit.yaml -+++ b/.packit.yaml -@@ -326,15 +326,6 @@ jobs: - provisioning: - tags: - BusinessUnit: sst_upgrades@leapp_upstream_test -- - &tmt-env-settings-centos9torhel101 -- tmt: -- context: &tmt-context-centos9torhel101 -- distro: "centos-9" -- distro_target: "rhel-10.1" -- settings: -- provisioning: -- tags: -- BusinessUnit: sst_upgrades@leapp_upstream_test - - &tmt-env-settings-98to102 - tmt: - context: &tmt-context-98to102 -@@ -521,28 +512,6 @@ jobs: - # ###################### CentOS Stream > RHEL ########################## # - # ###################################################################### # - --# ###################################################################### # --# ############################ 9 > 10.1 ################################ # --# ###################################################################### # -- --- &sanity-centos9torhel101 -- <<: *sanity-abstract-9to10 -- trigger: pull_request -- identifier: sanity-CentOS9toRHEL10.1 -- targets: -- epel-9-x86_64: -- distros: [CentOS-Stream-9] -- tf_extra_params: -- test: -- tmt: -- plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm' -- environments: -- - artifacts: *artifacts-for-rhel9 -- - *tmt-env-settings-centos9torhel101 -- env: &env-centos9to101 -- SOURCE_RELEASE: "9" -- TARGET_RELEASE: "10.1" -- - # ###################################################################### # - # ############################ 9 > 10.2 ################################ # - # ###################################################################### # --- -2.53.0 - diff --git a/0003-packit-add-new-upgrade-paths-to-tests.patch b/0003-packit-add-new-upgrade-paths-to-tests.patch deleted file mode 100644 index a2f140c..0000000 --- a/0003-packit-add-new-upgrade-paths-to-tests.patch +++ /dev/null @@ -1,300 +0,0 @@ -From 80c700223948b7a11af1b71c1ed81145662786ae Mon Sep 17 00:00:00 2001 -From: Peter Mocary -Date: Fri, 6 Mar 2026 17:56:10 +0100 -Subject: [PATCH 03/10] packit: add new upgrade paths to tests - -Adds the 8.10 -> 9.9 -> 10.3 upgrade paths to CI tests. ---- - .packit.yaml | 187 ++++++++++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 179 insertions(+), 8 deletions(-) - -diff --git a/.packit.yaml b/.packit.yaml -index 254b24b..cd45f27 100644 ---- a/.packit.yaml -+++ b/.packit.yaml -@@ -23,6 +23,7 @@ jobs: - get-current-version: - # get version from spec file instead from git tag - - bash -c "grep -m1 '^Version:' packaging/leapp.spec | grep -om1 '[0-9].[0-9.]**'" -+ - - job: copr_build - trigger: commit - metadata: -@@ -107,6 +108,15 @@ jobs: - provisioning: - tags: - BusinessUnit: sst_upgrades@leapp_upstream_test -+ - &tmt-env-settings-810to99 -+ tmt: -+ context: &tmt-context-810to99 -+ distro: "rhel-8.10" -+ distro_target: "rhel-9.9" -+ settings: -+ provisioning: -+ tags: -+ BusinessUnit: sst_upgrades@leapp_upstream_test - - - &sanity-abstract-8to9-aws - <<: *sanity-abstract-8to9 -@@ -188,7 +198,7 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm' -+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm' - environments: - - artifacts: *artifacts-for-rhel8 - - *tmt-env-settings-810to96 -@@ -217,7 +227,6 @@ jobs: - env: - <<: *env-810to96 - -- - # ###################################################################### # - # ############################# 8.10 > 9.8 ############################# # - # ###################################################################### # -@@ -268,13 +277,70 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true' -+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true' - environments: - - artifacts: *artifacts-for-rhel8 - - *tmt-env-settings-810to98 - env: - <<: *env-810to98 - -+# ###################################################################### # -+# ############################# 8.10 > 9.9 ############################# # -+# ###################################################################### # -+ -+- &sanity-810to99 -+ <<: *sanity-abstract-8to9 -+ trigger: pull_request -+ identifier: sanity-8.10to9.9 -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:8to9 & tag:tier0 & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel8 -+ - *tmt-env-settings-810to99 -+ env: &env-810to99 -+ SOURCE_RELEASE: "8.10" -+ TARGET_RELEASE: "9.9" -+ -+# On-demand minimal beaker tests -+- &beaker-minimal-810to99 -+ <<: *beaker-minimal-8to9-abstract-ondemand -+ trigger: pull_request -+ labels: -+ - beaker-minimal -+ - beaker-minimal-8.10to9.9 -+ - 8.10to9.9 -+ identifier: sanity-8.10to9.9-beaker-minimal-ondemand -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:8to9 & tag:partitioning & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel8 -+ - *tmt-env-settings-810to99 -+ env: -+ <<: *env-810to99 -+ -+# On-demand kernel-rt tests -+- &kernel-rt-810to99 -+ <<: *kernel-rt-abstract-8to9-ondemand -+ trigger: pull_request -+ labels: -+ - kernel-rt -+ - kernel-rt-8.10to9.9 -+ - 8.10to9.9 -+ identifier: sanity-8.10to9.9-kernel-rt-ondemand -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel8 -+ - *tmt-env-settings-810to99 -+ env: -+ <<: *env-810to99 -+ - # ###################################################################### # - # ############################## 9 TO 10 ################################ # - # ###################################################################### # -@@ -344,6 +410,24 @@ jobs: - provisioning: - tags: - BusinessUnit: sst_upgrades@leapp_upstream_test -+ - &tmt-env-settings-99to103 -+ tmt: -+ context: &tmt-context-99to103 -+ distro: "rhel-9.9" -+ distro_target: "rhel-10.3" -+ settings: -+ provisioning: -+ tags: -+ BusinessUnit: sst_upgrades@leapp_upstream_test -+ - &tmt-env-settings-centos9torhel103 -+ tmt: -+ context: &tmt-context-centos9torhel103 -+ distro: "centos-9" -+ distro_target: "rhel-10.3" -+ settings: -+ provisioning: -+ tags: -+ BusinessUnit: sst_upgrades@leapp_upstream_test - - - &sanity-abstract-9to10-aws - <<: *sanity-abstract-9to10 -@@ -412,7 +496,7 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:partitioning & enabled:true & tag:-rhsm' -+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true & tag:-rhsm' - environments: - - artifacts: *artifacts-for-rhel9 - - *tmt-env-settings-96to100 -@@ -431,7 +515,7 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm' -+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true & tag:-rhsm' - environments: - - artifacts: *artifacts-for-rhel9 - - *tmt-env-settings-96to100 -@@ -475,7 +559,7 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:partitioning & enabled:true & tag:-rhsm' -+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true & tag:-rhsm' - environments: - - artifacts: *artifacts-for-rhel9 - - *tmt-env-settings-98to102 -@@ -497,13 +581,79 @@ jobs: - tf_extra_params: - test: - tmt: -- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true & tag:-rhsm' -+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true & tag:-rhsm' - environments: - - artifacts: *artifacts-for-rhel9 - - *tmt-env-settings-98to102 - env: - <<: *env-98to102 - -+# ###################################################################### # -+# ############################# 9.9 > 10.3 ############################# # -+# ###################################################################### # -+ -+- &sanity-99to103 -+ <<: *sanity-abstract-9to10 -+ trigger: pull_request -+ identifier: sanity-9.9to10.3 -+ targets: -+ epel-9-x86_64: -+ distros: [RHEL-9.9.0-Nightly] -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:9to10 & tag:tier0 & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel9 -+ - *tmt-env-settings-99to103 -+ env: &env-99to103 -+ SOURCE_RELEASE: "9.9" -+ TARGET_RELEASE: "10.3" -+ -+# On-demand minimal beaker tests -+- &beaker-minimal-99to103 -+ <<: *beaker-minimal-9to10-abstract-ondemand -+ trigger: pull_request -+ labels: -+ - beaker-minimal -+ - beaker-minimal-9.9to10.3 -+ - 9.9to10.3 -+ identifier: sanity-9.9to10.3-beaker-minimal-ondemand -+ targets: -+ epel-9-x86_64: -+ distros: [RHEL-9.9-Nightly] -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:9to10 & tag:partitioning & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel9 -+ - *tmt-env-settings-99to103 -+ env: -+ <<: *env-99to103 -+ -+# On-demand kernel-rt tests -+- &kernel-rt-99to103 -+ <<: *kernel-rt-abstract-9to10-ondemand -+ trigger: pull_request -+ labels: -+ - kernel-rt -+ - kernel-rt-9.9to10.3 -+ - 9.9to10.3 -+ identifier: sanity-9.9to10.3-kernel-rt-ondemand -+ targets: -+ epel-9-x86_64: -+ distros: [RHEL-9.9-Nightly] -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:9to10 & tag:kernel-rt & enabled:true' -+ environments: -+ - artifacts: *artifacts-for-rhel9 -+ - *tmt-env-settings-99to103 -+ env: -+ <<: *env-99to103 -+ - # ###################################################################### # - # ########################## CentOS Stream ############################# # - # ###################################################################### # -@@ -527,7 +677,6 @@ jobs: - test: - tmt: - plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm' -- name: - environments: - - artifacts: *artifacts-for-rhel9 - - *tmt-env-settings-centos9torhel102 -@@ -535,6 +684,28 @@ jobs: - SOURCE_RELEASE: "9" - TARGET_RELEASE: "10.2" - -+# ###################################################################### # -+# ############################ 9 > 10.3 ################################ # -+# ###################################################################### # -+ -+- &sanity-centos9torhel103 -+ <<: *sanity-abstract-9to10 -+ trigger: pull_request -+ identifier: sanity-CentOS9toRHEL10.3 -+ targets: -+ epel-9-x86_64: -+ distros: [CentOS-Stream-9] -+ tf_extra_params: -+ test: -+ tmt: -+ plan_filter: 'tag:9to10 & tag:tier0 & enabled:true & tag:-rhsm' -+ environments: -+ - artifacts: *artifacts-for-rhel9 -+ - *tmt-env-settings-centos9torhel103 -+ env: &env-centos9torhel103 -+ SOURCE_RELEASE: "9" -+ TARGET_RELEASE: "10.3" -+ - # ###################################################################### # - # ################## CentOS Stream > CentOS Stream ##################### # - # ###################################################################### # --- -2.53.0 - diff --git a/0004-chore-deps-update-actions-checkout-action-to-v6.patch b/0004-chore-deps-update-actions-checkout-action-to-v6.patch deleted file mode 100644 index af91ea2..0000000 --- a/0004-chore-deps-update-actions-checkout-action-to-v6.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 136ed3baac103bfb0945d74703c7b7a05f40d8bd Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Thu, 5 Mar 2026 09:51:22 +0000 -Subject: [PATCH 04/10] chore(deps): update actions/checkout action to v6 - ---- - .github/workflows/reuse-copr-build.yml | 4 ++-- - .github/workflows/unit-tests.yml | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml -index c2fb51c..5e33fe3 100644 ---- a/.github/workflows/reuse-copr-build.yml -+++ b/.github/workflows/reuse-copr-build.yml -@@ -49,7 +49,7 @@ jobs: - # TODO: The correct way to checkout would be to use simmilar approach as in get_commit_by_timestamp function of - # the github gluetool module (i.e. do not use HEAD but the last commit before comment). - id: checkout -- uses: actions/checkout@v5 -+ uses: actions/checkout@v6 - with: - ref: "refs/pull/${{ steps.pr_nr.outputs.pr_nr }}/head" - -@@ -121,7 +121,7 @@ jobs: - - name: Checkout leapp-repository - id: checkout_leapp_repository - if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }} -- uses: actions/checkout@v5 -+ uses: actions/checkout@v6 - with: - repository: "oamg/leapp-repository" - ref: "refs/pull/${{ steps.leapp_repository_pr.outputs.leapp_repository_pr }}/head" -diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml -index 70d624d..906a45d 100644 ---- a/.github/workflows/unit-tests.yml -+++ b/.github/workflows/unit-tests.yml -@@ -36,7 +36,7 @@ jobs: - - steps: - - name: Checkout code -- uses: actions/checkout@v5 -+ uses: actions/checkout@v6 - with: - fetch-depth: '0' - - name: Set main to origin/main --- -2.53.0 - diff --git a/0005-chore-deps-update-actions-github-script-action-to-v8.patch b/0005-chore-deps-update-actions-github-script-action-to-v8.patch deleted file mode 100644 index 64b3b19..0000000 --- a/0005-chore-deps-update-actions-github-script-action-to-v8.patch +++ /dev/null @@ -1,34 +0,0 @@ -From dc9e1c60e5cc84abf1b5df0972072f7795bc860c Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Thu, 5 Mar 2026 09:51:26 +0000 -Subject: [PATCH 05/10] chore(deps): update actions/github-script action to v8 - ---- - .github/workflows/reuse-copr-build.yml | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml -index 5e33fe3..0f6b823 100644 ---- a/.github/workflows/reuse-copr-build.yml -+++ b/.github/workflows/reuse-copr-build.yml -@@ -102,7 +102,7 @@ jobs: - - name: Add comment with copr build url - # TODO: Create comment when copr build fails. - id: link_copr -- uses: actions/github-script@v7 -+ uses: actions/github-script@v8 - with: - script: | - github.issues.createComment({ -@@ -160,7 +160,7 @@ jobs: - # TODO: Create comment when copr build fails. - id: link_copr_leapp_repository - if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }} -- uses: actions/github-script@v7 -+ uses: actions/github-script@v8 - with: - script: | - github.issues.createComment({ --- -2.53.0 - diff --git a/0006-chore-deps-update-peter-evans-create-or-update-comme.patch b/0006-chore-deps-update-peter-evans-create-or-update-comme.patch deleted file mode 100644 index abf6cad..0000000 --- a/0006-chore-deps-update-peter-evans-create-or-update-comme.patch +++ /dev/null @@ -1,26 +0,0 @@ -From a2cbc6e98539926dc25862172b89a5585562009b Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Thu, 5 Mar 2026 09:51:28 +0000 -Subject: [PATCH 06/10] chore(deps): update - peter-evans/create-or-update-comment action to v5 - ---- - .github/workflows/pr-welcome-msg.yml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/.github/workflows/pr-welcome-msg.yml b/.github/workflows/pr-welcome-msg.yml -index 66d001e..5d9fc3e 100644 ---- a/.github/workflows/pr-welcome-msg.yml -+++ b/.github/workflows/pr-welcome-msg.yml -@@ -14,7 +14,7 @@ jobs: - runs-on: ubuntu-latest - steps: - - name: Create comment -- uses: peter-evans/create-or-update-comment@v4 -+ uses: peter-evans/create-or-update-comment@v5 - with: - issue-number: ${{ github.event.pull_request.number }} - body: | --- -2.53.0 - diff --git a/0007-reporting-fix-incorrect-converting-of-list-based-com.patch b/0007-reporting-fix-incorrect-converting-of-list-based-com.patch deleted file mode 100644 index b239f7e..0000000 --- a/0007-reporting-fix-incorrect-converting-of-list-based-com.patch +++ /dev/null @@ -1,157 +0,0 @@ -From 9fbd48b20f556cb613f3ca7999f4fc9d74e24024 Mon Sep 17 00:00:00 2001 -From: Peter Mocary -Date: Tue, 17 Mar 2026 12:22:35 +0100 -Subject: [PATCH 07/10] reporting: fix incorrect converting of list based - commands - -The reporting module handled conversion between shell command -representations for the text and json reports incorrectly. The list of -strings representation was converted without preserving the argument -separation correctly which results in malformed commands in the text -report. - -This patch utilizes the built-in shlex Python library for the conversion -which preserves the argument separation by wrapping arguments in quotes -when necessary. - -Jira: RHEL-156521 ---- - leapp/reporting/__init__.py | 9 +++-- - packaging/leapp.spec | 2 +- - tests/scripts/test_reporting.py | 61 +++++++++++++++++++++++++++++++-- - 3 files changed, 66 insertions(+), 6 deletions(-) - -diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py -index 34af17a..ca2b80b 100644 ---- a/leapp/reporting/__init__.py -+++ b/leapp/reporting/__init__.py -@@ -1,8 +1,9 @@ - import datetime --import json - import hashlib -+import json - import logging - import os -+import shlex - import six - - from leapp.compat import string_types -@@ -10,7 +11,7 @@ from leapp.compat import string_types - # also in this library. Its use is not planned here however. - from leapp.libraries.stdlib import format_list - from leapp.libraries.stdlib.api import produce --from leapp.models import fields, Model, ErrorModel -+from leapp.models import ErrorModel, Model, fields - from leapp.topics import ReportTopic - from leapp.utils.deprecation import deprecated - -@@ -281,8 +282,10 @@ class RemediationCommand(BaseRemediation): - def __repr__(self): - # NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly. - # As per python practices repr has to return an encoded string -+ # Note(pmocary) Using shlex.join is not possible here due to it being available from Python 3.8, -+ # thus we use the shlex.quote on each argument instead which is the same as shlex.join implementation. - return "[{}] {}".format(self._value['type'], -- ' '.join([_guarantee_encoded_str(c) for c in self._value['context']])) -+ ' '.join([shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']])) - - - class RemediationHint(BaseRemediation): -diff --git a/packaging/leapp.spec b/packaging/leapp.spec -index a06b141..ba906cf 100644 ---- a/packaging/leapp.spec -+++ b/packaging/leapp.spec -@@ -13,7 +13,7 @@ - # This is kind of help for more flexible development of leapp repository, - # so people do not have to wait for new official release of leapp to ensure - # it is installed/used the compatible one. --%global framework_version 6.3 -+%global framework_version 6.4 - - # IMPORTANT: everytime the requirements are changed, increment number by one - # - same for Provides in deps subpackage -diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py -index 2b0f245..8c284cb 100644 ---- a/tests/scripts/test_reporting.py -+++ b/tests/scripts/test_reporting.py -@@ -14,11 +14,10 @@ from leapp.reporting import ( - create_report_from_deprecation, - create_report_from_error, - _create_report_object, -- Audience, Flags, Groups, Key, RelatedResource, Remediation, Summary, Severity, Tags, Title -+ Audience, Flags, Groups, Key, RelatedResource, Remediation, RemediationCommand, Summary, Severity, Tags, Title - ) - from leapp.utils.report import generate_report_file - -- - ReportPrimitive = namedtuple('ReportPrimitive', ['data', 'path', 'value', 'is_leaf_list']) - - leaf_is_dict = ReportPrimitive({}, ('summary',), 'We better fix this!', False) -@@ -103,6 +102,64 @@ def test_report_tags_and_flags(): - assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"] - - -+@pytest.mark.parametrize('command, expected_command_form', [ -+ (['cmd'], "cmd"), -+ (['cmd', ''], "cmd ''"), -+ (['cmd', 'not_quoted'], "cmd not_quoted"), -+ (['ls', '-la', '/home/user'], "ls -la /home/user"), -+ -+ # Quoting ' ' -+ (['cmd', 'is quoted'], "cmd 'is quoted'"), -+ (['mv', '/home/user/test file', '/home/user/test_file'], "mv '/home/user/test file' /home/user/test_file"), -+ -+ # Quoting '$' -+ # Note: Execution of the first command would fail, but it is the correct conversion. -+ # The second test case should be used to utilize the shell expansion. -+ (['chsh', '-s', '$(which zsh)', '$USER'], "chsh -s '$(which zsh)' '$USER'"), -+ (['bash', '-c', 'chsh -s $(which zsh) $USER'], "bash -c 'chsh -s $(which zsh) $USER'"), -+ -+ # Quoting '\' -+ (['echo', '\\'], "echo '\\'"), -+ (['sed', '-i', 's/\\t/ /g', 'file.txt'], "sed -i 's/\\t/ /g' file.txt"), -+ -+ # Quoting '"' -+ (['echo', '"'], "echo '\"'"), -+ (['grep', 'key="value"', 'file.txt'], "grep 'key=\"value\"' file.txt"), -+ -+ # Quoting '`' -+ (['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"), -+]) -+def test_remediation_command_repr_quoting(command, expected_command_form): -+ """Test that RemediationCommand.__repr__ properly quotes arguments with special characters.""" -+ remediation_command = RemediationCommand(value=command) -+ assert repr(remediation_command) == f'[command] {expected_command_form}' -+ -+ -+@pytest.mark.parametrize("report_suffix", ('.json', '.txt')) -+def test_remediation_command_in_report(report_suffix): -+ """Test that commands with spaces in arguments are preserved correctly in reports.""" -+ remediation_command_as_list = ["mv", "file with spaces.txt", "file_without_spaces.txt"] -+ remediation_command_as_string = "mv 'file with spaces.txt' file_without_spaces.txt" -+ -+ report_entries = [Title('Test title'), Summary('Test summary'), Audience('sysadmin')] -+ remediation = Remediation(commands=[remediation_command_as_list]) -+ report_entries.append(remediation) -+ -+ report_message = _create_report_object(report_entries).report -+ -+ with tempfile.NamedTemporaryFile(suffix=report_suffix) as reportfile: -+ generate_report_file([report_message], 'leapp-run-id', reportfile.name) -+ with open(reportfile.name) as f: -+ content = f.read() -+ if report_suffix == '.txt': -+ assert remediation_command_as_string in content -+ else: -+ report_data = json.loads(content) -+ remediations = report_data['entries'][0]['detail']['remediations'] -+ cmd_entry = [r for r in remediations if r['type'] == 'command'][0] -+ assert cmd_entry['context'] == remediation_command_as_list -+ -+ - @pytest.mark.parametrize("report_suffix", ('.json', '.txt')) - def test_remediation_with_non_ascii_value(report_suffix): - report_entries = [Title('Some report title'), Summary('Some summary not used for dynamical key generation'), --- -2.53.0 - diff --git a/0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch b/0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch deleted file mode 100644 index c816e4b..0000000 --- a/0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch +++ /dev/null @@ -1,171 +0,0 @@ -From ad50bb2bdcc8a4b734c82f9d190dfe8c1611903a Mon Sep 17 00:00:00 2001 -From: Peter Mocary -Date: Wed, 25 Mar 2026 19:20:22 +0100 -Subject: [PATCH 08/10] fixup! reporting: fix incorrect converting of list - based commands - ---- - leapp/reporting/__init__.py | 34 ++++++++++++++++--- - tests/scripts/test_reporting.py | 60 ++++++++++++++++++++++++++++++--- - 2 files changed, 86 insertions(+), 8 deletions(-) - -diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py -index ca2b80b..6bd0b49 100644 ---- a/leapp/reporting/__init__.py -+++ b/leapp/reporting/__init__.py -@@ -4,9 +4,11 @@ import json - import logging - import os - import shlex -+ - import six - - from leapp.compat import string_types -+ - # NOTE(pstodulk): the format_list is imported to provide the function - # also in this library. Its use is not planned here however. - from leapp.libraries.stdlib import format_list -@@ -273,6 +275,32 @@ def _guarantee_decoded_str(text, encoding='utf-8'): - return text - - -+def _quote_for_shell(s): -+ """ -+ Quote a string for shell usage as a literal. -+ -+ This function quotes the given string in single-quotes using the -+ shlex.quote. However, when the single-quote is present in the string it -+ instead uses double-quotes, resulting in cleaner output (e.g. "don't" -+ instead of 'don'"'"'t' that would be produced by shlex.quote). -+ -+ :param str s: String to quote for shell usage -+ :return str: Quoted string safe for shell usage -+ """ -+ -+ if "'" not in s: -+ return shlex.quote(s) -+ -+ # The string contains a single-quote, use double-quote style instead. -+ # Escape following characters to make it literal: \ " $ ` ! -+ escaped = (s.replace('\\', '\\\\') -+ .replace('"', '\\"') -+ .replace('$', '\\$') -+ .replace('`', '\\`') -+ .replace('!', '\\!')) -+ return '"{}"'.format(escaped) -+ -+ - class RemediationCommand(BaseRemediation): - def __init__(self, value=None): - if not isinstance(value, list): -@@ -282,10 +310,8 @@ class RemediationCommand(BaseRemediation): - def __repr__(self): - # NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly. - # As per python practices repr has to return an encoded string -- # Note(pmocary) Using shlex.join is not possible here due to it being available from Python 3.8, -- # thus we use the shlex.quote on each argument instead which is the same as shlex.join implementation. -- return "[{}] {}".format(self._value['type'], -- ' '.join([shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']])) -+ quoted_command_args = [_quote_for_shell(_guarantee_encoded_str(c)) for c in self._value['context']] -+ return "[{}] {}".format(self._value['type'], ' '.join(quoted_command_args)) - - - class RemediationHint(BaseRemediation): -diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py -index 8c284cb..2a4e724 100644 ---- a/tests/scripts/test_reporting.py -+++ b/tests/scripts/test_reporting.py -@@ -1,20 +1,31 @@ - # -*- coding: utf-8 -*- --from collections import namedtuple - import datetime - import json - import os - import tempfile -+from collections import namedtuple - - import jsonschema - import pytest - - from leapp.reporting import ( -- _add_to_dict, - _DEPRECATION_SEVERITY_THRESHOLD, -+ Audience, -+ Flags, -+ Groups, -+ Key, -+ RelatedResource, -+ Remediation, -+ RemediationCommand, -+ Severity, -+ Summary, -+ Tags, -+ Title, -+ _add_to_dict, -+ _create_report_object, -+ _quote_for_shell, - create_report_from_deprecation, - create_report_from_error, -- _create_report_object, -- Audience, Flags, Groups, Key, RelatedResource, Remediation, RemediationCommand, Summary, Severity, Tags, Title - ) - from leapp.utils.report import generate_report_file - -@@ -102,6 +113,40 @@ def test_report_tags_and_flags(): - assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"] - - -+@pytest.mark.parametrize('string, expected_quoted', [ -+ # No quoting needed -+ ('path/to_the/file-name.txt', 'path/to_the/file-name.txt'), -+ ('user@host', 'user@host'), -+ ('value=123', 'value=123'), -+ ('a:b:c', 'a:b:c'), -+ ('99%', '99%'), -+ ('a+b', 'a+b'), -+ -+ # Single-quote style (no single quote in string) -+ ('', "''"), -+ ('file with spaces.txt', "'file with spaces.txt'"), -+ ('$(whoami)', "'$(whoami)'"), -+ ('$USER', "'$USER'"), -+ ('back`tick', "'back`tick'"), -+ ('double"quote', "'double\"quote'"), -+ ('exclaim!', "'exclaim!'"), -+ ('back\\slash', "'back\\slash'"), -+ ('new\nline', "'new\nline'"), -+ ('key="value"', "'key=\"value\"'"), -+ -+ # Double-quote style (a single quote in string) -+ ("It's fine", "\"It's fine\""), -+ ("It's `whoami`", "\"It's \\`whoami\\`\""), -+ ("User's home: $HOME", "\"User's home: \\$HOME\""), -+ ("Don't panic!", "\"Don't panic\\!\""), -+ ("s/'/\"/g", "\"s/'/\\\"/g\""), -+ ("sed -i 's/'/\"/g' file.txt", "\"sed -i 's/'/\\\"/g' file.txt\""), -+]) -+def test_quote_for_shell(string, expected_quoted): -+ """Test that _quote_for_shell properly quotes strings for shell usage.""" -+ assert _quote_for_shell(string) == expected_quoted -+ -+ - @pytest.mark.parametrize('command, expected_command_form', [ - (['cmd'], "cmd"), - (['cmd', ''], "cmd ''"), -@@ -128,6 +173,13 @@ def test_report_tags_and_flags(): - - # Quoting '`' - (['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"), -+ -+ # Double-quote style when single quote is present -+ (['echo', "It's fine"], "echo \"It's fine\""), -+ (['mv', "user's file.txt", 'newfile.txt'], "mv \"user's file.txt\" newfile.txt"), -+ (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i \"s/'/\\\"/g\" file.txt"), -+ (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c \"echo \\\"user's home: \\$HOME\\\"\""), -+ (['grep', "can't find", '/var/log/some report.log'], "grep \"can't find\" '/var/log/some report.log'"), - ]) - def test_remediation_command_repr_quoting(command, expected_command_form): - """Test that RemediationCommand.__repr__ properly quotes arguments with special characters.""" --- -2.53.0 - diff --git a/0009-python-test-deps-update-pytest-requirements.patch b/0009-python-test-deps-update-pytest-requirements.patch deleted file mode 100644 index ec07ad9..0000000 --- a/0009-python-test-deps-update-pytest-requirements.patch +++ /dev/null @@ -1,37 +0,0 @@ -From bf931901cdc18275aed2023e5c37da0e246ae8a7 Mon Sep 17 00:00:00 2001 -From: Petr Stodulka -Date: Tue, 14 Apr 2026 14:21:39 +0200 -Subject: [PATCH 09/10] python test deps: update pytest requirements - -Originally we required pytest v6.2.5 for any python. This is -pretty old requirement coming from time of python ~ 3.8 and recently -a CVE-2025-71176 occuared, which is fix in pytest v9.0.3. -So let's update ranges to actually allow use of newer pytest on newer -systems: - - +----------------+---------------+ - | pytest version | python range | - +----------------+---------------+ - | 6.2.5 | 3.7- | - | 7.4.4 | 3.8.x - 3.9.x | - | 9.0.3 | 3.10+ | - +----------------+---------------+ ---- - requirements-tests.txt | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/requirements-tests.txt b/requirements-tests.txt -index d4501f2..5859a2a 100644 ---- a/requirements-tests.txt -+++ b/requirements-tests.txt -@@ -7,4 +7,6 @@ jsonschema==3.2.0 - mock - pylint - pytest-cov --pytest==6.2.5 -+pytest==6.2.5; python_version < '3.8' -+pytest==7.4.4; python_version >= '3.8' and python_version < '3.10' -+pytest==9.0.3; python_version >= '3.10' --- -2.53.0 - diff --git a/0010-fix-reporting-use-single-quoting-when-converting-rem.patch b/0010-fix-reporting-use-single-quoting-when-converting-rem.patch deleted file mode 100644 index de6972e..0000000 --- a/0010-fix-reporting-use-single-quoting-when-converting-rem.patch +++ /dev/null @@ -1,173 +0,0 @@ -From eaf4af1a549b3cb675f49f03d46d9d5de362753f Mon Sep 17 00:00:00 2001 -From: Peter Mocary -Date: Fri, 10 Apr 2026 21:51:42 +0200 -Subject: [PATCH 10/10] fix(reporting): use single quoting when converting - remediation commands - -The remediation commands are provided as a list of arguments that is -used in leapp-report.json. The same command is also converted to a -string that is used in leapp-report.txt and can be copy-pasted by the -user into shell. - -Originally, the command conversion tried to make the resulting commands -prettier by enabling double quoting whenever there was a single quote in -an argument, while still trying to make the double quoted argument a -literal. This proved to be problematic approach due to multiple cases -that resulted with incorrect commands. Namely, when the command called -`bash -c` with a subcommand that would be evaluated by another -non-interactive shell, or when there was an exclamation mark that would -have different meaning in non-interactive and interactive shell and its -escaping was not possible unless single-quotes are used. - -This patch makes the command conversion produce pretty commands in the -most cases, moreover, it makes sure the command is always correct (if -the list version is correct to begin with). This approach leaves -possibility to encounter unintuitive escaping in the resulting converted -command, although this can be prevented by carefully crafting the -command when creating the report. - -Note that if there is a subcommand called in the converted command, the -report creator is responsible for its form and for the best resulting -command it should favor the double quoting of its arguments when -possible. ---- - leapp/reporting/__init__.py | 28 +------------------ - packaging/leapp.spec | 2 +- - tests/scripts/test_reporting.py | 48 +++++---------------------------- - 3 files changed, 9 insertions(+), 69 deletions(-) - -diff --git a/leapp/reporting/__init__.py b/leapp/reporting/__init__.py -index 6bd0b49..43aa17d 100644 ---- a/leapp/reporting/__init__.py -+++ b/leapp/reporting/__init__.py -@@ -275,32 +275,6 @@ def _guarantee_decoded_str(text, encoding='utf-8'): - return text - - --def _quote_for_shell(s): -- """ -- Quote a string for shell usage as a literal. -- -- This function quotes the given string in single-quotes using the -- shlex.quote. However, when the single-quote is present in the string it -- instead uses double-quotes, resulting in cleaner output (e.g. "don't" -- instead of 'don'"'"'t' that would be produced by shlex.quote). -- -- :param str s: String to quote for shell usage -- :return str: Quoted string safe for shell usage -- """ -- -- if "'" not in s: -- return shlex.quote(s) -- -- # The string contains a single-quote, use double-quote style instead. -- # Escape following characters to make it literal: \ " $ ` ! -- escaped = (s.replace('\\', '\\\\') -- .replace('"', '\\"') -- .replace('$', '\\$') -- .replace('`', '\\`') -- .replace('!', '\\!')) -- return '"{}"'.format(escaped) -- -- - class RemediationCommand(BaseRemediation): - def __init__(self, value=None): - if not isinstance(value, list): -@@ -310,7 +284,7 @@ class RemediationCommand(BaseRemediation): - def __repr__(self): - # NOTE(ivasilev) As the message can contain non-ascii characters let's deal with it properly. - # As per python practices repr has to return an encoded string -- quoted_command_args = [_quote_for_shell(_guarantee_encoded_str(c)) for c in self._value['context']] -+ quoted_command_args = [shlex.quote(_guarantee_encoded_str(c)) for c in self._value['context']] - return "[{}] {}".format(self._value['type'], ' '.join(quoted_command_args)) - - -diff --git a/packaging/leapp.spec b/packaging/leapp.spec -index ba906cf..0fde883 100644 ---- a/packaging/leapp.spec -+++ b/packaging/leapp.spec -@@ -13,7 +13,7 @@ - # This is kind of help for more flexible development of leapp repository, - # so people do not have to wait for new official release of leapp to ensure - # it is installed/used the compatible one. --%global framework_version 6.4 -+%global framework_version 6.5 - - # IMPORTANT: everytime the requirements are changed, increment number by one - # - same for Provides in deps subpackage -diff --git a/tests/scripts/test_reporting.py b/tests/scripts/test_reporting.py -index 2a4e724..2010d29 100644 ---- a/tests/scripts/test_reporting.py -+++ b/tests/scripts/test_reporting.py -@@ -23,7 +23,6 @@ from leapp.reporting import ( - Title, - _add_to_dict, - _create_report_object, -- _quote_for_shell, - create_report_from_deprecation, - create_report_from_error, - ) -@@ -113,40 +112,6 @@ def test_report_tags_and_flags(): - assert Flags(["This is a new flag", Groups.INHIBITOR]).value == ["This is a new flag", "inhibitor"] - - --@pytest.mark.parametrize('string, expected_quoted', [ -- # No quoting needed -- ('path/to_the/file-name.txt', 'path/to_the/file-name.txt'), -- ('user@host', 'user@host'), -- ('value=123', 'value=123'), -- ('a:b:c', 'a:b:c'), -- ('99%', '99%'), -- ('a+b', 'a+b'), -- -- # Single-quote style (no single quote in string) -- ('', "''"), -- ('file with spaces.txt', "'file with spaces.txt'"), -- ('$(whoami)', "'$(whoami)'"), -- ('$USER', "'$USER'"), -- ('back`tick', "'back`tick'"), -- ('double"quote', "'double\"quote'"), -- ('exclaim!', "'exclaim!'"), -- ('back\\slash', "'back\\slash'"), -- ('new\nline', "'new\nline'"), -- ('key="value"', "'key=\"value\"'"), -- -- # Double-quote style (a single quote in string) -- ("It's fine", "\"It's fine\""), -- ("It's `whoami`", "\"It's \\`whoami\\`\""), -- ("User's home: $HOME", "\"User's home: \\$HOME\""), -- ("Don't panic!", "\"Don't panic\\!\""), -- ("s/'/\"/g", "\"s/'/\\\"/g\""), -- ("sed -i 's/'/\"/g' file.txt", "\"sed -i 's/'/\\\"/g' file.txt\""), --]) --def test_quote_for_shell(string, expected_quoted): -- """Test that _quote_for_shell properly quotes strings for shell usage.""" -- assert _quote_for_shell(string) == expected_quoted -- -- - @pytest.mark.parametrize('command, expected_command_form', [ - (['cmd'], "cmd"), - (['cmd', ''], "cmd ''"), -@@ -174,12 +139,13 @@ def test_quote_for_shell(string, expected_quoted): - # Quoting '`' - (['usermod', '-aG', 'wheel', '`whoami`'], "usermod -aG wheel '`whoami`'"), - -- # Double-quote style when single quote is present -- (['echo', "It's fine"], "echo \"It's fine\""), -- (['mv', "user's file.txt", 'newfile.txt'], "mv \"user's file.txt\" newfile.txt"), -- (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i \"s/'/\\\"/g\" file.txt"), -- (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c \"echo \\\"user's home: \\$HOME\\\"\""), -- (['grep', "can't find", '/var/log/some report.log'], "grep \"can't find\" '/var/log/some report.log'"), -+ # Single quote in argument — shlex.quote uses the '"'"' pattern -+ (['echo', "It's fine"], "echo 'It'\"'\"'s fine'"), -+ (['mv', "user's file.txt", 'newfile.txt'], "mv 'user'\"'\"'s file.txt' newfile.txt"), -+ (['sed', '-i', "s/'/\"/g", 'file.txt'], "sed -i 's/'\"'\"'/\"/g' file.txt"), -+ (['bash', '-c', "echo \"user's home: $HOME\""], "bash -c 'echo \"user'\"'\"'s home: $HOME\"'"), -+ (['grep', "can't find", '/var/log/some report.log'], "grep 'can'\"'\"'t find' '/var/log/some report.log'"), -+ (['echo', "Don't panic!"], "echo 'Don'\"'\"'t panic!'"), - ]) - def test_remediation_command_repr_quoting(command, expected_command_form): - """Test that RemediationCommand.__repr__ properly quotes arguments with special characters.""" --- -2.53.0 - diff --git a/0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch b/0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch deleted file mode 100644 index 9792a80..0000000 --- a/0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch +++ /dev/null @@ -1,226 +0,0 @@ -From 66883ef34b1e241838b9812a8920bf6f6fb380e0 Mon Sep 17 00:00:00 2001 -From: Matej Matuska -Date: Wed, 20 May 2026 12:32:48 +0200 -Subject: [PATCH 11/16] Fix exception in normalize_schemas for conflicting - actor config schemas - -The normalize_schemas function incorrectly raises an exception when a -config schema (subclass of Config) is contained more than once in it's -input, regardless of whether it's a conflicting (same section and name, -but a difference in other members) or the same (same section and name). -Traceback: - -Traceback (most recent call last): - File "/usr/bin/leapp", line 33, in - sys.exit(load_entry_point('leapp==0.21.0', 'console_scripts', 'leapp')()) - File "/usr/lib/python3.9/site-packages/leapp/cli/__init__.py", line 51, in main - cli.command.execute('leapp version {}'.format(VERSION)) - File "/usr/lib/python3.9/site-packages/leapp/utils/clicmd.py", line 111, in execute - args.func(args) - File "/usr/lib/python3.9/site-packages/leapp/utils/clicmd.py", line 133, in called - self.target(args) - File "/usr/lib/python3.9/site-packages/leapp/cli/commands/upgrade/breadcrumbs.py", line 169, in wrapper - return f(*args, breadcrumbs=breadcrumbs, **kwargs) - File "/usr/lib/python3.9/site-packages/leapp/cli/commands/preupgrade/__init__.py", line 86, in preupgrade - command_utils.load_actor_configs_and_store_it_in_db(context, repositories, cfg) - File "/usr/lib/python3.9/site-packages/leapp/cli/commands/command_utils.py", line 291, in load_actor_configs_and_store_it_in_db - actor_config_schemas = actor_config.normalize_schemas(actor_config_schemas) - File "/usr/lib/python3.9/site-packages/leapp/actors/config.py", line 180, in normalize_schemas - if unique_name in added_fields and added_fields[unique_name] != field: -TypeError: 'set' object is not subscriptable - -The added_fields variable is a set. The condition for checking conflicts -attempts to do indexing on the set, which is not possible in Python sets -and results in a TypeError. - -This patch removes the set altogether since it doesn't bring any -advantage over just using the normalized_schemas dict. - -Also add unit tests for the function. ---- - leapp/actors/config.py | 40 +++++----- - tests/scripts/test_actor_config.py | 114 +++++++++++++++++++++++++++++ - 2 files changed, 136 insertions(+), 18 deletions(-) - create mode 100644 tests/scripts/test_actor_config.py - -diff --git a/leapp/actors/config.py b/leapp/actors/config.py -index 55775d5..d952bb6 100644 ---- a/leapp/actors/config.py -+++ b/leapp/actors/config.py -@@ -169,31 +169,35 @@ def _get_config(config_dir='/etc/leapp/actor_conf.d'): - def normalize_schemas(schemas): - """ - Merge all schemas into a single dictionary and validate them for errors we can detect. -+ -+ :param schemas: List of schemas to normalize -+ :type schemas: Iterable[Iterable[Type[Config]]] -+ :return A dictionary with structure: section -> name -> Config -+ :rtype: DefaultDict[str, Dict[str, Type[Config]]] - """ -- added_fields = set() - normalized_schema = defaultdict(dict) - for schema in schemas: - for field in schema: -- unique_name = (field.section, field.name) -- -+ # section and name are the unique key for a config -+ existing_field = normalized_schema[field.section].get(field.name, None) - # Error if the field has been added by another schema -- if unique_name in added_fields and added_fields[unique_name] != field: -- # TODO: Also include information on what Actor contains the -- # conflicting fields but that information isn't passed into -- # this function right now. -- message = ('Two actors added incompatible configuration items' -- ' with the same name for Section: {section},' -- ' Field: {field}'.format(section=field.section, -- field=field.name)) -- log.error(message) -- raise SchemaError(message) -+ if existing_field: -+ if existing_field != field: -+ # TODO: Also include information on what Actor contains the -+ # conflicting fields but that information isn't passed into -+ # this function right now. -+ message = ( -+ 'Two actors added incompatible configuration items with' -+ ' the same name for Section: {section}, Field: {field}' -+ ).format(section=field.section, field=field.name) - -- # TODO: More validation here. -+ log.error(message) -+ raise SchemaError(message) - -- # Store the fields from the schema in a way that we can easily look -- # up while validating -- added_fields.add(unique_name) -- normalized_schema[field.section][field.name] = field -+ # TODO: More validation here. -+ -+ else: -+ normalized_schema[field.section][field.name] = field - - return normalized_schema - -diff --git a/tests/scripts/test_actor_config.py b/tests/scripts/test_actor_config.py -new file mode 100644 -index 0000000..b8c02cd ---- /dev/null -+++ b/tests/scripts/test_actor_config.py -@@ -0,0 +1,114 @@ -+from collections import defaultdict -+import pytest -+ -+from leapp.actors.config import Config, SchemaError, normalize_schemas -+from leapp.models import fields -+ -+ -+class _TestConfigA(Config): -+ section = "test" -+ name = "a_setting" -+ type_ = fields.String() -+ description = 'Description here' -+ default = "default value" -+ -+ -+class _TestConfigB(Config): -+ section = "other_section" -+ name = "other_setting" -+ type_ = fields.String() -+ description = 'Description here' -+ default = "some default value" -+ -+ -+# conflicts in default -+class _TestConfigConflictsInDefault(Config): -+ section = "test" -+ name = "a_setting" -+ type_ = fields.String() -+ description = 'Description here' -+ default = "different than in A" -+ -+ -+# conflicts in type_ -+class _TestConfigConflictsInType(Config): -+ section = "test" -+ name = "a_setting" -+ type_ = fields.Integer() -+ description = 'Description here' -+ default = "default value" -+ -+ -+@pytest.mark.parametrize( -+ "schemas", -+ [ -+ # test configs from single actors are merged -+ [(_TestConfigA, _TestConfigB)], -+ # test configs from multiple actors are merged -+ [(_TestConfigA,), (_TestConfigB,)], -+ # test "deduplication" -+ [(_TestConfigA, _TestConfigA, _TestConfigB)], -+ [(_TestConfigA,), (_TestConfigA, _TestConfigB,)] -+ ], -+) -+def test_normalize_schemas_ok(schemas): -+ """ -+ Test that valid schemas are detected and if required deduplicated -+ """ -+ expect = defaultdict(dict) -+ expect["test"] = {"a_setting": _TestConfigA} -+ expect["other_section"] = {"other_setting": _TestConfigB} -+ ret = normalize_schemas(schemas) -+ assert ret == expect -+ -+ -+def test_normalize_schemas_identical(): -+ """ -+ Test that identical Config class objects are deduplicated -+ """ -+ expect = defaultdict(dict) -+ expect["test"] = {"a_setting": _TestConfigA} -+ -+ config = _TestConfigA -+ -+ schemas = [(config, config)] -+ ret = normalize_schemas(schemas) -+ assert ret == expect -+ -+ schemas = [(config,), (config,)] -+ ret = normalize_schemas(schemas) -+ assert ret == expect -+ -+ -+@pytest.mark.parametrize( -+ "schemas", -+ [ -+ [(_TestConfigA, _TestConfigConflictsInDefault)], -+ [(_TestConfigA, _TestConfigConflictsInType)], -+ ] -+) -+def test_normalize_schemas_intra_conflict(schemas): -+ """ -+ Test that conflicts within a single Actor config schema are detected -+ """ -+ with pytest.raises(SchemaError): -+ normalize_schemas(schemas) -+ -+ -+@pytest.mark.parametrize( -+ "schemas", -+ [ -+ [(_TestConfigA,), (_TestConfigConflictsInDefault,)], -+ [(_TestConfigA,), (_TestConfigConflictsInType,)], -+ ] -+) -+def test_normalize_schemas_inter_conflict(schemas): -+ """ -+ Test that conflicts between multiple Actor config schemas are detected -+ """ -+ with pytest.raises(SchemaError): -+ normalize_schemas(schemas) -+ -+ -+def test_normalize_schemas_empty(): -+ assert normalize_schemas([]) == defaultdict(dict) --- -2.54.0 - diff --git a/0012-Makefile-add-test_no_lint.patch b/0012-Makefile-add-test_no_lint.patch deleted file mode 100644 index 77023c0..0000000 --- a/0012-Makefile-add-test_no_lint.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 0a5b9b7bb44fbe71c97b10673be71e343abcf58c Mon Sep 17 00:00:00 2001 -From: Matej Matuska -Date: Wed, 20 May 2026 12:45:21 +0200 -Subject: [PATCH 12/16] Makefile: add test_no_lint - -The test rules always lints, add a variant which just tests. ---- - Makefile | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/Makefile b/Makefile -index a68b8fe..dd2d8b9 100644 ---- a/Makefile -+++ b/Makefile -@@ -202,6 +202,10 @@ test: lint - @ $(ENTER_VENV) \ - pytest -vv --cov-report term-missing --cov=leapp tests/scripts - -+test_no_lint: -+ @ $(ENTER_VENV) \ -+ pytest -vv --cov-report term-missing --cov=leapp tests/scripts -+ - # TODO(pstodulk): create ticket to add rhel10 for testing.... py: 3.12 - test_container: - @case $(_TEST_CONTAINER) in \ --- -2.54.0 - diff --git a/0013-Bump-framework_version.patch b/0013-Bump-framework_version.patch deleted file mode 100644 index cfb0e7a..0000000 --- a/0013-Bump-framework_version.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 5aab7431b2d1db7ca149731e1a4e00df45db6a02 Mon Sep 17 00:00:00 2001 -From: Matej Matuska -Date: Thu, 11 Jun 2026 09:43:49 +0200 -Subject: [PATCH 13/16] Bump framework_version - -I forgot to bump it in 66883. ---- - packaging/leapp.spec | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/packaging/leapp.spec b/packaging/leapp.spec -index 0fde883..8bb258a 100644 ---- a/packaging/leapp.spec -+++ b/packaging/leapp.spec -@@ -13,7 +13,7 @@ - # This is kind of help for more flexible development of leapp repository, - # so people do not have to wait for new official release of leapp to ensure - # it is installed/used the compatible one. --%global framework_version 6.5 -+%global framework_version 6.6 - - # IMPORTANT: everytime the requirements are changed, increment number by one - # - same for Provides in deps subpackage --- -2.54.0 - diff --git a/0014-chore-deps-update-actions-checkout-action-to-v7.patch b/0014-chore-deps-update-actions-checkout-action-to-v7.patch deleted file mode 100644 index 6caa890..0000000 --- a/0014-chore-deps-update-actions-checkout-action-to-v7.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 5c6035379bcf58678555db5fe614d793a7237141 Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Thu, 18 Jun 2026 21:36:12 +0000 -Subject: [PATCH 14/16] chore(deps): update actions/checkout action to v7 - ---- - .github/workflows/reuse-copr-build.yml | 4 ++-- - .github/workflows/unit-tests.yml | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml -index 0f6b823..3f413c5 100644 ---- a/.github/workflows/reuse-copr-build.yml -+++ b/.github/workflows/reuse-copr-build.yml -@@ -49,7 +49,7 @@ jobs: - # TODO: The correct way to checkout would be to use simmilar approach as in get_commit_by_timestamp function of - # the github gluetool module (i.e. do not use HEAD but the last commit before comment). - id: checkout -- uses: actions/checkout@v6 -+ uses: actions/checkout@v7 - with: - ref: "refs/pull/${{ steps.pr_nr.outputs.pr_nr }}/head" - -@@ -121,7 +121,7 @@ jobs: - - name: Checkout leapp-repository - id: checkout_leapp_repository - if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }} -- uses: actions/checkout@v6 -+ uses: actions/checkout@v7 - with: - repository: "oamg/leapp-repository" - ref: "refs/pull/${{ steps.leapp_repository_pr.outputs.leapp_repository_pr }}/head" -diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml -index 906a45d..6c6a1eb 100644 ---- a/.github/workflows/unit-tests.yml -+++ b/.github/workflows/unit-tests.yml -@@ -36,7 +36,7 @@ jobs: - - steps: - - name: Checkout code -- uses: actions/checkout@v6 -+ uses: actions/checkout@v7 - with: - fetch-depth: '0' - - name: Set main to origin/main --- -2.54.0 - diff --git a/0015-chore-deps-update-actions-github-script-action-to-v9.patch b/0015-chore-deps-update-actions-github-script-action-to-v9.patch deleted file mode 100644 index 548c49b..0000000 --- a/0015-chore-deps-update-actions-github-script-action-to-v9.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 2e6e8ceac23a2b8060115d9f9e7864a1dfcec507 Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Thu, 18 Jun 2026 21:36:17 +0000 -Subject: [PATCH 15/16] chore(deps): update actions/github-script action to v9 - ---- - .github/workflows/reuse-copr-build.yml | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/.github/workflows/reuse-copr-build.yml b/.github/workflows/reuse-copr-build.yml -index 3f413c5..b312d0d 100644 ---- a/.github/workflows/reuse-copr-build.yml -+++ b/.github/workflows/reuse-copr-build.yml -@@ -102,7 +102,7 @@ jobs: - - name: Add comment with copr build url - # TODO: Create comment when copr build fails. - id: link_copr -- uses: actions/github-script@v8 -+ uses: actions/github-script@v9 - with: - script: | - github.issues.createComment({ -@@ -160,7 +160,7 @@ jobs: - # TODO: Create comment when copr build fails. - id: link_copr_leapp_repository - if: ${{ steps.leapp_repository_pr_regex_match.outputs.match != '' }} -- uses: actions/github-script@v8 -+ uses: actions/github-script@v9 - with: - script: | - github.issues.createComment({ --- -2.54.0 - diff --git a/0016-chore-deps-update-sclorg-testing-farm-as-github-acti.patch b/0016-chore-deps-update-sclorg-testing-farm-as-github-acti.patch deleted file mode 100644 index 77ab5a3..0000000 --- a/0016-chore-deps-update-sclorg-testing-farm-as-github-acti.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 418a650d9211c7c010fbd265c36120ad2bde556e Mon Sep 17 00:00:00 2001 -From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> -Date: Tue, 16 Jun 2026 18:02:05 +0000 -Subject: [PATCH 16/16] chore(deps): update - sclorg/testing-farm-as-github-action action to v4.3.1 - ---- - .github/workflows/reuse-tests-8to9.yml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/.github/workflows/reuse-tests-8to9.yml b/.github/workflows/reuse-tests-8to9.yml -index 811fd8e..cea90fe 100644 ---- a/.github/workflows/reuse-tests-8to9.yml -+++ b/.github/workflows/reuse-tests-8to9.yml -@@ -47,7 +47,7 @@ jobs: - steps: - - name: Schedule regression testing for 8to9 - id: run_test_8to9 -- uses: sclorg/testing-farm-as-github-action@v4.0.0 -+ uses: sclorg/testing-farm-as-github-action@v4.3.1 - with: - # required - api_url: ${{ secrets.TF_ENDPOINT }} --- -2.54.0 - diff --git a/leapp.spec b/leapp.spec index 4314a8e..3c24b8c 100644 --- a/leapp.spec +++ b/leapp.spec @@ -36,8 +36,8 @@ %endif Name: leapp -Version: 0.21.0 -Release: 3%{?dist} +Version: 0.22.0 +Release: 1%{?dist} Summary: OS & Application modernization framework License: ASL 2.0 @@ -65,22 +65,6 @@ Requires: leapp-repository # PATCHES HERE # Patch0001: filename.patch -Patch0001: 0001-introduce-the-format_list-function.patch -Patch0002: 0002-packit-remove-unsupported-upgrade-path-from-tests.patch -Patch0003: 0003-packit-add-new-upgrade-paths-to-tests.patch -Patch0004: 0004-chore-deps-update-actions-checkout-action-to-v6.patch -Patch0005: 0005-chore-deps-update-actions-github-script-action-to-v8.patch -Patch0006: 0006-chore-deps-update-peter-evans-create-or-update-comme.patch -Patch0007: 0007-reporting-fix-incorrect-converting-of-list-based-com.patch -Patch0008: 0008-fixup-reporting-fix-incorrect-converting-of-list-bas.patch -Patch0009: 0009-python-test-deps-update-pytest-requirements.patch -Patch0010: 0010-fix-reporting-use-single-quoting-when-converting-rem.patch -Patch0011: 0011-Fix-exception-in-normalize_schemas-for-conflicting-a.patch -Patch0012: 0012-Makefile-add-test_no_lint.patch -Patch0013: 0013-Bump-framework_version.patch -Patch0014: 0014-chore-deps-update-actions-checkout-action-to-v7.patch -Patch0015: 0015-chore-deps-update-actions-github-script-action-to-v9.patch -Patch0016: 0016-chore-deps-update-sclorg-testing-farm-as-github-acti.patch %description Leapp utility provides the possibility to use the Leapp framework via CLI. @@ -177,22 +161,7 @@ Requires: findutils # APPLY REGISTERED PATCHES HERE # %%patch -P 0001 -p1 -%patch -P 0001 -p1 -%patch -P 0002 -p1 -%patch -P 0003 -p1 -%patch -P 0004 -p1 -%patch -P 0005 -p1 -%patch -P 0006 -p1 -%patch -P 0007 -p1 -%patch -P 0008 -p1 -%patch -P 0009 -p1 -%patch -P 0010 -p1 -%patch -P 0011 -p1 -%patch -P 0012 -p1 -%patch -P 0013 -p1 -%patch -P 0014 -p1 -%patch -P 0015 -p1 -%patch -P 0016 -p1 + ################################################## # Build ################################################## @@ -276,6 +245,10 @@ install -m 0644 -p man/leapp.1 %{buildroot}%{_mandir}/man1/ # no files here %changelog +* Thu Jul 30 2026 Karolina Kula - 0.22.0-1 +- Rebase to version 0.22.0 +- Resolves: RHEL-188371 + * Thu Jun 25 2026 Matej Matuska - 0.21.0-3 - Bump leapp-framework to 6.6 - Fix crash when multiple actors use the same config schema diff --git a/plans/tier0.fmf b/plans/tier0.fmf index 68c980d..0f4615c 100644 --- a/plans/tier0.fmf +++ b/plans/tier0.fmf @@ -13,10 +13,9 @@ context: distro_target: rhel-9.9 adjust: - - enabled: false - when: distro == centos-stream-8 - - environment+: - INSTALL_LEAPP_FROM_COMPOSE: yes + enabled: false + when: distro == centos-stream-9 + /destructive: /TestBasic: @@ -43,7 +42,12 @@ adjust: url: https://gitlab.cee.redhat.com/oamg/leapp-tests name: /plans/newstyle/upgrades/tests/destructive/test_basic.py::TestBasicRhsm$ ref: next - + /TestBasicLivemode: + plan: + import: + url: https://gitlab.cee.redhat.com/oamg/leapp-tests + name: /plans/newstyle/upgrades/tests/destructive/test_basic.py::TestBasicLivemode$ + ref: next /nondestructive: /tier0only: plan: @@ -51,3 +55,13 @@ adjust: url: https://gitlab.cee.redhat.com/oamg/leapp-tests name: /plans/newstyle/nondestructive/tier0only ref: next +/verification: + context+: + verification: verification_99_103_rc # the only dynamic part to be changed per milestone/release + plan: + import: + url: https://gitlab.cee.redhat.com/oamg/leapp-tests + name: /plans/newstyle/.* # import all tests by name, the filtering magic happens on the leapp-tests level based on the context + scope: all-plans + importing: become-parent + ref: next diff --git a/sources b/sources index 58bcfe4..e44a65b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (leapp-0.21.0.tar.gz) = fd880d8a57d99f2fb44871ffe4c77a6105cf6c8e0dea9fe41887c03cf4ae5b000ba55d0b111c07447d88646d03615c081f3e9054deb308538a866d1cdabd9e12 +SHA512 (leapp-0.22.0.tar.gz) = 36f68b2eff47fa59f741d213783eb9926bd247011370aad40b3b1587500c566241951ce8f042c3fa0e3e99a5353082a31d869f951acdc7add210d95356ddca16