Change handling with repo list

This commit is contained in:
Pascal Vizeli 2017-04-27 21:58:21 +02:00
parent dd38c73b85
commit c6cc8adbb7
6 changed files with 37 additions and 34 deletions

View File

@ -40,10 +40,10 @@ class AddonManager(AddonsData):
tasks = [addon.load() for addon in self.repositories] tasks = [addon.load() for addon in self.repositories]
if tasks: if tasks:
await asyncio.wait(tasks, loop=self.loop) await asyncio.wait(tasks, loop=self.loop)
self.read_addons_repo()
# Update config # read data from repositories
self.merge_local_config() self.read_data_from_repositories()
self.merge_update_config()
# load installed addons # load installed addons
for addon in self.list_installed: for addon in self.list_installed:
@ -53,7 +53,7 @@ class AddonManager(AddonsData):
async def add_custom_repository(self, url): async def add_custom_repository(self, url):
"""Add a new custom repository.""" """Add a new custom repository."""
if url in self.config.addons_repositories.keys(): if url in self.config.addons_repositories:
_LOGGER.warning("Repository already exists %s", url) _LOGGER.warning("Repository already exists %s", url)
return False return False
@ -63,6 +63,7 @@ class AddonManager(AddonsData):
_LOGGER.error("Can't load from repository %s", url) _LOGGER.error("Can't load from repository %s", url)
return False return False
self.config.addons_repositories = repo
self.repositories.append(repo) self.repositories.append(repo)
return True return True
@ -71,6 +72,7 @@ class AddonManager(AddonsData):
for repo in self.repositories: for repo in self.repositories:
if repo.url == url: if repo.url == url:
repo = self.repositories.pop(repo, repo) repo = self.repositories.pop(repo, repo)
self.config.drop_addon_repository(url)
repo.remove() repo.remove()
return True return True
@ -84,9 +86,9 @@ class AddonManager(AddonsData):
await asyncio.wait(tasks, loop=self.loop) await asyncio.wait(tasks, loop=self.loop)
# Update config # read data from repositories
self.read_addons_repo() self.read_data_from_repositories()
self.merge_local_config() self.merge_update_config()
# remove stalled addons # remove stalled addons
for addon in self.list_removed: for addon in self.list_removed:

View File

@ -42,7 +42,7 @@ class AddonsData(Config):
} }
super().save() super().save()
def read_addons_repo(self): def read_data_from_repositories(self):
"""Read data from addons repository.""" """Read data from addons repository."""
self._current_data = {} self._current_data = {}
@ -67,7 +67,7 @@ class AddonsData(Config):
_LOGGER.warning("Can't read %s -> %s", addon, _LOGGER.warning("Can't read %s -> %s", addon,
humanize_error(addon_config, ex)) humanize_error(addon_config, ex))
def merge_local_config(self): def merge_update_config(self):
"""Update local config if they have update. """Update local config if they have update.
It need to be the same version as the local version is. It need to be the same version as the local version is.

View File

@ -3,10 +3,10 @@ import asyncio
import logging import logging
import os import os
import shutil import shutil
import tempfile
import git import git
from .util import get_hash_from_repository
from ..const import URL_HASSIO_ADDONS from ..const import URL_HASSIO_ADDONS
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -86,17 +86,11 @@ class AddonsRepoHassIO(AddonsRepo):
class AddonsRepoCustom(AddonsRepo): class AddonsRepoCustom(AddonsRepo):
"""Custom addons repository.""" """Custom addons repository."""
def __init__(self, config, loop, url, slug=None): def __init__(self, config, loop, url):
"""Initialize git hassio addon repository.""" """Initialize git hassio addon repository."""
if slug is None: path = os.path.join(
_LOGGER("Init new custom addon repository %s", url) config.path_addons_custom, get_hash_from_repository(url))
with tempfile.TemporaryDirectory(dir=config.path_addons_custom) \
as temp_dir:
slug = temp_dir.name
config.add_addons_repository(url, slug)
path = os.path.join(config.path_addons_custom, slug)
super().__init__(config, loop, path, url) super().__init__(config, loop, path, url)
def remove(self): def remove(self):
@ -109,5 +103,3 @@ class AddonsRepoCustom(AddonsRepo):
_LOGGER.warning("Can't remove %s", path) _LOGGER.warning("Can't remove %s", path)
shutil.rmtree(self.path, onerror=log_err) shutil.rmtree(self.path, onerror=log_err)
self.config.drop_addons_repository(self.url)

8
hassio/addons/util.py Normal file
View File

@ -0,0 +1,8 @@
"""Util addons functions."""
import hashlib
def get_hash_from_repository(repo):
"""Generate a hash from repository."""
key = repo.lower().encode()
return hashlib.sha1(key).hexdigest()

View File

@ -46,8 +46,7 @@ class APISupervisor(object):
ATTR_LAST_VERSION: self.config.last_hassio, ATTR_LAST_VERSION: self.config.last_hassio,
ATTR_BETA_CHANNEL: self.config.upstream_beta, ATTR_BETA_CHANNEL: self.config.upstream_beta,
ATTR_ADDONS: self.addons.list_api, ATTR_ADDONS: self.addons.list_api,
ATTR_ADDONS_REPOSITORIES: ATTR_ADDONS_REPOSITORIES: list(self.config.addons_repositories),
list(self.config.addons_repositories.keys()),
} }
@api_process @api_process
@ -70,7 +69,7 @@ class APISupervisor(object):
for url in set(old - new): for url in set(old - new):
self.addons.drop_custom_repository(url) self.addons.drop_custom_repository(url)
return self.config.save() return True
@api_process @api_process
async def update(self, request): async def update(self, request):

View File

@ -44,9 +44,7 @@ SCHEMA_CONFIG = vol.Schema({
vol.Optional(HOMEASSISTANT_LAST): vol.Coerce(str), vol.Optional(HOMEASSISTANT_LAST): vol.Coerce(str),
vol.Optional(HASSIO_LAST): vol.Coerce(str), vol.Optional(HASSIO_LAST): vol.Coerce(str),
vol.Optional(HASSIO_CLEANUP): vol.Coerce(str), vol.Optional(HASSIO_CLEANUP): vol.Coerce(str),
vol.Optional(ADDONS_CUSTOM_LIST, default={}): { vol.Optional(ADDONS_CUSTOM_LIST, default=[]): [vol.Url()],
vol.Url(): vol.Coerce(str),
}
}, extra=vol.REMOVE_EXTRA) }, extra=vol.REMOVE_EXTRA)
@ -214,17 +212,21 @@ class CoreConfig(Config):
"""Return root backup data folder extern for docker.""" """Return root backup data folder extern for docker."""
return BACKUP_DATA.format(self.path_hassio_docker) return BACKUP_DATA.format(self.path_hassio_docker)
def add_addons_repository(self, repo, slug): @addons_repositories.setter
def addons_repositories(self, repo):
"""Add a custom repository to list.""" """Add a custom repository to list."""
self._data[ADDONS_CUSTOM_LIST][repo] = slug if repo in self._data[ADDONS_CUSTOM_LIST]:
self.save() return
def drop_addons_repository(self, repo): self._data[ADDONS_CUSTOM_LIST].append(repo)
"""Remove a custom repository from list."""
if self._data[ADDONS_CUSTOM_LIST].pop(repo, None):
self.save() self.save()
@property @property
def addons_repositories(self): def addons_repositories(self):
"""Return list of addons custom repositories.""" """Return list of addons custom repositories."""
return self._data[ADDONS_CUSTOM_LIST] return self._data[ADDONS_CUSTOM_LIST]
def drop_addon_repository(self, repo):
"""Remove a custom repository from list."""
if self._data[ADDONS_CUSTOM_LIST].pop(repo, False):
self.save()