mirror of
https://github.com/CCOSTAN/Home-AssistantConfig.git
synced 2025-09-15 07:59:41 +00:00
Updated HACS and also fixed Garadget #727
This commit is contained in:
127
config/custom_components/hacs/hacsbase/__init__.py
Executable file → Normal file
127
config/custom_components/hacs/hacsbase/__init__.py
Executable file → Normal file
@@ -9,13 +9,20 @@ from homeassistant.helpers.event import async_call_later, async_track_time_inter
|
||||
from aiogithubapi import AIOGitHubException, AIOGitHubRatelimit
|
||||
from integrationhelper import Logger
|
||||
|
||||
from .task_factory import HacsTaskFactory
|
||||
from .exceptions import HacsException
|
||||
from custom_components.hacs.hacsbase.task_factory import HacsTaskFactory
|
||||
from custom_components.hacs.hacsbase.exceptions import HacsException
|
||||
|
||||
from ..const import ELEMENT_TYPES
|
||||
from ..setup import setup_extra_stores
|
||||
from ..store import async_load_from_store, async_save_to_store
|
||||
from ..helpers.get_defaults import get_default_repos_lists, get_default_repos_orgs
|
||||
from custom_components.hacs.const import ELEMENT_TYPES
|
||||
from custom_components.hacs.setup import setup_extra_stores
|
||||
from custom_components.hacs.store import async_load_from_store, async_save_to_store
|
||||
from custom_components.hacs.helpers.get_defaults import (
|
||||
get_default_repos_lists,
|
||||
get_default_repos_orgs,
|
||||
)
|
||||
|
||||
from custom_components.hacs.helpers.register_repository import register_repository
|
||||
from custom_components.hacs.globals import removed_repositories, get_removed, is_removed
|
||||
from custom_components.hacs.repositories.removed import RemovedRepository
|
||||
|
||||
|
||||
class HacsStatus:
|
||||
@@ -40,7 +47,6 @@ class HacsCommon:
|
||||
"""Common for HACS."""
|
||||
|
||||
categories = []
|
||||
blacklist = []
|
||||
default = []
|
||||
installed = []
|
||||
skip = []
|
||||
@@ -90,6 +96,7 @@ class Hacs:
|
||||
github = None
|
||||
hass = None
|
||||
version = None
|
||||
session = None
|
||||
factory = HacsTaskFactory()
|
||||
system = System()
|
||||
recuring_tasks = []
|
||||
@@ -114,7 +121,7 @@ class Hacs:
|
||||
"""Get repository by full_name."""
|
||||
try:
|
||||
for repository in self.repositories:
|
||||
if repository.information.full_name == repository_full_name:
|
||||
if repository.data.full_name.lower() == repository_full_name.lower():
|
||||
return repository
|
||||
except Exception: # pylint: disable=broad-except
|
||||
pass
|
||||
@@ -122,10 +129,9 @@ class Hacs:
|
||||
|
||||
def is_known(self, repository_full_name):
|
||||
"""Return a bool if the repository is known."""
|
||||
for repository in self.repositories:
|
||||
if repository.information.full_name == repository_full_name:
|
||||
return True
|
||||
return False
|
||||
return repository_full_name.lower() in [
|
||||
x.data.full_name.lower() for x in self.repositories
|
||||
]
|
||||
|
||||
@property
|
||||
def sorted_by_name(self):
|
||||
@@ -135,59 +141,16 @@ class Hacs:
|
||||
@property
|
||||
def sorted_by_repository_name(self):
|
||||
"""Return a sorted(by repository_name) list of repository objects."""
|
||||
return sorted(self.repositories, key=lambda x: x.information.full_name)
|
||||
return sorted(self.repositories, key=lambda x: x.data.full_name)
|
||||
|
||||
async def register_repository(self, full_name, category, check=True):
|
||||
"""Register a repository."""
|
||||
from ..repositories.repository import RERPOSITORY_CLASSES
|
||||
|
||||
if full_name in self.common.skip:
|
||||
if full_name != "hacs/integration":
|
||||
self.logger.debug(f"Skipping {full_name}")
|
||||
return
|
||||
|
||||
if category not in RERPOSITORY_CLASSES:
|
||||
msg = f"{category} is not a valid repository category."
|
||||
self.logger.error(msg)
|
||||
raise HacsException(msg)
|
||||
|
||||
repository = RERPOSITORY_CLASSES[category](full_name)
|
||||
if check:
|
||||
try:
|
||||
await repository.registration()
|
||||
if self.system.status.new:
|
||||
repository.status.new = False
|
||||
if repository.validate.errors:
|
||||
self.common.skip.append(repository.information.full_name)
|
||||
if not self.system.status.startup:
|
||||
self.logger.error(f"Validation for {full_name} failed.")
|
||||
return repository.validate.errors
|
||||
repository.logger.info("Registration complete")
|
||||
except AIOGitHubException as exception:
|
||||
self.logger.debug(self.github.ratelimits.remaining)
|
||||
self.logger.debug(self.github.ratelimits.reset_utc)
|
||||
self.common.skip.append(repository.information.full_name)
|
||||
# if not self.system.status.startup:
|
||||
if self.system.status.startup:
|
||||
self.logger.error(
|
||||
f"Validation for {full_name} failed with {exception}."
|
||||
)
|
||||
return exception
|
||||
self.hass.bus.async_fire(
|
||||
"hacs/repository",
|
||||
{
|
||||
"id": 1337,
|
||||
"action": "registration",
|
||||
"repository": repository.information.full_name,
|
||||
"repository_id": repository.information.uid,
|
||||
},
|
||||
)
|
||||
self.repositories.append(repository)
|
||||
await register_repository(full_name, category, check=True)
|
||||
|
||||
async def startup_tasks(self):
|
||||
"""Tasks tha are started after startup."""
|
||||
self.system.status.background_task = True
|
||||
await self.hass.async_add_executor_job(setup_extra_stores, self)
|
||||
await self.hass.async_add_executor_job(setup_extra_stores)
|
||||
self.hass.bus.async_fire("hacs/status", {})
|
||||
self.logger.debug(self.github.ratelimits.remaining)
|
||||
self.logger.debug(self.github.ratelimits.reset_utc)
|
||||
@@ -195,7 +158,7 @@ class Hacs:
|
||||
await self.handle_critical_repositories_startup()
|
||||
await self.handle_critical_repositories()
|
||||
await self.load_known_repositories()
|
||||
await self.clear_out_blacklisted_repositories()
|
||||
await self.clear_out_removed_repositories()
|
||||
|
||||
self.recuring_tasks.append(
|
||||
async_track_time_interval(
|
||||
@@ -257,7 +220,8 @@ class Hacs:
|
||||
stored_critical = []
|
||||
|
||||
for repository in critical:
|
||||
self.common.blacklist.append(repository["repository"])
|
||||
removed_repo = get_removed(repository["repository"])
|
||||
removed_repo.removal_type = "critical"
|
||||
repo = self.get_by_name(repository["repository"])
|
||||
|
||||
stored = {
|
||||
@@ -266,7 +230,6 @@ class Hacs:
|
||||
"link": repository["link"],
|
||||
"acknowledged": True,
|
||||
}
|
||||
|
||||
if repository["repository"] not in instored:
|
||||
if repo is not None and repo.installed:
|
||||
self.logger.critical(
|
||||
@@ -278,6 +241,7 @@ class Hacs:
|
||||
repo.remove()
|
||||
await repo.uninstall()
|
||||
stored_critical.append(stored)
|
||||
removed_repo.update_data(stored)
|
||||
|
||||
# Save to FS
|
||||
await async_save_to_store(self.hass, "critical", stored_critical)
|
||||
@@ -299,7 +263,7 @@ class Hacs:
|
||||
for repository in self.repositories:
|
||||
if (
|
||||
repository.status.installed
|
||||
and repository.category in self.common.categories
|
||||
and repository.data.category in self.common.categories
|
||||
):
|
||||
self.factory.tasks.append(self.factory.safe_update(repository))
|
||||
|
||||
@@ -313,33 +277,35 @@ class Hacs:
|
||||
async def recuring_tasks_all(self, notarealarg=None):
|
||||
"""Recuring tasks for all repositories."""
|
||||
self.logger.debug("Starting recuring background task for all repositories")
|
||||
await self.hass.async_add_executor_job(setup_extra_stores)
|
||||
self.system.status.background_task = True
|
||||
self.hass.bus.async_fire("hacs/status", {})
|
||||
self.logger.debug(self.github.ratelimits.remaining)
|
||||
self.logger.debug(self.github.ratelimits.reset_utc)
|
||||
for repository in self.repositories:
|
||||
if repository.category in self.common.categories:
|
||||
if repository.data.category in self.common.categories:
|
||||
self.factory.tasks.append(self.factory.safe_common_update(repository))
|
||||
|
||||
await self.factory.execute()
|
||||
await self.load_known_repositories()
|
||||
await self.clear_out_blacklisted_repositories()
|
||||
await self.clear_out_removed_repositories()
|
||||
self.system.status.background_task = False
|
||||
await self.data.async_write()
|
||||
self.hass.bus.async_fire("hacs/status", {})
|
||||
self.hass.bus.async_fire("hacs/repository", {"action": "reload"})
|
||||
self.logger.debug("Recuring background task for all repositories done")
|
||||
|
||||
async def clear_out_blacklisted_repositories(self):
|
||||
async def clear_out_removed_repositories(self):
|
||||
"""Clear out blaclisted repositories."""
|
||||
need_to_save = False
|
||||
for repository in self.common.blacklist:
|
||||
if self.is_known(repository):
|
||||
repository = self.get_by_name(repository)
|
||||
if repository.status.installed:
|
||||
for removed in removed_repositories:
|
||||
if self.is_known(removed.repository):
|
||||
repository = self.get_by_name(removed.repository)
|
||||
if repository.status.installed and removed.removal_type != "critical":
|
||||
self.logger.warning(
|
||||
f"You have {repository.information.full_name} installed with HACS "
|
||||
+ "this repository has been blacklisted, please consider removing it."
|
||||
f"You have {repository.data.full_name} installed with HACS "
|
||||
+ f"this repository has been removed, please consider removing it. "
|
||||
+ f"Removal reason ({removed.removal_type})"
|
||||
)
|
||||
else:
|
||||
need_to_save = True
|
||||
@@ -353,7 +319,7 @@ class Hacs:
|
||||
repositories = {}
|
||||
for category in self.common.categories:
|
||||
repositories[category] = await get_default_repos_lists(
|
||||
self.github, category
|
||||
self.session, self.configuration.token, category
|
||||
)
|
||||
org = await get_default_repos_orgs(self.github, category)
|
||||
for repo in org:
|
||||
@@ -370,17 +336,20 @@ class Hacs:
|
||||
self.logger.info("Loading known repositories")
|
||||
repositories = await self.get_repositories()
|
||||
|
||||
for item in await get_default_repos_lists(self.github, "blacklist"):
|
||||
if item not in self.common.blacklist:
|
||||
self.common.blacklist.append(item)
|
||||
for item in await get_default_repos_lists(
|
||||
self.session, self.configuration.token, "removed"
|
||||
):
|
||||
removed = get_removed(item["repository"])
|
||||
removed.reason = item.get("reason")
|
||||
removed.link = item.get("link")
|
||||
removed.removal_type = item.get("removal_type")
|
||||
|
||||
for category in repositories:
|
||||
for repo in repositories[category]:
|
||||
if repo in self.common.blacklist:
|
||||
if is_removed(repo):
|
||||
continue
|
||||
if self.is_known(repo):
|
||||
continue
|
||||
self.factory.tasks.append(
|
||||
self.factory.safe_register(self, repo, category)
|
||||
)
|
||||
self.factory.tasks.append(self.factory.safe_register(repo, category))
|
||||
await self.factory.execute()
|
||||
self.logger.info("Loading known repositories finished")
|
||||
|
Reference in New Issue
Block a user