diff options
Diffstat (limited to 'circuitpython/py/makeversionhdr.py')
-rw-r--r-- | circuitpython/py/makeversionhdr.py | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/circuitpython/py/makeversionhdr.py b/circuitpython/py/makeversionhdr.py new file mode 100644 index 0000000..29abcd9 --- /dev/null +++ b/circuitpython/py/makeversionhdr.py @@ -0,0 +1,129 @@ +""" +Generate header file with macros defining MicroPython version info. + +This script works with Python 3.7 and newer +""" + +from __future__ import print_function + +import sys +import os +import pathlib +import datetime +import subprocess + +tools_describe = str(pathlib.Path(__file__).parent.parent / "tools/describe") + + +def get_version_info_from_git(): + # Note: git describe doesn't work if no tag is available + try: + git_tag = subprocess.check_output( + [tools_describe], stderr=subprocess.STDOUT, universal_newlines=True, shell=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 as e: + return None + try: + git_hash = subprocess.check_output( + ["git", "rev-parse", "--short", "HEAD"], + stderr=subprocess.STDOUT, + universal_newlines=True, + ).strip() + 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"], stderr=subprocess.STDOUT + ) + # Check if there are any staged files. + subprocess.check_call( + ["git", "diff-index", "--cached", "--quiet", "HEAD", "--"], stderr=subprocess.STDOUT + ) + except subprocess.CalledProcessError: + git_hash += "-dirty" + except OSError: + return None + + # Try to extract MicroPython version from git tag + ver = git_tag.split("-")[0].split(".") + + return git_tag, git_hash, ver + + +def get_version_info_from_docs_conf(): + with open(os.path.join(os.path.dirname(sys.argv[0]), "..", "conf.py")) as f: + for line in f: + if line.startswith("version = release = '"): + ver = line.strip().split(" = ")[2].strip("'") + git_tag = "v" + ver + ver = ver.split(".") + if len(ver) == 2: + ver.append("0") + return git_tag, "<no hash>", ver + return None + + +def make_version_header(filename): + # Get version info using git, with fallback to docs/conf.py + info = get_version_info_from_git() + if info is None: + info = get_version_info_from_docs_conf() + + git_tag, git_hash, ver = "7.3.0", "d0953e8f845a7544a27bea92bbcd533f0a84d493", "7.3.0" + if len(ver) < 3: + ver = ("0", "0", "0") + version_string = git_hash + else: + version_string = ".".join(ver) + + build_date = datetime.date.today() + if "SOURCE_DATE_EPOCH" in os.environ: + build_date = datetime.datetime.utcfromtimestamp( + int(os.environ["SOURCE_DATE_EPOCH"]) + ).date() + + # Generate the file with the git and version info + 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" +#define MICROPY_VERSION_MAJOR (%s) +#define MICROPY_VERSION_MINOR (3) +#define MICROPY_VERSION_MICRO (%s) +#define MICROPY_VERSION_STRING "%s" +#define MICROPY_FULL_VERSION_INFO "Adafruit CircuitPython " MICROPY_GIT_TAG " on " MICROPY_BUILD_DATE "; " MICROPY_HW_BOARD_NAME " with " MICROPY_HW_MCU_NAME +""" % ( + git_tag, + git_hash, + datetime.date.today().strftime("%Y-%m-%d"), + ver[0].replace("v", ""), + ver[2], + version_string, + ) + + # Check if the file contents changed from last time + write_file = True + if os.path.isfile(filename): + with open(filename, "r") as f: + existing_data = f.read() + if existing_data == file_data: + write_file = False + + # Only write the file if we need to + if write_file: + with open(filename, "w") as f: + f.write(file_data) + + +if __name__ == "__main__": + make_version_header(sys.argv[1]) |