Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 05490376d9cf5d1ebeb29161fbc41ec15447fefb
Author: Valentin Gologuzov <vgologuz(a)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)
+
+(a)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 %}