diff options
author | Jim Mussared <jim.mussared@gmail.com> | 2023-10-04 11:20:47 +1100 |
---|---|---|
committer | Jim Mussared <jim.mussared@gmail.com> | 2023-10-06 12:10:14 +1100 |
commit | 69e34b6b6bdf45bc1111777c46839a8b5fcb30bd (patch) | |
tree | 757623344e1f4a4004234f93d7541c1d9472fdfa /py/makeversionhdr.py | |
parent | e00a144008f368df878c12606fdbf651af2a1dc0 (diff) | |
download | micropython-69e34b6b6bdf45bc1111777c46839a8b5fcb30bd.tar.gz micropython-69e34b6b6bdf45bc1111777c46839a8b5fcb30bd.zip |
all: Switch to new preview build versioning scheme.v1.22.0-preview
See https://github.com/micropython/micropython/issues/12127 for details.
Previously at the point when a release is made, we update mpconfig.h
and set a git tag. i.e. the version increments at the release.
Now the version increments immediately after the release. The workflow is:
1. Final commit in the cycle updates mpconfig.h to set (X, Y, 0, 0) (i.e.
clear the pre-release state).
2. This commit is tagged "vX.Y.0".
3. First commit for the new cycle updates mpconfig.h to set (X, Y+1, 0, 1)
(i.e. increment the minor version, set the pre-release state).
4. This commit is tagged "vX.Y+1.0-preview".
The idea is that a nightly build is actually a "preview" of the _next_
release. i.e. any documentation describing the current release may not
actually match the nightly build. So we use "preview" as our semver
pre-release identifier.
Changes in this commit:
- Add MICROPY_VERSION_PRERELEASE to mpconfig.h to allow indicating that
this is not a release version.
- Remove unused MICROPY_VERSION integer.
- Append "-preview" to MICROPY_VERSION_STRING when the pre-release state
is set.
- Update py/makeversionhdr.py to no longer generate MICROPY_GIT_HASH.
- Remove the one place MICROPY_GIT_HASH was used (it can use
MICROPY_GIT_TAG instead).
- Update py/makeversionhdr.py to also understand
MICROPY_VERSION_PRERELEASE in mpconfig.h.
- Update py/makeversionhdr.py to convert the git-describe output into
semver-compatible "X.Y.Z-preview.N.gHASH".
- Update autobuild.sh to generate filenames using the new scheme.
- Update remove_old_firmware.py to match new scheme.
- Update mpremote's pyproject.toml to handle the "-preview" suffix in the
tag. setuptools_scm maps to this "rc0" to match PEP440.
- Fix docs heading where it incorrectly said "vvX.Y.Z" for release docs.
This work was funded through GitHub Sponsors.
Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
Diffstat (limited to 'py/makeversionhdr.py')
-rw-r--r-- | py/makeversionhdr.py | 91 |
1 files changed, 46 insertions, 45 deletions
diff --git a/py/makeversionhdr.py b/py/makeversionhdr.py index e682a4e139..2030bb02c4 100644 --- a/py/makeversionhdr.py +++ b/py/makeversionhdr.py @@ -13,6 +13,14 @@ import datetime import subprocess +# The MicroPython repository tags a release commit as "vX.Y.Z", and the commit +# immediately following as "vX.(Y+1).Z-preview". +# This function will return: +# "vX.Y.Z" -- building at the release commit +# "vX.Y.Z-preview" -- building at the first commit in the next cycle +# "vX.Y.Z-preview.N.gHASH" -- building at any subsequent commit in the cycle +# "vX.Y.Z-preview.N.gHASH.dirty" -- building at any subsequent commit in the cycle +# with local changes def get_version_info_from_git(repo_path): # Python 2.6 doesn't have check_output, so check for that try: @@ -29,47 +37,33 @@ def get_version_info_from_git(repo_path): stderr=subprocess.STDOUT, universal_newlines=True, ).strip() - except subprocess.CalledProcessError as er: - if er.returncode == 128: - # git exit code of 128 means no repository found - return None - git_tag = "" - except OSError: - return None - try: - git_hash = subprocess.check_output( - ["git", "rev-parse", "--short", "HEAD"], - cwd=repo_path, - stderr=subprocess.STDOUT, - universal_newlines=True, - ).strip() + # Turn git-describe's output into semver compatible (dot-separated + # identifiers inside the prerelease field). + git_tag = git_tag.split("-", 1) + if len(git_tag) == 1: + return git_tag[0] + else: + return git_tag[0] + "-" + git_tag[1].replace("-", ".") except subprocess.CalledProcessError: - git_hash = "unknown" - except OSError: return None - - try: - # Check if there are any modified files. - subprocess.check_call( - ["git", "diff", "--no-ext-diff", "--quiet", "--exit-code"], - cwd=repo_path, - stderr=subprocess.STDOUT, - ) - # Check if there are any staged files. - subprocess.check_call( - ["git", "diff-index", "--cached", "--quiet", "HEAD", "--"], - cwd=repo_path, - stderr=subprocess.STDOUT, - ) - except subprocess.CalledProcessError: - git_hash += "-dirty" except OSError: return None - return git_tag, git_hash - +# When building from a source tarball (or any situation where the git repo +# isn't available), this function will use the info in mpconfig.h as a +# fallback. The release commit sets MICROPY_VERSION_PRERELEASE to 0, and the +# commit immediately following increments MICROPY_VERSION_MINOR and sets +# MICROPY_VERSION_PRERELEASE back to 1. +# This function will return: +# "vX.Y.Z" -- building at the release commit +# "vX.Y.Z-preview" -- building at any other commit def get_version_info_from_mpconfig(repo_path): + print( + "makeversionhdr.py: Warning: No git repo or tag info available, falling back to mpconfig.h version info.", + file=sys.stderr, + ) + with open(os.path.join(repo_path, "py", "mpconfig.h")) as f: for line in f: if line.startswith("#define MICROPY_VERSION_MAJOR "): @@ -78,21 +72,30 @@ def get_version_info_from_mpconfig(repo_path): ver_minor = int(line.strip().split()[2]) elif line.startswith("#define MICROPY_VERSION_MICRO "): ver_micro = int(line.strip().split()[2]) - git_tag = "v%d.%d.%d" % (ver_major, ver_minor, ver_micro) - return git_tag, "<no hash>" + elif line.startswith("#define MICROPY_VERSION_PRERELEASE "): + ver_prerelease = int(line.strip().split()[2]) + git_tag = "v%d.%d.%d%s" % ( + ver_major, + ver_minor, + ver_micro, + "-preview" if ver_prerelease else "", + ) + return git_tag return None def make_version_header(repo_path, filename): - info = None + git_tag = None if "MICROPY_GIT_TAG" in os.environ: - info = [os.environ["MICROPY_GIT_TAG"], os.environ["MICROPY_GIT_HASH"]] - if info is None: - info = get_version_info_from_git(repo_path) - if info is None: - info = get_version_info_from_mpconfig(repo_path) + git_tag = os.environ["MICROPY_GIT_TAG"] + if git_tag is None: + git_tag = get_version_info_from_git(repo_path) + if git_tag is None: + git_tag = get_version_info_from_mpconfig(repo_path) - git_tag, git_hash = info + if not git_tag: + print("makeversionhdr.py: Error: No version information available.") + sys.exit(1) build_date = datetime.date.today() if "SOURCE_DATE_EPOCH" in os.environ: @@ -104,11 +107,9 @@ def make_version_header(repo_path, filename): file_data = """\ // This file was generated by py/makeversionhdr.py #define MICROPY_GIT_TAG "%s" -#define MICROPY_GIT_HASH "%s" #define MICROPY_BUILD_DATE "%s" """ % ( git_tag, - git_hash, build_date.strftime("%Y-%m-%d"), ) |