diff --git a/src/Mod/AddonManager/AddonManager.py b/src/Mod/AddonManager/AddonManager.py index b0760923f1e4..36f5fc34d897 100644 --- a/src/Mod/AddonManager/AddonManager.py +++ b/src/Mod/AddonManager/AddonManager.py @@ -559,25 +559,67 @@ def run(self): else: answer = self.download(self.repos[self.idx][1],clonedir) else: - if git: - self.info_label.emit("Cloning module...") - repo = git.Repo.clone_from(self.repos[self.idx][1], clonedir, branch='master') - 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") - 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") + ": " - answer += f + "" + self.info_label.emit("Checking module dependencies...") + depsok,answer = self.checkDependencies(self.repos[self.idx][1]) + if depsok: + if git: + self.info_label.emit("Cloning module...") + repo = git.Repo.clone_from(self.repos[self.idx][1], clonedir, branch='master') + 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") + 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") + ": " + answer += f + "" self.info_label.emit(answer) self.progressbar_show.emit(False) self.stop = True + def checkDependencies(self,baseurl): + "checks if the repo contains a metadata.txt and check its contents" + import FreeCADGui + ok = True + message = "" + depsurl = baseurl.replace("github.com","raw.githubusercontent.com") + if not depsurl.endswith("/"): + depsurl += "/" + depsurl += "master/metadata.txt" + try: + mu = urllib2.urlopen(depsurl) + except urllib2.HTTPError: + # no metadata.txt, we just continue without deps checking + pass + else: + # metadata.txt found + depsfile = mu.read() + mu.close() + deps = depsfile.split("\n") + for l in deps: + if l.startswith("workbenches="): + depswb = l.split("=")[1].split(",") + for wb in depswb: + if not wb in FreeCADGui.listWorkbenches().keys(): + ok = False + message += translate("AddonsInstaller","Missing workbench") + ": " + wb + ", " + elif l.startswith("pylibs="): + depspy = l.split("=")[1].split(",") + for pl in depspy: + try: + __import__(pl) + except: + ok = False + message += translate("AddonsInstaller","Missing python module") +": " + pl + ", " + if message: + message = translate("AddonsInstaller", "Some errors were found that prevent to install this workbench") + ": " + message + ". " + message += translate("AddonsInstaller","Please install the missing components first.") + return ok, message + def download(self,giturl,clonedir): "downloads and unzip from github" import zipfile