122 lines
3.9 KiB
Python
122 lines
3.9 KiB
Python
|
"""API Handler for hacs_repository_data"""
|
||
|
import sys
|
||
|
|
||
|
import homeassistant.helpers.config_validation as cv
|
||
|
import voluptuous as vol
|
||
|
from aiogithubapi import AIOGitHubAPIException
|
||
|
from homeassistant.components import websocket_api
|
||
|
|
||
|
from custom_components.hacs.helpers.classes.exceptions import HacsException
|
||
|
from custom_components.hacs.helpers.functions.logger import getLogger
|
||
|
from custom_components.hacs.helpers.functions.misc import extract_repository_from_url
|
||
|
from custom_components.hacs.helpers.functions.register_repository import (
|
||
|
register_repository,
|
||
|
)
|
||
|
from custom_components.hacs.share import get_hacs
|
||
|
|
||
|
_LOGGER = getLogger()
|
||
|
|
||
|
|
||
|
@websocket_api.async_response
|
||
|
@websocket_api.websocket_command(
|
||
|
{
|
||
|
vol.Required("type"): "hacs/repository/data",
|
||
|
vol.Optional("action"): cv.string,
|
||
|
vol.Optional("repository"): cv.string,
|
||
|
vol.Optional("data"): cv.string,
|
||
|
}
|
||
|
)
|
||
|
async def hacs_repository_data(hass, connection, msg):
|
||
|
"""Handle get media player cover command."""
|
||
|
hacs = get_hacs()
|
||
|
repo_id = msg.get("repository")
|
||
|
action = msg.get("action")
|
||
|
data = msg.get("data")
|
||
|
|
||
|
if repo_id is None:
|
||
|
return
|
||
|
|
||
|
if action == "add":
|
||
|
repo_id = extract_repository_from_url(repo_id)
|
||
|
if repo_id is None:
|
||
|
return
|
||
|
|
||
|
if repo_id in hacs.common.skip:
|
||
|
hacs.common.skip.remove(repo_id)
|
||
|
|
||
|
if not hacs.get_by_name(repo_id):
|
||
|
try:
|
||
|
registration = await register_repository(repo_id, data.lower())
|
||
|
if registration is not None:
|
||
|
raise HacsException(registration)
|
||
|
except (
|
||
|
Exception,
|
||
|
BaseException,
|
||
|
) as exception: # pylint: disable=broad-except
|
||
|
hass.bus.async_fire(
|
||
|
"hacs/error",
|
||
|
{
|
||
|
"action": "add_repository",
|
||
|
"exception": str(sys.exc_info()[0].__name__),
|
||
|
"message": str(exception),
|
||
|
},
|
||
|
)
|
||
|
else:
|
||
|
hass.bus.async_fire(
|
||
|
"hacs/error",
|
||
|
{
|
||
|
"action": "add_repository",
|
||
|
"message": f"Repository '{repo_id}' exists in the store.",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
repository = hacs.get_by_name(repo_id)
|
||
|
else:
|
||
|
repository = hacs.get_by_id(repo_id)
|
||
|
|
||
|
if repository is None:
|
||
|
hass.bus.async_fire("hacs/repository", {})
|
||
|
return
|
||
|
|
||
|
_LOGGER.debug("Running %s for %s", action, repository.data.full_name)
|
||
|
try:
|
||
|
if action == "set_state":
|
||
|
repository.state = data
|
||
|
|
||
|
elif action == "set_version":
|
||
|
repository.data.selected_tag = data
|
||
|
await repository.update_repository()
|
||
|
|
||
|
repository.state = None
|
||
|
|
||
|
elif action == "install":
|
||
|
was_installed = repository.data.installed
|
||
|
repository.data.selected_tag = data
|
||
|
await repository.update_repository()
|
||
|
await repository.async_install()
|
||
|
repository.state = None
|
||
|
if not was_installed:
|
||
|
hass.bus.async_fire("hacs/reload", {"force": True})
|
||
|
|
||
|
elif action == "add":
|
||
|
repository.state = None
|
||
|
|
||
|
else:
|
||
|
repository.state = None
|
||
|
_LOGGER.error("WS action '%s' is not valid", action)
|
||
|
|
||
|
message = None
|
||
|
except AIOGitHubAPIException as exception:
|
||
|
message = exception
|
||
|
except AttributeError as exception:
|
||
|
message = f"Could not use repository with ID {repo_id} ({exception})"
|
||
|
except (Exception, BaseException) as exception: # pylint: disable=broad-except
|
||
|
message = exception
|
||
|
|
||
|
if message is not None:
|
||
|
_LOGGER.error(message)
|
||
|
hass.bus.async_fire("hacs/error", {"message": str(message)})
|
||
|
|
||
|
await hacs.data.async_write()
|
||
|
connection.send_message(websocket_api.result_message(msg["id"], {}))
|