forked from rpms/leapp
Compare commits
2 Commits
c8-elevate
...
c8
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ff5687638 | |||
| 1ff3d09a69 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/leapp-0.20.0.tar.gz
|
SOURCES/leapp-0.21.0.tar.gz
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
a9b310b4ba20d6ce8f3e4e261035f5f0fcf553d7 SOURCES/leapp-0.20.0.tar.gz
|
5b1ef7ebe3cf1cbb271691001d3e7a1a315ab5c1 SOURCES/leapp-0.21.0.tar.gz
|
||||||
|
|||||||
194
SOURCES/0001-introduce-the-format_list-function.patch
Normal file
194
SOURCES/0001-introduce-the-format_list-function.patch
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
From d67332c2234e437113493bfdce37594c1e2ae417 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Petr Stodulka <pstodulk@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
From 2f210e763a8b851f1804f518fb02466db9cb55fa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Mocary <pmocary@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
300
SOURCES/0003-packit-add-new-upgrade-paths-to-tests.patch
Normal file
300
SOURCES/0003-packit-add-new-upgrade-paths-to-tests.patch
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
From 80c700223948b7a11af1b71c1ed81145662786ae Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Mocary <pmocary@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,157 @@
|
|||||||
|
From 9fbd48b20f556cb613f3ca7999f4fc9d74e24024 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Mocary <pmocary@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,171 @@
|
|||||||
|
From ad50bb2bdcc8a4b734c82f9d190dfe8c1611903a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Mocary <pmocary@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
From bf931901cdc18275aed2023e5c37da0e246ae8a7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Petr Stodulka <pstodulk@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -0,0 +1,173 @@
|
|||||||
|
From eaf4af1a549b3cb675f49f03d46d9d5de362753f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Mocary <pmocary@redhat.com>
|
||||||
|
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
|
||||||
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
# it. In case of upstream, dependencies are set differently, but YUM is not
|
# it. In case of upstream, dependencies are set differently, but YUM is not
|
||||||
# capable enough to deal with them correctly all the time; we continue to use
|
# capable enough to deal with them correctly all the time; we continue to use
|
||||||
# simplified deps in RHEL to ensure that YUM can deal with it.
|
# simplified deps in RHEL to ensure that YUM can deal with it.
|
||||||
%global framework_version 6.1
|
%global framework_version 6.5
|
||||||
|
|
||||||
# IMPORTANT: everytime the requirements are changed, increment number by one
|
# IMPORTANT: everytime the requirements are changed, increment number by one
|
||||||
# - same for Provides in deps subpackage
|
# - same for Provides in deps subpackage
|
||||||
@ -36,8 +36,8 @@
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
Name: leapp
|
Name: leapp
|
||||||
Version: 0.20.0
|
Version: 0.21.0
|
||||||
Release: 1%{?dist}
|
Release: 2%{?dist}
|
||||||
Summary: OS & Application modernization framework
|
Summary: OS & Application modernization framework
|
||||||
|
|
||||||
License: ASL 2.0
|
License: ASL 2.0
|
||||||
@ -65,6 +65,17 @@ Requires: leapp-repository
|
|||||||
|
|
||||||
# PATCHES HERE
|
# PATCHES HERE
|
||||||
# Patch0001: filename.patch
|
# 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
|
||||||
|
|
||||||
|
|
||||||
%description
|
%description
|
||||||
Leapp utility provides the possibility to use the Leapp framework via CLI.
|
Leapp utility provides the possibility to use the Leapp framework via CLI.
|
||||||
@ -161,8 +172,16 @@ Requires: findutils
|
|||||||
|
|
||||||
# APPLY REGISTERED PATCHES HERE
|
# APPLY REGISTERED PATCHES HERE
|
||||||
# %%patch -P 0001 -p1
|
# %%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
|
||||||
##################################################
|
##################################################
|
||||||
# Build
|
# Build
|
||||||
##################################################
|
##################################################
|
||||||
@ -246,6 +265,21 @@ install -m 0644 -p man/leapp.1 %{buildroot}%{_mandir}/man1/
|
|||||||
# no files here
|
# no files here
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Apr 17 2026 Matej Matuska <mmatuska@redhat.com> - 0.21.0-1
|
||||||
|
- Bump leapp-framework to 6.5
|
||||||
|
- Change how commands are converted for text based report from the list representation
|
||||||
|
- Introduce the format_list function for unified presentation of lists in reports and logs
|
||||||
|
- Resolves: RHEL-169278
|
||||||
|
|
||||||
|
* Tue Feb 10 2026 Matej Matuska <mmatuska@redhat.com> - 0.21.0
|
||||||
|
- Rebase to version 0.21.0
|
||||||
|
- Resolves: RHEL-128270
|
||||||
|
|
||||||
|
* Thu Nov 13 2025 Karolina Kula <kkula@redhat.com> - 0.20.0-2
|
||||||
|
- Bump leapp-framework to 6.2
|
||||||
|
- Add possibility to specify aliases for CLI option
|
||||||
|
- Resolves: RHEL-128270
|
||||||
|
|
||||||
* Thu Aug 14 2025 Karolina Kula <kkula@redhat.com> - 0.20.0-1
|
* Thu Aug 14 2025 Karolina Kula <kkula@redhat.com> - 0.20.0-1
|
||||||
- Rebase to new upstream 0.20.0
|
- Rebase to new upstream 0.20.0
|
||||||
- Resolves: RHEL-67625
|
- Resolves: RHEL-67625
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user