aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/py/makeversionhdr.py
diff options
context:
space:
mode:
Diffstat (limited to 'circuitpython/py/makeversionhdr.py')
-rw-r--r--circuitpython/py/makeversionhdr.py129
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])