From 1824c8131e343b2601e290c5db06df12b2706b75 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 16 Dec 2022 19:46:56 +1300 Subject: [PATCH] Fix import_full_config for adoption configs (#4197) * Fix git raw url * Fix setting full config query param * Force dashboard import urls to have a branch or tag reference for full import --- .../components/dashboard_import/__init__.py | 29 ++++++++++++++----- esphome/git.py | 4 +-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/esphome/components/dashboard_import/__init__.py b/esphome/components/dashboard_import/__init__.py index 4742c77785..0eb65579f9 100644 --- a/esphome/components/dashboard_import/__init__.py +++ b/esphome/components/dashboard_import/__init__.py @@ -4,7 +4,7 @@ import requests import esphome.codegen as cg import esphome.config_validation as cv from esphome.components.packages import validate_source_shorthand -from esphome.const import CONF_WIFI +from esphome.const import CONF_WIFI, CONF_REF from esphome.wizard import wizard_file from esphome.yaml_util import dump from esphome import git @@ -21,19 +21,32 @@ CODEOWNERS = ["@esphome/core"] def validate_import_url(value): value = cv.string_strict(value) value = cv.Length(max=255)(value) - # ignore result, only check if it's a valid shorthand validate_source_shorthand(value) return value +def validate_full_url(config): + if not config[CONF_IMPORT_FULL_CONFIG]: + return config + source = validate_source_shorthand(config[CONF_PACKAGE_IMPORT_URL]) + if CONF_REF not in source: + raise cv.Invalid( + "Must specify a ref (branch or tag) to import from when importing full config" + ) + return config + + CONF_PACKAGE_IMPORT_URL = "package_import_url" CONF_IMPORT_FULL_CONFIG = "import_full_config" -CONFIG_SCHEMA = cv.Schema( - { - cv.Required(CONF_PACKAGE_IMPORT_URL): validate_import_url, - cv.Optional(CONF_IMPORT_FULL_CONFIG, default=False): cv.boolean, - } +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.Required(CONF_PACKAGE_IMPORT_URL): validate_import_url, + cv.Optional(CONF_IMPORT_FULL_CONFIG, default=False): cv.boolean, + } + ), + validate_full_url, ) WIFI_CONFIG = """ @@ -49,7 +62,7 @@ async def to_code(config): url = config[CONF_PACKAGE_IMPORT_URL] if config[CONF_IMPORT_FULL_CONFIG]: url += "?full_config" - cg.add(dashboard_import_ns.set_package_import_url(config[CONF_PACKAGE_IMPORT_URL])) + cg.add(dashboard_import_ns.set_package_import_url(url)) def import_config( diff --git a/esphome/git.py b/esphome/git.py index d3d5996fe3..130cd4f5e1 100644 --- a/esphome/git.py +++ b/esphome/git.py @@ -129,9 +129,9 @@ class GitFile: def raw_url(self) -> str: if self.ref is None: raise ValueError("URL has no ref") - if self.domain == "github": + if self.domain == "github.com": return f"https://raw.githubusercontent.com/{self.owner}/{self.repo}/{self.ref}/{self.filename}" - if self.domain == "gitlab": + if self.domain == "gitlab.com": return f"https://gitlab.com/{self.owner}/{self.repo}/-/raw/{self.ref}/{self.filename}" raise NotImplementedError(f"Git domain {self.domain} not supported")