Updated HACS and also fixed Garadget #727

This commit is contained in:
ccostan
2020-04-09 21:29:27 -04:00
parent 51aab60dea
commit e6e0d442e9
65 changed files with 1510 additions and 1047 deletions

124
config/custom_components/hacs/helpers/download.py Executable file → Normal file
View File

@@ -16,9 +16,13 @@ class FileInformation:
def should_try_releases(repository):
"""Return a boolean indicating whether to download releases or not."""
if repository.ref == repository.information.default_branch:
if repository.data.zip_release:
if repository.data.filename.endswith(".zip"):
if repository.ref != repository.data.default_branch:
return True
if repository.ref == repository.data.default_branch:
return False
if repository.information.category not in ["plugin", "theme"]:
if repository.data.category not in ["plugin", "theme"]:
return False
if not repository.releases.releases:
return False
@@ -31,7 +35,7 @@ def gather_files_to_download(repository):
tree = repository.tree
ref = f"{repository.ref}".replace("tags/", "")
releaseobjects = repository.releases.objects
category = repository.information.category
category = repository.data.category
remotelocation = repository.content.path.remote
if should_try_releases(repository):
@@ -44,7 +48,7 @@ def gather_files_to_download(repository):
if repository.content.single:
for treefile in tree:
if treefile.filename == repository.information.file_name:
if treefile.filename == repository.data.file_name:
files.append(
FileInformation(
treefile.download_url, treefile.full_path, treefile.filename
@@ -55,28 +59,29 @@ def gather_files_to_download(repository):
if category == "plugin":
for treefile in tree:
if treefile.path in ["", "dist"]:
if not remotelocation:
if treefile.filename != repository.information.file_name:
continue
if remotelocation == "dist" and not treefile.filename.startswith(
"dist"
):
continue
if treefile.is_directory:
continue
files.append(
FileInformation(
treefile.download_url, treefile.full_path, treefile.filename
if not remotelocation:
if not treefile.filename.endswith(".js"):
continue
if treefile.path != "":
continue
if not treefile.is_directory:
files.append(
FileInformation(
treefile.download_url, treefile.full_path, treefile.filename
)
)
)
if files:
return files
if repository.repository_manifest.content_in_root:
if repository.repository_manifest.filename is None:
if repository.data.content_in_root:
if not repository.data.filename:
if category == "theme":
tree = filter_content_return_one_of_type(
repository.tree, "themes", "yaml", "full_path"
repository.tree, "", "yaml", "full_path"
)
for path in tree:
@@ -104,21 +109,17 @@ async def download_zip(repository, validate):
return validate
for content in contents:
filecontent = await async_download_file(
repository.hass, content.download_url
)
filecontent = await async_download_file(content.download_url)
if filecontent is None:
validate.errors.append(f"[{content.name}] was not downloaded.")
continue
result = await async_save_file(
f"{tempfile.gettempdir()}/{repository.repository_manifest.filename}",
filecontent,
f"{tempfile.gettempdir()}/{repository.data.filename}", filecontent
)
with zipfile.ZipFile(
f"{tempfile.gettempdir()}/{repository.repository_manifest.filename}",
"r",
f"{tempfile.gettempdir()}/{repository.data.filename}", "r"
) as zip_file:
zip_file.extractall(repository.content.path.local)
@@ -132,54 +133,49 @@ async def download_zip(repository, validate):
return validate
async def download_content(repository, validate, local_directory):
async def download_content(repository):
"""Download the content of a directory."""
contents = gather_files_to_download(repository)
try:
if not contents:
raise HacsException("No content to download")
repository.logger.debug(repository.data.filename)
if not contents:
raise HacsException("No content to download")
for content in contents:
if repository.repository_manifest.content_in_root:
if repository.repository_manifest.filename is not None:
if content.name != repository.repository_manifest.filename:
continue
repository.logger.debug(f"Downloading {content.name}")
filecontent = await async_download_file(
repository.hass, content.download_url
)
if filecontent is None:
validate.errors.append(f"[{content.name}] was not downloaded.")
for content in contents:
if repository.data.content_in_root and repository.data.filename:
if content.name != repository.data.filename:
continue
repository.logger.debug(f"Downloading {content.name}")
# Save the content of the file.
if repository.content.single or content.path is None:
local_directory = repository.content.path.local
filecontent = await async_download_file(content.download_url)
else:
_content_path = content.path
if not repository.repository_manifest.content_in_root:
_content_path = _content_path.replace(
f"{repository.content.path.remote}", ""
)
if filecontent is None:
repository.validate.errors.append(f"[{content.name}] was not downloaded.")
continue
local_directory = f"{repository.content.path.local}/{_content_path}"
local_directory = local_directory.split("/")
del local_directory[-1]
local_directory = "/".join(local_directory)
# Save the content of the file.
if repository.content.single or content.path is None:
local_directory = repository.content.path.local
# Check local directory
pathlib.Path(local_directory).mkdir(parents=True, exist_ok=True)
else:
_content_path = content.path
if not repository.data.content_in_root:
_content_path = _content_path.replace(
f"{repository.content.path.remote}", ""
)
local_file_path = f"{local_directory}/{content.name}"
result = await async_save_file(local_file_path, filecontent)
if result:
repository.logger.info(f"download of {content.name} complete")
continue
validate.errors.append(f"[{content.name}] was not downloaded.")
local_directory = f"{repository.content.path.local}/{_content_path}"
local_directory = local_directory.split("/")
del local_directory[-1]
local_directory = "/".join(local_directory)
# Check local directory
pathlib.Path(local_directory).mkdir(parents=True, exist_ok=True)
local_file_path = (f"{local_directory}/{content.name}").replace("//", "/")
result = await async_save_file(local_file_path, filecontent)
if result:
repository.logger.info(f"download of {content.name} complete")
continue
repository.validate.errors.append(f"[{content.name}] was not downloaded.")
except Exception as exception: # pylint: disable=broad-except
validate.errors.append(f"Download was not complete [{exception}]")
return validate