AddonManager: allow to update all updatable addons at once by pressing the update button again (git-python only)

This commit is contained in:
Yorik van Havre
2017-11-12 15:23:25 -02:00
parent ed671ef65e
commit c72b9fa532

View File

@@ -108,6 +108,7 @@ class AddonsInstaller(QtGui.QDialog):
self.labelDescription.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
self.labelDescription.setWordWrap(True)
self.verticalLayout.addWidget(self.labelDescription)
self.doUpdate = []
self.progressBar = QtGui.QProgressBar(self)
#self.progressBar.setProperty("value", 24)
@@ -197,11 +198,14 @@ class AddonsInstaller(QtGui.QDialog):
def check_updates(self):
if self.tabWidget.currentIndex() == 0:
self.check_worker = CheckWBWorker(self.repos)
self.check_worker.mark.connect(self.mark)
self.check_worker.info_label.connect(self.set_information_label)
self.check_worker.progressbar_show.connect(self.show_progress_bar)
self.check_worker.start()
if not self.doUpdate:
self.check_worker = CheckWBWorker(self.repos)
self.check_worker.mark.connect(self.mark)
self.check_worker.info_label.connect(self.set_information_label)
self.check_worker.progressbar_show.connect(self.show_progress_bar)
self.check_worker.start()
else:
self.install(self.doUpdate)
def add_addon_repo(self, addon_repo):
self.repos.append(addon_repo)
@@ -261,13 +265,22 @@ class AddonsInstaller(QtGui.QDialog):
#print("clicked: ",link)
QtGui.QDesktopServices.openUrl(QtCore.QUrl(link, QtCore.QUrl.TolerantMode))
def install(self):
def install(self,repos=None):
if self.tabWidget.currentIndex() == 0:
idx = self.listWorkbenches.currentRow()
self.install_worker = InstallWorker(self.repos, idx)
self.install_worker.info_label.connect(self.set_information_label)
self.install_worker.progressbar_show.connect(self.show_progress_bar)
self.install_worker.start()
idx = None
if repos:
idx = []
for repo in repos:
for i,r in enumerate(self.repos):
if r[0] == repo:
idx.append(i)
else:
idx = self.listWorkbenches.currentRow()
if idx != None:
self.install_worker = InstallWorker(self.repos, idx)
self.install_worker.info_label.connect(self.set_information_label)
self.install_worker.progressbar_show.connect(self.show_progress_bar)
self.install_worker.start()
elif self.tabWidget.currentIndex() == 1:
macropath = FreeCAD.ParamGet('User parameter:BaseApp/Preferences/Macro').GetString("MacroPath",os.path.join(FreeCAD.ConfigGet("UserAppData"),"Macro"))
if not os.path.isdir(macropath):
@@ -352,7 +365,8 @@ class AddonsInstaller(QtGui.QDialog):
if w.text().startswith(str(repo)):
w.setText(str(repo) + str(" (Update available)"))
w.setIcon(QtGui.QIcon.fromTheme("reload"))
if not repo in self.doUpdate:
self.doUpdate.append(repo)
class UpdateWorker(QtCore.QThread):
@@ -483,7 +497,7 @@ class CheckWBWorker(QtCore.QThread):
upds.append(repo[0])
self.progressbar_show.emit(False)
if upds:
self.info_label.emit(str(len(upds))+" "+translate("AddonsInstaller", "update(s) available")+": "+",".join(upds))
self.info_label.emit(str(len(upds))+" "+translate("AddonsInstaller", "update(s) available")+": "+",".join(upds)+". "+translate("AddonsInstaller","Press the update button again to update them all at once."))
else:
self.info_label.emit(translate("AddonsInstaller","Everything is up to date"))
self.stop = True
@@ -699,60 +713,63 @@ class InstallWorker(QtCore.QThread):
import StringIO as io
except ImportError: # StringIO is not available with python3
import io
if self.idx < 0:
return
if not self.repos:
return
if NOGIT:
git = None
basedir = FreeCAD.ConfigGet("UserAppData")
moddir = basedir + os.sep + "Mod"
if not os.path.exists(moddir):
os.makedirs(moddir)
clonedir = moddir + os.sep + self.repos[self.idx][0]
self.progressbar_show.emit(True)
if os.path.exists(clonedir):
self.info_label.emit("Updating module...")
if git:
if not os.path.exists(clonedir + os.sep + '.git'):
# Repair addon installed with raw download
bare_repo = git.Repo.clone_from(self.repos[self.idx][1], clonedir + os.sep + '.git', bare=True)
try:
with bare_repo.config_writer() as cw:
cw.set('core', 'bare', False)
except AttributeError:
FreeCAD.Console.PrintWarning(translate("AddonsInstaller", "Outdated GitPython detected, consider upgrading with pip.\n"))
cw = bare_repo.config_writer()
cw.set('core', 'bare', False)
del cw
repo = git.Repo(clonedir)
repo.head.reset('--hard')
repo = git.Git(clonedir)
answer = repo.pull()
else:
answer = self.download(self.repos[self.idx][1],clonedir)
else:
self.info_label.emit("Checking module dependencies...")
depsok,answer = self.checkDependencies(self.repos[self.idx][1])
if depsok:
if not isinstance(self.idx,list):
self.idx = [self.idx]
for idx in self.idx:
if idx < 0:
return
if not self.repos:
return
if NOGIT:
git = None
basedir = FreeCAD.ConfigGet("UserAppData")
moddir = basedir + os.sep + "Mod"
if not os.path.exists(moddir):
os.makedirs(moddir)
clonedir = moddir + os.sep + self.repos[idx][0]
self.progressbar_show.emit(True)
if os.path.exists(clonedir):
self.info_label.emit("Updating module...")
if git:
self.info_label.emit("Cloning module...")
repo = git.Repo.clone_from(self.repos[self.idx][1], clonedir, branch='master')
if not os.path.exists(clonedir + os.sep + '.git'):
# Repair addon installed with raw download
bare_repo = git.Repo.clone_from(self.repos[idx][1], clonedir + os.sep + '.git', bare=True)
try:
with bare_repo.config_writer() as cw:
cw.set('core', 'bare', False)
except AttributeError:
FreeCAD.Console.PrintWarning(translate("AddonsInstaller", "Outdated GitPython detected, consider upgrading with pip.\n"))
cw = bare_repo.config_writer()
cw.set('core', 'bare', False)
del cw
repo = git.Repo(clonedir)
repo.head.reset('--hard')
repo = git.Git(clonedir)
answer = repo.pull()
else:
self.info_label.emit("Downloading module...")
self.download(self.repos[self.idx][1],clonedir)
answer = translate("AddonsInstaller", "Workbench successfully installed. Please restart FreeCAD to apply the changes.")
# symlink any macro contained in the module to the macros folder
macrodir = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro").GetString("MacroPath",os.path.join(FreeCAD.ConfigGet("UserAppData"),"Macro"))
if not os.path.exists(macrodir):
os.makedirs(macrodir)
for f in os.listdir(clonedir):
if f.lower().endswith(".fcmacro"):
symlink(clonedir+os.sep+f,macrodir+os.sep+f)
FreeCAD.ParamGet('User parameter:Plugins/'+self.repos[self.idx][0]).SetString("destination",clonedir)
answer += translate("AddonsInstaller", "A macro has been installed and is available the Macros menu") + ": <b>"
answer += f + "</b>"
self.info_label.emit(answer)
answer = self.download(self.repos[idx][1],clonedir)
else:
self.info_label.emit("Checking module dependencies...")
depsok,answer = self.checkDependencies(self.repos[idx][1])
if depsok:
if git:
self.info_label.emit("Cloning module...")
repo = git.Repo.clone_from(self.repos[idx][1], clonedir, branch='master')
else:
self.info_label.emit("Downloading module...")
self.download(self.repos[idx][1],clonedir)
answer = translate("AddonsInstaller", "Workbench successfully installed. Please restart FreeCAD to apply the changes.")
# symlink any macro contained in the module to the macros folder
macrodir = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Macro").GetString("MacroPath",os.path.join(FreeCAD.ConfigGet("UserAppData"),"Macro"))
if not os.path.exists(macrodir):
os.makedirs(macrodir)
for f in os.listdir(clonedir):
if f.lower().endswith(".fcmacro"):
symlink(clonedir+os.sep+f,macrodir+os.sep+f)
FreeCAD.ParamGet('User parameter:Plugins/'+self.repos[idx][0]).SetString("destination",clonedir)
answer += translate("AddonsInstaller", "A macro has been installed and is available the Macros menu") + ": <b>"
answer += f + "</b>"
self.info_label.emit(answer)
self.progressbar_show.emit(False)
self.stop = True