diff --git a/0001-Fix-compatibility-with-setuptools-66.patch b/0001-Fix-compatibility-with-setuptools-66.patch new file mode 100644 index 0000000000000000000000000000000000000000..9f167058f40c4200259004ea303050b3e1841ec0 --- /dev/null +++ b/0001-Fix-compatibility-with-setuptools-66.patch @@ -0,0 +1,163 @@ +From 93acddd5f9c40a707cf5eb1b86d8dd6a3f69c695 Mon Sep 17 00:00:00 2001 +Message-Id: <93acddd5f9c40a707cf5eb1b86d8dd6a3f69c695.1686949946.git.ce+ubuntuone@sicherha.de> +From: Christoph Erhardt +Date: Sun, 30 Apr 2023 11:18:15 +0200 +Subject: [PATCH] Fix compatibility with setuptools >= 66 + +The Python world, including the `setuptools` package, has migrated to +the versioning scheme defined in PEP 440. Unfortunately, the versioning +of Jenkins plugins is less strict than that. As a consequence, +`pkg_resources.parse_version()` now rejects versions as invalid. + +Fix `PluginVersion` by salvaging the implementation of the old +`LegacyVersion` class, which used to be part of the `packaging` library +prior to version 22.0. The code is licensed under a 2-clause BSD +licence. + +For compatibility with older Python versions, remove type annotations +from the copied code. + +Change-Id: Iaa057dcd81620fed861cb11bed534ff7f9ab3f32 +Signed-off-by: Christoph Erhardt +--- + jenkins/plugins.py | 97 +++++++++++++++++++++++++++++++++++++++++++--- + requirements.txt | 2 - + 2 files changed, 91 insertions(+), 8 deletions(-) + +diff --git a/jenkins/plugins.py b/jenkins/plugins.py +index 9709d5d..cdaada9 100644 +--- a/jenkins/plugins.py ++++ b/jenkins/plugins.py +@@ -42,8 +42,6 @@ + import operator + import re + +-import pkg_resources +- + + class Plugin(dict): + '''Dictionary object containing plugin metadata.''' +@@ -76,15 +74,13 @@ class PluginVersion(str): + '''Parse plugin version and store it for comparison.''' + + self._version = version +- self.parsed_version = pkg_resources.parse_version( +- self.__convert_version(version)) ++ self._key = _legacy_cmpkey(self.__convert_version(version)) + + def __convert_version(self, version): + return self._VERSION_RE.sub(r'\g<1>.preview', str(version)) + + def __compare(self, op, version): +- return op(self.parsed_version, pkg_resources.parse_version( +- self.__convert_version(version))) ++ return op(self._key, PluginVersion(version)._key) + + def __le__(self, version): + return self.__compare(operator.le, version) +@@ -109,3 +105,92 @@ class PluginVersion(str): + + def __repr__(self): + return str(self._version) ++ ++ ++############################################################################### ++""" ++The Python world has migrated to the versioning scheme defined in PEP 440, but ++the versioning of Jenkins plugins is less strict than that. The code below was ++salvaged from the implementation of the `LegacyVersion` class, which used to be ++part of the `packaging` library prior to version 22.0. ++ ++It is licensed as follows. ++ ++Copyright (c) Donald Stufft and individual contributors. ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++ 1. Redistributions of source code must retain the above copyright notice, ++ this list of conditions and the following disclaimer. ++ ++ 2. Redistributions in binary form must reproduce the above copyright ++ notice, this list of conditions and the following disclaimer in the ++ documentation and/or other materials provided with the distribution. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++""" ++ ++_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE) ++ ++_legacy_version_replacement_map = { ++ "pre": "c", ++ "preview": "c", ++ "-": "final-", ++ "rc": "c", ++ "dev": "@", ++} ++ ++ ++def _parse_version_parts(s): ++ for part in _legacy_version_component_re.split(s): ++ part = _legacy_version_replacement_map.get(part, part) ++ ++ if not part or part == ".": ++ continue ++ ++ if part[:1] in "0123456789": ++ # pad for numeric comparison ++ yield part.zfill(8) ++ else: ++ yield "*" + part ++ ++ # ensure that alpha/beta/candidate are before final ++ yield "*final" ++ ++ ++def _legacy_cmpkey(version): ++ ++ # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch ++ # greater than or equal to 0. This will effectively put the LegacyVersion, ++ # which uses the defacto standard originally implemented by setuptools, ++ # as before all PEP 440 versions. ++ epoch = -1 ++ ++ # This scheme is taken from pkg_resources.parse_version setuptools prior to ++ # it's adoption of the packaging library. ++ parts = [] ++ for part in _parse_version_parts(version.lower()): ++ if part.startswith("*"): ++ # remove "-" before a prerelease tag ++ if part < "*final": ++ while parts and parts[-1] == "*final-": ++ parts.pop() ++ ++ # remove trailing zeros from each series of numeric parts ++ while parts and parts[-1] == "00000000": ++ parts.pop() ++ ++ parts.append(part) ++ ++ return epoch, tuple(parts) +diff --git a/requirements.txt b/requirements.txt +index da41145..5c014cc 100644 +--- a/requirements.txt ++++ b/requirements.txt +@@ -1,5 +1,3 @@ +-# Setuptools removed support for PEP 440 non-conforming versions +-setuptools<66 + six>=1.3.0 + pbr>=0.8.2 + multi_key_dict +-- +2.40.1 + diff --git a/bugfix_function_loss.patch b/bugfix_function_loss.patch deleted file mode 100644 index 1ccd21b709a2266667fa255f46e7c3bc271c55f4..0000000000000000000000000000000000000000 --- a/bugfix_function_loss.patch +++ /dev/null @@ -1,10 +0,0 @@ -diff -Nur python-jenkins-1.7.0_old/setup.py python-jenkins-1.7.0/setup.py ---- python-jenkins-1.7.0_old/setup.py 2021-08-20 10:10:28.910000000 +0800 -+++ python-jenkins-1.7.0/setup.py 2020-03-04 11:06:09.000000000 +0800 -@@ -1,3 +1,5 @@ - import setuptools - --setuptools.setup() -+setuptools.setup( -+ setup_requires=['pbr'], -+ pbr=True) diff --git a/python-jenkins-1.7.0.tar.gz b/python-jenkins-1.7.0.tar.gz deleted file mode 100644 index a376e68cfd3d11c5d199d0276fec693e73c29b3a..0000000000000000000000000000000000000000 Binary files a/python-jenkins-1.7.0.tar.gz and /dev/null differ diff --git a/python-jenkins-1.8.0.tar.gz b/python-jenkins-1.8.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bc4525568483336f5d9d3ebe713fd4a6e26e9420 Binary files /dev/null and b/python-jenkins-1.8.0.tar.gz differ diff --git a/python-jenkins.spec b/python-jenkins.spec index 099e9a16d838487edda55737aefe8ca10a4bade0..ecc34aaada20e8a197984751f078443825340c74 100644 --- a/python-jenkins.spec +++ b/python-jenkins.spec @@ -1,13 +1,15 @@ Name: python-jenkins -Version: 1.7.0 -Release: 3 +Version: 1.8.0 +Release: 1 Summary: Python bindings for the remote Jenkins API -License: BSD +License: BSD-3-Clause URL: http://git.openstack.org/cgit/openstack/python-jenkins -Source0: https://files.pythonhosted.org/packages/85/8e/52223d8eebe35a3d86579df49405f096105328a9d80443eaed809f6c374f/python-jenkins-1.7.0.tar.gz -Patch1: bugfix_function_loss.patch +Source0: https://files.pythonhosted.org/packages/93/2e/8120831ac693483e3ac878c2f1c6bb3535dabb247b4a93117bb2da3b09f8/python-jenkins-1.8.0.tar.gz +# Contributed at https://review.opendev.org/c/jjb/python-jenkins/+/881904 +Patch0: 0001-Fix-compatibility-with-setuptools-66.patch BuildRequires: python3-sphinx +BuildRequires: make BuildArch: noarch %description @@ -47,7 +49,7 @@ build nodes. %prep -%autosetup -n python-jenkins-1.7.0 -p1 +%autosetup -p1 -n %{name}-%{version} # Remove env from __init__.py sed -i '1{s|^#!/usr/bin/env python||}' jenkins/__init__.py @@ -85,6 +87,9 @@ install -D -m0644 -p doc/build/man/pythonjenkins.1 %{buildroot}%{_mandir}/man1/p %changelog +* Wed Aug 23 2023 jiangxinyu - 1.8.0-1 +- Update package to version 1.8.0 + * Tue Jun 28 2022 wangkai -1.7.0-3 - Remove buildrequires python-nose