You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by tv...@apache.org on 2022/08/17 08:08:30 UTC

[buildstream] 04/06: Mark unstable BuildStream releases with PEP440-compatible postfix

This is an automated email from the ASF dual-hosted git repository.

tvb pushed a commit to branch tristan/build-wheels
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 8dd3c2d8191b67d47ae720f6d38dda56eb323d53
Author: Sam Thursfield <sa...@codethink.co.uk>
AuthorDate: Fri Aug 12 12:22:55 2022 +0200

    Mark unstable BuildStream releases with PEP440-compatible postfix
    
    PyPI and Pip use the PEP440 version standard, which uses explicit
    '.dev', '.a', '.b' and '.rc' suffixes to mark "unstable" releases.
    
    BuildStream uses the even/odd convention. When running `pip install`
    we want Pip to prefer a stable 2.0.0 release over an unstable 2.1.0
    release. To make this work, all unstable releases now have a .dev0
    suffix automatically added in setup.py, e.g. `2.1.0.dev0`.
    
    This is necessary for us to fully automate releases to PyPI from GitHub
    Actions.
---
 pyproject.toml |  3 ++-
 setup.cfg      |  2 +-
 setup.py       | 42 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/pyproject.toml b/pyproject.toml
index f3eadb7af..ea9f0df05 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,8 @@ requires = [
     "setuptools>=36.6.0",
     # In order to build wheels, and as required by PEP 517
     "wheel",
-    "Cython"
+    "Cython",
+    "packaging",
 ]
 build-backend = "setuptools.build_meta"
 
diff --git a/setup.cfg b/setup.cfg
index aea4bdcc8..d220e3952 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,6 +1,6 @@
 [versioneer]
 VCS = git
-style = pep440
+style = pep440_buildstream
 versionfile_source = src/buildstream/_version.py
 versionfile_build = buildstream/_version.py
 tag_prefix =
diff --git a/setup.py b/setup.py
index 820b0588c..d118e516c 100755
--- a/setup.py
+++ b/setup.py
@@ -23,6 +23,8 @@ from pathlib import Path
 import re
 import sys
 
+import packaging.version
+
 
 ###################################
 # Ensure we have a version number #
@@ -32,11 +34,49 @@ import sys
 sys.path.append(os.path.dirname(__file__))
 import versioneer  # pylint: disable=wrong-import-position
 
+
+def mark_unstable_version(version_string):
+    # When publishing to PyPI we must be sure that unstable releases are
+    # marked as such, so `pip install` doesn't install them by default.
+
+    v = packaging.version.parse(version_string)
+
+    # BuildStream version scheme: if MINOR version is odd, then
+    # this is an unstable release.
+    is_unstable_release = v.minor % 2 != 0
+
+    # Python PEP440 version scheme: use an explicit postfix to mark development
+    # and prereleases.
+    if is_unstable_release:
+        if v.local or v.is_devrelease or v.is_prerelease:
+            # PyPI will ignore these without us marking them.
+            return version_string
+        else:
+            return version_string + ".dev0"
+
+    return version_string
+
+
+# Extend versioneer to support our custom version style.
+_render = versioneer.render
+
+
+def render_version(pieces, style):
+    if style == "pep440_buildstream":
+        result = _render(pieces, "pep440")
+        result["version"] = mark_unstable_version(result["version"])
+    else:
+        result = _render(pieces, style)
+    return result
+
+
+versioneer.render = render_version
+
 version = versioneer.get_version()
 
 if version.startswith("0+untagged"):
     print(
-        "Your git repository has no tags - BuildStream can't " "determine its version. Please run `git fetch --tags`.",
+        "Your git repository has no tags - BuildStream can't determine its version. Please run `git fetch --tags`.",
         file=sys.stderr,
     )
     sys.exit(1)