Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed

- Internally created executors are now named for improved metrics and debuggability.
- Library no longer has a hard dependency on Python bindings to `rpm`, if RPM-related
functionality is not used.

## [2.9.0] - 2021-07-05

Expand Down
17 changes: 17 additions & 0 deletions src/pushsource/_impl/backend/broken_rpmlib.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import six

# A replacement for kobo.rpmlib to give a decent error message
# when rpm bindings are not available.

# importer is expected to put a more specific cause here.
CAUSE = RuntimeError("unknown error")

MESSAGE = "kobo.rpmlib is not available (consider 'pip install rpm-py-installer')"


def not_available(*_args, **_kwargs):
six.raise_from(RuntimeError(MESSAGE), CAUSE)


get_rpm_header = not_available
get_keys_from_header = not_available
14 changes: 11 additions & 3 deletions src/pushsource/_impl/backend/staged/staged_rpm.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import logging

import kobo.rpmlib
try:
from kobo import rpmlib
except Exception as ex: # pragma: no cover, pylint: disable=broad-except
# If kobo.rpmlib is unavailable, let's not immediately crash.
# We will hold this exception and re-raise it only if there's an
# attempt to use the related functionality.
from .. import broken_rpmlib as rpmlib

rpmlib.CAUSE = ex

from ...model import RpmPushItem
from .staged_base import StagedBaseMixin, handles_type
Expand All @@ -19,8 +27,8 @@ def __push_item(self, leafdir, _, entry):
LOG.warning("Unexpected non-RPM %s (ignored)", entry.path)
return None

header = kobo.rpmlib.get_rpm_header(entry.path)
key_id = kobo.rpmlib.get_keys_from_header(header)
header = rpmlib.get_rpm_header(entry.path)
key_id = rpmlib.get_keys_from_header(header)

return RpmPushItem(
name=entry.name,
Expand Down
15 changes: 15 additions & 0 deletions tests/staged/test_broken_rpmlib.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import pytest

from pushsource._impl.backend import broken_rpmlib


@pytest.mark.parametrize(
"fn", [broken_rpmlib.get_keys_from_header, broken_rpmlib.get_rpm_header]
)
def test_functions_raise(fn):
"""Expected functions are present in broken_rpmlib and raise on use."""

with pytest.raises(RuntimeError) as excinfo:
fn("a", "b", "c")

assert "kobo.rpmlib is not available" in str(excinfo)