Also rename yaml filename with rename command (#3447)

This commit is contained in:
Jesse Hills 2022-05-09 19:16:46 +12:00 committed by GitHub
parent 50a32b387e
commit 2e4645310b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 = {