]> git.lizzy.rs Git - cheatdb.git/blobdiff - app/tasks/importtasks.py
Fix incorrect mod name fold in MinetestCheck
[cheatdb.git] / app / tasks / importtasks.py
index ad3e4960fd924c9a3be7f6cc124af6f98277d596..1361afe384652b96c7b628956fa76406d721d552 100644 (file)
@@ -139,6 +139,60 @@ def cloneRepo(urlstr, ref=None, recursive=False):
                        .replace("Cloning into '" + gitDir + "'...", "") \
                        .strip())
 
+
+@celery.task(bind=True)
+def updateMetaFromRelease(self, id, path):
+       release = PackageRelease.query.get(id)
+       if release is None:
+               raise TaskError("No such release!")
+       elif release.package is None:
+               raise TaskError("No package attached to release")
+
+       temp = getTempDir()
+       try:
+               with ZipFile(path, 'r') as zip_ref:
+                       zip_ref.extractall(temp)
+
+               try:
+                       tree = build_tree(temp, expected_type=ContentType[release.package.type.name], \
+                               author=release.package.author.username, name=release.package.name)
+
+                       cache = {}
+                       def getMetaPackages(names):
+                               return [ MetaPackage.GetOrCreate(x, cache) for x in names ]
+
+                       provides = getMetaPackages(tree.getModNames())
+
+                       package = release.package
+                       package.provides.clear()
+                       package.provides.extend(provides)
+
+                       for dep in package.dependencies:
+                               if dep.meta_package:
+                                       db.session.delete(dep)
+
+                       for meta in getMetaPackages(tree.fold("meta", "depends")):
+                               db.session.add(Dependency(package, meta=meta, optional=False))
+
+                       for meta in getMetaPackages(tree.fold("meta", "optional_depends")):
+                               db.session.add(Dependency(package, meta=meta, optional=True))
+
+                       db.session.commit()
+
+               except MinetestCheckError as err:
+                       if "Fails validation" not in release.title:
+                               release.title += " (Fails validation)"
+
+                       release.task_id = self.request.id
+                       release.approved = False
+                       db.session.commit()
+
+                       raise TaskError(str(err))
+
+       finally:
+               shutil.rmtree(temp)
+
+
 @celery.task()
 def getMeta(urlstr, author):
        gitDir, _ = cloneRepo(urlstr, recursive=True)
@@ -152,7 +206,7 @@ def getMeta(urlstr, author):
 
        result = {}
        result["name"] = tree.name
-       result["provides"] = tree.fold("name")
+       result["provides"] = tree.getModNames()
        result["type"] = tree.type.name
 
        for key in ["depends", "optional_depends"]:
@@ -236,10 +290,10 @@ def makeVCSRelease(id, branch):
                release.task_id     = None
                release.commit_hash = repo.head.object.hexsha
 
-               if tree.meta["min_minetest_version"]:
+               if tree.meta.get("min_minetest_version"):
                        release.min_rel = MinetestRelease.get(tree.meta["min_minetest_version"], None)
 
-               if tree.meta["max_minetest_version"]:
+               if tree.meta.get("max_minetest_version"):
                        release.max_rel = MinetestRelease.get(tree.meta["max_minetest_version"], None)
 
                release.approve(release.package.author)
@@ -249,6 +303,7 @@ def makeVCSRelease(id, branch):
        finally:
                shutil.rmtree(gitDir)
 
+
 @celery.task()
 def importRepoScreenshot(id):
        package = Package.query.get(id)