Merge pull request #499 from dhalbert/2.x_frozen_module_version_info
Add git version info to frozen modules.
This commit is contained in:
commit
94e645defa
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -29,3 +29,6 @@
|
|||||||
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
|
[submodule "frozen/Adafruit_CircuitPython_BusDevice"]
|
||||||
path = frozen/Adafruit_CircuitPython_BusDevice
|
path = frozen/Adafruit_CircuitPython_BusDevice
|
||||||
url = https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git
|
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
|
||||||
|
@ -70,6 +70,7 @@ endif
|
|||||||
MAKE_FROZEN = $(TOP)/tools/make-frozen.py
|
MAKE_FROZEN = $(TOP)/tools/make-frozen.py
|
||||||
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
|
MPY_CROSS = $(TOP)/mpy-cross/mpy-cross
|
||||||
MPY_TOOL = $(TOP)/tools/mpy-tool.py
|
MPY_TOOL = $(TOP)/tools/mpy-tool.py
|
||||||
|
PREPROCESS_FROZEN_MODULES = PYTHONPATH=$(TOP)/tools/python-semver $(TOP)/tools/preprocess_frozen_modules.py
|
||||||
|
|
||||||
all:
|
all:
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
|
@ -114,14 +114,13 @@ $(MPY_CROSS): $(TOP)/py/*.[ch] $(TOP)/mpy-cross/*.[ch] $(TOP)/windows/fmode.c
|
|||||||
$(Q)$(MAKE) -C $(TOP)/mpy-cross
|
$(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).
|
# 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.
|
# Do any preprocessing necessary: currently, this adds version information, removes examples, and
|
||||||
# Also remove the library examples directory, so it won't be included.
|
# 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.
|
# 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)
|
$(BUILD)/frozen_mpy: $(FROZEN_MPY_DIRS)
|
||||||
$(ECHO) FREEZE $(FROZEN_MPY_DIRS)
|
$(ECHO) FREEZE $(FROZEN_MPY_DIRS)
|
||||||
$(Q)$(MKDIR) -p $@
|
$(Q)$(MKDIR) -p $@
|
||||||
$(Q)$(RSYNC) -rL --include="*/" --include='*.py' --exclude="*" $(addsuffix /*,$(FROZEN_MPY_DIRS)) $@
|
$(Q)$(PREPROCESS_FROZEN_MODULES) -o $@ $(FROZEN_MPY_DIRS)
|
||||||
$(Q)$(RM) -rf $@/conf.py $@/setup.py $@/examples
|
|
||||||
$(Q)$(CD) $@ && \
|
$(Q)$(CD) $@ && \
|
||||||
$(FIND) -L . -type f -name '*.py' | sed 's=^\./==' | \
|
$(FIND) -L . -type f -name '*.py' | sed 's=^\./==' | \
|
||||||
xargs -n1 $(abspath $(MPY_CROSS)) $(MPY_CROSS_FLAGS)
|
xargs -n1 $(abspath $(MPY_CROSS)) $(MPY_CROSS_FLAGS)
|
||||||
|
71
tools/preprocess_frozen_modules.py
Executable file
71
tools/preprocess_frozen_modules.py
Executable file
@ -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
tools/python-semver
Submodule
1
tools/python-semver
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 2001c62d1a0361c44acc7076d8ce91e1d1c66141
|
Loading…
Reference in New Issue
Block a user