diff options
author | rubenwardy <rw@rubenwardy.com> | 2020-07-12 02:22:35 +0100 |
---|---|---|
committer | rubenwardy <rw@rubenwardy.com> | 2020-07-12 02:22:35 +0100 |
commit | 284683e7e541b8124b5a13bf3c7139423e063985 (patch) | |
tree | b2df02f0b3689846fe55af2a5c975b172e684b3b /app/tasks/importtasks.py | |
parent | 868ced76a86585c098c4d54caff4693cbb9f3a0a (diff) | |
download | cheatdb-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.py | 55 |
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) |