From 33422254022dcbb4158cac910f14a02bbbd1cd7a Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 10 Jul 2019 18:29:02 -0300 Subject: [PATCH] AddonManager: Provisions to support different git hosting platforms than github --- src/Mod/AddonManager/AddonManager.py | 16 ++---- .../AddonManager/addonmanager_utilities.py | 55 +++++++++++++++++++ src/Mod/AddonManager/addonmanager_workers.py | 55 +++++++++++-------- 3 files changed, 92 insertions(+), 34 deletions(-) diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py index d7110f5cd8b4..3868fa89bf2e 100644 --- a/src/Mod/AddonManager/AddonManager.py +++ b/src/Mod/AddonManager/AddonManager.py @@ -44,12 +44,8 @@ import sys import tempfile -from addonmanager_utilities import translate -from addonmanager_utilities import update_macro_details -from addonmanager_utilities import install_macro -from addonmanager_utilities import remove_macro -from addonmanager_utilities import remove_directory_if_empty -from addonmanager_utilities import restartFreeCAD +import addonmanager_utilities as utils +from addonmanager_utilities import translate # this needs to be as is for pylupdate from addonmanager_workers import * def QT_TRANSLATE_NOOP(ctx,txt): @@ -194,7 +190,7 @@ def reject(self): if ret == m.Ok: shutil.rmtree(self.macro_repo_dir,onerror=self.remove_readonly) # restart FreeCAD after a delay to give time to this dialog to close - QtCore.QTimer.singleShot(1000,restartFreeCAD) + QtCore.QTimer.singleShot(1000,utils.restartFreeCAD) try: shutil.rmtree(self.macro_repo_dir,onerror=self.remove_readonly) except: @@ -359,7 +355,7 @@ def add_macro(self, macro): if macro in self.macros: # The macro is already in the list of macros. old_macro = self.macros[self.macros.index(macro)] - update_macro_details(old_macro, macro) + utils.update_macro_details(old_macro, macro) else: from PySide import QtGui self.macros.append(macro) @@ -402,7 +398,7 @@ def install(self,repos=None): elif self.dialog.tabWidget.currentIndex() == 1: # Tab "Macros". macro = self.macros[self.dialog.listMacros.currentRow()] - if install_macro(macro, self.macro_repo_dir): + if utils.install_macro(macro, self.macro_repo_dir): self.dialog.description.setText(translate("AddonsInstaller", "Macro successfully installed. The macro is now available from the Macros dialog.")) else: self.dialog.description.setText(translate("AddonsInstaller", "Unable to install")) @@ -474,7 +470,7 @@ def remove(self): elif self.dialog.tabWidget.currentIndex() == 1: # Tab "Macros". macro = self.macros[self.dialog.listMacros.currentRow()] - if remove_macro(macro): + if utils.remove_macro(macro): self.dialog.description.setText(translate('AddonsInstaller', 'Macro successfully removed.')) else: self.dialog.description.setText(translate('AddonsInstaller', 'Macro could not be removed.')) diff --git a/src/Mod/AddonManager/addonmanager_utilities.py b/src/Mod/AddonManager/addonmanager_utilities.py index 5ee6e923f5c7..6d92f5fbf72f 100644 --- a/src/Mod/AddonManager/addonmanager_utilities.py +++ b/src/Mod/AddonManager/addonmanager_utilities.py @@ -233,3 +233,58 @@ def restartFreeCAD(): if FreeCADGui.getMainWindow().close(): QtCore.QProcess.startDetached(QtGui.QApplication.applicationFilePath(),args) + +def getzipurl(baseurl): + + "Returns the location of a zip file from a repo, if available" + + url = getserver(baseurl).strip("/") + if url.endswith("github.com"): + return baseurl+"/archive/master.zip" + elif url.endswith("framagit.org"): + # https://framagit.org/freecad-france/mooc-workbench/-/archive/master/mooc-workbench-master.zip + reponame = baseurl.strip("/").split("/")[-1] + return baseurl+"/-/archive/master/"+reponame+"-master.zip" + else: + print("Debug: addonmanager_utilities.getzipurl: Unknown git host:",url) + return None + + +def getreadmeurl(baseurl): + + "Returns the location of a readme file" + + url = getserver(baseurl).strip("/") + if url.endswith("github.com") or url.endswith("framagit.org"): + return baseurl+"/blob/master/README.md" + else: + print("Debug: addonmanager_utilities.getreadmeurl: Unknown git host:",url) + return None + + +def getreadmeregex(baseurl): + + """Return a regex string that extracts the contents to be displayed in the description + panel of the Addon manager, from raw HTML data (the readme's html rendering usually)""" + + url = getserver(baseurl).strip("/") + if url.endswith("github.com"): + return "(.*?)" + elif url.endswith("framagit.org"): + return None # the readme content on framagit is generated by javascript so unretrievable by urlopen + else: + print("Debug: addonmanager_utilities.getreadmeregex: Unknown git host:",url) + return None + + +def getdescregex(baseurl): + + """Returns a regex string that extracts a WB description to be displayed in the description + panel of the Addon manager, if the README could not be found""" + + url = getserver(baseurl).strip("/") + if url.endswith("github.com") or url.endswith("framagit.org"): + return "= 3 and isinstance(p, bytes): p = p.decode("utf-8") u.close() - readme = re.findall("(.*?)",p,flags=re.MULTILINE|re.DOTALL) - if readme: - desc += readme[0] + readmeregex = utils.getreadmeregex(url) + if readmeregex: + readme = re.findall(readmeregex,p,flags=re.MULTILINE|re.DOTALL) + if readme: + desc += readme[0] else: # fall back to the description text - u = urlopen(url) + u = utils.urlopen(url) if not u: self.progressbar_show.emit(False) self.stop = True @@ -341,9 +344,11 @@ def run(self): if sys.version_info.major >= 3 and isinstance(p, bytes): p = p.decode("utf-8") u.close() - desc = re.findall(" Macros menu")+":" answer += "\n" + f + "" @@ -615,7 +620,7 @@ def checkDependencies(self,baseurl): if not depsurl.endswith("/"): depsurl += "/" depsurl += "master/metadata.txt" - mu = urlopen(depsurl) + mu = utils.urlopen(depsurl) if mu: # metadata.txt found depsfile = mu.read() @@ -659,9 +664,9 @@ def checkDependencies(self,baseurl): message += translate("AddonsInstaller","Please install the missing components first.") return ok, message - def download(self,giturl,clonedir): + def download(self,baseurl,clonedir): - "downloads and unzip from github" + "downloads and unzip a zip version from a git repo" import zipfile bakdir = None @@ -671,10 +676,12 @@ def download(self,giturl,clonedir): shutil.rmtree(bakdir) os.rename(clonedir,bakdir) os.makedirs(clonedir) - zipurl = giturl+"/archive/master.zip" + zipurl = utils.getzipurl(baseurl) + if not zipurl: + return translate("AddonsInstaller", "Error: Unable to locate zip from") + " " + baseurl try: print("Downloading "+zipurl) - u = urlopen(zipurl) + u = utils.urlopen(zipurl) except: return translate("AddonsInstaller", "Error: Unable to download") + " " + zipurl if not u: