-@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")
-
- print("updateMetaFromRelease: {} for {}/{}" \
- .format(id, release.package.author.display_name, release.package.name))
-
- 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 = tree.getModNames()
-
- package = release.package
- package.provides.clear()
- package.provides.extend(getMetaPackages(tree.getModNames()))
-
- # Delete all meta package dependencies
- package.dependencies.filter(Dependency.meta_package != None).delete()
-
- # Get raw dependencies
- depends = tree.fold("meta", "depends")
- optional_depends = tree.fold("meta", "optional_depends")
-
- # Filter out provides
- for mod in provides:
- depends.discard(mod)
- optional_depends.discard(mod)
-
- # Add dependencies
-
- for meta in getMetaPackages(depends):
- db.session.add(Dependency(package, meta=meta, optional=False))
-
- for meta in getMetaPackages(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)
-
-