mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-10 10:46:29 +00:00
Change handling with repo list
This commit is contained in:
parent
dd38c73b85
commit
c6cc8adbb7
@ -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:
|
||||||
|
@ -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.
|
||||||
|
@ -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
8
hassio/addons/util.py
Normal 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()
|
@ -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):
|
||||||
|
@ -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."""
|
self.save()
|
||||||
if self._data[ADDONS_CUSTOM_LIST].pop(repo, None):
|
|
||||||
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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user