diff options
author | rubenwardy <rw@rubenwardy.com> | 2018-05-27 22:55:46 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-27 22:55:46 +0100 |
commit | d046de8057d42d4653af6d7c6c7ff557319d1bae (patch) | |
tree | 0361d8515fa3b3d16b0222a27048158262d76376 /app/tasks/importtasks.py | |
parent | e85298d890a3fdaa3ac1919092aa495cf480a61f (diff) | |
parent | 05e536b1217633fd612b8ee94360e8afef3c527c (diff) | |
download | cheatdb-d046de8057d42d4653af6d7c6c7ff557319d1bae.tar.xz |
Merge pull request #78 from minetest/dev
Add meta packages, remove current dependencies
Diffstat (limited to 'app/tasks/importtasks.py')
-rw-r--r-- | app/tasks/importtasks.py | 119 |
1 files changed, 118 insertions, 1 deletions
diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py index db992b3..7ccd36c 100644 --- a/app/tasks/importtasks.py +++ b/app/tasks/importtasks.py @@ -55,6 +55,9 @@ class GithubURLMaker: def getDescURL(self): return self.baseUrl + "/description.txt" + def getDependsURL(self): + return self.baseUrl + "/depends.txt" + def getScreenshotURL(self): return self.baseUrl + "/screenshot.png" @@ -161,7 +164,7 @@ def getMeta(urlstr, author): try: contents = urllib.request.urlopen(urlmaker.getModConfURL()).read().decode("utf-8") conf = parseConf(contents) - for key in ["name", "description", "title"]: + for key in ["name", "description", "title", "depends", "optional_depends"]: try: result[key] = conf[key] except KeyError: @@ -179,12 +182,35 @@ def getMeta(urlstr, author): except HTTPError: print("description.txt does not exist!") + import re + pattern = re.compile("^([a-z0-9_]+)\??$") + if not "depends" in result and not "optional_depends" in result: + try: + contents = urllib.request.urlopen(urlmaker.getDependsURL()).read().decode("utf-8") + soft = [] + hard = [] + for line in contents.split("\n"): + line = line.strip() + if pattern.match(line): + if line[len(line) - 1] == "?": + soft.append( line[:-1]) + else: + hard.append(line) + + result["depends"] = ",".join(hard) + result["optional_depends"] = ",".join(soft) + + + except HTTPError: + print("depends.txt does not exist!") + if "description" in result: desc = result["description"] idx = desc.find(".") + 1 cutIdx = min(len(desc), 200 if idx < 5 else idx) result["short_description"] = desc[:cutIdx] + info = findModInfo(author, result.get("name"), result["repo"]) if info is not None: result["forumId"] = info.get("topicId") @@ -264,3 +290,94 @@ def importRepoScreenshot(id): print("screenshot.png does not exist") return None + + + +def getDepends(package): + url = urlparse(package.repo) + urlmaker = None + if url.netloc == "github.com": + urlmaker = GithubURLMaker(url) + else: + raise TaskError("Unsupported repo") + + result = {} + if urlmaker.isValid(): + # + # Try getting depends on mod.conf + # + try: + contents = urllib.request.urlopen(urlmaker.getModConfURL()).read().decode("utf-8") + conf = parseConf(contents) + for key in ["depends", "optional_depends"]: + try: + result[key] = conf[key] + except KeyError: + pass + + except HTTPError: + print("mod.conf does not exist") + + if "depends" in result or "optional_depends" in result: + return result + + + # + # Try depends.txt + # + import re + pattern = re.compile("^([a-z0-9_]+)\??$") + try: + contents = urllib.request.urlopen(urlmaker.getDependsURL()).read().decode("utf-8") + soft = [] + hard = [] + for line in contents.split("\n"): + line = line.strip() + if pattern.match(line): + if line[len(line) - 1] == "?": + soft.append( line[:-1]) + else: + hard.append(line) + + result["depends"] = ",".join(hard) + result["optional_depends"] = ",".join(soft) + except HTTPError: + print("depends.txt does not exist") + + return result + + else: + print(TaskError("non-github depends detector not implemented yet!")) + return {} + + +def importDependencies(package, mpackage_cache): + if Dependency.query.filter_by(depender=package).count() != 0: + return + + result = getDepends(package) + + if "depends" in result: + deps = Dependency.SpecToList(package, result["depends"], mpackage_cache) + print("{} hard: {}".format(len(deps), result["depends"])) + for dep in deps: + dep.optional = False + db.session.add(dep) + + if "optional_depends" in result: + deps = Dependency.SpecToList(package, result["optional_depends"], mpackage_cache) + print("{} soft: {}".format(len(deps), result["optional_depends"])) + for dep in deps: + dep.optional = True + db.session.add(dep) + +@celery.task() +def importAllDependencies(): + Dependency.query.delete() + mpackage_cache = {} + packages = Package.query.filter_by(type=PackageType.MOD).all() + for i, p in enumerate(packages): + print("============= {} ({}/{}) =============".format(p.name, i, len(packages))) + importDependencies(p, mpackage_cache) + + db.session.commit() |