circuitpython/tools/merge_micropython.py

299 lines
6.8 KiB
Python

"""
This is a helper script for merging in new versions of MicroPython. You *must*
evaluate its correctness and adapt it for each MP version. This is committed
in the repo more for reference than "fire and forget" use.
I have found I have to run each piece separately, because there are some errors.
For instance, there are file renames in the porcelain output that are not handled.
I add a sys.exit(0) after a section, and once a section runs, I delete it temporarily
and move on to the next section. -- dhalbert
Updated for v1.21.0 merge - dhalbert
"""
from io import StringIO
import sh
from sh import git
out_buf = StringIO()
ports_to_delete = [
"bare-arm",
"cc3200",
"embed",
"esp32",
"esp8266",
"mimxrt",
"minimal",
"pic16bit",
"powerpc",
"qemu-arm",
"raspberrypi",
"renesas-ra",
"rp2",
"samd",
"stm32",
"teensy",
"webassembly",
"windows",
"zephyr",
]
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",
"develop",
"differences",
"esp32",
"esp8266",
"library/bluetooth.rst",
"library/btree.rst",
"library/cryptolib.rst",
"library/esp*.rst",
"library/framebuf.rst",
"library/hashlib.rst",
"library/lcd160cr.rst",
"library/machine*.rst",
"library/math.rst",
"library/network*.rst",
"library/os.rst",
"library/pyb*.rst",
"library/random.rst",
"library/rp2*.rst",
"library/uos.rst",
"library/socket.rst",
"library/ssl.rst",
"library/stm.rst",
"library/struct.rst",
"library/_thread.rst",
"library/time.rst",
"library/uasyncio.rst",
"library/uctypes.rst",
"library/wipy.rst",
"library/wm8960.rst",
"library/zephyr*.rst",
"library/zlib.rst",
"make.bat",
"mimxrt",
"pyboard",
"reference",
"renesas-ra",
"rp2",
"samd",
"templates/topindex.html",
"wipy",
"zephyr",
]
for d in docs_to_delete:
try:
git.rm("-rf", "docs/" + d)
except sh.ErrorReturnCode_128:
pass
tests_to_delete = [
"esp32",
"multi_bluetooth",
"multi_espnow",
"multi_net",
"net_hosted",
"net_inet",
"pyb",
"wipy",
]
for t in tests_to_delete:
try:
git.rm("-rf", "tests/" + t)
except sh.ErrorReturnCode_128:
pass
libs_to_delete = [
"asf4",
"btstack",
"libhydrogen",
"lwip",
"micropython-lib",
"mynewt-nimble",
"nrfx",
"nxp_driver",
"pico-sdk",
"protobuf-c",
"stm32lib",
"wiznet5k",
]
for l in libs_to_delete:
try:
git.rm("-rf", "lib/" + l)
except sh.ErrorReturnCode_128:
pass
extmod_to_delete = [
"btstack",
"extmod.cmake",
"machine_*",
"mbedtls",
"modbluetooth.*",
"modbtree.*",
"modframebuf.*",
"modlwip.*",
"modnetwork.*",
"modonewire.*",
"moducryptolib.*",
"modsocket.*",
"modssl_*.*",
"modtimeq.*",
"modwebsocket.*",
"modwebrepl.*",
"mpbthci.*",
"network_*.*",
"nimble",
]
for e in extmod_to_delete:
try:
git.rm("-rf", "extmod/" + e)
except sh.ErrorReturnCode_128 as error:
print(error)
top_delete = [
"drivers",
"README.md",
"CODEOFCONDUCT.md",
"CODECONVENTIONS.md",
]
for t in top_delete:
try:
git.rm("-rf", t)
except sh.ErrorReturnCode_128:
pass
dot_github_delete = [
".github/dependabot.yml",
".github/FUNDING.yml",
".github/ISSUE_TEMPLATE/documentation.md",
".github/ISSUE_TEMPLATE/security.md",
".github/workflows/code_formatting.yml",
".github/workflows/code_size_comment.yml",
".github/workflows/code_size.yml",
".github/workflows/commit_formatting.yml",
".github/workflows/docs.yml",
".github/workflows/examples.yml",
".github/workflows/mpremote.yml",
".github/workflows/mpy_format.yml",
".github/workflows/mpy_format.yml",
".github/workflows/ports_*.yml",
]
for t in dot_github_delete:
try:
git.rm("-rf", t)
except sh.ErrorReturnCode_128:
pass
# Always ours:
always_ours = [
".github",
"devices",
"supervisor",
"shared-bindings",
"shared-module",
"ports/atmel-samd",
"ports/cxd56",
"ports/espressif",
"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()