Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-bindep for openSUSE:Factory checked in at 2026-04-01 19:51:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-bindep (Old) and /work/SRC/openSUSE:Factory/.python-bindep.new.21863 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-bindep" Wed Apr 1 19:51:10 2026 rev:11 rq:1343776 version:2.14.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-bindep/python-bindep.changes 2026-03-12 22:27:18.822734341 +0100 +++ /work/SRC/openSUSE:Factory/.python-bindep.new.21863/python-bindep.changes 2026-04-01 19:51:49.812119159 +0200 @@ -1,0 +2,9 @@ +Mon Mar 30 21:28:32 UTC 2026 - Dirk Müller <[email protected]> + +- update to 2.14.0: + * New exit code of 2 for input file parse errors + * Drop Bionic testing + * Fix authors/maintainers format in pyproject.toml + * Comment reminding to replace extras with depgroups + +------------------------------------------------------------------- Old: ---- bindep-2.13.0.tar.gz New: ---- bindep-2.14.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-bindep.spec ++++++ --- /var/tmp/diff_new_pack.9ZDBCw/_old 2026-04-01 19:51:50.632153327 +0200 +++ /var/tmp/diff_new_pack.9ZDBCw/_new 2026-04-01 19:51:50.640153660 +0200 @@ -28,7 +28,7 @@ %bcond_without libalternatives %{?sle15_python_module_pythons} Name: python-bindep%{psuffix} -Version: 2.13.0 +Version: 2.14.0 Release: 0 Summary: Binary dependency utility License: Apache-2.0 ++++++ bindep-2.13.0.tar.gz -> bindep-2.14.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/.zuul.yaml new/bindep-2.14.0/.zuul.yaml --- old/bindep-2.13.0/.zuul.yaml 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/.zuul.yaml 2026-03-19 15:56:35.000000000 +0100 @@ -31,8 +31,8 @@ - bindep-ubuntu-noble - build-python-release - nox-linters - - nox-py37: - nodeset: ubuntu-bionic + - nox-py38: + nodeset: ubuntu-focal - nox-py312: nodeset: ubuntu-noble - nox-cover @@ -42,8 +42,8 @@ - bindep-ubuntu-noble - build-python-release - nox-linters - - nox-py37: - nodeset: ubuntu-bionic + - nox-py38: + nodeset: ubuntu-focal - nox-py312: nodeset: ubuntu-noble - nox-cover diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/AUTHORS new/bindep-2.14.0/AUTHORS --- old/bindep-2.13.0/AUTHORS 2025-03-21 00:06:59.000000000 +0100 +++ new/bindep-2.14.0/AUTHORS 2026-03-19 15:57:59.000000000 +0100 @@ -7,6 +7,7 @@ Cody Lee Cochran <[email protected]> Cody Lee Cochran <[email protected]> Dan Smith <[email protected]> +David Shrewsbury <[email protected]> Dirk Mueller <[email protected]> Ehud Kaldor <[email protected]> Eric Harney <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/ChangeLog new/bindep-2.14.0/ChangeLog --- old/bindep-2.13.0/ChangeLog 2025-03-21 00:06:59.000000000 +0100 +++ new/bindep-2.14.0/ChangeLog 2026-03-19 15:57:59.000000000 +0100 @@ -1,6 +1,14 @@ CHANGES ======= +2.14.0 +------ + +* New exit code of 2 for input file parse errors +* Drop Bionic testing +* Fix authors/maintainers format in pyproject.toml +* Comment reminding to replace extras with depgroups + 2.13.0 ------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/PKG-INFO new/bindep-2.14.0/PKG-INFO --- old/bindep-2.13.0/PKG-INFO 2025-03-21 00:06:59.529117600 +0100 +++ new/bindep-2.14.0/PKG-INFO 2026-03-19 15:57:59.143607000 +0100 @@ -1,11 +1,8 @@ Metadata-Version: 2.4 Name: bindep -Version: 2.13.0 +Version: 2.14.0 Summary: Binary dependency utility -Author: OpenDev Contributors -Author-email: [email protected] -Maintainer: OpenDev Contributors -Maintainer-email: [email protected] +Author-email: OpenDev Contributors <[email protected]> Project-URL: Browse Source, https://opendev.org/opendev/bindep Project-URL: Bug Reporting, https://storyboard.openstack.org/#!/project/opendev/bindep Project-URL: Documentation, https://docs.opendev.org/opendev/bindep @@ -21,7 +18,6 @@ Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 @@ -33,7 +29,7 @@ Classifier: Topic :: Software Development :: Testing Classifier: Topic :: System :: Archiving :: Packaging Classifier: Topic :: Utilities -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: distro>=1.7 @@ -165,6 +161,15 @@ Comments are allowed: everything from the first ``#`` to the end of the line is ignored. +CLI Exit Codes +-------------- + +The `bindep` CLI will exit with one of the following integer values: + +* ``0``: Success - all dependencies satisfied or listing operations completed +* ``1``: File not found/reading errors OR missing/incompatible packages +* ``2``: Parse errors in the input fie + Examples -------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/README.rst new/bindep-2.14.0/README.rst --- old/bindep-2.13.0/README.rst 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/README.rst 2026-03-19 15:56:35.000000000 +0100 @@ -106,6 +106,15 @@ Comments are allowed: everything from the first ``#`` to the end of the line is ignored. +CLI Exit Codes +-------------- + +The `bindep` CLI will exit with one of the following integer values: + +* ``0``: Success - all dependencies satisfied or listing operations completed +* ``1``: File not found/reading errors OR missing/incompatible packages +* ``2``: Parse errors in the input fie + Examples -------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep/__main__.py new/bindep-2.14.0/bindep/__main__.py --- old/bindep-2.13.0/bindep/__main__.py 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/bindep/__main__.py 2026-03-19 15:56:35.000000000 +0100 @@ -22,8 +22,25 @@ import bindep.depends -logging.basicConfig( - stream=sys.stdout, level=logging.INFO, format="%(message)s") +def configure_logging(): + """Configure logging to send ERROR or higher to stderr.""" + class StdoutFilter(logging.Filter): + def filter(self, record): + return record.levelno < logging.ERROR + + stdout_handler = logging.StreamHandler(sys.stdout) + stdout_handler.setLevel(logging.INFO) + stdout_handler.addFilter(StdoutFilter()) + stdout_handler.setFormatter(logging.Formatter("%(message)s")) + + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.ERROR) + stderr_handler.setFormatter(logging.Formatter("%(message)s")) + + root_logger = logging.getLogger() + root_logger.setLevel(logging.INFO) + root_logger.addHandler(stdout_handler) + root_logger.addHandler(stderr_handler) def main(depends=None): @@ -52,10 +69,17 @@ '--version', action='version', version="%%(prog)s %s" % bindep.version) args = parser.parse_args() + configure_logging() + if depends is None: - depends = bindep.depends.get_depends( - args.filename, - default_blank=args.profiles) + try: + depends = bindep.depends.get_depends( + args.filename, + default_blank=args.profiles) + except bindep.depends.DependsException as e: + logging.error(e) + return 2 + if not depends: return 1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep/depends.py new/bindep-2.14.0/bindep/depends.py --- old/bindep-2.13.0/bindep/depends.py 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/bindep/depends.py 2026-03-19 15:56:35.000000000 +0100 @@ -64,6 +64,11 @@ PY3 = "base-py3" +class DependsException(Exception): + """Exception raised by Depends.""" + pass + + def get_depends(filename=None, default_blank=False): fd = get_depends_file(filename) if not fd: @@ -140,12 +145,17 @@ :param filename: The string name of the file from which requirements were loaded. """ + self.filename = filename + if not depends_string.endswith('\n'): # The parsley grammar expects each line to end with a newline depends_string += '\n' - parser = makeGrammar(grammar, {})(depends_string) - self._rules = parser.rules() - self.filename = filename + + try: + parser = makeGrammar(grammar, {})(depends_string) + self._rules = parser.rules() + except Exception as e: + raise DependsException(f"Requirements parsing error: {e}") def _partition(self, rule): """Separate conditions into platform and user profiles. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep/tests/test_depends.py new/bindep-2.14.0/bindep/tests/test_depends.py --- old/bindep-2.13.0/bindep/tests/test_depends.py 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/bindep/tests/test_depends.py 2026-03-19 15:56:35.000000000 +0100 @@ -24,7 +24,6 @@ import distro import fixtures -import ometa.runtime from testtools import ExpectedException from testtools.matchers import Contains from testtools.matchers import Equals @@ -39,6 +38,7 @@ from bindep.depends import Pacman from bindep.depends import Rpm from bindep.depends import Apk +from bindep.depends import DependsException # NOTE(notmorgan): In python3 subprocess.check_output returns bytes not @@ -541,8 +541,9 @@ depends.active_rules(["default"])) def test_parser_invalid(self): - self.assertRaises(ometa.runtime.ParseError, - lambda: Depends("foo [platform:bar@baz]\n")) + with ExpectedException(DependsException, + "Requirements parsing error:.*"): + Depends("foo [platform:bar@baz]\n") def test_platforms_include(self): # 9 tests for the nine cases of _include in Depends diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep/tests/test_main.py new/bindep-2.14.0/bindep/tests/test_main.py --- old/bindep-2.13.0/bindep/tests/test_main.py 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/bindep/tests/test_main.py 2026-03-19 15:56:35.000000000 +0100 @@ -15,9 +15,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging import os import subprocess import sys +from io import StringIO from textwrap import dedent from unittest import mock @@ -27,7 +29,7 @@ from fixtures import TempDir from testtools import TestCase -from bindep.__main__ import main +from bindep.__main__ import main, configure_logging class MainFixture(Fixture): @@ -206,3 +208,49 @@ result2 = subprocess.check_output( [sys.executable, "-m", "bindep", "--version"]) assert result == result2 + + def test_logging_split(self): + """Test logging to stdout and stderr. + + INFO|WARNING -> stdout + ERROR|CRITICAL -> stderr. + """ + stderr_capture = StringIO() + stdout_capture = StringIO() + + # Clear existing handlers + root_logger = logging.getLogger() + for handler in root_logger.handlers[:]: + root_logger.removeHandler(handler) + + # Patch sys.stdout and sys.stderr + with mock.patch('sys.stdout', stdout_capture), \ + mock.patch('sys.stderr', stderr_capture): + configure_logging() + logging.critical("Test critical message") + logging.error("Test error message") + logging.warning("Test warning message") + logging.info("Test info message") + + # Verify output routing + stderr_out = stderr_capture.getvalue() + stdout_out = stdout_capture.getvalue() + + # stderr + self.assertIn("Test critical message\n", stderr_out) + self.assertIn("Test error message\n", stderr_out) + # stdout + self.assertIn("Test warning message\n", stdout_out) + self.assertIn("Test info message\n", stdout_out) + + def test_invalid_syntax_returns_exit_code_2(self): + """Test that parsing errors return exit code 2.""" + fixture = self.useFixture(MainFixture()) + self.useFixture(MonkeyPatch('sys.argv', ['bindep'])) + + # Create file with invalid syntax + with open(fixture.path + '/bindep.txt', 'wt') as f: + f.write('foo [platform:bar@baz]\n') + + self.assertEqual(2, main()) + self.assertIn("Requirements parsing error:", fixture.logger.output) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep.egg-info/PKG-INFO new/bindep-2.14.0/bindep.egg-info/PKG-INFO --- old/bindep-2.13.0/bindep.egg-info/PKG-INFO 2025-03-21 00:06:59.000000000 +0100 +++ new/bindep-2.14.0/bindep.egg-info/PKG-INFO 2026-03-19 15:57:59.000000000 +0100 @@ -1,11 +1,8 @@ Metadata-Version: 2.4 Name: bindep -Version: 2.13.0 +Version: 2.14.0 Summary: Binary dependency utility -Author: OpenDev Contributors -Author-email: [email protected] -Maintainer: OpenDev Contributors -Maintainer-email: [email protected] +Author-email: OpenDev Contributors <[email protected]> Project-URL: Browse Source, https://opendev.org/opendev/bindep Project-URL: Bug Reporting, https://storyboard.openstack.org/#!/project/opendev/bindep Project-URL: Documentation, https://docs.opendev.org/opendev/bindep @@ -21,7 +18,6 @@ Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 @@ -33,7 +29,7 @@ Classifier: Topic :: Software Development :: Testing Classifier: Topic :: System :: Archiving :: Packaging Classifier: Topic :: Utilities -Requires-Python: >=3.7 +Requires-Python: >=3.8 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: distro>=1.7 @@ -165,6 +161,15 @@ Comments are allowed: everything from the first ``#`` to the end of the line is ignored. +CLI Exit Codes +-------------- + +The `bindep` CLI will exit with one of the following integer values: + +* ``0``: Success - all dependencies satisfied or listing operations completed +* ``1``: File not found/reading errors OR missing/incompatible packages +* ``2``: Parse errors in the input fie + Examples -------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep.egg-info/SOURCES.txt new/bindep-2.14.0/bindep.egg-info/SOURCES.txt --- old/bindep-2.13.0/bindep.egg-info/SOURCES.txt 2025-03-21 00:06:59.000000000 +0100 +++ new/bindep-2.14.0/bindep.egg-info/SOURCES.txt 2026-03-19 15:57:59.000000000 +0100 @@ -56,6 +56,7 @@ doc/source/releasenotes.rst doc/source/usage.rst playbooks/bindep/run.yaml +releasenotes/notes/add-exit-code-on-parse-error-3d937acaa4ccc013.yaml releasenotes/notes/almalinux-154befa793559c61.yaml releasenotes/notes/apk-error-handling-94d6910226a770f2.yaml releasenotes/notes/as-module-b07f9bf5c220d3e5.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/bindep.egg-info/pbr.json new/bindep-2.14.0/bindep.egg-info/pbr.json --- old/bindep-2.13.0/bindep.egg-info/pbr.json 2025-03-21 00:06:59.000000000 +0100 +++ new/bindep-2.14.0/bindep.egg-info/pbr.json 2026-03-19 15:57:59.000000000 +0100 @@ -1 +1 @@ -{"git_version": "09f16f6", "is_release": true} \ No newline at end of file +{"git_version": "9a97635", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/noxfile.py new/bindep-2.14.0/noxfile.py --- old/bindep-2.13.0/noxfile.py 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/noxfile.py 2026-03-19 15:56:35.000000000 +0100 @@ -11,12 +11,14 @@ # version using --force-python. @nox.session(python="3") def linters(session): + # TODO: switch to a dependency group after Python 3.8 support is dropped session.install(".[test-linters]") session.run("flake8") @nox.session(python="3") def docs(session): + # TODO: switch to a dependency group after Python 3.8 support is dropped session.install(".[build-docs]") session.run( "sphinx-build", "-W", @@ -28,6 +30,7 @@ @nox.session(python="3") def venv(session): + # TODO: switch to a dependency group after Python 3.8 support is dropped session.install("-e", ".[test-unit]") session.run(*session.posargs) @@ -35,6 +38,7 @@ # This will attempt to run python3 tests by default. @nox.session(python=["3"]) def tests(session): + # TODO: switch to a dependency group after Python 3.8 support is dropped session.install("-e", ".[test-unit]") session.run("stestr", "run", *session.posargs) session.run("stestr", "slowest") @@ -42,6 +46,7 @@ @nox.session(python="3") def cover(session): + # TODO: switch to a dependency group after Python 3.8 support is dropped session.install("-e", ".[test-cover]") session.env["PYTHON"] = "coverage run --source bindep --parallel-mode" session.run("stestr", "run", *session.posargs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/pyproject.toml new/bindep-2.14.0/pyproject.toml --- old/bindep-2.13.0/pyproject.toml 2025-03-21 00:05:42.000000000 +0100 +++ new/bindep-2.14.0/pyproject.toml 2026-03-19 15:56:35.000000000 +0100 @@ -4,8 +4,7 @@ [project] authors = [ - {email = "[email protected]"}, - {name = "OpenDev Contributors"}, + {name = "OpenDev Contributors", email = "[email protected]"}, ] classifiers = [ "Development Status :: 5 - Production/Stable", @@ -16,7 +15,6 @@ "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", @@ -45,16 +43,14 @@ "distro", "package", ] -# TODO: Add 'license-expression = "Apache-2.0"' here and drop the License -# classifier once https://github.com/pypa/setuptools/issues/4629 is resolved. -maintainers = [ - {email = "[email protected]"}, - {name = "OpenDev Contributors"}, -] +# TODO: Add 'license = "Apache-2.0"' here and drop the License classifier above +# once support for Python 3.8 is dropped (requires SetupTools>=77). name = "bindep" readme = {charset = "UTF-8", content-type = "text/x-rst", file = "README.rst"} -requires-python = ">=3.7" +requires-python = ">=3.8" +# TODO: replace these with PEP 735 compliant dependency groups once support for +# Python 3.8 is dropped (requires pip>=25.1). [project.optional-dependencies] build-docs = [ # needed because we use autodoc to document our tests in the dev docs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/bindep-2.13.0/releasenotes/notes/add-exit-code-on-parse-error-3d937acaa4ccc013.yaml new/bindep-2.14.0/releasenotes/notes/add-exit-code-on-parse-error-3d937acaa4ccc013.yaml --- old/bindep-2.13.0/releasenotes/notes/add-exit-code-on-parse-error-3d937acaa4ccc013.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/bindep-2.14.0/releasenotes/notes/add-exit-code-on-parse-error-3d937acaa4ccc013.yaml 2026-03-19 15:56:35.000000000 +0100 @@ -0,0 +1,4 @@ +--- +features: + - | + A new exit code (2) is added to the CLI when a parse error occurs from the input file.
