From 92717f31dd94ad1c763641a397305de9bc143df9 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Fri, 11 May 2018 15:04:17 +0100 Subject: [PATCH] Add VCS import from Github --- app/models.py | 1 + app/tasks/importtasks.py | 58 +++++++++++++++++++++++++++++--- app/templates/base.html | 1 + app/templates/packages/view.html | 36 +++++++++++--------- app/templates/tasks/view.html | 21 ++++++++++++ app/views/__init__.py | 2 +- app/views/api.py | 35 ------------------- app/views/packages.py | 17 ++++++---- app/views/tasks.py | 50 +++++++++++++++++++++++++++ 9 files changed, 158 insertions(+), 63 deletions(-) create mode 100644 app/templates/tasks/view.html delete mode 100644 app/views/api.py create mode 100644 app/views/tasks.py diff --git a/app/models.py b/app/models.py index 9b64d3b..113a1cb 100644 --- a/app/models.py +++ b/app/models.py @@ -322,6 +322,7 @@ class PackageRelease(db.Model): releaseDate = db.Column(db.DateTime, nullable=False) url = db.Column(db.String(100), nullable=False) approved = db.Column(db.Boolean, nullable=False, default=False) + task_id = db.Column(db.String(32), nullable=True) def getEditURL(self): diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py index 2027f74..1950d5b 100644 --- a/app/tasks/importtasks.py +++ b/app/tasks/importtasks.py @@ -1,12 +1,18 @@ -import flask +import flask, json from flask.ext.sqlalchemy import SQLAlchemy import urllib.request -from urllib.parse import urlparse - +from urllib.parse import urlparse, quote_plus from app import app from app.models import * from app.tasks import celery +class TaskError(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) + + class GithubURLMaker: def __init__(self, url): # Rewrite path @@ -18,6 +24,8 @@ class GithubURLMaker: user = m.group(1) repo = m.group(2) self.baseUrl = "https://raw.githubusercontent.com/" + user + "/" + repo.replace(".git", "") + "/master" + self.user = user + self.repo = repo def isValid(self): return self.baseUrl is not None @@ -31,6 +39,13 @@ class GithubURLMaker: def getScreenshotURL(self): return self.baseUrl + "/screenshot.png" + def getCommitsURL(self, branch): + return "https://api.github.com/repos/" + self.user + "/" + self.repo + "/commits?sha" + urllib.parse.quote_plus(branch) + + def getCommitDownload(self, commit): + return "https://github.com/" + self.user + "/" + self.repo + "/archive/" + commit + ".zip" + + def parseConf(string): retval = {} for line in string.split("\n"): @@ -49,10 +64,11 @@ def getMeta(urlstr): urlmaker = None if url.netloc == "github.com": urlmaker = GithubURLMaker(url) + else: + raise TaskError("Unsupported repo") if not urlmaker.isValid(): - print("Error! Url maker not valid") - return + raise TaskError("Error! Url maker not valid") print(urlmaker.getModConfURL()) @@ -79,3 +95,35 @@ def getMeta(urlstr): print("description.txt does not exist!") return result + +@celery.task() +def makeVCSRelease(id, branch): + release = PackageRelease.query.get(id) + if release is None: + raise TaskError("No such release!") + + if release.package is None: + raise TaskError("No package attached to release") + + url = urlparse(release.package.repo) + + urlmaker = None + if url.netloc == "github.com": + urlmaker = GithubURLMaker(url) + else: + raise TaskError("Unsupported repo") + + if not urlmaker.isValid(): + raise TaskError("Invalid github repo URL") + + contents = urllib.request.urlopen(urlmaker.getCommitsURL(branch)).read().decode("utf-8") + commits = json.loads(contents) + + if len(commits) == 0: + raise TaskError("No commits found") + + release.url = urlmaker.getCommitDownload(commits[0]["sha"]) + release.task_id = None + db.session.commit() + + return release.url diff --git a/app/templates/base.html b/app/templates/base.html index 07131de..0ab87b4 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -7,6 +7,7 @@ {% block title %}title{% endblock %} - {{ config.USER_APP_NAME }} + {% block headextra %}{% endblock %} diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html index 5c68ead..ecd6b35 100644 --- a/app/templates/packages/view.html +++ b/app/templates/packages/view.html @@ -78,25 +78,29 @@