mirror of
https://github.com/esphome/esphome.git
synced 2024-12-20 16:18:49 +01:00
ac0d921413
* Socket refactor and SSL * esp-idf temp * Fixes * Echo component and noise * Add noise API transport support * Updates * ESP-IDF * Complete * Fixes * Fixes * Versions update * New i2c APIs * Complete i2c refactor * SPI migration * Revert ESP Preferences migration, too complex for now * OTA support * Remove echo again * Remove ssl again * GPIOFlags updates * Rename esphal and ICACHE_RAM_ATTR * Make ESP32 arduino compilable again * Fix GPIO flags * Complete pin registry refactor and fixes * Fixes to make test1 compile * Remove sdkconfig file * Ignore sdkconfig file * Fixes in reviewing * Make test2 compile * Make test4 compile * Make test5 compile * Run clang-format * Fix lint errors * Use esp-idf APIs instead of btStart * Another round of fixes * Start implementing ESP8266 * Make test3 compile * Guard esp8266 code * Lint * Reformat * Fixes * Fixes v2 * more fixes * ESP-IDF tidy target * Convert ARDUINO_ARCH_ESPxx * Update WiFiSignalSensor * Update time ifdefs * OTA needs millis from hal * RestartSwitch needs delay from hal * ESP-IDF Uart * Fix OTA blank password * Allow setting sdkconfig * Fix idf partitions and allow setting sdkconfig from yaml * Re-add read/write compat APIs and fix esp8266 uart * Fix esp8266 store log strings in flash * Fix ESP32 arduino preferences not initialized * Update ifdefs * Change how sdkconfig change is detected * Add checks to ci-custom and fix them * Run clang-format * Add esp-idf clang-tidy target and fix errors * Fixes from clang-tidy idf round 2 * Fixes from compiling tests with esp-idf * Run clang-format * Switch test5.yaml to esp-idf * Implement ESP8266 Preferences * Lint * Re-do PIO package version selection a bit * Fix arduinoespressif32 package version * Fix unit tests * Lint * Lint fixes * Fix readv/writev not defined * Fix graphing component * Re-add all old options from core/config.py Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
156 lines
4.6 KiB
Python
156 lines
4.6 KiB
Python
import codecs
|
|
import os.path
|
|
import re
|
|
import subprocess
|
|
import json
|
|
from pathlib import Path
|
|
|
|
root_path = os.path.abspath(os.path.normpath(os.path.join(__file__, "..", "..")))
|
|
basepath = os.path.join(root_path, "esphome")
|
|
temp_folder = os.path.join(root_path, ".temp")
|
|
temp_header_file = os.path.join(temp_folder, "all-include.cpp")
|
|
|
|
|
|
def shlex_quote(s):
|
|
if not s:
|
|
return "''"
|
|
if re.search(r"[^\w@%+=:,./-]", s) is None:
|
|
return s
|
|
|
|
return "'" + s.replace("'", "'\"'\"'") + "'"
|
|
|
|
|
|
def build_all_include():
|
|
# Build a cpp file that includes all header files in this repo.
|
|
# Otherwise header-only integrations would not be tested by clang-tidy
|
|
headers = []
|
|
for path in walk_files(basepath):
|
|
filetypes = (".h",)
|
|
ext = os.path.splitext(path)[1]
|
|
if ext in filetypes:
|
|
path = os.path.relpath(path, root_path)
|
|
include_p = path.replace(os.path.sep, "/")
|
|
headers.append(f'#include "{include_p}"')
|
|
headers.sort()
|
|
headers.append("")
|
|
content = "\n".join(headers)
|
|
p = Path(temp_header_file)
|
|
p.parent.mkdir(exist_ok=True)
|
|
p.write_text(content)
|
|
|
|
|
|
def walk_files(path):
|
|
for root, _, files in os.walk(path):
|
|
for name in files:
|
|
yield os.path.join(root, name)
|
|
|
|
|
|
def get_output(*args):
|
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
output, err = proc.communicate()
|
|
return output.decode("utf-8")
|
|
|
|
|
|
def get_err(*args):
|
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
output, err = proc.communicate()
|
|
return err.decode("utf-8")
|
|
|
|
|
|
def splitlines_no_ends(string):
|
|
return [s.strip() for s in string.splitlines()]
|
|
|
|
|
|
def changed_files():
|
|
check_remotes = ["upstream", "origin"]
|
|
check_remotes.extend(splitlines_no_ends(get_output("git", "remote")))
|
|
for remote in check_remotes:
|
|
command = ["git", "merge-base", f"refs/remotes/{remote}/dev", "HEAD"]
|
|
try:
|
|
merge_base = splitlines_no_ends(get_output(*command))[0]
|
|
break
|
|
# pylint: disable=bare-except
|
|
except:
|
|
pass
|
|
else:
|
|
raise ValueError("Git not configured")
|
|
command = ["git", "diff", merge_base, "--name-only"]
|
|
changed = splitlines_no_ends(get_output(*command))
|
|
changed = [os.path.relpath(f, os.getcwd()) for f in changed]
|
|
changed.sort()
|
|
return changed
|
|
|
|
|
|
def filter_changed(files):
|
|
changed = changed_files()
|
|
files = [f for f in files if f in changed]
|
|
print("Changed files:")
|
|
if not files:
|
|
print(" No changed files!")
|
|
for c in files:
|
|
print(f" {c}")
|
|
return files
|
|
|
|
|
|
def filter_grep(files, value):
|
|
matched = []
|
|
for file in files:
|
|
with open(file, "r") as handle:
|
|
contents = handle.read()
|
|
if value in contents:
|
|
matched.append(file)
|
|
return matched
|
|
|
|
|
|
def git_ls_files(patterns=None):
|
|
command = ["git", "ls-files", "-s"]
|
|
if patterns is not None:
|
|
command.extend(patterns)
|
|
proc = subprocess.Popen(command, stdout=subprocess.PIPE)
|
|
output, err = proc.communicate()
|
|
lines = [x.split() for x in output.decode("utf-8").splitlines()]
|
|
return {s[3].strip(): int(s[0]) for s in lines}
|
|
|
|
|
|
IDF_TIDY_SDKCONFIG = """\
|
|
CONFIG_BT_ENABLED=y
|
|
"""
|
|
|
|
|
|
def load_idedata(environment):
|
|
platformio_ini = Path(root_path) / "platformio.ini"
|
|
temp_idedata = Path(temp_folder) / f"idedata-{environment}.json"
|
|
changed = False
|
|
if not platformio_ini.is_file() or not temp_idedata.is_file():
|
|
changed = True
|
|
elif platformio_ini.stat().st_mtime >= temp_idedata.stat().st_mtime:
|
|
changed = True
|
|
|
|
if environment == "esp32-idf-tidy":
|
|
# sdkconfig needs to be written before idedata is run
|
|
# but the file is also modified by the build process, so
|
|
# store a temp file to keep track of the
|
|
|
|
sdk_internal = Path(temp_folder) / f"{environment}-internal-sdkconfig"
|
|
sdkconfig = Path(root_path) / f"sdkconfig.{environment}"
|
|
if (
|
|
changed
|
|
or not sdk_internal.is_file()
|
|
or sdk_internal.read_text() != IDF_TIDY_SDKCONFIG
|
|
):
|
|
changed = True
|
|
sdkconfig.write_text(IDF_TIDY_SDKCONFIG)
|
|
sdk_internal.parent.mkdir(exist_ok=True)
|
|
sdk_internal.write_text(IDF_TIDY_SDKCONFIG)
|
|
|
|
if not changed:
|
|
return json.loads(temp_idedata.read_text())
|
|
|
|
stdout = subprocess.check_output(["pio", "run", "-t", "idedata", "-e", environment])
|
|
match = re.search(r'{\s*".*}', stdout.decode("utf-8"))
|
|
data = json.loads(match.group())
|
|
|
|
temp_idedata.parent.mkdir(exist_ok=True)
|
|
temp_idedata.write_text(json.dumps(data, indent=2) + "\n")
|
|
return data
|