Addon Manager: Renaming and cleanup

This commit is contained in:
Chris Hennes
2022-02-27 22:50:54 -06:00
parent c4d0eb2f11
commit 17aed10f6f
14 changed files with 274 additions and 262 deletions

View File

@@ -2,7 +2,7 @@
# ***************************************************************************
# * *
# * Copyright (c) 2019 Yorik van Havre <yorik@uncreated.net> *
# * Copyright (c) 2021 Chris Hennes <chennes@pioneerlibrarysystem.org> *
# * Copyright (c) 2022 FreeCAD Project Association *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU Lesser General Public License (LGPL) *
@@ -51,7 +51,7 @@ if FreeCAD.GuiUp:
import addonmanager_utilities as utils
from addonmanager_macro import Macro
from AddonManagerRepo import AddonManagerRepo
from Addon import Addon
import NetworkManager
translate = FreeCAD.Qt.translate
@@ -239,10 +239,10 @@ class UpdateWorker(QtCore.QThread):
package_names.append(name)
addondir = moddir + os.sep + name
if os.path.exists(addondir) and os.listdir(addondir):
state = AddonManagerRepo.UpdateStatus.UNCHECKED
state = Addon.Status.UNCHECKED
else:
state = AddonManagerRepo.UpdateStatus.NOT_INSTALLED
repo = AddonManagerRepo(name, addon["url"], state, addon["branch"])
state = Addon.Status.NOT_INSTALLED
repo = Addon(name, addon["url"], state, addon["branch"])
md_file = os.path.join(addondir, "package.xml")
if os.path.isfile(md_file):
repo.load_metadata_file(md_file)
@@ -281,10 +281,10 @@ class UpdateWorker(QtCore.QThread):
addondir = moddir + os.sep + name
if os.path.exists(addondir) and os.listdir(addondir):
# make sure the folder exists and it contains files!
state = AddonManagerRepo.UpdateStatus.UNCHECKED
state = Addon.Status.UNCHECKED
else:
state = AddonManagerRepo.UpdateStatus.NOT_INSTALLED
repo = AddonManagerRepo(name, url, state, branch)
state = Addon.Status.NOT_INSTALLED
repo = Addon(name, url, state, branch)
md_file = os.path.join(addondir, "package.xml")
if os.path.isfile(md_file):
repo.load_metadata_file(md_file)
@@ -323,7 +323,7 @@ class LoadPackagesFromCacheWorker(QtCore.QThread):
for item in dict_data.values():
if QtCore.QThread.currentThread().isInterruptionRequested():
return
repo = AddonManagerRepo.from_cache(item)
repo = Addon.from_cache(item)
repo_metadata_cache_path = os.path.join(
metadata_cache_path, repo.name, "package.xml"
)
@@ -357,7 +357,7 @@ class LoadMacrosFromCacheWorker(QtCore.QThread):
if QtCore.QThread.currentThread().isInterruptionRequested():
return
new_macro = Macro.from_cache(item)
repo = AddonManagerRepo.from_macro(new_macro)
repo = Addon.from_macro(new_macro)
utils.update_macro_installation_details(repo)
self.add_macro_signal.emit(repo)
@@ -368,18 +368,18 @@ class CheckSingleUpdateWorker(QtCore.QObject):
update_status = QtCore.Signal(int)
def __init__(self, repo: AddonManagerRepo, parent: QtCore.QObject = None):
def __init__(self, repo: Addon, parent: QtCore.QObject = None):
super().__init__(parent)
self.repo = repo
def do_work(self):
# Borrow the function from another class:
checker = UpdateChecker()
if self.repo.repo_type == AddonManagerRepo.RepoType.WORKBENCH:
if self.repo.repo_type == Addon.Kind.WORKBENCH:
checker.check_workbench(self.repo)
elif self.repo.repo_type == AddonManagerRepo.RepoType.MACRO:
elif self.repo.repo_type == Addon.Kind.MACRO:
checker.check_macro(self.repo)
elif self.repo.repo_type == AddonManagerRepo.RepoType.PACKAGE:
elif self.repo.repo_type == Addon.Kind.PACKAGE:
checker.check_package(self.repo)
self.update_status.emit(self.repo.update_status)
@@ -388,10 +388,10 @@ class CheckSingleUpdateWorker(QtCore.QObject):
class CheckWorkbenchesForUpdatesWorker(QtCore.QThread):
"""This worker checks for available updates for all workbenches"""
update_status = QtCore.Signal(AddonManagerRepo)
update_status = QtCore.Signal(Addon)
progress_made = QtCore.Signal(int, int)
def __init__(self, repos: List[AddonManagerRepo]):
def __init__(self, repos: List[Addon]):
QtCore.QThread.__init__(self)
self.repos = repos
@@ -408,14 +408,14 @@ class CheckWorkbenchesForUpdatesWorker(QtCore.QThread):
return
self.progress_made.emit(count, len(self.repos))
count += 1
if repo.status() == AddonManagerRepo.UpdateStatus.UNCHECKED:
if repo.repo_type == AddonManagerRepo.RepoType.WORKBENCH:
if repo.status() == Addon.Status.UNCHECKED:
if repo.repo_type == Addon.Kind.WORKBENCH:
checker.check_workbench(repo)
self.update_status.emit(repo)
elif repo.repo_type == AddonManagerRepo.RepoType.MACRO:
elif repo.repo_type == Addon.Kind.MACRO:
checker.check_macro(repo)
self.update_status.emit(repo)
elif repo.repo_type == AddonManagerRepo.RepoType.PACKAGE:
elif repo.repo_type == Addon.Kind.PACKAGE:
checker.check_package(repo)
self.update_status.emit(repo)
@@ -427,7 +427,7 @@ class UpdateChecker:
def check_workbench(self, wb):
if not have_git or NOGIT:
wb.set_status(AddonManagerRepo.UpdateStatus.CANNOT_CHECK)
wb.set_status(Addon.Status.CANNOT_CHECK)
return
clonedir = self.moddir + os.sep + wb.name
if os.path.exists(clonedir):
@@ -441,7 +441,7 @@ class UpdateChecker:
if gitrepo.head.is_detached:
# By definition, in a detached-head state we cannot
# update, so don't even bother checking.
wb.set_status(AddonManagerRepo.UpdateStatus.NO_UPDATE_AVAILABLE)
wb.set_status(Addon.Status.NO_UPDATE_AVAILABLE)
if hasattr(gitrepo.head, "ref"):
wb.branch = gitrepo.head.ref.name
else:
@@ -458,17 +458,13 @@ class UpdateChecker:
+ "\n"
)
FreeCAD.Console.PrintWarning(str(e) + "\n")
wb.set_status(AddonManagerRepo.UpdateStatus.CANNOT_CHECK)
wb.set_status(Addon.Status.CANNOT_CHECK)
else:
try:
if "git pull" in gitrepo.git.status():
wb.set_status(
AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE
)
wb.set_status(Addon.Status.UPDATE_AVAILABLE)
else:
wb.set_status(
AddonManagerRepo.UpdateStatus.NO_UPDATE_AVAILABLE
)
wb.set_status(Addon.Status.NO_UPDATE_AVAILABLE)
except Exception:
FreeCAD.Console.PrintWarning(
translate(
@@ -476,16 +472,16 @@ class UpdateChecker:
).format(wb.name)
+ "\n"
)
wb.set_status(AddonManagerRepo.UpdateStatus.CANNOT_CHECK)
wb.set_status(Addon.Status.CANNOT_CHECK)
def check_package(self, package: AddonManagerRepo) -> None:
def check_package(self, package: Addon) -> None:
clonedir = self.moddir + os.sep + package.name
if os.path.exists(clonedir):
# First, try to just do a git-based update, which will give the most accurate results:
if have_git and not NOGIT:
self.check_workbench(package)
if package.status() != AddonManagerRepo.UpdateStatus.CANNOT_CHECK:
if package.status() != Addon.Status.CANNOT_CHECK:
# It worked, just exit now
return
@@ -495,7 +491,7 @@ class UpdateChecker:
# If there is no package.xml file, then it's because the package author added it after the last time
# the local installation was updated. By definition, then, there is an update available, if only to
# download the new XML file.
package.set_status(AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE)
package.set_status(Addon.Status.UPDATE_AVAILABLE)
package.installed_version = None
return
else:
@@ -506,11 +502,9 @@ class UpdateChecker:
# Packages are considered up-to-date if the metadata version matches. Authors should update
# their version string when they want the addon manager to alert users of a new version.
if package.metadata.Version != installed_metadata.Version:
package.set_status(AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE)
package.set_status(Addon.Status.UPDATE_AVAILABLE)
else:
package.set_status(
AddonManagerRepo.UpdateStatus.NO_UPDATE_AVAILABLE
)
package.set_status(Addon.Status.NO_UPDATE_AVAILABLE)
except Exception:
FreeCAD.Console.PrintWarning(
translate(
@@ -519,9 +513,9 @@ class UpdateChecker:
).format(name=installed_metadata_file)
+ "\n"
)
package.set_status(AddonManagerRepo.UpdateStatus.CANNOT_CHECK)
package.set_status(Addon.Status.CANNOT_CHECK)
def check_macro(self, macro_wrapper: AddonManagerRepo) -> None:
def check_macro(self, macro_wrapper: Addon) -> None:
# Make sure this macro has its code downloaded:
try:
if not macro_wrapper.macro.parsed and macro_wrapper.macro.on_git:
@@ -542,7 +536,7 @@ class UpdateChecker:
).format(name=macro_wrapper.macro.name)
+ "\n"
)
macro_wrapper.set_status(AddonManagerRepo.UpdateStatus.CANNOT_CHECK)
macro_wrapper.set_status(Addon.Status.CANNOT_CHECK)
return
hasher1 = hashlib.sha1()
@@ -568,9 +562,9 @@ class UpdateChecker:
else:
return
if new_sha1 == old_sha1:
macro_wrapper.set_status(AddonManagerRepo.UpdateStatus.NO_UPDATE_AVAILABLE)
macro_wrapper.set_status(Addon.Status.NO_UPDATE_AVAILABLE)
else:
macro_wrapper.set_status(AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE)
macro_wrapper.set_status(Addon.Status.UPDATE_AVAILABLE)
class FillMacroListWorker(QtCore.QThread):
@@ -669,7 +663,7 @@ class FillMacroListWorker(QtCore.QThread):
macro = Macro(filename[:-8]) # Remove ".FCMacro".
macro.on_git = True
macro.src_filename = os.path.join(dirpath, filename)
repo = AddonManagerRepo.from_macro(macro)
repo = Addon.from_macro(macro)
repo.url = "https://github.com/FreeCAD/FreeCAD-macros.git"
utils.update_macro_installation_details(repo)
self.add_macro_signal.emit(repo)
@@ -713,7 +707,7 @@ class FillMacroListWorker(QtCore.QThread):
macro_names.append(macname)
macro = Macro(macname)
macro.on_wiki = True
repo = AddonManagerRepo.from_macro(macro)
repo = Addon.from_macro(macro)
repo.url = "https://wiki.freecad.org/Macros_recipes"
utils.update_macro_installation_details(repo)
self.add_macro_signal.emit(repo)
@@ -723,10 +717,10 @@ class CacheMacroCode(QtCore.QThread):
"""Download and cache the macro code, and parse its internal metadata"""
status_message = QtCore.Signal(str)
update_macro = QtCore.Signal(AddonManagerRepo)
update_macro = QtCore.Signal(Addon)
progress_made = QtCore.Signal(int, int)
def __init__(self, repos: List[AddonManagerRepo]) -> None:
def __init__(self, repos: List[Addon]) -> None:
QtCore.QThread.__init__(self)
self.repos = repos
self.workers = []
@@ -797,7 +791,7 @@ class CacheMacroCode(QtCore.QThread):
).format(num_macros=num_macros, num_failed=num_failed)
)
def update_and_advance(self, repo: AddonManagerRepo) -> None:
def update_and_advance(self, repo: Addon) -> None:
if repo is not None:
if repo.macro.name not in self.failed:
self.update_macro.emit(repo)
@@ -906,10 +900,10 @@ class InstallWorkbenchWorker(QtCore.QThread):
status_message = QtCore.Signal(str)
progress_made = QtCore.Signal(int, int)
success = QtCore.Signal(AddonManagerRepo, str)
failure = QtCore.Signal(AddonManagerRepo, str)
success = QtCore.Signal(Addon, str)
failure = QtCore.Signal(Addon, str)
def __init__(self, repo: AddonManagerRepo):
def __init__(self, repo: Addon):
QtCore.QThread.__init__(self)
self.repo = repo
@@ -1094,7 +1088,7 @@ class InstallWorkbenchWorker(QtCore.QThread):
"Addon successfully installed.",
)
if self.repo.repo_type == AddonManagerRepo.RepoType.WORKBENCH:
if self.repo.repo_type == Addon.Kind.WORKBENCH:
# symlink any macro contained in the module to the macros folder
macro_dir = FreeCAD.getUserMacroDir(True)
if not os.path.exists(macro_dir):
@@ -1375,7 +1369,7 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
status_message = QtCore.Signal(str)
progress_made = QtCore.Signal(int, int)
package_updated = QtCore.Signal(AddonManagerRepo)
package_updated = QtCore.Signal(Addon)
class RequestType(Enum):
PACKAGE_XML = auto()
@@ -1387,9 +1381,7 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
QtCore.QThread.__init__(self)
self.repos = repos
self.requests: Dict[
int, (AddonManagerRepo, UpdateMetadataCacheWorker.RequestType)
] = {}
self.requests: Dict[int, (Addon, UpdateMetadataCacheWorker.RequestType)] = {}
NetworkManager.AM_NETWORK_MANAGER.completed.connect(self.download_completed)
self.requests_completed = 0
self.total_requests = 0
@@ -1470,8 +1462,8 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
elif request[1] == UpdateMetadataCacheWorker.RequestType.ICON:
self.process_icon(request[0], data)
def process_package_xml(self, repo: AddonManagerRepo, data: QtCore.QByteArray):
repo.repo_type = AddonManagerRepo.RepoType.PACKAGE # By definition
def process_package_xml(self, repo: Addon, data: QtCore.QByteArray):
repo.repo_type = Addon.Kind.PACKAGE # By definition
package_cache_directory = os.path.join(self.store, repo.name)
if not os.path.exists(package_cache_directory):
os.makedirs(package_cache_directory)
@@ -1509,7 +1501,7 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
self.requests[index] = (repo, UpdateMetadataCacheWorker.RequestType.ICON)
self.total_requests += 1
def process_metadata_txt(self, repo: AddonManagerRepo, data: QtCore.QByteArray):
def process_metadata_txt(self, repo: Addon, data: QtCore.QByteArray):
self.status_message.emit(
translate("AddonsInstaller", "Downloaded metadata.txt for {}").format(
repo.display_name
@@ -1557,7 +1549,7 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
with open(new_xml_file, "wb") as f:
f.write(data.data())
def process_requirements_txt(self, repo: AddonManagerRepo, data: QtCore.QByteArray):
def process_requirements_txt(self, repo: Addon, data: QtCore.QByteArray):
self.status_message.emit(
translate(
"AddonsInstaller",
@@ -1583,7 +1575,7 @@ class UpdateMetadataCacheWorker(QtCore.QThread):
with open(new_xml_file, "wb") as f:
f.write(data.data())
def process_icon(self, repo: AddonManagerRepo, data: QtCore.QByteArray):
def process_icon(self, repo: Addon, data: QtCore.QByteArray):
self.status_message.emit(
translate("AddonsInstaller", "Downloaded icon for {}").format(
repo.display_name
@@ -1625,8 +1617,8 @@ class UpdateAllWorker(QtCore.QThread):
progress_made = QtCore.Signal(int, int)
status_message = QtCore.Signal(str)
success = QtCore.Signal(AddonManagerRepo)
failure = QtCore.Signal(AddonManagerRepo)
success = QtCore.Signal(Addon)
failure = QtCore.Signal(Addon)
def __init__(self, repos):
super().__init__()
@@ -1664,13 +1656,13 @@ class UpdateAllWorker(QtCore.QThread):
for worker in workers:
worker.wait()
def on_success(self, repo: AddonManagerRepo) -> None:
def on_success(self, repo: Addon) -> None:
self.progress_made.emit(
len(self.repos) - self.repo_queue.qsize(), len(self.repos)
)
self.success.emit(repo)
def on_failure(self, repo: AddonManagerRepo) -> None:
def on_failure(self, repo: Addon) -> None:
self.progress_made.emit(
len(self.repos) - self.repo_queue.qsize(), len(self.repos)
)
@@ -1678,8 +1670,8 @@ class UpdateAllWorker(QtCore.QThread):
class UpdateSingleWorker(QtCore.QThread):
success = QtCore.Signal(AddonManagerRepo)
failure = QtCore.Signal(AddonManagerRepo)
success = QtCore.Signal(Addon)
failure = QtCore.Signal(Addon)
def __init__(self, repo_queue: queue.Queue):
super().__init__()
@@ -1694,13 +1686,13 @@ class UpdateSingleWorker(QtCore.QThread):
repo = self.repo_queue.get_nowait()
except queue.Empty:
return
if repo.repo_type == AddonManagerRepo.RepoType.MACRO:
if repo.repo_type == Addon.Kind.MACRO:
self.update_macro(repo)
else:
self.update_package(repo)
self.repo_queue.task_done()
def update_macro(self, repo: AddonManagerRepo):
def update_macro(self, repo: Addon):
"""Updating a macro happens in this function, in the current thread"""
cache_path = os.path.join(
@@ -1718,7 +1710,7 @@ class UpdateSingleWorker(QtCore.QThread):
else:
self.failure.emit(repo)
def update_package(self, repo: AddonManagerRepo):
def update_package(self, repo: Addon):
"""Updating a package re-uses the package installation worker, so actually spawns another thread that we block on"""
worker = InstallWorkbenchWorker(repo)