From cddfe346f8338a9bddaabeb7feb8c8384eadf27b206c2cf4226eab0f3f704353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Chv=C3=A1tal?= Date: Thu, 12 Sep 2019 17:33:17 +0000 Subject: [PATCH] - Add patch to fix build with new semantic versioning: * semanticversioning.patch OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-releases?expand=0&rev=9 --- python-releases.changes | 6 ++ python-releases.spec | 16 ++--- semanticversioning.patch | 143 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 semanticversioning.patch diff --git a/python-releases.changes b/python-releases.changes index 96a7cc9..8b76ddb 100644 --- a/python-releases.changes +++ b/python-releases.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Sep 12 17:30:04 UTC 2019 - Tomáš Chvátal + +- Add patch to fix build with new semantic versioning: + * semanticversioning.patch + ------------------------------------------------------------------- Wed Aug 29 08:28:17 UTC 2018 - tchvatal@suse.com diff --git a/python-releases.spec b/python-releases.spec index 29a4fec..4a841c0 100644 --- a/python-releases.spec +++ b/python-releases.spec @@ -1,7 +1,7 @@ # -# spec file for package python-releases +# spec file for package python # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,22 +12,20 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %global flavor @BUILD_FLAVOR@%{nil} %{?!python_module:%define python_module() python-%{**} python3-%{**}} %if "%{flavor}" == "test" +%define psuffix -%{flavor} %bcond_without test %else +%define psuffix %{nil} %bcond_with test %endif -%if %{with test} -Name: python-releases-%{flavor} -%else -Name: python-releases -%endif +Name: python-releases%{psuffix} Version: 1.6.1 Release: 0 Summary: A Sphinx extension for changelog manipulation @@ -35,6 +33,7 @@ License: BSD-2-Clause Group: Development/Languages/Python URL: https://github.com/bitprophet/releases Source: https://files.pythonhosted.org/packages/source/r/releases/releases-%{version}.tar.gz +Patch0: semanticversioning.patch BuildRequires: %{python_module setuptools} BuildRequires: fdupes BuildRequires: python-rpm-macros @@ -72,6 +71,7 @@ Specifically: %prep %setup -q -n releases-%{version} +%patch0 -p1 %build %python_build diff --git a/semanticversioning.patch b/semanticversioning.patch new file mode 100644 index 0000000..2aeff52 --- /dev/null +++ b/semanticversioning.patch @@ -0,0 +1,143 @@ +From 8787236dffb7383427b3e1448ece9a5b3eaf5257 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rapha=C3=ABl=20Barrois?= +Date: Sun, 8 Sep 2019 00:18:00 +0200 +Subject: [PATCH] Fix usage of semanticversion to intended API. + +The recent versions of python-semanticversion made changes to private +APIs, removing the interaction between `Version(x, partial=True)` and +`Spec()` (`partial=True` was designed for implementing the `Spec` class +only) + +The code used these classes to exclude ranges of version whose major +component didn't match a bugfix/issue range; the code went akin to: + + Version('1', partial=True) in Spec('>=1.0') + +This no longer works; this patch changes that behaviour to exclude +families where no actual release matches the bugfix/issue range - this +should be more accurate. + +The patch also uses `Version.coerce`, the intended API to manage +non semver-compliant version strings. + +The patch has been tested with both python-semanticversion==2.6.0 and +python-semanticversion==2.8.1; it can be included to an upgraded version +of `releases` even if users haven't yet upgraded python-semanticversion. +--- + releases/__init__.py | 2 +- + releases/models.py | 54 ++++++++++++++++++++++++-------------------- + 2 files changed, 30 insertions(+), 26 deletions(-) + +diff --git a/releases/__init__.py b/releases/__init__.py +index 3c73f0b..48fc5f5 100644 +--- a/releases/__init__.py ++++ b/releases/__init__.py +@@ -426,7 +426,7 @@ def handle_upcoming_major_release(entries, manager): + # to the line manager! + for obj in next_releases: + # TODO: update when Release gets tied closer w/ Version +- version = Version(obj.number) ++ version = Version.coerce(obj.number) + if version.minor == 0 and version.patch == 0: + manager.add_family(obj.family) + +diff --git a/releases/models.py b/releases/models.py +index d980e9c..0517174 100644 +--- a/releases/models.py ++++ b/releases/models.py +@@ -2,18 +2,10 @@ + from operator import xor + + from docutils import nodes +-from semantic_version import Version as StrictVersion, Spec ++from semantic_version import Version, Spec + import six + + +-class Version(StrictVersion): +- """ +- Version subclass toggling ``partial=True`` by default. +- """ +- def __init__(self, version_string, partial=True): +- super(Version, self).__init__(version_string, partial) +- +- + # Issue type list (keys) + color values + ISSUE_TYPES = { + 'bug': 'A04040', +@@ -122,7 +114,7 @@ def default_spec(self, manager): + buckets = self.minor_releases(manager) + if buckets: + specstr = ">={}".format(max(buckets)) +- return Spec(specstr) if specstr else Spec() ++ return Spec(specstr) if specstr else Spec('*') + + def add_to_manager(self, manager): + """ +@@ -130,32 +122,43 @@ def add_to_manager(self, manager): + """ + # Derive version spec allowing us to filter against major/minor buckets + spec = self.spec or self.default_spec(manager) +- # Only look in appropriate major version/family; if self is an issue +- # declared as living in e.g. >=2, this means we don't even bother +- # looking in the 1.x family. +- families = [Version(str(x)) for x in manager] +- versions = list(spec.filter(families)) +- for version in versions: +- family = version.major +- # Within each family, we further limit which bugfix lines match up +- # to what self cares about (ignoring 'unreleased' until later) +- candidates = [ +- Version(x) ++ ++ # Browse through families, adding us to every line we match. ++ for family in manager: ++ # Map changelog keys to Version objects, keeping a link ++ # to the original text ++ versions = { ++ Version.coerce(x): x + for x in manager[family] + if not x.startswith('unreleased') +- ] +- # Select matching release lines (& stringify) ++ } ++ ++ # Bail out if no listed version (included pending feature/bugfix) ++ # match self.spec: if self is an issue for >=2, don't look ++ # at the 1.x family. If self is an issue for >=1.0, include it ++ # in the 1.x family even if no 1.0 release exists yet. ++ candidates = list(spec.filter(versions)) ++ # Also compare the first release in the family, for cases ++ # where no release has been performed yet. ++ if not candidates and Version.coerce(str(family)) not in spec: ++ continue ++ ++ # `buckets` has the list of line families + buckets = [] +- bugfix_buckets = [str(x) for x in spec.filter(candidates)] ++ bugfix_buckets = candidates + # Add back in unreleased_* as appropriate + # TODO: probably leverage Issue subclasses for this eventually? + if self.is_buglike: +- buckets.extend(bugfix_buckets) ++ # Convert back Version() to line ++ buckets.extend([ ++ versions[bucket] for bucket in bugfix_buckets ++ ]) + # Don't put into JUST unreleased_bugfix; it implies that this + # major release/family hasn't actually seen any releases yet + # and only exists for features to go into. + if bugfix_buckets: + buckets.append('unreleased_bugfix') ++ + # Obtain list of minor releases to check for "haven't had ANY + # releases yet" corner case, in which case ALL issues get thrown in + # unreleased_feature for the first release to consume. +@@ -164,6 +167,7 @@ def add_to_manager(self, manager): + no_releases = not self.minor_releases(manager) + if self.is_featurelike or self.backported or no_releases: + buckets.append('unreleased_feature') ++ + # Now that we know which buckets are appropriate, add ourself to + # all of them. TODO: or just...do it above...instead... + for bucket in buckets: