125 lines
4.9 KiB
Python
125 lines
4.9 KiB
Python
"""Helper to do common validation for repositories."""
|
|
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
from aiogithubapi import AIOGitHubAPIException
|
|
|
|
from custom_components.hacs.exceptions import (
|
|
HacsException,
|
|
HacsNotModifiedException,
|
|
HacsRepositoryArchivedException,
|
|
HacsRepositoryExistException,
|
|
)
|
|
from custom_components.hacs.helpers.functions.information import (
|
|
get_releases,
|
|
get_repository,
|
|
get_tree,
|
|
)
|
|
from custom_components.hacs.helpers.functions.version_to_install import (
|
|
version_to_install,
|
|
)
|
|
from custom_components.hacs.share import get_hacs, is_removed
|
|
|
|
if TYPE_CHECKING:
|
|
from custom_components.hacs.helpers.classes.repository import HacsRepository
|
|
|
|
|
|
async def common_validate(repository, ignore_issues=False):
|
|
"""Common validation steps of the repository."""
|
|
repository.validate.errors = []
|
|
|
|
# Make sure the repository exist.
|
|
repository.logger.debug("%s Checking repository.", repository)
|
|
await common_update_data(repository, ignore_issues)
|
|
|
|
# Step 6: Get the content of hacs.json
|
|
await repository.get_repository_manifest_content()
|
|
|
|
|
|
async def common_update_data(repository: HacsRepository, ignore_issues=False, force=False):
|
|
"""Common update data."""
|
|
hacs = get_hacs()
|
|
releases = []
|
|
try:
|
|
repository_object, etag = await get_repository(
|
|
hacs.session,
|
|
hacs.configuration.token,
|
|
repository.data.full_name,
|
|
etag=None if force or repository.data.installed else repository.data.etag_repository,
|
|
)
|
|
repository.repository_object = repository_object
|
|
if repository.data.full_name.lower() != repository_object.full_name.lower():
|
|
hacs.common.renamed_repositories[
|
|
repository.data.full_name
|
|
] = repository_object.full_name
|
|
if str(repository_object.id) not in hacs.common.default:
|
|
hacs.common.default.append(str(repository_object.id))
|
|
raise HacsRepositoryExistException
|
|
repository.data.update_data(repository_object.attributes)
|
|
repository.data.etag_repository = etag
|
|
except HacsNotModifiedException:
|
|
return
|
|
except HacsRepositoryExistException:
|
|
raise HacsRepositoryExistException from None
|
|
except (AIOGitHubAPIException, HacsException) as exception:
|
|
if not hacs.status.startup:
|
|
repository.logger.error("%s %s", repository, exception)
|
|
if not ignore_issues:
|
|
repository.validate.errors.append("Repository does not exist.")
|
|
raise HacsException(exception) from None
|
|
|
|
# Make sure the repository is not archived.
|
|
if repository.data.archived and not ignore_issues:
|
|
repository.validate.errors.append("Repository is archived.")
|
|
hacs.common.archived_repositories.append(repository.data.full_name)
|
|
raise HacsRepositoryArchivedException("Repository is archived.")
|
|
|
|
# Make sure the repository is not in the blacklist.
|
|
if is_removed(repository.data.full_name) and not ignore_issues:
|
|
repository.validate.errors.append("Repository is in the blacklist.")
|
|
raise HacsException("Repository is in the blacklist.")
|
|
|
|
# Get releases.
|
|
try:
|
|
releases = await get_releases(
|
|
repository.repository_object,
|
|
repository.data.show_beta,
|
|
hacs.configuration.release_limit,
|
|
)
|
|
if releases:
|
|
repository.data.releases = True
|
|
repository.releases.objects = [x for x in releases if not x.draft]
|
|
repository.data.published_tags = [x.tag_name for x in repository.releases.objects]
|
|
repository.data.last_version = next(iter(repository.data.published_tags))
|
|
|
|
except (AIOGitHubAPIException, HacsException):
|
|
repository.data.releases = False
|
|
|
|
if not repository.force_branch:
|
|
repository.ref = version_to_install(repository)
|
|
if repository.data.releases:
|
|
for release in repository.releases.objects or []:
|
|
if release.tag_name == repository.ref:
|
|
assets = release.assets
|
|
if assets:
|
|
downloads = next(iter(assets)).attributes.get("download_count")
|
|
repository.data.downloads = downloads
|
|
|
|
repository.logger.debug(
|
|
"%s Running checks against %s", repository, repository.ref.replace("tags/", "")
|
|
)
|
|
|
|
try:
|
|
repository.tree = await get_tree(repository.repository_object, repository.ref)
|
|
if not repository.tree:
|
|
raise HacsException("No files in tree")
|
|
repository.treefiles = []
|
|
for treefile in repository.tree:
|
|
repository.treefiles.append(treefile.full_path)
|
|
except (AIOGitHubAPIException, HacsException) as exception:
|
|
if not hacs.status.startup:
|
|
repository.logger.error("%s %s", repository, exception)
|
|
if not ignore_issues:
|
|
raise HacsException(exception) from None
|