diff options
author | rubenwardy <rw@rubenwardy.com> | 2020-01-19 01:22:33 +0000 |
---|---|---|
committer | rubenwardy <rw@rubenwardy.com> | 2020-01-19 01:22:33 +0000 |
commit | 1b1c94ffa0d349f2702342cf6e1796840db88a87 (patch) | |
tree | f0eae76eec6285584a97caf00cf332a16654e50c /app/tasks/importtasks.py | |
parent | bcd003685e9fbc38ff484a55ead38d381d75925b (diff) | |
download | cheatdb-1b1c94ffa0d349f2702342cf6e1796840db88a87.tar.xz |
Add release contents validation
Diffstat (limited to 'app/tasks/importtasks.py')
-rw-r--r-- | app/tasks/importtasks.py | 174 |
1 files changed, 15 insertions, 159 deletions
diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py index 8925f0e..7084909 100644 --- a/app/tasks/importtasks.py +++ b/app/tasks/importtasks.py @@ -26,7 +26,8 @@ from app import app from app.models import * from app.tasks import celery, TaskError from app.utils import randomString - +from .minetestcheck import build_tree, MinetestCheckError, ContentType +from .minetestcheck.config import parse_conf class GithubURLMaker: def __init__(self, url): @@ -127,162 +128,6 @@ def findModInfo(author, name, link): return None - -def parseConf(string): - retval = {} - for line in string.split("\n"): - idx = line.find("=") - if idx > 0: - key = line[:idx].strip() - value = line[idx+1:].strip() - retval[key] = value - - return retval - - -class PackageTreeNode: - def __init__(self, baseDir, author=None, repo=None, name=None): - print("Scanning " + baseDir) - self.baseDir = baseDir - self.author = author - self.name = name - self.repo = repo - self.meta = None - self.children = [] - - # Detect type - type = None - is_modpack = False - if os.path.isfile(baseDir + "/game.conf"): - type = PackageType.GAME - elif os.path.isfile(baseDir + "/init.lua"): - type = PackageType.MOD - elif os.path.isfile(baseDir + "/modpack.txt") or \ - os.path.isfile(baseDir + "/modpack.conf"): - type = PackageType.MOD - is_modpack = True - elif os.path.isdir(baseDir + "/mods"): - type = PackageType.GAME - elif os.listdir(baseDir) == []: - # probably a submodule - return - else: - raise TaskError("Unable to detect package type!") - - self.type = type - self.readMetaFiles() - - if self.type == PackageType.GAME: - self.addChildrenFromModDir(baseDir + "/mods") - elif is_modpack: - self.addChildrenFromModDir(baseDir) - - - def readMetaFiles(self): - result = {} - - # .conf file - try: - with open(self.baseDir + "/mod.conf", "r") as myfile: - conf = parseConf(myfile.read()) - for key in ["name", "description", "title", "depends", "optional_depends"]: - try: - result[key] = conf[key] - except KeyError: - pass - except IOError: - print("description.txt does not exist!") - - # description.txt - if not "description" in result: - try: - with open(self.baseDir + "/description.txt", "r") as myfile: - result["description"] = myfile.read() - except IOError: - print("description.txt does not exist!") - - # depends.txt - import re - pattern = re.compile("^([a-z0-9_]+)\??$") - if not "depends" in result and not "optional_depends" in result: - try: - with open(self.baseDir + "/depends.txt", "r") as myfile: - contents = myfile.read() - 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"] = hard - result["optional_depends"] = soft - - except IOError: - print("depends.txt does not exist!") - - else: - if "depends" in result: - result["depends"] = [x.strip() for x in result["depends"].split(",")] - if "optional_depends" in result: - result["optional_depends"] = [x.strip() for x in result["optional_depends"].split(",")] - - - # Calculate Title - if "name" in result and not "title" in result: - result["title"] = result["name"].replace("_", " ").title() - - # Calculate short description - 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] - - # Get forum ID - info = findModInfo(self.author, result.get("name"), self.repo) - if info is not None: - result["forumId"] = info.get("topicId") - - if "name" in result: - self.name = result["name"] - del result["name"] - - self.meta = result - - def addChildrenFromModDir(self, dir): - for entry in next(os.walk(dir))[1]: - path = dir + "/" + entry - if not entry.startswith('.') and os.path.isdir(path): - self.children.append(PackageTreeNode(path, name=entry)) - - - def fold(self, attr, key=None, acc=None): - if acc is None: - acc = set() - - if self.meta is None: - return acc - - at = getattr(self, attr) - value = at if key is None else at.get(key) - - if isinstance(value, list): - acc |= set(value) - elif value is not None: - acc.add(value) - - for child in self.children: - child.fold(attr, key, acc) - - return acc - - def get(self, key): - return self.meta.get(key) - def generateGitURL(urlstr): scheme, netloc, path, query, frag = urlsplit(urlstr) @@ -323,7 +168,12 @@ def cloneRepo(urlstr, ref=None, recursive=False): @celery.task() def getMeta(urlstr, author): gitDir, _ = cloneRepo(urlstr, recursive=True) - tree = PackageTreeNode(gitDir, author=author, repo=urlstr) + + try: + tree = build_tree(gitDir, author=author, repo=urlstr) + except MinetestCheckError as err: + raise TaskError(str(err)) + shutil.rmtree(gitDir) result = {} @@ -388,6 +238,12 @@ def makeVCSRelease(id, branch): gitDir, repo = cloneRepo(release.package.repo, ref=branch, recursive=True) try: + tree = build_tree(gitDir, expected_type=ContentType[release.package.type.name], \ + author=release.package.author.username, name=release.package.name) + except MinetestCheckError as err: + raise TaskError(str(err)) + + try: filename = randomString(10) + ".zip" destPath = os.path.join(app.config["UPLOAD_DIR"], filename) @@ -464,7 +320,7 @@ def getDepends(package): # try: contents = urllib.request.urlopen(urlmaker.getModConfURL()).read().decode("utf-8") - conf = parseConf(contents) + conf = parse_conf(contents) for key in ["depends", "optional_depends"]: try: result[key] = conf[key] |