114 lines
3.6 KiB
Python
114 lines
3.6 KiB
Python
|
"""API Handler for hacs_repository"""
|
||
|
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.functions.logger import getLogger
|
||
|
from custom_components.hacs.share import get_hacs
|
||
|
|
||
|
|
||
|
@websocket_api.async_response
|
||
|
@websocket_api.websocket_command(
|
||
|
{
|
||
|
vol.Required("type"): "hacs/repository",
|
||
|
vol.Optional("action"): cv.string,
|
||
|
vol.Optional("repository"): cv.string,
|
||
|
}
|
||
|
)
|
||
|
async def hacs_repository(hass, connection, msg):
|
||
|
"""Handle get media player cover command."""
|
||
|
hacs = get_hacs()
|
||
|
logger = getLogger()
|
||
|
data = {}
|
||
|
repository = None
|
||
|
|
||
|
repo_id = msg.get("repository")
|
||
|
action = msg.get("action")
|
||
|
if repo_id is None or action is None:
|
||
|
return
|
||
|
|
||
|
try:
|
||
|
repository = hacs.get_by_id(repo_id)
|
||
|
logger.debug(f"Running {action} for {repository.data.full_name}")
|
||
|
|
||
|
if action == "update":
|
||
|
await repository.update_repository(True)
|
||
|
repository.status.updated_info = True
|
||
|
|
||
|
elif action == "install":
|
||
|
repository.data.new = False
|
||
|
was_installed = repository.data.installed
|
||
|
await repository.async_install()
|
||
|
if not was_installed:
|
||
|
hass.bus.async_fire("hacs/reload", {"force": True})
|
||
|
|
||
|
elif action == "not_new":
|
||
|
repository.data.new = False
|
||
|
|
||
|
elif action == "uninstall":
|
||
|
repository.data.new = False
|
||
|
await repository.update_repository(True)
|
||
|
await repository.uninstall()
|
||
|
|
||
|
elif action == "hide":
|
||
|
repository.data.hide = True
|
||
|
|
||
|
elif action == "unhide":
|
||
|
repository.data.hide = False
|
||
|
|
||
|
elif action == "show_beta":
|
||
|
repository.data.show_beta = True
|
||
|
await repository.update_repository()
|
||
|
|
||
|
elif action == "hide_beta":
|
||
|
repository.data.show_beta = False
|
||
|
await repository.update_repository()
|
||
|
|
||
|
elif action == "toggle_beta":
|
||
|
repository.data.show_beta = not repository.data.show_beta
|
||
|
await repository.update_repository()
|
||
|
|
||
|
elif action == "delete":
|
||
|
repository.data.show_beta = False
|
||
|
repository.remove()
|
||
|
|
||
|
elif action == "release_notes":
|
||
|
data = [
|
||
|
{
|
||
|
"name": x.attributes["name"],
|
||
|
"body": x.attributes["body"],
|
||
|
"tag": x.attributes["tag_name"],
|
||
|
}
|
||
|
for x in repository.releases.objects
|
||
|
]
|
||
|
|
||
|
elif action == "set_version":
|
||
|
if msg["version"] == repository.data.default_branch:
|
||
|
repository.data.selected_tag = None
|
||
|
else:
|
||
|
repository.data.selected_tag = msg["version"]
|
||
|
await repository.update_repository()
|
||
|
|
||
|
hass.bus.async_fire("hacs/reload", {"force": True})
|
||
|
|
||
|
else:
|
||
|
logger.error(f"WS action '{action}' is not valid")
|
||
|
|
||
|
await hacs.data.async_write()
|
||
|
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)})
|
||
|
|
||
|
if repository:
|
||
|
repository.state = None
|
||
|
connection.send_message(websocket_api.result_message(msg["id"], data))
|