Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-stevedore for
openSUSE:Factory checked in at 2026-08-22 21:36:40
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-stevedore (Old)
and /work/SRC/openSUSE:Factory/.python-stevedore.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-stevedore"
Sat Aug 22 21:36:40 2026 rev:53 rq:1373081 version:5.9.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-stevedore/python-stevedore.changes
2026-07-06 12:34:40.052260236 +0200
+++
/work/SRC/openSUSE:Factory/.python-stevedore.new.1258/python-stevedore.changes
2026-08-22 21:38:47.487903240 +0200
@@ -1,0 +2,8 @@
+Sat Aug 22 14:06:55 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 5.9.1:
+ * docs: Add guide on conflict resolution
+ * Fix conflict_resolver with DriverManager
+ * ruff: Use more explicit name for "UP" checks
+
+-------------------------------------------------------------------
Old:
----
stevedore-5.9.0.tar.gz
New:
----
stevedore-5.9.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-stevedore.spec ++++++
--- /var/tmp/diff_new_pack.BEedm0/_old 2026-08-22 21:38:48.743948229 +0200
+++ /var/tmp/diff_new_pack.BEedm0/_new 2026-08-22 21:38:48.748948408 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-stevedore
-Version: 5.9.0
+Version: 5.9.1
Release: 0
Summary: Manage dynamic plugins for Python applications
License: Apache-2.0
++++++ stevedore-5.9.0.tar.gz -> stevedore-5.9.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/ChangeLog
new/stevedore-5.9.1/ChangeLog
--- old/stevedore-5.9.0/ChangeLog 2026-07-02 13:37:18.000000000 +0200
+++ new/stevedore-5.9.1/ChangeLog 2026-08-20 17:24:26.036980000 +0200
@@ -1,6 +1,13 @@
CHANGES
=======
+5.9.1
+-----
+
+* docs: Add guide on conflict resolution
+* Fix conflict\_resolver with DriverManager
+* ruff: Use more explicit name for "UP" checks
+
5.9.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/PKG-INFO new/stevedore-5.9.1/PKG-INFO
--- old/stevedore-5.9.0/PKG-INFO 2026-07-02 13:37:18.662969600 +0200
+++ new/stevedore-5.9.1/PKG-INFO 2026-08-20 17:24:26.183980200 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: stevedore
-Version: 5.9.0
+Version: 5.9.1
Summary: Manage dynamic plugins for Python applications
Author-email: OpenStack <[email protected]>
License-Expression: Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/doc/source/reference/index.rst
new/stevedore-5.9.1/doc/source/reference/index.rst
--- old/stevedore-5.9.0/doc/source/reference/index.rst 2026-07-02
13:36:32.000000000 +0200
+++ new/stevedore-5.9.1/doc/source/reference/index.rst 2026-08-20
17:23:34.702652700 +0200
@@ -1,51 +1,70 @@
-===========================
- Extension Manager Classes
-===========================
+===============
+ API Reference
+===============
+
+Extension Manager Classes
+=========================
DriverManager
-=============
+-------------
.. autoclass:: stevedore.driver.DriverManager
HookManager
-===========
+-----------
.. autoclass:: stevedore.hook.HookManager
NamedExtensionManager
-=====================
+---------------------
.. autoclass:: stevedore.named.NamedExtensionManager
EnabledExtensionManager
-=======================
+-----------------------
.. autoclass:: stevedore.enabled.EnabledExtensionManager
DispatchExtensionManager
-========================
+------------------------
.. autoclass:: stevedore.dispatch.DispatchExtensionManager
NameDispatchExtensionManager
-============================
+----------------------------
.. autoclass:: stevedore.dispatch.NameDispatchExtensionManager
ExtensionManager
-================
+----------------
.. autoclass:: stevedore.extension.ExtensionManager
Extension
-=========
+---------
.. autoclass:: stevedore.extension.Extension
:members:
:show-inheritance:
:no-special-members:
-TestExtensionManager
-====================
+Conflict Resolution
+===================
+
+See :doc:`../user/conflict_resolution` for an overview of how conflicting
+entry point names are resolved.
+
+.. autodata:: stevedore.extension.ConflictResolverT
+
+.. autofunction:: stevedore.extension.ignore_conflicts
+
+.. autofunction:: stevedore.extension.error_on_conflict
+
+Exceptions
+==========
+
+.. autoexception:: stevedore.exception.NoUniqueMatch
+
+.. autoexception:: stevedore.exception.NoMatches
-.. autoclass:: stevedore.tests.manager.TestExtensionManager
+.. autoexception:: stevedore.exception.MultipleMatches
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/stevedore-5.9.0/doc/source/user/conflict_resolution.rst
new/stevedore-5.9.1/doc/source/user/conflict_resolution.rst
--- old/stevedore-5.9.0/doc/source/user/conflict_resolution.rst 1970-01-01
01:00:00.000000000 +0100
+++ new/stevedore-5.9.1/doc/source/user/conflict_resolution.rst 2026-08-20
17:23:34.702652700 +0200
@@ -0,0 +1,138 @@
+=====================
+ Resolving Conflicts
+=====================
+
+.. versionadded:: 5.6.0
+
+Entry point names do not have to be unique within a namespace. This is
+intentional and is what makes the *hooks* pattern (:doc:`patterns_loading`)
+possible, where several entry points share a name so that they can all be
+invoked for a single event. For the *drivers* pattern, however, a name is
+expected to identify exactly one implementation, and for the *extensions*
+pattern each name is used to look up a single extension. When more than one
+entry point in a namespace registers under the same name, stevedore has to
+decide which one to use. This is a *conflict*, and the mechanism that decides
+what to do about it is the *conflict resolver*.
+
+Conflicts most commonly arise when two packages are installed that both
+provide a plugin under the same name in the same namespace. For example, two
+libraries that each register a ``sqlite`` driver in the ``myapp.database``
+namespace.
+
+The ``conflict_resolver`` parameter
+===================================
+
+The following managers accept a ``conflict_resolver`` keyword argument:
+
+* :class:`~stevedore.extension.ExtensionManager`
+* :class:`~stevedore.named.NamedExtensionManager`
+* :class:`~stevedore.driver.DriverManager`
+
+A conflict resolver is any callable matching
+:data:`~stevedore.extension.ConflictResolverT`. It is called with three
+arguments - the namespace, the conflicting name, and the list of
+:class:`~stevedore.extension.Extension` objects that share that name - and must
+return the single :class:`~stevedore.extension.Extension` to use (or raise an
+exception to abort):
+
+.. code-block:: python
+
+ def resolver(namespace, name, entrypoints):
+ # return one of the entries in ``entrypoints``
+ ...
+
+The resolver is only consulted for name-based lookups. For the
+:class:`~stevedore.extension.ExtensionManager` and
+:class:`~stevedore.named.NamedExtensionManager` this happens lazily, the first
+time an extension is retrieved by name. For the
+:class:`~stevedore.driver.DriverManager`, which always loads a single named
+driver, it is consulted when the manager is constructed.
+
+Built-in resolvers
+==================
+
+stevedore ships with two resolvers, both in the :mod:`stevedore.extension`
+module.
+
+:func:`~stevedore.extension.ignore_conflicts`
+ Logs a warning listing the conflicting implementations and returns the last
+ entry point found, so a single plugin is selected and no error is raised.
+ This is the default for :class:`~stevedore.extension.ExtensionManager` and
+ :class:`~stevedore.named.NamedExtensionManager`.
+
+:func:`~stevedore.extension.error_on_conflict`
+ Raises :class:`~stevedore.exception.MultipleMatches`, refusing to resolve
+ the conflict silently. This is the default for
+ :class:`~stevedore.driver.DriverManager`.
+
+.. versionchanged:: 5.9.1
+
+ Prior to 5.9.1, :class:`~stevedore.driver.DriverManager` unconditionally
+ raised :class:`~stevedore.exception.MultipleMatches` and ignored any
+ ``conflict_resolver`` that was passed. Since 5.9.1 this parameter is
+ honoured and defaults to :func:`~stevedore.extension.error_on_conflict` to
+ preserve the historical "raise on duplicate" behavior.
+
+Usage
+=====
+
+To have a :class:`~stevedore.driver.DriverManager` pick a driver instead of
+raising when duplicates are present, pass
+:func:`~stevedore.extension.ignore_conflicts`:
+
+.. code-block:: python
+
+ from stevedore import driver
+ from stevedore import extension
+
+ mgr = driver.DriverManager(
+ namespace='myapp.database',
+ name='sqlite',
+ invoke_on_load=True,
+ conflict_resolver=extension.ignore_conflicts,
+ )
+
+Alternatively, to make an :class:`~stevedore.extension.ExtensionManager` or
+:class:`~stevedore.named.NamedExtensionManager` raise on duplicates rather than
+silently choosing one, pass :func:`~stevedore.extension.error_on_conflict`:
+
+.. code-block:: python
+
+ from stevedore import extension
+
+ mgr = extension.ExtensionManager(
+ namespace='myapp.formatters',
+ conflict_resolver=extension.error_on_conflict,
+ )
+
+Writing a custom resolver
+=========================
+
+When neither built-in resolver expresses the policy you need, you can provide
+your own callable. This can be useful if you want to prefer an implementation
+from a particular package, for example. The example below prefers the first
+entry point discovered:
+
+.. code-block:: python
+
+ from stevedore import driver
+
+ def prefer_first(namespace, name, entrypoints):
+ return entrypoints[0]
+
+ mgr = driver.DriverManager(
+ namespace='myapp.database',
+ name='sqlite',
+ invoke_on_load=True,
+ conflict_resolver=prefer_first,
+ )
+
+A custom resolver may also raise an exception to reject the conflict, just as
+:func:`~stevedore.extension.error_on_conflict` does.
+
+.. seealso::
+
+ * :doc:`patterns_loading`
+ * :class:`stevedore.driver.DriverManager`
+ * :class:`stevedore.extension.ExtensionManager`
+ * :class:`stevedore.named.NamedExtensionManager`
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/doc/source/user/index.rst
new/stevedore-5.9.1/doc/source/user/index.rst
--- old/stevedore-5.9.0/doc/source/user/index.rst 2026-07-02
13:36:32.000000000 +0200
+++ new/stevedore-5.9.1/doc/source/user/index.rst 2026-08-20
17:23:34.708648200 +0200
@@ -8,6 +8,7 @@
patterns_loading
patterns_enabling
+ conflict_resolution
tutorial/index
sphinxext
essays/*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/doc/source/user/tutorial/loading.rst
new/stevedore-5.9.1/doc/source/user/tutorial/loading.rst
--- old/stevedore-5.9.0/doc/source/user/tutorial/loading.rst 2026-07-02
13:36:32.000000000 +0200
+++ new/stevedore-5.9.1/doc/source/user/tutorial/loading.rst 2026-08-20
17:23:34.709647400 +0200
@@ -39,6 +39,11 @@
:attr:`driver` property of the manager, and then its methods can be
called directly.
+Because a :class:`DriverManager` expects a name to identify exactly one
+driver, it will raise an error if more than one entry point in the
+namespace shares the requested name. See :doc:`../conflict_resolution`
+for how to control this behavior.
+
.. literalinclude:: ../../../../stevedore/example/load_as_driver.py
:language: python
:lines: 43-44
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/pyproject.toml
new/stevedore-5.9.1/pyproject.toml
--- old/stevedore-5.9.0/pyproject.toml 2026-07-02 13:36:32.000000000 +0200
+++ new/stevedore-5.9.1/pyproject.toml 2026-08-20 17:23:34.710646900 +0200
@@ -68,7 +68,7 @@
skip-magic-trailing-comma = true
[tool.ruff.lint]
-select = ["C4", "E4", "E5", "E7", "E9", "F", "G", "LOG", "S", "U"]
+select = ["C4", "E4", "E5", "E7", "E9", "F", "G", "LOG", "S", "UP"]
external = ["H"]
ignore = [
# we only use asserts for type narrowing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/stevedore-5.9.0/releasenotes/notes/driver-manager-conflict-resolver-0d1f7c2a4b6e8f10.yaml
new/stevedore-5.9.1/releasenotes/notes/driver-manager-conflict-resolver-0d1f7c2a4b6e8f10.yaml
---
old/stevedore-5.9.0/releasenotes/notes/driver-manager-conflict-resolver-0d1f7c2a4b6e8f10.yaml
1970-01-01 01:00:00.000000000 +0100
+++
new/stevedore-5.9.1/releasenotes/notes/driver-manager-conflict-resolver-0d1f7c2a4b6e8f10.yaml
2026-08-20 17:23:34.711646000 +0200
@@ -0,0 +1,24 @@
+---
+fixes:
+ - |
+ :class:`~stevedore.driver.DriverManager` now honors its
+ ``conflict_resolver`` parameter. Previously the parameter was accepted but
+ ignored: whenever multiple entry points in the namespace shared the
+ requested name, ``DriverManager`` unconditionally raised
+ :class:`~stevedore.exception.MultipleMatches`. The configured resolver is
+ now consulted, allowing callers to select a single driver (for example
+ with :func:`~stevedore.extension.ignore_conflicts`) or to apply custom
+ logic.
+upgrade:
+ - |
+ The default ``conflict_resolver`` for
+ :class:`~stevedore.driver.DriverManager` is now
+ :func:`~stevedore.extension.error_on_conflict` rather than
+ :func:`~stevedore.extension.ignore_conflicts`. This preserves the
+ historical behavior of raising
+ :class:`~stevedore.exception.MultipleMatches` when duplicate names are
+ found, so a duplicate is never resolved silently by default. Callers that
+ want a duplicate name to resolve to a single driver must now pass
+ ``conflict_resolver=stevedore.extension.ignore_conflicts`` (or a custom
+ resolver) explicitly. Note that the exception message raised on a conflict
+ has changed slightly, though the exception type is unchanged.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/stevedore/driver.py
new/stevedore-5.9.1/stevedore/driver.py
--- old/stevedore-5.9.0/stevedore/driver.py 2026-07-02 13:36:32.000000000
+0200
+++ new/stevedore-5.9.1/stevedore/driver.py 2026-08-20 17:23:34.719640000
+0200
@@ -14,12 +14,11 @@
import importlib.metadata
from typing import Any, Concatenate, ParamSpec, Self, TypeVar
-from .exception import MultipleMatches
from .exception import NoMatches
from .extension import ConflictResolverT
+from .extension import error_on_conflict
from .extension import Extension
from .extension import ExtensionManager
-from .extension import ignore_conflicts
from .extension import OnLoadFailureCallbackT
from .named import NamedExtensionManager
from .named import OnMissingEntrypointsCallbackT
@@ -60,7 +59,10 @@
logging.
:param conflict_resolver: A callable that determines what to do in the
event that there are multiple entrypoints in the same group with the
- same name. This is only used if retrieving entrypoint by name.
+ same name. Defaults to :func:`~stevedore.extension.error_on_conflict`,
+ which raises :class:`~stevedore.exception.MultipleMatches`. Pass
+ :func:`~stevedore.extension.ignore_conflicts` (or a custom callable)
+ to select a single driver instead of raising.
"""
def __init__(
@@ -77,7 +79,7 @@
verify_requirements: bool | None = None,
warn_on_missing_entrypoint: bool | None = None,
*,
- conflict_resolver: 'ConflictResolverT[T]' = ignore_conflicts,
+ conflict_resolver: 'ConflictResolverT[T]' = error_on_conflict,
) -> None:
invoke_args = () if invoke_args is None else invoke_args
invoke_kwds = {} if invoke_kwds is None else invoke_kwds
@@ -114,7 +116,7 @@
on_load_failure_callback: 'OnLoadFailureCallbackT[T] | None' = None,
verify_requirements: bool | None = None,
*,
- conflict_resolver: 'ConflictResolverT[T]' = ignore_conflicts,
+ conflict_resolver: 'ConflictResolverT[T]' = error_on_conflict,
) -> Self:
"""Construct a test DriverManager
@@ -136,7 +138,8 @@
removed in a future version.
:param conflict_resolver: A callable that determines what to do in the
event that there are multiple entrypoints in the same group with
- the same name. This is only used if retrieving entrypoint by name.
+ the same name. Defaults to
+ :func:`~stevedore.extension.error_on_conflict`.
:return: The manager instance, initialized for testing
"""
o = super().make_test_instance(
@@ -152,20 +155,20 @@
def _init_plugins(self, extensions: list[Extension[T]]) -> None:
super()._init_plugins(extensions)
+ name = self._names[0]
if not self.extensions:
- name = self._names[0]
raise NoMatches(
f'No {self.namespace!r} driver found, looking for {name!r}'
)
if len(self.extensions) > 1:
- discovered_drivers = ','.join(
- e.entry_point_target for e in self.extensions
- )
-
- raise MultipleMatches(
- f'Multiple {self.namespace!r} drivers found: '
- f'{discovered_drivers}'
- )
+ # More than one entrypoint was found for the requested name. Since
+ # a DriverManager only ever loads a single name, this can only
+ # happen when multiple entrypoints in the namespace share that
+ # name. Defer to the configured conflict resolver to decide which
+ # one to use (or whether to raise).
+ self.extensions = [
+ self._conflict_resolver(self.namespace, name, self.extensions)
+ ]
def __call__(
self,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/stevedore/tests/test_driver.py
new/stevedore-5.9.1/stevedore/tests/test_driver.py
--- old/stevedore-5.9.0/stevedore/tests/test_driver.py 2026-07-02
13:36:32.000000000 +0200
+++ new/stevedore-5.9.1/stevedore/tests/test_driver.py 2026-08-20
17:23:34.723637000 +0200
@@ -31,6 +31,23 @@
class Bar(Base): ...
+def _conflicting_extensions():
+ return [
+ extension.Extension(
+ 'backend',
+ importlib.metadata.EntryPoint('backend', 'pkg1:driver', 'backend'),
+ Foo,
+ None,
+ ),
+ extension.Extension(
+ 'backend',
+ importlib.metadata.EntryPoint('backend', 'pkg2:driver', 'backend'),
+ Bar,
+ None,
+ ),
+ ]
+
+
class TestCallback(utils.TestCase):
def test_detect_plugins(self):
em: driver.DriverManager[Any]
@@ -82,29 +99,42 @@
def test_multiple_drivers(self):
# The idea for this test was contributed by clayg:
# https://gist.github.com/clayg/6311348
- extensions: list[extension.Extension[Any]] = [
- extension.Extension(
- 'backend',
- importlib.metadata.EntryPoint(
- 'backend', 'pkg1:driver', 'backend'
- ),
- Foo,
- None,
- ),
- extension.Extension(
- 'backend',
- importlib.metadata.EntryPoint(
- 'backend', 'pkg2:driver', 'backend'
- ),
- Bar,
- None,
- ),
- ]
+ extensions: list[extension.Extension[Any]] = _conflicting_extensions()
try:
+ # By default a DriverManager raises when multiple entrypoints in
+ # the namespace share the requested name.
dm = driver.DriverManager.make_test_instance(extensions[0])
# Call the initialization code that verifies the extension
dm._init_plugins(extensions)
except exception.MultipleMatches as err:
- self.assertIn("Multiple", str(err))
+ self.assertIn("multiple implementations", str(err))
+ self.assertIn("backend", str(err))
else:
self.fail('Should have had an error')
+
+ def test_multiple_drivers_ignore_conflicts(self):
+ # A conflict resolver can be used to select a single driver rather
+ # than raising when there are duplicate names.
+ extensions: list[extension.Extension[Any]] = _conflicting_extensions()
+ dm = driver.DriverManager.make_test_instance(
+ extensions[0], conflict_resolver=extension.ignore_conflicts
+ )
+ dm._init_plugins(extensions)
+ # ignore_conflicts keeps the last entrypoint found
+ self.assertEqual(1, len(dm.extensions))
+ self.assertIs(Bar, dm.driver)
+
+ def test_multiple_drivers_custom_resolver(self):
+ # A custom conflict resolver receives the namespace, name and the
+ # list of conflicting extensions, and returns the one to use.
+ extensions: list[extension.Extension[Any]] = _conflicting_extensions()
+
+ def prefer_first(namespace, name, conflicting):
+ return conflicting[0]
+
+ dm = driver.DriverManager.make_test_instance(
+ extensions[0], conflict_resolver=prefer_first
+ )
+ dm._init_plugins(extensions)
+ self.assertEqual(1, len(dm.extensions))
+ self.assertIs(Foo, dm.driver)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/stevedore.egg-info/PKG-INFO
new/stevedore-5.9.1/stevedore.egg-info/PKG-INFO
--- old/stevedore-5.9.0/stevedore.egg-info/PKG-INFO 2026-07-02
13:37:18.000000000 +0200
+++ new/stevedore-5.9.1/stevedore.egg-info/PKG-INFO 2026-08-20
17:24:26.094980000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: stevedore
-Version: 5.9.0
+Version: 5.9.1
Summary: Manage dynamic plugins for Python applications
Author-email: OpenStack <[email protected]>
License-Expression: Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/stevedore.egg-info/SOURCES.txt
new/stevedore-5.9.1/stevedore.egg-info/SOURCES.txt
--- old/stevedore-5.9.0/stevedore.egg-info/SOURCES.txt 2026-07-02
13:37:18.000000000 +0200
+++ new/stevedore-5.9.1/stevedore.egg-info/SOURCES.txt 2026-08-20
17:24:26.139980000 +0200
@@ -18,6 +18,7 @@
doc/source/index.rst
doc/source/install/index.rst
doc/source/reference/index.rst
+doc/source/user/conflict_resolution.rst
doc/source/user/history.rst
doc/source/user/index.rst
doc/source/user/patterns_enabling.rst
@@ -43,6 +44,7 @@
releasenotes/notes/conflict-resolution-12cd58160d48481a.yaml
releasenotes/notes/deprecate-verify_requirements-33fe21fad9df33a1.yaml
releasenotes/notes/deprecate-warn_on_missing_entrypoint-d7e3bf2d4421f4cc.yaml
+releasenotes/notes/driver-manager-conflict-resolver-0d1f7c2a4b6e8f10.yaml
releasenotes/notes/drop-python-310-a175ee1330887985.yaml
releasenotes/notes/drop-python2-support-3f0f717570cad8cb.yaml
releasenotes/notes/entry-point-type-change-06ca3b301ba7aad1.yaml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/stevedore-5.9.0/stevedore.egg-info/pbr.json
new/stevedore-5.9.1/stevedore.egg-info/pbr.json
--- old/stevedore-5.9.0/stevedore.egg-info/pbr.json 2026-07-02
13:37:18.000000000 +0200
+++ new/stevedore-5.9.1/stevedore.egg-info/pbr.json 2026-08-20
17:24:26.093980000 +0200
@@ -1 +1 @@
-{"git_version": "8550c66", "is_release": true}
\ No newline at end of file
+{"git_version": "44e1028", "is_release": true}
\ No newline at end of file