from .minetestcheck import build_tree, MinetestCheckError, ContentType
from .minetestcheck.config import parse_conf
-class GithubURLMaker:
- def __init__(self, url):
- self.baseUrl = None
- self.user = None
- self.repo = None
-
- # Rewrite path
- import re
- m = re.search("^\/([^\/]+)\/([^\/]+)\/?$", url.path)
- if m is None:
- return
-
- user = m.group(1)
- repo = m.group(2).replace(".git", "")
- self.baseUrl = "https://raw.githubusercontent.com/{}/{}/master" \
- .format(user, repo)
- self.user = user
- self.repo = repo
-
- def isValid(self):
- return self.baseUrl is not None
-
- def getRepoURL(self):
- return "https://github.com/{}/{}".format(self.user, self.repo)
-
- def getScreenshotURL(self):
- return self.baseUrl + "/screenshot.png"
-
- def getModConfURL(self):
- return self.baseUrl + "/mod.conf"
-
- def getCommitsURL(self, branch):
- return "https://api.github.com/repos/{}/{}/commits?sha={}" \
- .format(self.user, self.repo, urllib.parse.quote_plus(branch))
-
- def getCommitDownload(self, commit):
- return "https://github.com/{}/{}/archive/{}.zip" \
- .format(self.user, self.repo, commit)
-
krock_list_cache = None
krock_list_cache_by_name = None
def getKrockList():
origin = repo.create_remote("origin", url=gitUrl)
assert origin.exists()
origin.fetch()
+ origin.pull(ref)
- new_head = repo.commit(ref) #repo.create_head("target", ref)
- repo.head.reference = new_head
- repo.head.reset(index=True, working_tree=True)
+ for submodule in repo.submodules:
+ submodule.update(init=True)
return gitDir, repo
.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)
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"]:
return result
-def makeVCSReleaseFromGithub(id, branch, release, url):
- urlmaker = GithubURLMaker(url)
- if not urlmaker.isValid():
- raise TaskError("Invalid github repo URL")
-
- commitsURL = urlmaker.getCommitsURL(branch)
- try:
- contents = urllib.request.urlopen(commitsURL).read().decode("utf-8")
- commits = json.loads(contents)
- except HTTPError:
- raise TaskError("Unable to get commits for Github repository. Either the repository or reference doesn't exist.")
-
- if len(commits) == 0 or not "sha" in commits[0]:
- raise TaskError("No commits found")
-
- release.url = urlmaker.getCommitDownload(commits[0]["sha"])
- release.task_id = None
- release.commit_hash = commits[0]["sha"]
- release.approve(release.package.author)
- db.session.commit()
-
- return release.url
-
-
@celery.task(bind=True)
def checkZipRelease(self, id, path):
release = PackageRelease.query.get(id)
elif release.package is None:
raise TaskError("No package attached to release")
- # url = urlparse(release.package.repo)
- # if url.netloc == "github.com":
- # return makeVCSReleaseFromGithub(id, branch, release, url)
-
gitDir, repo = cloneRepo(release.package.repo, ref=branch, recursive=True)
+ tree = None
try:
tree = build_tree(gitDir, expected_type=ContentType[release.package.type.name], \
author=release.package.author.username, name=release.package.name)
release.url = "/uploads/" + filename
release.task_id = None
release.commit_hash = repo.head.object.hexsha
+
+ if tree.meta.get("min_minetest_version"):
+ release.min_rel = MinetestRelease.get(tree.meta["min_minetest_version"], None)
+
+ if tree.meta.get("max_minetest_version"):
+ release.max_rel = MinetestRelease.get(tree.meta["max_minetest_version"], None)
+
release.approve(release.package.author)
- print(release.url)
db.session.commit()
return release.url
finally:
shutil.rmtree(gitDir)
+
@celery.task()
def importRepoScreenshot(id):
package = Package.query.get(id)
print("screenshot.png does not exist")
return None
-
-
-
-def getDepends(package):
- url = urlparse(package.repo)
- urlmaker = None
- if url.netloc == "github.com":
- urlmaker = GithubURLMaker(url)
- else:
- return {}
-
- result = {}
- if not urlmaker.isValid():
- return {}
-
- #
- # Try getting depends on mod.conf
- #
- try:
- contents = urllib.request.urlopen(urlmaker.getModConfURL()).read().decode("utf-8")
- conf = parse_conf(contents)
- for key in ["depends", "optional_depends"]:
- try:
- result[key] = conf[key]
- except KeyError:
- pass
-
- except HTTPError:
- print("mod.conf does not exist")
-
- if "depends" in result or "optional_depends" in result:
- return result
-
-
- #
- # Try depends.txt
- #
- import re
- pattern = re.compile("^([a-z0-9_]+)\??$")
- try:
- contents = urllib.request.urlopen(urlmaker.getDependsURL()).read().decode("utf-8")
- 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"] = ",".join(hard)
- result["optional_depends"] = ",".join(soft)
- except HTTPError:
- print("depends.txt does not exist")
-
- return result
-
-
-def importDependencies(package, mpackage_cache):
- if Dependency.query.filter_by(depender=package).count() != 0:
- return
-
- result = getDepends(package)
-
- if "depends" in result:
- deps = Dependency.SpecToList(package, result["depends"], mpackage_cache)
- print("{} hard: {}".format(len(deps), result["depends"]))
- for dep in deps:
- dep.optional = False
- db.session.add(dep)
-
- if "optional_depends" in result:
- deps = Dependency.SpecToList(package, result["optional_depends"], mpackage_cache)
- print("{} soft: {}".format(len(deps), result["optional_depends"]))
- for dep in deps:
- dep.optional = True
- db.session.add(dep)
-
-@celery.task()
-def importAllDependencies():
- Dependency.query.delete()
- mpackage_cache = {}
- packages = Package.query.filter_by(type=PackageType.MOD).all()
- for i, p in enumerate(packages):
- print("============= {} ({}/{}) =============".format(p.name, i, len(packages)))
- importDependencies(p, mpackage_cache)
-
- db.session.commit()