diff --git a/hassio/addons/built-in.json b/hassio/addons/built-in.json index 73d225d82..f16cd4ff6 100644 --- a/hassio/addons/built-in.json +++ b/hassio/addons/built-in.json @@ -1,12 +1,12 @@ { "local": { - "name": "Local Add-Ons", + "name": "Local add-ons", "url": "https://home-assistant.io/hassio", "maintainer": "you" }, "core": { - "name": "Built-in Add-Ons", + "name": "Official add-ons", "url": "https://home-assistant.io/addons", - "maintainer": "Home Assistant authors" + "maintainer": "Home Assistant" } } diff --git a/hassio/addons/git.py b/hassio/addons/git.py index 4712d9b6d..a00521946 100644 --- a/hassio/addons/git.py +++ b/hassio/addons/git.py @@ -8,8 +8,9 @@ import shutil import git from .utils import get_hash_from_repository -from ..const import URL_HASSIO_ADDONS +from ..const import URL_HASSIO_ADDONS, ATTR_URL, ATTR_BRANCH from ..coresys import CoreSysAttributes +from ..validate import RE_REPOSITORY _LOGGER = logging.getLogger(__name__) @@ -22,9 +23,20 @@ class GitRepo(CoreSysAttributes): self.coresys = coresys self.repo = None self.path = path - self.url = url self.lock = asyncio.Lock(loop=coresys.loop) + self._data = RE_REPOSITORY.match(url).groupdict() + + @property + def url(self): + """Return repository URL.""" + return self._data[ATTR_URL] + + @property + def branch(self): + """Return repository branch.""" + return self._data[ATTR_BRANCH] + async def load(self): """Init git addon repo.""" if not self.path.is_dir(): @@ -46,12 +58,20 @@ class GitRepo(CoreSysAttributes): async def clone(self): """Clone git addon repo.""" async with self.lock: + git_args = { + attribute: value + for attribute, value in ( + ('recursive', True), + ('branch', self.branch) + ) if value is not None + } + try: _LOGGER.info("Clone addon %s repository", self.url) - self.repo = await self._loop.run_in_executor( - None, ft.partial( - git.Repo.clone_from, self.url, str(self.path), - recursive=True)) + self.repo = await self._loop.run_in_executor(None, ft.partial( + git.Repo.clone_from, self.url, str(self.path), + **git_args + )) except (git.InvalidGitRepositoryError, git.NoSuchPathError, git.GitCommandError) as err: diff --git a/hassio/api/panel/hassio-app.html b/hassio/api/panel/hassio-app.html index 715d58b61..7d7845b70 100644 --- a/hassio/api/panel/hassio-app.html +++ b/hassio/api/panel/hassio-app.html @@ -11,7 +11,7 @@ .fixed-left, .fixed-right, .fixed-top{position:fixed;}.fixed-top{top:0;left:0;right:0;}.fixed-right{top:0;right:0;bottom:0;}.fixed-bottom{right:0;bottom:0;left:0;}.fixed-left{top:0;bottom:0;left:0;}
\ No newline at end of file diff --git a/hassio/api/panel/hassio-app.html.gz b/hassio/api/panel/hassio-app.html.gz index c92b9ffd9..c69340f3d 100644 Binary files a/hassio/api/panel/hassio-app.html.gz and b/hassio/api/panel/hassio-app.html.gz differ diff --git a/hassio/api/panel/index.html.gz b/hassio/api/panel/index.html.gz index f9d5275ea..c0717db02 100644 Binary files a/hassio/api/panel/index.html.gz and b/hassio/api/panel/index.html.gz differ diff --git a/hassio/const.py b/hassio/const.py index c149ab5a4..0e71662ef 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -2,7 +2,7 @@ from pathlib import Path from ipaddress import ip_network -HASSIO_VERSION = '0.95' +HASSIO_VERSION = '0.96' URL_HASSIO_VERSION = ('https://raw.githubusercontent.com/home-assistant/' 'hassio/{}/version.json') @@ -158,6 +158,7 @@ ATTR_SERVICES = 'services' ATTR_DISCOVERY = 'discovery' ATTR_PROTECTED = 'protected' ATTR_CRYPTO = 'crypto' +ATTR_BRANCH = 'branch' SERVICE_MQTT = 'mqtt' diff --git a/hassio/snapshots/__init__.py b/hassio/snapshots/__init__.py index 18a1fcf67..ade6e355a 100644 --- a/hassio/snapshots/__init__.py +++ b/hassio/snapshots/__init__.py @@ -173,7 +173,8 @@ class SnapshotManager(CoreSysAttributes): if addon and addon.is_installed: addon_list.append(addon) continue - _LOGGER.warning("Add-on %s not found/installed", addon_slug) + _LOGGER.warning( + "Add-on %s not found/installed", addon_slug) if addon_list: _LOGGER.info("Snapshot %s store Add-ons", snapshot.slug) diff --git a/hassio/validate.py b/hassio/validate.py index ae52aca85..fd4a909be 100644 --- a/hassio/validate.py +++ b/hassio/validate.py @@ -1,5 +1,6 @@ """Validate functions.""" import uuid +import re import voluptuous as vol import pytz @@ -11,13 +12,29 @@ from .const import ( ATTR_SSL, ATTR_PORT, ATTR_WATCHDOG, ATTR_WAIT_BOOT, ATTR_UUID) +RE_REPOSITORY = re.compile(r"^(?P[^#]+)(?:#(?P[\w\-]+))?$") + NETWORK_PORT = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) ALSA_CHANNEL = vol.Match(r"\d+,\d+") WAIT_BOOT = vol.All(vol.Coerce(int), vol.Range(min=1, max=60)) DOCKER_IMAGE = vol.Match(r"^[\w{}]+/[\-\w{}]+$") + +def validate_repository(repository): + """Validate a valide repository.""" + data = RE_REPOSITORY.match(repository) + if not data: + raise vol.Invalid("No valid repository format!") + + # Validate URL + # pylint: disable=no-value-for-parameter + vol.Url()(data.group('url')) + + return repository + + # pylint: disable=no-value-for-parameter -REPOSITORIES = vol.All([vol.Url()], vol.Unique()) +REPOSITORIES = vol.All([validate_repository], vol.Unique()) def validate_timezone(timezone): diff --git a/home-assistant-polymer b/home-assistant-polymer index 1a18ee275..39172f8c4 160000 --- a/home-assistant-polymer +++ b/home-assistant-polymer @@ -1 +1 @@ -Subproject commit 1a18ee27553aaff643a4a06512bc6112f8c8f036 +Subproject commit 39172f8c49a5253b28eb8508940e2ffa4f0ca451 diff --git a/version.json b/version.json index 4116e5ea5..e0603c66c 100644 --- a/version.json +++ b/version.json @@ -1,5 +1,5 @@ { - "hassio": "0.95", + "hassio": "0.96", "homeassistant": "0.64.3", "resinos": "1.1", "resinhup": "0.3",