python3-pykickstart: fix options parse error

Backport a patch for python3-pykickstart to fix option parse error:

    File "/usr/lib64/python3.12/site-packages/pykickstart/options.py", line 185, in _parse_optional
      option = action.option_strings[0]
               ^^^^^^^^^^^^^^^^^^^^^
  AttributeError: 'tuple' object has no attribute 'option_strings'

Signed-off-by: Kai Kang <kai.kang@windriver.com>
Signed-off-by: Khem Raj <raj.khem@gmail.com>
This commit is contained in:
Kai Kang 2025-03-11 16:57:56 +08:00 committed by Khem Raj
parent 59b904920b
commit 5a2dcee4ac
No known key found for this signature in database
GPG Key ID: BB053355919D3314
2 changed files with 72 additions and 0 deletions

View File

@ -0,0 +1,71 @@
From f753d4d6ad1f4846d14735beb3d1b157b9914b51 Mon Sep 17 00:00:00 2001
From: Adam Williamson <awilliam@redhat.com>
Date: Wed, 2 Oct 2024 09:48:39 -0700
Subject: [PATCH] options: adjust to behavior change in upstream
_parse_optional
In Python 3.13 and 3.12.7, the behavior of _parse_optional has
changed. It used to raise an error on multiple matching actions
itself, and only ever return None or an option tuple. Now the
"raise error on multiple matching actions" code was moved out
into consume_optional, and _parse_optional returns either None
or a *list* of option tuples, which contains more than one if
multiple actions match. See:
https://github.com/python/cpython/pull/124631
https://github.com/python/cpython/issues/58573
This adapts to the change in a way that should work on both older
and newer Pythons.
Signed-off-by: Adam Williamson <awilliam@redhat.com>
Upstream-Status: Backport [https://github.com/pykickstart/pykickstart/commit/f753d4d]
Signed-off-by: Kai Kang <kai.kang@windriver.com>
---
pykickstart/options.py | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/pykickstart/options.py b/pykickstart/options.py
index 2e3a0721..ca0e18af 100644
--- a/pykickstart/options.py
+++ b/pykickstart/options.py
@@ -177,9 +177,23 @@ class KSOptionParser(ArgumentParser):
self.lineno = None
def _parse_optional(self, arg_string):
- option_tuple = ArgumentParser._parse_optional(self, arg_string)
+ # Before 3.13 and 3.12.7, this returned None or a single
+ # option tuple. From 3.13 / 3.12.7 onwards it returns None
+ # or a *list* of option tuples
+ option_tuple_or_tuples = ArgumentParser._parse_optional(self, arg_string)
+ # all we want to do here is a custom warning if the action is
+ # deprecated. we can only safely do this if there's exactly
+ # one matching action
+ if isinstance(option_tuple_or_tuples, list):
+ if len(option_tuple_or_tuples) == 1:
+ option_tuple = option_tuple_or_tuples[0]
+ else:
+ return option_tuple_or_tuples
+ else:
+ option_tuple = option_tuple_or_tuples
+
if option_tuple is None or option_tuple[0] is None:
- return option_tuple
+ return option_tuple_or_tuples
action = option_tuple[0]
option = action.option_strings[0]
@@ -191,7 +205,7 @@ class KSOptionParser(ArgumentParser):
"kickstart. Please modify your kickstart file to remove this option.")
% {"lineno": self.lineno, "option": option}, KickstartDeprecationWarning)
- return option_tuple
+ return option_tuple_or_tuples
def add_argument(self, *args, **kwargs):
if "introduced" in kwargs:
--
2.47.1

View File

@ -16,6 +16,7 @@ SRC_URI = "git://github.com/rhinstaller/pykickstart.git;protocol=https;branch=ma
file://0002-pykickstart-parser.py-add-lock-for-readKickstart-and.patch \
file://0003-comment-out-sections-shutdown-and-environment-in-gen.patch \
file://0004-load.py-retry-to-invoke-request-with-timeout.patch \
file://0005-options-adjust-to-behavior-change-in-upstream-_parse.patch \
"
SRCREV = "fa6c80c0e5c6bee29d089899a10d26e6f7f8afd8"