Skip to content

Commit 78f5b1e

Browse files
bajertomvaibhavdarengemini-code-assist[bot]
authored
Extend Options with allow_erasing and allow_downgrade (#4996)
Add two new fields to the package manager Options: - `allow_erasing` (`--allowerasing`): lets DNF remove packages that obsolete or conflict with a requested install. Supported by DNF4 and DNF5. - `allow_downgrade` (`--allow-downgrade`): lets DNF5 downgrade transitive dependencies when a requested package requires an older version. DNF4 already permits this by default, so the flag is only emitted for DNF5. - Both options raise `PrepareError` under `YumEngine` (no equivalent flag). Fixes #4909 --------- Co-authored-by: vaibhavdaren <vaibhavdaren@gmail.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
1 parent 8a80c4f commit 78f5b1e

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

tmt/package_managers/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,12 @@ class Options:
329329
#: If set, instruct package manager to install from untrusted sources.
330330
allow_untrusted: bool = False
331331

332+
#: If set, allow erasing conflicting or obsoleting packages during install.
333+
allow_erasing: bool = False
334+
335+
#: If set, allow downgrades of transitive dependencies during install.
336+
allow_downgrade: bool = False
337+
332338

333339
class PackageManagerEngine(tmt.utils.Common):
334340
command: Command

tmt/package_managers/dnf.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ def _extra_dnf_options(self, options: Options, command: Optional[Command] = None
5959
else:
6060
raise GeneralError(f"Unhandled package manager command '{command}'.")
6161

62+
if options.allow_erasing:
63+
# Supported by DNF4 and DNF5; YumEngine raises PrepareError for this flag.
64+
extra_options += Command('--allowerasing')
65+
6266
return extra_options
6367

6468
def _construct_presence_script(
@@ -398,6 +402,19 @@ class Dnf5Engine(DnfEngine):
398402
skip_missing_packages_option = '--skip-unavailable'
399403
skip_missing_debuginfo_option = skip_missing_packages_option
400404

405+
def _extra_dnf_options(self, options: Options, command: Optional[Command] = None) -> Command:
406+
"""
407+
Collect additional options for ``dnf5`` based on given options.
408+
"""
409+
410+
extra_options = super()._extra_dnf_options(options, command)
411+
412+
if options.allow_downgrade:
413+
# DNF4 allows transitive downgrades automatically; this flag is DNF5-specific.
414+
extra_options += Command('--allow-downgrade')
415+
416+
return extra_options
417+
401418

402419
@provides_package_manager('dnf5')
403420
class Dnf5(Dnf):
@@ -415,6 +432,13 @@ class Dnf5(Dnf):
415432
class YumEngine(DnfEngine):
416433
_base_command = Command('yum')
417434

435+
def _extra_dnf_options(self, options: Options, command: Optional[Command] = None) -> Command:
436+
if options.allow_erasing:
437+
raise PrepareError("Package manager 'yum' does not support '--allowerasing'.")
438+
if options.allow_downgrade:
439+
raise PrepareError("Package manager 'yum' does not support '--allow-downgrade'.")
440+
return super()._extra_dnf_options(options, command)
441+
418442
def _yum_config_manager_command(self) -> Command:
419443
command = Command('yum-config-manager')
420444

0 commit comments

Comments
 (0)