Skip to content

Add git version info to frozen modules. #499

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 24, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,6 @@
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
path = frozen/Adafruit_CircuitPython_BusDevice
url = https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git
[submodule "tools/python-semver"]
path = tools/python-semver
url = https://github.com/k-bx/python-semver.git
1 change: 1 addition & 0 deletions py/mkenv.mk
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ endif
MAKE_FROZEN = $(TOP)/tools/make-frozen.py
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
MPY_TOOL = $(TOP)/tools/mpy-tool.py
PREPROCESS_FROZEN_MODULES = PYTHONPATH=$(TOP)/tools/python-semver $(TOP)/tools/preprocess_frozen_modules.py

all:
.PHONY: all
Expand Down
7 changes: 3 additions & 4 deletions py/mkrules.mk
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,13 @@ $(MPY_CROSS): $(TOP)/py/*.[ch] $(TOP)/mpy-cross/*.[ch] $(TOP)/windows/fmode.c
$(Q)$(MAKE) -C $(TOP)/mpy-cross

# Copy all the modules and single python files to freeze to a common area, omitting top-level dirs (the repo names).
# Remove any conf.py (sphinx config) and setup.py (module install info) files, which are not meant to be frozen.
# Also remove the library examples directory, so it won't be included.
# Do any preprocessing necessary: currently, this adds version information, removes examples, and
# non-library .py files in the modules (setup.py and conf.py)
# Then compile .mpy files from all the .py files, placing them in the same directories as the .py files.
$(BUILD)/frozen_mpy: $(FROZEN_MPY_DIRS)
$(ECHO) FREEZE $(FROZEN_MPY_DIRS)
$(Q)$(MKDIR) -p $@
$(Q)$(RSYNC) -rL --include="*/" --include='*.py' --exclude="*" $(addsuffix /*,$(FROZEN_MPY_DIRS)) $@
$(Q)$(RM) -rf $@/conf.py $@/setup.py $@/examples
$(Q)$(PREPROCESS_FROZEN_MODULES) -o $@ $(FROZEN_MPY_DIRS)
$(Q)$(CD) $@ && \
$(FIND) -L . -type f -name '*.py' | sed 's=^\./==' | \
xargs -n1 $(abspath $(MPY_CROSS)) $(MPY_CROSS_FLAGS)
Expand Down
71 changes: 71 additions & 0 deletions tools/preprocess_frozen_modules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/env python3
import argparse
import os
import os.path
from pathlib import Path
import semver
import subprocess

# Compatible with Python 3.4 due to travis using trusty as default.

def version_string(path=None, *, valid_semver=False):
version = None
try:
tag = subprocess.check_output('git describe --tags --exact-match', shell=True, cwd=path)
version = tag.strip().decode("utf-8", "strict")
except subprocess.CalledProcessError:
describe = subprocess.check_output("git describe --tags", shell=True, cwd=path)
tag, additional_commits, commitish = describe.strip().decode("utf-8", "strict").rsplit("-", maxsplit=2)
commitish = commitish[1:]
if valid_semver:
version_info = semver.parse_version_info(tag)
if not version_info.prerelease:
version = semver.bump_patch(tag) + "-alpha.0.plus." + additional_commits + "+" + commitish
else:
version = tag + ".plus." + additional_commits + "+" + commitish
else:
version = commitish
return version

# Visit all the .py files in topdir. Replace any __version__ = "0.0.0-auto.0" type of info
# with actual version info derived from git.
def copy_and_process(in_dir, out_dir):
for root, subdirs, files in os.walk(in_dir):

# Skip library examples directories.
if Path(root).name == 'examples':
continue

for file in files:
# Skip top-level setup.py (module install info) and conf.py (sphinx config),
# which are not part of the library
if (root == in_dir) and file in ('conf.py', 'setup.py'):
continue

input_file_path = Path(root, file)
output_file_path = Path(out_dir, input_file_path.relative_to(in_dir))

if file.endswith(".py"):
if not output_file_path.parent.exists():
output_file_path.parent.mkdir(parents=True)
with input_file_path.open("r") as input, output_file_path.open("w") as output:
for line in input:
if line.startswith("__version__"):
module_version = version_string(root, valid_semver=True)
line = line.replace("0.0.0-auto.0", module_version)
output.write(line)

if __name__ == '__main__':
argparser = argparse.ArgumentParser(description="""\
Copy and pre-process .py files into output directory, before freezing.
1. Remove top-level repo directory.
2. Update __version__ info.
3. Remove examples.
4. Remove non-library setup.py and conf.py""")
argparser.add_argument("in_dirs", metavar="input-dir", nargs="+",
help="top-level code dirs (may be git repo dirs)")
argparser.add_argument("-o", "--out_dir", help="output directory")
args = argparser.parse_args()

for in_dir in args.in_dirs:
copy_and_process(in_dir, args.out_dir)
1 change: 1 addition & 0 deletions tools/python-semver
Submodule python-semver added at 2001c6