mirror of
https://github.com/esphome/esphome.git
synced 2024-11-22 23:18:10 +01:00
Also rename yaml filename with rename command (#3447)
This commit is contained in:
parent
50a32b387e
commit
2e4645310b
1 changed files with 70 additions and 68 deletions
|
@ -496,83 +496,85 @@ def command_rename(args, config):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return 1
|
return 1
|
||||||
|
# Load existing yaml file
|
||||||
with open(CORE.config_path, mode="r+", encoding="utf-8") as raw_file:
|
with open(CORE.config_path, mode="r+", encoding="utf-8") as raw_file:
|
||||||
raw_contents = raw_file.read()
|
raw_contents = raw_file.read()
|
||||||
yaml = yaml_util.load_yaml(CORE.config_path)
|
|
||||||
if CONF_ESPHOME not in yaml or CONF_NAME not in yaml[CONF_ESPHOME]:
|
yaml = yaml_util.load_yaml(CORE.config_path)
|
||||||
print(
|
if CONF_ESPHOME not in yaml or CONF_NAME not in yaml[CONF_ESPHOME]:
|
||||||
color(
|
print(
|
||||||
Fore.BOLD_RED, "Complex YAML files cannot be automatically renamed."
|
color(Fore.BOLD_RED, "Complex YAML files cannot be automatically renamed.")
|
||||||
|
)
|
||||||
|
return 1
|
||||||
|
old_name = yaml[CONF_ESPHOME][CONF_NAME]
|
||||||
|
match = re.match(r"^\$\{?([a-zA-Z0-9_]+)\}?$", old_name)
|
||||||
|
if match is None:
|
||||||
|
new_raw = re.sub(
|
||||||
|
rf"name:\s+[\"']?{old_name}[\"']?",
|
||||||
|
f'name: "{args.name}"',
|
||||||
|
raw_contents,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
old_name = yaml[CONF_SUBSTITUTIONS][match.group(1)]
|
||||||
|
if (
|
||||||
|
len(
|
||||||
|
re.findall(
|
||||||
|
rf"^\s+{match.group(1)}:\s+[\"']?{old_name}[\"']?",
|
||||||
|
raw_contents,
|
||||||
|
flags=re.MULTILINE,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return 1
|
> 1
|
||||||
old_name = yaml[CONF_ESPHOME][CONF_NAME]
|
):
|
||||||
match = re.match(r"^\$\{?([a-zA-Z0-9_]+)\}?$", old_name)
|
print(color(Fore.BOLD_RED, "Too many matches in YAML to safely rename"))
|
||||||
if match is None:
|
|
||||||
new_raw = re.sub(
|
|
||||||
rf"name:\s+[\"']?{old_name}[\"']?",
|
|
||||||
f'name: "{args.name}"',
|
|
||||||
raw_contents,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
old_name = yaml[CONF_SUBSTITUTIONS][match.group(1)]
|
|
||||||
if (
|
|
||||||
len(
|
|
||||||
re.findall(
|
|
||||||
rf"^\s+{match.group(1)}:\s+[\"']?{old_name}[\"']?",
|
|
||||||
raw_contents,
|
|
||||||
flags=re.MULTILINE,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
> 1
|
|
||||||
):
|
|
||||||
print(color(Fore.BOLD_RED, "Too many matches in YAML to safely rename"))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
new_raw = re.sub(
|
|
||||||
rf"^(\s+{match.group(1)}):\s+[\"']?{old_name}[\"']?",
|
|
||||||
f'\\1: "{args.name}"',
|
|
||||||
raw_contents,
|
|
||||||
flags=re.MULTILINE,
|
|
||||||
)
|
|
||||||
|
|
||||||
raw_file.seek(0)
|
|
||||||
raw_file.write(new_raw)
|
|
||||||
raw_file.flush()
|
|
||||||
|
|
||||||
print(f"Updating {color(Fore.CYAN, CORE.config_path)}")
|
|
||||||
print()
|
|
||||||
|
|
||||||
rc = run_external_process("esphome", "config", CORE.config_path)
|
|
||||||
if rc != 0:
|
|
||||||
raw_file.seek(0)
|
|
||||||
raw_file.write(raw_contents)
|
|
||||||
print(color(Fore.BOLD_RED, "Rename failed. Reverting changes."))
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
cli_args = [
|
new_raw = re.sub(
|
||||||
"run",
|
rf"^(\s+{match.group(1)}):\s+[\"']?{old_name}[\"']?",
|
||||||
CORE.config_path,
|
f'\\1: "{args.name}"',
|
||||||
"--no-logs",
|
raw_contents,
|
||||||
"--device",
|
flags=re.MULTILINE,
|
||||||
CORE.address,
|
)
|
||||||
]
|
|
||||||
|
|
||||||
if args.dashboard:
|
new_path = os.path.join(CORE.config_dir, args.name + ".yaml")
|
||||||
cli_args.insert(0, "--dashboard")
|
print(
|
||||||
|
f"Updating {color(Fore.CYAN, CORE.config_path)} to {color(Fore.CYAN, new_path)}"
|
||||||
|
)
|
||||||
|
print()
|
||||||
|
|
||||||
try:
|
with open(new_path, mode="w", encoding="utf-8") as new_file:
|
||||||
rc = run_external_process("esphome", *cli_args)
|
new_file.write(new_raw)
|
||||||
except KeyboardInterrupt:
|
|
||||||
rc = 1
|
|
||||||
if rc != 0:
|
|
||||||
raw_file.seek(0)
|
|
||||||
raw_file.write(raw_contents)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
print(color(Fore.BOLD_GREEN, "SUCCESS"))
|
rc = run_external_process("esphome", "config", new_path)
|
||||||
print()
|
if rc != 0:
|
||||||
return 0
|
print(color(Fore.BOLD_RED, "Rename failed. Reverting changes."))
|
||||||
|
os.remove(new_path)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
cli_args = [
|
||||||
|
"run",
|
||||||
|
new_path,
|
||||||
|
"--no-logs",
|
||||||
|
"--device",
|
||||||
|
CORE.address,
|
||||||
|
]
|
||||||
|
|
||||||
|
if args.dashboard:
|
||||||
|
cli_args.insert(0, "--dashboard")
|
||||||
|
|
||||||
|
try:
|
||||||
|
rc = run_external_process("esphome", *cli_args)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
rc = 1
|
||||||
|
if rc != 0:
|
||||||
|
os.remove(new_path)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
os.remove(CORE.config_path)
|
||||||
|
|
||||||
|
print(color(Fore.BOLD_GREEN, "SUCCESS"))
|
||||||
|
print()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
PRE_CONFIG_ACTIONS = {
|
PRE_CONFIG_ACTIONS = {
|
||||||
|
|
Loading…
Reference in a new issue