From 20c4a325a46e92c59ee02db0b9b7734a9d3dd407 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 7 May 2021 10:16:50 -0700 Subject: [PATCH] Add Python helper tool for MicroPython merges. It automates ignoring parts of MP we don't use. Related to #2999 --- tools/merge_micropython.py | 231 +++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 tools/merge_micropython.py diff --git a/tools/merge_micropython.py b/tools/merge_micropython.py new file mode 100644 index 0000000000..1f0d076a16 --- /dev/null +++ b/tools/merge_micropython.py @@ -0,0 +1,231 @@ +""" +This is a helper script for merging in new versions of MicroPython. You *must* +evaluate it's correctness and adapt it for each MP version. This is committed +in the repo more for reference than "fire and forget" use. +""" + +import sh +from sh import git +from io import StringIO + +out_buf = StringIO() + +ports_to_delete = [ + "mimxrt", + "powerpc", + "samd", + "javascript", + "stm32", + "esp32", + "cc3200", + "teensy", + "windows", + "zephyr", + "minimal", + "esp8266", + "pic16bit", + "qemu-arm", + "bare-arm", + "rp2", +] +for p in ports_to_delete: + try: + git.rm("-rf", "ports/" + p) + except sh.ErrorReturnCode_128: + pass + +# We inherit stm32 changes into stm because we did a git rename. +git.status("--porcelain=1", "ports/stm", _out=out_buf) +out_buf.seek(0) +line = out_buf.readline() +while line: + state, path = line.split() + if state == "UU": + git.checkout("--ours", path) + git.add(path) + elif state == "UA": + git.rm(path) + line = out_buf.readline() + +# MicroPython added their nrf code in ports/nrf too. So, we always take our version. +out_buf = StringIO() +git.status("--porcelain=1", "ports/nrf", _out=out_buf) +out_buf.seek(0) +line = out_buf.readline() +while line: + state, path = line.split() + if state == "UU": + git.checkout("--ours", path) + git.add(path) + elif state == "UA": + git.rm(path) + elif state == "AA": + git.rm("-f", path) + elif state == "A": + git.rm("-f", path) + elif state == "DU": + git.rm(path) + elif state == "DD": + git.rm(path) + else: + print(state, path) + line = out_buf.readline() + + +# MicroPython has their own CI settings. Let's not use them now. +out_buf = StringIO() +git.status("--porcelain=1", ".github/workflows", _out=out_buf) +out_buf.seek(0) +line = out_buf.readline() +while line: + state, path = line.split() + if state == "A": + git.rm("-f", path) + else: + print(state, path) + line = out_buf.readline() + +# Delete docs and tests for things we don't need anymore +docs_to_delete = [ + "conf.py", + "pyboard", + "library/pyb.*", + "library/esp*", + "library/lcd160cr.rst", + "esp8266", + "wipy", + "esp32", + "library/machine.*", + "library/network.*", + "library/ubluetooth.rst", + "library/ucryptolib.rst", + "library/uos.rst", + "library/usocket.rst", + "library/ussl.rst", + "library/ustruct.rst", + "develop", + "reference", + "make.bat", + "templates/topindex.html", +] +for d in docs_to_delete: + try: + git.rm("-rf", "docs/" + d) + except sh.ErrorReturnCode_128: + pass + +tests_to_delete = [ + "wipy", + "pyb", + "multi_net", + "net_inet", + "multi_bluetooth", + "esp32", + "net_hosted", +] +for t in tests_to_delete: + try: + git.rm("-rf", "tests/" + t) + except sh.ErrorReturnCode_128: + pass + + +libs_to_delete = [ + "mynewt-nimble", + "nxp_driver", + "mbedtls", + "mbedtls_errors", + "asf4", + "btstack", +] +for l in libs_to_delete: + try: + git.rm("-rf", "lib/" + l) + except sh.ErrorReturnCode_128: + pass + +extmod_to_delete = [ + "machine_*", + "webrepl", + "uzlib", + "ussl*", + "modlwip.c", + "moducryptolib.c", + "modbluetooth*", + "network*", + "nimble", + "btstack", + "mpbthci*", +] +for e in extmod_to_delete: + try: + git.rm("-rf", "extmod/" + e) + except sh.ErrorReturnCode_128 as error: + print(error) + pass + +top_delete = [ + "drivers", + ".travis.yml", + ".github/FUNDING.yml", + ".github/workflows/docs.yml", + "README.md", + "CODEOFCONDUCT.md", + "CODECONVENTIONS.md", + "examples", +] +for t in top_delete: + try: + git.rm("-rf", t) + except sh.ErrorReturnCode_128: + pass + +# Always ours: +always_ours = [ + "devices", + "supervisor", + "shared-bindings", + "shared-module", + "ports/atmel-samd", + "ports/cxd56", + "ports/esp32s2", + "ports/mimxrt10xx", + "ports/raspberrypi", + "ports/stm", +] +for ours in always_ours: + out_buf = StringIO() + git.status("--porcelain=1", ours, _out=out_buf) + out_buf.seek(0) + line = out_buf.readline() + while line: + state, path = line.split() + if state == "UU": + print("ours", path) + git.checkout("--ours", path) + git.add(path) + else: + print(state, path) + line = out_buf.readline() + +# Check to see if any files changed only in formatting +out_buf = StringIO() +git.status("--porcelain=1", ".", _out=out_buf) +out_buf.seek(0) +line = out_buf.readline() +while line: + state = line.split()[0] + if state in ("D", "R", "DD"): + line = out_buf.readline() + continue + state, path = line.split() + log_buf = StringIO() + git.log("--pretty=tformat:%H", "25ae98f..HEAD", path, _out=log_buf, _tty_out=False) + log_buf.seek(0) + commits = [] + for line in log_buf.readlines(): + commits.append(line.strip()) + if state in ["UU", "M"] and commits == ["a52eb88031620a81521b937f2a0651dbac2bb350"]: + git.checkout("--theirs", path) + git.add(path) + line = out_buf.readline()