diff --git a/src/Mod/AddonManager/addonmanager_utilities.py b/src/Mod/AddonManager/addonmanager_utilities.py index 08d068ddca..1aa1b6f0cf 100644 --- a/src/Mod/AddonManager/addonmanager_utilities.py +++ b/src/Mod/AddonManager/addonmanager_utilities.py @@ -248,28 +248,28 @@ def restart_freecad(): QtCore.QProcess.startDetached(QtGui.QApplication.applicationFilePath(), args) -def get_zip_url(baseurl): +def get_zip_url(baseurl, branch="master"): "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" + return baseurl+"/archive/" + branch + ".zip" elif url.endswith("framagit.org") or url.endswith("gitlab.com") or url.endswith("salsa.debian.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" + return baseurl+"/-/archive/" + branch + "/"+reponame+"-" + branch + ".zip" else: print("Debug: addonmanager_utilities.get_zip_url: Unknown git host:", url) return None -def get_readme_url(url): +def get_readme_url(url, branch="master"): "Returns the location of a readme file" if "github" in url or "framagit" in url: - return url+"/raw/master/README.md" + return url+"/raw/" + branch + "/README.md" elif "gitlab" in url or "salsa.debian.org" in url: - return url+"/-/raw/master/README.md" + return url+"/-/raw/" + branch + "/README.md" else: print("Debug: addonmanager_utilities.get_readme_url: Unknown git host:", url) return None @@ -287,11 +287,11 @@ def get_desc_regex(url): return None -def get_readme_html_url(url): +def get_readme_html_url(url, branch="master"): """Returns the location of a html file containing readme""" if "github" in url: - return url + "/blob/master/README.md" + return url + "/blob/" + branch + "/README.md" else: print("Debug: addonmanager_utilities.get_readme_html_url: Unknown git host:", url) return None diff --git a/src/Mod/AddonManager/addonmanager_workers.py b/src/Mod/AddonManager/addonmanager_workers.py index 9893eba2ab..d62b2da392 100644 --- a/src/Mod/AddonManager/addonmanager_workers.py +++ b/src/Mod/AddonManager/addonmanager_workers.py @@ -82,6 +82,8 @@ NOGIT = False # for debugging purposes, set this to True to always use http dow NOMARKDOWN = False # for debugging purposes, set this to True to disable Markdown lib +url_to_branch_map = {} # Added to 0.19.3 to support branches with names other than "master" + """Multithread workers for the Addon Manager""" @@ -137,12 +139,13 @@ class UpdateWorker(QtCore.QThread): u.close() p = re.findall((r'(?m)\[submodule\s*"(?P.*)"\]\s*' r"path\s*=\s*(?P.+)\s*" - r"url\s*=\s*(?Phttps?://.*)"), p) + r"url\s*=\s*(?Phttps?://.*)\s*" + r"(branch\s*=\s*(?P.*)\s*)?"), p) basedir = FreeCAD.getUserAppDataDir() moddir = basedir + os.sep + "Mod" repos = [] # querying official addons - for name, path, url in p: + for name, path, url, _, branch in p: self.info_label.emit(name) url = url.split(".git")[0] addondir = moddir + os.sep + name @@ -152,11 +155,20 @@ class UpdateWorker(QtCore.QThread): else: state = 0 repos.append([name, url, state]) + if branch is None or len(branch) == 0: + branch = "master" + url_to_branch_map[url] = branch # querying custom addons customaddons = (FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") .GetString("CustomRepositories", "").split("\n")) for url in customaddons: if url: + if " " in url: + addon_and_branch = addon.split(" ") + url = addon_and_branch[0] + branch = addon_and_branch[1] + else: + branch = "master" name = url.split("/")[-1] if name.lower().endswith(".git"): name = name[:-4] @@ -166,6 +178,7 @@ class UpdateWorker(QtCore.QThread): else: state = 1 repos.append([name, url, state]) + url_to_branch_map[url] = branch if not repos: self.info_label.emit(translate("AddonsInstaller", "Unable to download addon list.")) else: @@ -386,17 +399,22 @@ class ShowWorker(QtCore.QThread): self.progressbar_show.emit(True) self.info_label.emit(translate("AddonsInstaller", "Retrieving description...")) + if len(self.repos[self.idx]) == 4: desc = self.repos[self.idx][3] else: u = None url = self.repos[self.idx][1] + if url in url_to_branch_map: + branch = url_to_branch_map[url] + else: + branch = "master" self.info_label.emit(translate("AddonsInstaller", "Retrieving info from") + " " + str(url)) desc = "" regex = utils.get_readme_regex(url) if regex: # extract readme from html via regex - readmeurl = utils.get_readme_html_url(url) + readmeurl = utils.get_readme_html_url(url,branch) if not readmeurl: print("Debug: README not found for", url) u = utils.urlopen(readmeurl) @@ -415,7 +433,7 @@ class ShowWorker(QtCore.QThread): print("Debug: README not found at", readmeurl) else: # convert raw markdown using lib - readmeurl = utils.get_readme_url(url) + readmeurl = utils.get_readme_url(url,branch) if not readmeurl: print("Debug: README not found for", url) u = utils.urlopen(readmeurl) @@ -867,7 +885,11 @@ class InstallWorker(QtCore.QThread): shutil.rmtree(bakdir) os.rename(clonedir, bakdir) os.makedirs(clonedir) - zipurl = utils.get_zip_url(baseurl) + if baseurl in url_to_branch_map: + branch = url_to_branch_map[baseurl] + else: + branch = "master" + zipurl = utils.get_zip_url(baseurl, branch) if not zipurl: return translate("AddonsInstaller", "Error: Unable to locate zip from") + " " + baseurl try: