Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
commit 05490376d9cf5d1ebeb29161fbc41ec15447fefb Author: Valentin Gologuzov vgologuz@redhat.com Date: Tue Feb 17 22:41:23 2015 +0100
[frontend][backend] [rhbz:#1119300] [RFE] allow easy add copr repos in using repository lis
backend/backend/mockremote/builder.py | 31 +++++++++++++++++-- frontend/coprs_frontend/config/copr_devel.conf | 2 + frontend/coprs_frontend/coprs/filters.py | 14 ++++++++- frontend/coprs_frontend/coprs/forms.py | 30 ++++++++++++++---- .../coprs/templates/coprs/detail/overview.html | 2 +- 5 files changed, 66 insertions(+), 13 deletions(-)
diff --git a/backend/backend/mockremote/builder.py b/backend/backend/mockremote/builder.py index 938e5a6..a981482 100644 --- a/backend/backend/mockremote/builder.py +++ b/backend/backend/mockremote/builder.py @@ -3,6 +3,7 @@ import pipes import socket from subprocess import Popen, PIPE import time +from urlparse import urlparse
from ansible.runner import Runner
@@ -236,15 +237,37 @@ class Builder(object): except ValueError: pass
+ def pre_process_repo_url(self, repo_url): + """ + Expands variables and sanitize repo url to be used for mock config + maybe more sophisticated approach, see https://bugzilla.redhat.com/attachment.cgi?id=971075&action=diff + """ + try: + parsed_url = urlparse(repo_url) + if parsed_url.scheme == "copr": + user = parsed_url.netloc + prj = parsed_url.path.split("/")[1] + repo_url = "{}/{}/{}/{}".format( + self.opts.results_baseurl, user, prj, self.chroot) + + else: + if "rawhide" in self.chroot: + repo_url = repo_url.replace("$releasever", "rawhide") + + return pipes.quote(repo_url) + except Exception as err: + self.callback.log("Failed not pre-process repo url: {}".format(err)) + return None + def gen_mockchain_command(self, dest): buildcmd = "{0} -r {1} -l {2} ".format( mockchain, pipes.quote(self.chroot), pipes.quote(self.remote_build_dir)) - for r in self.repos: - if "rawhide" in self.chroot: - r = r.replace("$releasever", "rawhide") + for repo in self.repos: + repo = self.pre_process_repo_url(repo) + if repo is not None: + buildcmd += "-a {0} ".format(repo)
- buildcmd += "-a {0} ".format(pipes.quote(r)) for k, v in self.macros.items(): mock_opt = "--define={0} {1}".format(k, v) buildcmd += "-m {0} ".format(pipes.quote(mock_opt)) diff --git a/frontend/coprs_frontend/config/copr_devel.conf b/frontend/coprs_frontend/config/copr_devel.conf index 182e105..9f26dc2 100644 --- a/frontend/coprs_frontend/config/copr_devel.conf +++ b/frontend/coprs_frontend/config/copr_devel.conf @@ -42,3 +42,5 @@ ENFORCE_PROTOCOL_FOR_BACKEND_URL = "http" ENFORCE_PROTOCOL_FOR_FRONTEND_URL = "http"
PUBLIC_COPR_HOSTNAME = "copr-fe-dev.cloud.fedoraproject.org" + +LOG_FILENAME="/tmp/copr_frontend.log" diff --git a/frontend/coprs_frontend/coprs/filters.py b/frontend/coprs_frontend/coprs/filters.py index 25ecf78..35ca893 100644 --- a/frontend/coprs_frontend/coprs/filters.py +++ b/frontend/coprs_frontend/coprs/filters.py @@ -1,11 +1,12 @@ import datetime +from urlparse import urlparse import pytz import time import markdown
import os
-from flask import Markup +from flask import Markup, url_for
from coprs import app from coprs import helpers @@ -140,3 +141,14 @@ def fix_url_https_backend(url): @app.template_filter("fix_url_https_frontend") def fix_url_https_frontend(url): return helpers.fix_protocol_for_frontend(url) + +@app.template_filter("repo_url") +def repo_url(url): + """ render copr://<user>/prj to be rendered as copr projects pages """ + parsed = urlparse(url) + if parsed.scheme == "copr": + user = parsed.netloc + prj = parsed.path.split("/")[1] + url = url_for("coprs_ns.copr_detail", username=user, coprname=prj) + + return helpers.fix_protocol_for_frontend(url) diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py index a3ea066..76a8c21 100644 --- a/frontend/coprs_frontend/coprs/forms.py +++ b/frontend/coprs_frontend/coprs/forms.py @@ -28,14 +28,30 @@ class UrlListValidator(object):
def is_url(self, url): parsed = urlparse.urlparse(url) - is_url = True - if not parsed.scheme.startswith("http"): - is_url = False + return False if not parsed.netloc: - is_url = False + return False + return True
- return is_url + +class UrlRepoListValidator(UrlListValidator): + """ Allows also `repo://` schema""" + def is_url(self, url): + parsed = urlparse.urlparse(url) + if parsed.scheme not in ["http", "https", "copr"]: + return False + if not parsed.netloc: + return False + # copr://username/projectname + # ^^ schema ^^ netlock ^^ path + if parsed.scheme == "copr": + # check if projectname missed + path_split = parsed.path.split("/") + if len(path_split) < 2 or path_split[1] == "": + return False + + return True
class CoprUniqueNameValidator(object): @@ -117,7 +133,7 @@ class CoprFormFactory(object):
repos = wtforms.TextAreaField( "Repos", - validators=[UrlListValidator()], + validators=[UrlRepoListValidator()], filters=[StringListFilter()])
initial_pkgs = wtforms.TextAreaField( @@ -318,7 +334,7 @@ class CoprModifyForm(wtf.Form): validators=[wtforms.validators.Optional()])
repos = wtforms.TextAreaField('Repos', - validators=[UrlListValidator(), + validators=[UrlRepoListValidator(), wtforms.validators.Optional()], filters=[StringListFilter()])
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html index 6f02e8c..7336814 100644 --- a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html +++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html @@ -78,7 +78,7 @@ <h2>Repository List</h2> <ul class=repos-list> {% for repo in copr.repos_list %} - <li><a href="{{ repo }}">{{ repo }}</a></li> + <li><a href="{{ repo|repo_url }}">{{ repo }}</a></li> {% endfor %} </ul> {% endif %}