#105 --verbose causes fedmod rpm2flatpak to fail with Python AssertionError
Opened 3 years ago by sbergmann. Modified 2 years ago

Originally reported at https://bugzilla.redhat.com/show_bug.cgi?id=1913726 "--verbose causes fedmod rpm2flatpak to fail with Python AssertionError", seen with fedmod-0.6.3-12.fc33.noarch.

After fedmod fetch-metadata, e.g. fedmod --verbose rpm2flatpak libreoffice fails with

ERROR:root:Unexpected exception: AssertionError()
Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/_fedmod/cli.py", line 35, in run
    rc = _cli_commands.main(sys.argv[1:], standalone_mode=False,
  File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.9/site-packages/_fedmod/cli.py", line 142, in rpm2flatpak
    fg.run(output_modulemd, output_containerspec, force=force, flathub=flathub,
  File "/usr/lib/python3.9/site-packages/_fedmod/flatpak_generator.py", line 258, in run
    super().run(output_modulemd)
  File "/usr/lib/python3.9/site-packages/_fedmod/module_generator.py", line 140, in run
    self._calculate_dependencies()
  File "/usr/lib/python3.9/site-packages/_fedmod/flatpak_generator.py", line 146, in _calculate_dependencies
    all_needed_packages = _depchase.ensure_installable(
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 267, in ensure_installable
    return _solve(solver, pkgnames, full_info=full_info)
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 202, in _solve
    dep_details = _get_dependency_details(pool, solver.transaction())
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 125, in _get_dependency_details
    assert matches
AssertionError
Traceback (most recent call last):
  File "/usr/bin/fedmod", line 33, in <module>
    sys.exit(load_entry_point('fedmod==0.6.3', 'console_scripts', 'fedmod')())
  File "/usr/lib/python3.9/site-packages/_fedmod/cli.py", line 35, in run
    rc = _cli_commands.main(sys.argv[1:], standalone_mode=False,
  File "/usr/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3.9/site-packages/_fedmod/cli.py", line 142, in rpm2flatpak
    fg.run(output_modulemd, output_containerspec, force=force, flathub=flathub,
  File "/usr/lib/python3.9/site-packages/_fedmod/flatpak_generator.py", line 258, in run
    super().run(output_modulemd)
  File "/usr/lib/python3.9/site-packages/_fedmod/module_generator.py", line 140, in run
    self._calculate_dependencies()
  File "/usr/lib/python3.9/site-packages/_fedmod/flatpak_generator.py", line 146, in _calculate_dependencies
    all_needed_packages = _depchase.ensure_installable(
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 267, in ensure_installable
    return _solve(solver, pkgnames, full_info=full_info)
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 202, in _solve
    dep_details = _get_dependency_details(pool, solver.transaction())
  File "/usr/lib/python3.9/site-packages/_fedmod/_depchase.py", line 125, in _get_dependency_details
    assert matches
AssertionError

(It succeeds when leaving out --verbose.)


I get the same when trying trying to run fedmod --dataset=f36 resolve-deps --json gnutls - without the --json it works though

It actually doesn't work with --verbose or --debug as well

So it asserts when processing the (glibc-gconv-extra(x86-64) = 2.35-4.fc36 if redhat-rpm-config) in my case. Does fedmod support the rich dependencies?

Owen told me about the following changes that he has locally applied:

diff --git a/_fedmod/_depchase.py b/_fedmod/_depchase.py
index daeac3b..1cebb3c 100644
--- a/_fedmod/_depchase.py
+++ b/_fedmod/_depchase.py
@@ -6,6 +6,7 @@ import collections
 import functools
 import logging
 import os
+import re

 import smartcols
 import solv
@@ -95,6 +96,12 @@ def _iterate_all_requires(package):
         yield dep


+_BOOLEAN_KEYWORDS = re.compile(r" (?:and|or|if|with|without|unless) ")
+
+def _dependency_is_conditional(dependency):
+    return _BOOLEAN_KEYWORDS.search(str(dependency)) is not None
+
+
 def _get_dependency_details(pool, transaction):
     cache = {}

@@ -122,7 +129,11 @@ def _get_dependency_details(pool, transaction):
                         if s in candq
                     }
                 # It was possible to resolve set, so something is wrong here
-                assert matches
+                if not matches:
+                    if _dependency_is_conditional(dep):
+                        log.debug("Conditional dependency {} doesn't need to be satisfied".format(dep))
+                    else:
+                        raise RuntimeError("Dependency {} isn't satisfied in resolved packages!".format(dep))
                 cache[dep] = matches

             # While multiple packages providing the same thing is rare, it's

Also if using the resolve-deps for updating the Fedora Flatpak runtime, then the following patch needs to be applied (if not already applied in a particular modules/flatpak-runtime branch).

diff --git a/tools/generate-runtime-report.py b/tools/generate-runtime-report.py
index 1ded093..b589378 100755
--- a/tools/generate-runtime-report.py
+++ b/tools/generate-runtime-report.py
@@ -240,6 +240,9 @@ def add_packages(source, which, resolve_deps=False, only_if_exists=False):

         for package in resolved_packages:
             for req, providers in package['requires'].items():
+                # boolean dependency that didn't need to be satisfied
+                if len(providers) == 0:
+                    continue
                 provider = nvr_to_name(providers[0])
                 provider_package = packages.get(provider, None)
                 if provider_package is None: # filtered out of the resolve-deps output - e.g., fedora-release

Login to comment on this ticket.

Metadata