aboutsummaryrefslogtreecommitdiff
path: root/app/tasks/importtasks.py
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2020-07-12 02:22:35 +0100
committerrubenwardy <rw@rubenwardy.com>2020-07-12 02:22:35 +0100
commit284683e7e541b8124b5a13bf3c7139423e063985 (patch)
treeb2df02f0b3689846fe55af2a5c975b172e684b3b /app/tasks/importtasks.py
parent868ced76a86585c098c4d54caff4693cbb9f3a0a (diff)
downloadcheatdb-284683e7e541b8124b5a13bf3c7139423e063985.tar.xz
Add reimport of package meta from latest release
Fixes #127
Diffstat (limited to 'app/tasks/importtasks.py')
-rw-r--r--app/tasks/importtasks.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py
index 501b430..0568949 100644
--- a/app/tasks/importtasks.py
+++ b/app/tasks/importtasks.py
@@ -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.fold("name"))
+
+ 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)
@@ -249,6 +303,7 @@ def makeVCSRelease(id, branch):
finally:
shutil.rmtree(gitDir)
+
@celery.task()
def importRepoScreenshot(id):
package = Package.query.get(id)