Addon Manager: Renaming and cleanup
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user