[copr] master: we moved to github. Nothing to see here. (ca9733c)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit ca9733c22536834ce9316f8068f87bca029b5c17
Author: Miroslav Such�� <msuchy(a)redhat.com>
Date: Thu Feb 18 14:07:30 2016 +0100
we moved to github. Nothing to see here.
>---------------------------------------------------------------
Diff suppressed because of size. To see it, use:
git diff --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol ^ca9733c22536834ce9316f8068f87bca029b5c17~1 ca9733c22536834ce9316f8068f87bca029b5c17
8 years, 1 month
[copr] master: [backend] put back lost changes from commits d5150cd9 and 53e9af1d from last two days (unwriteable permissions on backend source files which caused faulty rebase, sorry) (6fc8598)
by clime@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 6fc85989a86cb4b571a3cb4bb27c527f0e3d0424
Author: clime <clime(a)redhat.com>
Date: Wed Feb 17 10:20:29 2016 +0100
[backend] put back lost changes from commits d5150cd9 and 53e9af1d from last two days (unwriteable permissions on backend source files which caused faulty rebase, sorry)
>---------------------------------------------------------------
backend/backend/actions.py | 3 +++
backend/backend/mockremote/builder.py | 2 +-
2 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/backend/backend/actions.py b/backend/backend/actions.py
index 8048c15..058721e 100644
--- a/backend/backend/actions.py
+++ b/backend/backend/actions.py
@@ -246,6 +246,9 @@ class Action(object):
destdir = os.path.join(chrootdir, build)
self.log.debug("Copy directory: {} as {}".format(srcdir, destdir))
shutil.copytree(srcdir, destdir)
+
+ with open(os.path.join(destdir, "build.info"), "a") as f:
+ f.write("\nfrom_chroot={}".format(data["rawhide_chroot"]))
except:
result.result = ActionResult.FAILURE
diff --git a/backend/backend/mockremote/builder.py b/backend/backend/mockremote/builder.py
index 934adc9..41a594a 100644
--- a/backend/backend/mockremote/builder.py
+++ b/backend/backend/mockremote/builder.py
@@ -187,7 +187,7 @@ class Builder(object):
def download_job_pkg_to_builder(self):
repo_url = "{}/{}.git".format(self.opts.dist_git_url, self.job.git_repo)
self.log.info("Cloning Dist Git repo {}, branch {}, hash {}".format(
- self.job.git_repo, self.job.git_hash, self.job.git_branch))
+ self.job.git_repo, self.job.git_branch, self.job.git_hash))
results = self._run_ansible(
"rm -rf /tmp/build_package_repo && "
"mkdir /tmp/build_package_repo && "
8 years, 1 month
[copr] master: [frontend][dist-git] PyPI builds - finished all functionality without autorebuilds (6a55226)
by clime@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 6a5522605574760615a77ad5f54a1d0ee46eae96
Author: clime <clime(a)redhat.com>
Date: Wed Feb 17 09:43:46 2016 +0100
[frontend][dist-git] PyPI builds - finished all functionality without autorebuilds
>---------------------------------------------------------------
backend/backend/actions.py | 3 -
backend/backend/mockremote/builder.py | 2 +-
dist-git/dist_git/dist_git_importer.py | 3 +-
frontend/coprs_frontend/coprs/filters.py | 1 +
frontend/coprs_frontend/coprs/forms.py | 4 ++
.../coprs/static/css/custom-styles.css | 23 +++++++++++
.../templates/coprs/detail/_builds_forms.html | 17 +++++++-
.../templates/coprs/detail/_describe_source.html | 7 +++
.../templates/coprs/detail/_package_forms.html | 42 ++++++++++++++++++++
.../coprs/templates/coprs/detail/add_build.html | 2 +-
.../templates/coprs/detail/add_build/pypi.html | 2 +-
.../coprs/templates/coprs/detail/add_package.html | 7 +++-
.../coprs/templates/coprs/detail/package_edit.html | 7 +++-
.../coprs_frontend/coprs/templates/layout.html | 1 +
.../coprs/views/coprs_ns/coprs_packages.py | 20 +++++++--
15 files changed, 126 insertions(+), 15 deletions(-)
diff --git a/backend/backend/actions.py b/backend/backend/actions.py
index 058721e..8048c15 100644
--- a/backend/backend/actions.py
+++ b/backend/backend/actions.py
@@ -246,9 +246,6 @@ class Action(object):
destdir = os.path.join(chrootdir, build)
self.log.debug("Copy directory: {} as {}".format(srcdir, destdir))
shutil.copytree(srcdir, destdir)
-
- with open(os.path.join(destdir, "build.info"), "a") as f:
- f.write("\nfrom_chroot={}".format(data["rawhide_chroot"]))
except:
result.result = ActionResult.FAILURE
diff --git a/backend/backend/mockremote/builder.py b/backend/backend/mockremote/builder.py
index 41a594a..934adc9 100644
--- a/backend/backend/mockremote/builder.py
+++ b/backend/backend/mockremote/builder.py
@@ -187,7 +187,7 @@ class Builder(object):
def download_job_pkg_to_builder(self):
repo_url = "{}/{}.git".format(self.opts.dist_git_url, self.job.git_repo)
self.log.info("Cloning Dist Git repo {}, branch {}, hash {}".format(
- self.job.git_repo, self.job.git_branch, self.job.git_hash))
+ self.job.git_repo, self.job.git_hash, self.job.git_branch))
results = self._run_ansible(
"rm -rf /tmp/build_package_repo && "
"mkdir /tmp/build_package_repo && "
diff --git a/dist-git/dist_git/dist_git_importer.py b/dist-git/dist_git/dist_git_importer.py
index eca9c29..58d6b7e 100755
--- a/dist-git/dist_git/dist_git_importer.py
+++ b/dist-git/dist_git/dist_git_importer.py
@@ -337,7 +337,7 @@ class PyPIProvider(SrpmBuilderProvider):
if self.task.pypi_package_version:
cmd += ['-v', self.task.pypi_package_version]
- log.info(cmd)
+ log.info(' '.join(cmd))
try:
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
@@ -349,6 +349,7 @@ class PyPIProvider(SrpmBuilderProvider):
log.error(error)
raise PyPIException(FailTypeEnum("srpm_build_error")) # pass error message somehow?
+ log.info(output)
self.copy()
diff --git a/frontend/coprs_frontend/coprs/filters.py b/frontend/coprs_frontend/coprs/filters.py
index ffe4599..dbab38a 100644
--- a/frontend/coprs_frontend/coprs/filters.py
+++ b/frontend/coprs_frontend/coprs/filters.py
@@ -174,6 +174,7 @@ def build_source_description(state):
"srpm_upload": "SRPM file upload",
"git_and_tito": "Tito build from a Git repository",
"mock_scm": "Mock build from a SCM repository",
+ "pypi": "Build from PyPI",
}
return description_map.get(state, "")
diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py
index bd87e74..6a0eeea 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -374,6 +374,10 @@ class PackageFormMock(BasePackageForm):
class PackageFormPyPI(BasePackageForm):
+ source_type = wtforms.HiddenField(
+ "Source Type",
+ validators=[wtforms.validators.AnyOf(["pypi"])])
+
package_version = wtforms.StringField(
"Package version",
validators=[
diff --git a/frontend/coprs_frontend/coprs/static/css/custom-styles.css b/frontend/coprs_frontend/coprs/static/css/custom-styles.css
new file mode 100644
index 0000000..9b75599
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/static/css/custom-styles.css
@@ -0,0 +1,23 @@
+div.pypi-python-version {
+ cursor: default;
+}
+
+div.pypi-python-version input {
+ margin-bottom: -1px;
+ vertical-align:middle;
+}
+
+div.pypi-python-version label {
+ margin-bottom: -5px;
+ vertical-align:middle;
+}
+
+div.anitya-rebuild input {
+ margin-bottom: -1px;
+ vertical-align:middle;
+}
+
+div.anitya-rebuild label {
+ margin-bottom: -5px;
+ vertical-align:middle;
+}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
index 8011eeb..1b8d46c 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
@@ -190,8 +190,21 @@
{{ source_description('This method uses <a href="https://github.com/fedora-python/pyp2rpm">pyp2rpm</a> to create the RPM for you automatically from PyPI - the Python Package Index. Please provide the package name.')}}
{{ render_field(form.package_name, placeholder="Package name in the Python Package Index.") }}
- {{ render_field(form.package_version, placeholder="Optional - Version of the package") }}
- {{ render_field(form.python_version, placeholder="Base python version that you want to build for") }}
+ {{ render_field(form.package_version, placeholder="Optional - Version of the package PyPI") }}
+
+ <div class="form-group">
+ <label class="col-sm-2 control-label">
+ <label for="python_version">Base Python version</label>:
+ </label>
+ <div class="col-sm-10 pypi-python-version">
+ <input id="python_version-0" name="python_version" value="2" type="radio" {% if form.python_version.data == '2' %}checked="checked"{% endif %}>
+ <label for="python_version-0">2</label>
+ <input id="python_version-1" name="python_version" value="3" type="radio" {% if form.python_version.data == '3' %}checked="checked"{% endif %}>
+ <label for="python_version-1">3</label>
+ </div>
+ </div>
+
+ <input type="hidden" name="source_type" value="pypi" />
{{ copr_build_form_end(form, view, copr) }}
{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_source.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_source.html
index 9c4bc7c..9d4ce44 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_source.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_source.html
@@ -37,6 +37,13 @@
<dt>Path to .spec file:</dt>
<dd>{{ build.source_json_dict["spec"] }}</dd>
+
+ {% elif build.source_type_text == "pypi" %}
+ <dt>Package name</dt>
+ <dd>{{ build.source_json_dict["package_name"] }}</dd>
+
+ <dt>Base python version</dt>
+ <dd>{{ build.source_json_dict["python_version"] }}</dd>
{% endif %}
{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
index 144ddeb..ca3d4dd 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_package_forms.html
@@ -66,3 +66,45 @@
{{ copr_package_form_end(form, package, 'mock_scm') }}
{% endmacro %}
+
+
+{% macro copr_package_form_pypi(form, view, copr, package) %}
+ {{ render_form_errors(form) }}
+
+ {% if not package.name %} {# Add package #}
+ <form class="form-horizontal" action="{{ copr_url(view, copr) }}" method="post" enctype="multipart/form-data">
+ {{ render_field(form.package_name) }}
+ {% else %} {# Edit package #}
+ <form class="form-horizontal" action="{{ copr_url(view, copr, package_name=package.name) }}" method="post" enctype="multipart/form-data">
+ <input type="hidden" name="package_name" value="{{ package.name }}" />
+ {% endif %}
+
+ {{ render_field(form.package_name, placeholder="Package name in the Python Package Index.") }}
+
+ <div class="form-group">
+ <label class="col-sm-2 control-label">
+ <label for="python_version">Base Python version</label>:
+ </label>
+ <div class="col-sm-10 pypi-python-version">
+ <input id="python_version-0" name="python_version" value="2" type="radio" {% if form.python_version.data == '2' %}checked="checked"{% endif %}>
+ <label for="python_version-0">2</label>
+ <input id="python_version-1" name="python_version" value="3" type="radio" {% if form.python_version.data == '3' %}checked="checked"{% endif %}>
+ <label for="python_version-1">3</label>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-2 control-label" for="textInput-markup">
+ Anitya rebuild
+ </label>
+ <div class="col-sm-10 anitya-rebuild">
+ <input type="checkbox" name="webhook_rebuild" id="anitya_rebuild" {% if form.webhook_rebuild.data == True %}checked="checked"{% endif %}/>
+ <label for="webhook_rebuild">Use Anitya emitted message to rebuild this package (you also need to register respective PyPI package on <a href="https://release-monitoring.org/">release-monitoring.org</a>)</label>
+ </div>
+ </div>
+ <input type="hidden" name="source_type" value="pypi" />
+ {{ form.csrf_token }}
+ <input class="btn btn-primary pull-right" type="submit" value="Submit">
+
+ </form>
+{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
index 3715af9..ebc887c 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
@@ -1,5 +1,5 @@
{% extends "coprs/detail.html" %}
-{% from "_helpers.html" import nav_element, copr_url %}
+{% from "_helpers.html" import copr_url %}
{% block title %}Adding Build for {{ copr.owner.name }}/{{ copr.name }}{% endblock %}
{% set selected_tab = "builds" %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
index 707a4b9..17b2c08 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
@@ -1,7 +1,7 @@
{% extends "coprs/detail/add_build.html" %}
{% from "coprs/detail/_builds_forms.html" import copr_build_form_pypi with context %}
-{% set add_build_tab = "PyPI" %}
+{% set add_build_tab = "pypi" %}
{% block build_form %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html
index 0a0199e..343d9f0 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_package.html
@@ -1,6 +1,6 @@
{% extends "coprs/detail.html" %}
{% from "coprs/detail/_package_helpers.html" import nav_element, badge with context %}
-{% from "coprs/detail/_package_forms.html" import copr_package_form_tito, copr_package_form_mock with context %}
+{% from "coprs/detail/_package_forms.html" import copr_package_form_tito, copr_package_form_mock, copr_package_form_pypi with context %}
{% block title %}New package in {{ copr.owner.name }}/{{ copr.name }}{% endblock %}
{% set selected_tab = "packages" %}
@@ -24,6 +24,7 @@ create a <a href="{{ copr_url('coprs_ns.copr_add_build', copr) }}">New Build</a>
<ul class="nav nav-tabs nav-tabs-pf">
{{ nav_element("git_and_tito", "Git and Tito", copr_url('coprs_ns.copr_add_package', copr, source_type="git_and_tito")) }}
{{ nav_element("mock_scm", "Mock SCM", copr_url('coprs_ns.copr_add_package', copr, source_type="mock_scm")) }}
+ {{ nav_element("pypi", "PyPI", copr_url('coprs_ns.copr_add_package', copr, source_type="pypi")) }}
</ul>
{% if source_type == "git_and_tito" %}
@@ -34,6 +35,10 @@ create a <a href="{{ copr_url('coprs_ns.copr_add_build', copr) }}">New Build</a>
<h3>Mock {{ badge('mock_scm') }}</h3>
{{ copr_package_form_mock(form_mock, view, copr, package) }}
+{% elif source_type == "pypi" %}
+ <h3>PyPI {{ badge('pypi') }}</h3>
+ {{ copr_package_form_pypi(form_pypi, view, copr, package) }}
+
{% else %}
<h3>Wrong source type</h3>
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
index cb4e6e9..27ab908 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package_edit.html
@@ -1,6 +1,6 @@
{% extends "coprs/detail.html" %}
{% from "coprs/detail/_package_helpers.html" import nav_element, badge with context %}
-{% from "coprs/detail/_package_forms.html" import copr_package_form_tito, copr_package_form_mock with context %}
+{% from "coprs/detail/_package_forms.html" import copr_package_form_tito, copr_package_form_mock, copr_package_form_pypi with context %}
{% block title %}Package {{ package.name }} in {{ package.copr.owner.name }}/{{ package.copr.name }}{% endblock %}
{% set selected_tab = "packages" %}
@@ -20,6 +20,7 @@
<ul class="nav nav-tabs nav-tabs-pf">
{{ nav_element("git_and_tito", "Git and Tito", copr_url('coprs_ns.copr_edit_package', copr, package_name=package.name, source_type="git_and_tito")) }}
{{ nav_element("mock_scm", "Mock SCM", copr_url('coprs_ns.copr_edit_package', copr, package_name=package.name, source_type="mock_scm")) }}
+ {{ nav_element("pypi", "PyPI", copr_url('coprs_ns.copr_edit_package', copr, package_name=package.name, source_type="pypi")) }}
</ul>
{% if source_type == "git_and_tito" %}
@@ -30,6 +31,10 @@
<h3>Mock {{ badge('mock_scm') }}</h3>
{{ copr_package_form_mock(form_mock, view, copr, package) }}
+{% elif source_type == "pypi" %}
+ <h3>PyPI {{ badge('pypi') }}</h3>
+ {{ copr_package_form_pypi(form_pypi, view, copr, package) }}
+
{% else %}
<h3>Wrong source type</h3>
diff --git a/frontend/coprs_frontend/coprs/templates/layout.html b/frontend/coprs_frontend/coprs/templates/layout.html
index 9baa331..59caf33 100644
--- a/frontend/coprs_frontend/coprs/templates/layout.html
+++ b/frontend/coprs_frontend/coprs/templates/layout.html
@@ -10,6 +10,7 @@
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/vnd.microsoft.icon">
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}" type="image/x-icon">
<link href="{{ url_for('static', filename='css/patternfly.min.css') }}" rel="stylesheet" media="screen, print">
+ <link href="{{ url_for('static', filename='css/custom-styles.css') }}" rel="stylesheet" media="screen, print">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="../components/html5shiv/dist/html5shiv.min.js"></script>
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index 9a81504..7d10853 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -7,7 +7,7 @@ from coprs import forms
from coprs import helpers
from coprs.models import Package, Build
from coprs.views.coprs_ns import coprs_ns
-from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_build_mock
+from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_build_mock, render_add_build_pypi
from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr
from coprs.logic.complex_logic import ComplexLogic
from coprs.logic.packages_logic import PackagesLogic
@@ -48,6 +48,10 @@ def copr_rebuild_package(copr, package_name):
form = forms.BuildFormMockFactory
f = render_add_build_mock
view_suffix = "_mock"
+ elif package.source_type_text == "pypi":
+ form = forms.BuildFormPyPIFactory
+ f = render_add_build_pypi
+ view_suffix = "_pypi"
else:
flask.flash("Package {} has not the default source which is required for rebuild. Please configure some source"
.format(package_name, copr.full_name))
@@ -66,7 +70,8 @@ def copr_rebuild_package(copr, package_name):
def copr_add_package(copr, source_type="git_and_tito", **kwargs):
form = {
"git_and_tito": forms.PackageFormTito(),
- "mock_scm": forms.PackageFormMock()
+ "mock_scm": forms.PackageFormMock(),
+ "pypi": forms.PackageFormPyPI(),
}
if "form" in kwargs:
@@ -74,7 +79,7 @@ def copr_add_package(copr, source_type="git_and_tito", **kwargs):
return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None,
source_type=source_type, view="coprs_ns.copr_new_package",
- form_tito=form["git_and_tito"], form_mock=form["mock_scm"])
+ form_tito=form["git_and_tito"], form_mock=form["mock_scm"], form_pypi=form["pypi"])
@coprs_ns.route("/<username>/<coprname>/package/new", methods=["POST"])
@@ -105,6 +110,7 @@ def copr_edit_package(copr, package_name, source_type=None, **kwargs):
form_classes = {
"git_and_tito": forms.PackageFormTito,
"mock_scm": forms.PackageFormMock,
+ "pypi": forms.PackageFormPyPI,
}
form = {k: v(formdata=None) for k, v in form_classes.items()}
@@ -117,7 +123,7 @@ def copr_edit_package(copr, package_name, source_type=None, **kwargs):
return flask.render_template("coprs/detail/package_edit.html", package=package, copr=copr,
source_type=source_type, view="coprs_ns.copr_edit_package",
- form_tito=form["git_and_tito"], form_mock=form["mock_scm"])
+ form_tito=form["git_and_tito"], form_mock=form["mock_scm"], form_pypi=form["pypi"])
@coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit", methods=["POST"])
@@ -138,6 +144,8 @@ def process_save_package(copr, package_name, view, view_method, url_on_success):
form = forms.PackageFormTito()
elif flask.request.form["source_type"] == "mock_scm":
form = forms.PackageFormMock()
+ elif flask.request.form["source_type"] == "pypi":
+ form = forms.PackageFormPyPI()
else:
raise Exception("Wrong source type")
@@ -162,6 +170,10 @@ def process_save_package(copr, package_name, view, view_method, url_on_success):
"scm_url": form.scm_url.data,
"scm_branch": form.scm_branch.data,
"spec": form.spec.data})
+ elif package.source_type == helpers.BuildSourceEnum("pypi"):
+ package.source_json = json.dumps({
+ "package_name": form.package_name.data,
+ "python_version": form.python_version.data})
try:
db.session.add(package)
8 years, 1 month
[copr] master: [frontend][dist-git] Building from PyPI - initial commit (ebb35fb)
by clime@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit ebb35fb78f22930fd59533c8471e581a966e05e9
Author: clime <clime(a)redhat.com>
Date: Mon Feb 15 17:56:25 2016 +0100
[frontend][dist-git] Building from PyPI - initial commit
>---------------------------------------------------------------
dist-git/dist_git/dist_git_importer.py | 41 ++++++++++-
dist-git/dist_git/exceptions.py | 4 +
frontend/coprs_frontend/coprs/forms.py | 26 +++++++-
frontend/coprs_frontend/coprs/helpers.py | 4 +-
.../coprs_frontend/coprs/logic/builds_logic.py | 43 +++++++++++
.../templates/coprs/detail/_builds_forms.html | 13 +++-
.../coprs/templates/coprs/detail/add_build.html | 1 +
.../detail/add_build/{mock.html => pypi.html} | 6 +-
.../coprs/views/coprs_ns/coprs_builds.py | 76 ++++++++++++++++++++
9 files changed, 207 insertions(+), 7 deletions(-)
diff --git a/dist-git/dist_git/dist_git_importer.py b/dist-git/dist_git/dist_git_importer.py
index 071a73f..eca9c29 100755
--- a/dist-git/dist_git/dist_git_importer.py
+++ b/dist-git/dist_git/dist_git_importer.py
@@ -24,6 +24,7 @@ class SourceType:
SRPM_UPLOAD = 2
GIT_AND_TITO = 3
MOCK_SCM = 4
+ PYPI = 5
class ImportTask(object):
@@ -59,6 +60,11 @@ class ImportTask(object):
self.mock_scm_branch = None
self.mock_spec = None
+ # For PyPI
+ self.pypi_package_name = None
+ self.pypi_package_version = None
+ self.pypi_python_version = None
+
@property
def reponame(self):
if any(x is None for x in [self.user, self.project, self.package_name]):
@@ -99,6 +105,11 @@ class ImportTask(object):
task.mock_scm_branch = task.source_data["scm_branch"]
task.mock_spec = task.source_data["spec"]
+ elif task.source_type == SourceType.PYPI:
+ task.pypi_package_name = task.source_data["package_name"]
+ task.pypi_package_version = task.source_data["package_version"]
+ task.pypi_python_version = task.source_data["python_version"]
+
else:
raise PackageImportException("Got unknown source type: {}".format(task.source_type))
@@ -138,6 +149,9 @@ class SourceProvider(object):
elif task.source_type == SourceType.MOCK_SCM:
self.provider = MockScmProvider
+ elif task.source_type == SourceType.PYPI:
+ self.provider = PyPIProvider
+
else:
raise PackageImportException("Got unknown source type: {}".format(task.source_type))
@@ -166,7 +180,7 @@ class SrpmBuilderProvider(BaseSourceProvider):
srpm_name = dest_srpms[0]
else:
log.debug("ERROR :( :( :(")
- log.debug("git_dir: {}".format(self.git_dir))
+ #log.debug("git_dir: {}".format(self.git_dir))
log.debug("dest_files: {}".format(dest_files))
log.debug("dest_srpms: {}".format(dest_srpms))
log.debug("")
@@ -313,6 +327,31 @@ class MockScmProvider(SrpmBuilderProvider):
}[self.task.mock_scm_type].format(self.task.mock_scm_url)
+class PyPIProvider(SrpmBuilderProvider):
+ """
+ Used for PyPI
+ """
+ def get_srpm(self):
+ log.debug("GIT_BUILDER: 3. build via pyp2rpm")
+ cmd = ['pyp2rpm', self.task.pypi_package_name, '--srpm', '-d', self.tmp_dest, '-b', self.task.pypi_python_version]
+ if self.task.pypi_package_version:
+ cmd += ['-v', self.task.pypi_package_version]
+
+ log.info(cmd)
+
+ try:
+ proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
+ output, error = proc.communicate()
+ except OSError as e:
+ log.error(str(e))
+ raise PyPIException(FailTypeEnum("srpm_build_error"))
+ if proc.returncode != 0:
+ log.error(error)
+ raise PyPIException(FailTypeEnum("srpm_build_error")) # pass error message somehow?
+
+ self.copy()
+
+
class SrpmUrlProvider(BaseSourceProvider):
def get_srpm(self):
"""
diff --git a/dist-git/dist_git/exceptions.py b/dist-git/dist_git/exceptions.py
index 47e6db4..673c5be 100644
--- a/dist-git/dist_git/exceptions.py
+++ b/dist-git/dist_git/exceptions.py
@@ -28,6 +28,10 @@ class GitException(SrpmBuilderException):
pass
+class PyPIException(SrpmBuilderException):
+ pass
+
+
class GitAndTitoException(GitException):
def __init__(self, error_code=None):
super(GitAndTitoException, self).__init__(error_code)
diff --git a/frontend/coprs_frontend/coprs/forms.py b/frontend/coprs_frontend/coprs/forms.py
index b42f030..bd87e74 100644
--- a/frontend/coprs_frontend/coprs/forms.py
+++ b/frontend/coprs_frontend/coprs/forms.py
@@ -316,7 +316,7 @@ class BuildFormRebuildFactory(object):
class BasePackageForm(wtf.Form):
package_name = wtforms.StringField(
- "Package Name",
+ "Package name",
validators=[wtforms.validators.DataRequired()])
webhook_rebuild = wtforms.BooleanField(default=False)
@@ -373,6 +373,25 @@ class PackageFormMock(BasePackageForm):
message="RPM spec file must end with .spec")])
+class PackageFormPyPI(BasePackageForm):
+ package_version = wtforms.StringField(
+ "Package version",
+ validators=[
+ wtforms.validators.Optional(),
+ ])
+
+ python_version = wtforms.RadioField(
+ "Base Python version",
+ choices=[
+ ('2', '2'),
+ ('3', '3'),
+ ],
+ default='3',
+ validators=[
+ wtforms.validators.DataRequired(),
+ ])
+
+
class BaseBuildFormFactory(object):
def __new__(cls, active_chroots, form):
class F(form):
@@ -428,6 +447,11 @@ class BuildFormMockFactory(object):
return BaseBuildFormFactory(active_chroots, PackageFormMock)
+class BuildFormPyPIFactory(object):
+ def __new__(cls, active_chroots):
+ return BaseBuildFormFactory(active_chroots, PackageFormPyPI)
+
+
class BuildFormUploadFactory(object):
def __new__(cls, active_chroots):
form = BaseBuildFormFactory(active_chroots, wtf.Form)
diff --git a/frontend/coprs_frontend/coprs/helpers.py b/frontend/coprs_frontend/coprs/helpers.py
index c47c5f1..6422866 100644
--- a/frontend/coprs_frontend/coprs/helpers.py
+++ b/frontend/coprs_frontend/coprs/helpers.py
@@ -94,7 +94,9 @@ class BuildSourceEnum(with_metaclass(EnumType, object)):
"srpm_link": 1, # url
"srpm_upload": 2, # pkg, tmp
"git_and_tito": 3, # git_url, git_dir, git_branch, tito_test
- "mock_scm": 4} # scm_type, scm_url, spec, scm_branch
+ "mock_scm": 4, # scm_type, scm_url, spec, scm_branch
+ "pypi": 5, # package_name, version, python_version
+ }
# The same enum is also in distgit's helpers.py
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index 4009e74..4b23ad2 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -409,6 +409,49 @@ GROUP BY
return build
+
+ @classmethod
+ def create_new_from_pypi(cls, user, copr, package_name, package_version, python_version,
+ chroot_names=None, **build_options):
+ """
+ :type user: models.User
+ :type copr: models.Copr
+ :type package_name: str
+ :type version: str
+ :type python_version: str
+
+ :type chroot_names: List[str]
+
+ :rtype: models.Build
+ """
+ if chroot_names is None:
+ chroots = [c for c in copr.active_chroots]
+ else:
+ chroots = []
+ for chroot in copr.active_chroots:
+ if chroot.name in chroot_names:
+ chroots.append(chroot)
+
+ source_type = helpers.BuildSourceEnum("pypi")
+ source_json = json.dumps({"package_name": package_name,
+ "package_version": package_version,
+ "python_version": python_version})
+
+ build = cls.add(
+ user=user,
+ pkgs="",
+ copr=copr,
+ chroots=chroots,
+ source_type=source_type,
+ source_json=source_json,
+ enable_net=build_options.get("enable_net", copr.build_enable_net))
+
+ if user.proven:
+ if "timeout" in build_options:
+ build.timeout = build_options["timeout"]
+
+ return build
+
@classmethod
def create_new_from_upload(cls, user, copr, f_uploader, orig_filename,
chroot_names=None, **build_options):
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
index dd4c152..8011eeb 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_builds_forms.html
@@ -184,13 +184,24 @@
{% endmacro %}
+{% macro copr_build_form_pypi(form, view, copr) %}
+ {{ copr_build_form_begin(form, view, copr) }}
+
+ {{ source_description('This method uses <a href="https://github.com/fedora-python/pyp2rpm">pyp2rpm</a> to create the RPM for you automatically from PyPI - the Python Package Index. Please provide the package name.')}}
+
+ {{ render_field(form.package_name, placeholder="Package name in the Python Package Index.") }}
+ {{ render_field(form.package_version, placeholder="Optional - Version of the package") }}
+ {{ render_field(form.python_version, placeholder="Base python version that you want to build for") }}
+ {{ copr_build_form_end(form, view, copr) }}
+{% endmacro %}
+
+
{% macro copr_build_form_rebuild(form, view, copr, build) %}
{{ copr_build_form_begin(form, view, copr, build, hide_panels=True) }}
{{ copr_build_form_end(form, view, copr, hide_panels=True) }}
{% endmacro %}
-
{% macro copr_build_cancel_form(build, page, class="") %}
{% if build.cancelable %}
<form class="{{class}}" action="{{ copr_url('coprs_ns.copr_cancel_build', build.copr, build_id=build.id) }}" method="post">
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
index af02644..3715af9 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build.html
@@ -37,6 +37,7 @@
{{ nav_element("upload", "Upload SRPM", copr_url('coprs_ns.copr_add_build_upload', copr)) }}
{{ nav_element("tito", "Tito", copr_url('coprs_ns.copr_add_build_tito', copr)) }}
{{ nav_element("mock", "Mock SCM", copr_url('coprs_ns.copr_add_build_mock', copr)) }}
+ {{ nav_element("pypi", "PyPI", copr_url('coprs_ns.copr_add_build_pypi', copr)) }}
</ul>
</div>
</div>
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/mock.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
similarity index 59%
copy from frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/mock.html
copy to frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
index ce85e52..707a4b9 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/mock.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/add_build/pypi.html
@@ -1,10 +1,10 @@
{% extends "coprs/detail/add_build.html" %}
-{% from "coprs/detail/_builds_forms.html" import copr_build_form_mock with context %}
+{% from "coprs/detail/_builds_forms.html" import copr_build_form_pypi with context %}
-{% set add_build_tab = "mock" %}
+{% set add_build_tab = "PyPI" %}
{% block build_form %}
- {{ copr_build_form_mock(form, view, copr) }}
+ {{ copr_build_form_pypi(form, view, copr) }}
{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
index 686182f..38b9517 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -336,6 +336,82 @@ def process_new_build_mock(copr, add_view, url_on_success):
return render_add_build_mock(copr, form, add_view)
+################################ PyPI builds ################################
+
+(a)coprs_ns.route("/<username>/<coprname>/add_build_pypi/")
+@login_required
+@req_with_copr
+def copr_add_build_pypi(copr, form=None):
+ return render_add_build_pypi(
+ copr, form, view='coprs_ns.copr_new_build_pypi')
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/")
+@login_required
+@req_with_copr
+def group_copr_add_build_pypi(copr, form=None):
+ return render_add_build_pypi(
+ copr, form, view='coprs_ns.copr_new_build_pypi')
+
+
+def render_add_build_pypi(copr, form, view, package=None):
+ if not form:
+ form = forms.BuildFormPyPIFactory(copr.active_chroots)()
+ return flask.render_template("coprs/detail/add_build/pypi.html",
+ copr=copr, form=form, view=view, package=package)
+
+
+(a)coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])
+@login_required
+@req_with_copr
+def copr_new_build_pypi(copr):
+ view = 'coprs_ns.copr_new_build_pypi'
+ url_on_success = url_for("coprs_ns.copr_builds",
+ username=copr.owner.username, coprname=copr.name)
+ return process_new_build_pypi(copr, view, url_on_success)
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])
+@login_required
+@req_with_copr
+def group_copr_new_build_pypi(copr):
+ view = 'coprs_ns.copr_new_build_pypi'
+ url_on_success = url_for("coprs_ns.group_copr_builds",
+ group_name=copr.group.name, coprname=copr.name)
+ return process_new_build_pypi(copr, view, url_on_success)
+
+
+def process_new_build_pypi(copr, add_view, url_on_success):
+ form = forms.BuildFormPyPIFactory(copr.active_chroots)()
+
+ if form.validate_on_submit():
+ build_options = {
+ "enable_net": form.enable_net.data,
+ "timeout": form.timeout.data,
+ }
+
+ try:
+ BuildsLogic.create_new_from_pypi(
+ flask.g.user,
+ copr,
+ form.package_name.data,
+ form.package_version.data,
+ form.python_version.data,
+ form.selected_chroots,
+ **build_options
+ )
+ db.session.commit()
+ except (ActionInProgressException, InsufficientRightsException) as e:
+ db.session.rollback()
+ flask.flash(str(e), "error")
+ else:
+ flask.flash("New build has been created.")
+
+ return flask.redirect(url_on_success)
+ else:
+ return render_add_build_pypi(copr, form, add_view)
+
+
################################ Upload builds ################################
@coprs_ns.route("/<username>/<coprname>/add_build_upload/")
8 years, 1 month
[copr] master: Revert "check if dist-git returns hash" (eec3945)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit eec3945e37d3916f1a9c5f1df3fbf3038dd2c6ea
Author: Miroslav Such�� <msuchy(a)redhat.com>
Date: Mon Feb 15 17:01:34 2016 +0100
Revert "check if dist-git returns hash"
This reverts commit a443cffbacc47e85dccce8203b39188b40b6a498.
>---------------------------------------------------------------
.../coprs/views/backend_ns/backend_general.py | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
index 1e1cb23..f7338bd 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -73,8 +73,7 @@ def dist_git_upload_completed():
build = build_chroots[0].build
# Is it OK?
- if "git_hash" in flask.request.json and "repo_name" in flask.request.json and \
- flask.request.json["git_hash"] != "None" and flask.request.json["git_hash"] is None:
+ if "git_hash" in flask.request.json and "repo_name" in flask.request.json:
git_hash = flask.request.json["git_hash"]
pkg_name = flask.request.json["pkg_name"]
pkg_version = flask.request.json["pkg_version"]
8 years, 1 month
[copr] master: print correct info in logs (d5150cd)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit d5150cd989b15a101c8658d16e55bde435c91d45
Author: Miroslav Such�� <msuchy(a)redhat.com>
Date: Mon Feb 15 15:07:53 2016 +0100
print correct info in logs
>---------------------------------------------------------------
backend/backend/mockremote/builder.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/backend/backend/mockremote/builder.py b/backend/backend/mockremote/builder.py
index 934adc9..41a594a 100644
--- a/backend/backend/mockremote/builder.py
+++ b/backend/backend/mockremote/builder.py
@@ -187,7 +187,7 @@ class Builder(object):
def download_job_pkg_to_builder(self):
repo_url = "{}/{}.git".format(self.opts.dist_git_url, self.job.git_repo)
self.log.info("Cloning Dist Git repo {}, branch {}, hash {}".format(
- self.job.git_repo, self.job.git_hash, self.job.git_branch))
+ self.job.git_repo, self.job.git_branch, self.job.git_hash))
results = self._run_ansible(
"rm -rf /tmp/build_package_repo && "
"mkdir /tmp/build_package_repo && "
8 years, 1 month
[copr] master: [frontend] show edit and rebuild buttons only for allowed users (b835835)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit b8358354f2e3219e7d5be01c48625fd11fde53f3
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Feb 15 15:58:40 2016 +0100
[frontend] show edit and rebuild buttons only for allowed users
>---------------------------------------------------------------
.../coprs/templates/coprs/detail/package.html | 4 ++++
.../coprs/views/coprs_ns/coprs_packages.py | 4 ++++
2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
index e5cc5a3..37be997 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/package.html
@@ -18,9 +18,11 @@
{% block detail_body %}
+{% if g.user and g.user.can_edit(copr) %}
<a class="btn btn-default pull-right button-build-action" href="{{ copr_url('coprs_ns.copr_rebuild_package', copr, package_name=package.name) }}">
<span class="pficon pficon-restart"></span> Rebuild
</a>
+{% endif %}
<h2 class="page-title"> Package: {{ package.name }} </h2>
@@ -47,11 +49,13 @@
<div class="panel panel-default">
<div class="panel-heading clearfix panel-heading-buttons">
<h3 class="panel-title pull-left">Default Build Source</h3>
+ {% if g.user and g.user.can_edit(copr) %}
<div class="btn-group pull-right">
<a class="btn btn-default btn-sm" href="{{ copr_url('coprs_ns.copr_edit_package', copr, package_name=package.name) }}">
<span class="pficon pficon-edit"> Edit</span>
</a>
</div>
+ {% endif %}
</div>
<div class="panel-body">
<dl class="dl-horizontal">
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
index 9ca1ed3..9a81504 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_packages.py
@@ -11,6 +11,7 @@ from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_
from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr
from coprs.logic.complex_logic import ComplexLogic
from coprs.logic.packages_logic import PackagesLogic
+from coprs.logic.users_logic import UsersLogic
from coprs.exceptions import (ActionInProgressException,
InsufficientRightsException,)
@@ -124,6 +125,9 @@ def copr_edit_package(copr, package_name, source_type=None, **kwargs):
@login_required
@req_with_copr
def copr_edit_package_post(copr, package_name):
+ UsersLogic.raise_if_cant_build_in_copr(
+ flask.g.user, copr, "You don't have permissions to edit this package.")
+
url_on_success = copr_url("coprs_ns.copr_packages", copr)
return process_save_package(copr, package_name, view="coprs_ns.copr_edit_package",
view_method=copr_edit_package, url_on_success=url_on_success)
8 years, 1 month
[copr] master: [backend] append from_chroot to build.info (53e9af1)
by frostyx@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 53e9af1d3c444405d64b1b9ce064220f6577be82
Author: Jakub Kadl����k <jkadlcik(a)redhat.com>
Date: Mon Feb 15 13:26:29 2016 +0100
[backend] append from_chroot to build.info
>---------------------------------------------------------------
backend/backend/actions.py | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/backend/backend/actions.py b/backend/backend/actions.py
index 8048c15..058721e 100644
--- a/backend/backend/actions.py
+++ b/backend/backend/actions.py
@@ -246,6 +246,9 @@ class Action(object):
destdir = os.path.join(chrootdir, build)
self.log.debug("Copy directory: {} as {}".format(srcdir, destdir))
shutil.copytree(srcdir, destdir)
+
+ with open(os.path.join(destdir, "build.info"), "a") as f:
+ f.write("\nfrom_chroot={}".format(data["rawhide_chroot"]))
except:
result.result = ActionResult.FAILURE
8 years, 1 month
[copr] master: [frontend] views/coprs_ns/coprs_builds.py restructured (a025367)
by clime@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit a025367794da3819d8f49c40be429491e141cfca
Author: clime <clime(a)redhat.com>
Date: Mon Feb 15 12:30:51 2016 +0100
[frontend] views/coprs_ns/coprs_builds.py restructured
>---------------------------------------------------------------
.../coprs/views/coprs_ns/coprs_builds.py | 293 +++++++++++---------
1 files changed, 158 insertions(+), 135 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
index 85066ef..686182f 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -51,10 +51,7 @@ def copr_build_redirect(build_id):
build_id=build_id))
-def render_copr_build(build_id, copr):
- build = ComplexLogic.get_build_safe(build_id)
- return render_template("coprs/detail/build.html", build=build, copr=copr)
-
+################################ Build detail ################################
@coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/")
@req_with_copr
@@ -68,6 +65,13 @@ def group_copr_build(copr, build_id):
return render_copr_build(build_id, copr)
+def render_copr_build(build_id, copr):
+ build = ComplexLogic.get_build_safe(build_id)
+ return render_template("coprs/detail/build.html", build=build, copr=copr)
+
+
+################################ Build table ################################
+
@coprs_ns.route("/<username>/<coprname>/builds/")
@req_with_copr
def copr_builds(copr):
@@ -87,6 +91,8 @@ def render_copr_builds(copr):
builds=builds_query)
+################################ Url builds ################################
+
@coprs_ns.route("/<username>/<coprname>/add_build/")
@login_required
@req_with_copr
@@ -94,6 +100,7 @@ def copr_add_build(copr, form=None):
return render_add_build(
copr, form, view='coprs_ns.copr_new_build')
+
@coprs_ns.route("/g/<group_name>/<coprname>/add_build/")
@login_required
@req_with_copr
@@ -101,6 +108,7 @@ def group_copr_add_build(copr, form=None):
return render_add_build(
copr, form, view='coprs_ns.copr_new_build')
+
def render_add_build(copr, form, view):
if not form:
form = forms.BuildFormUrlFactory(copr.active_chroots)()
@@ -108,26 +116,73 @@ def render_add_build(copr, form, view):
copr=copr, view=view, form=form)
-(a)coprs_ns.route("/<username>/<coprname>/add_build_upload/")
+(a)coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
@login_required
@req_with_copr
-def copr_add_build_upload(copr, form=None):
- return render_add_build_upload(
- copr, form, view='coprs_ns.copr_new_build_upload')
+def copr_new_build(copr):
+ return process_new_build_url(
+ copr,
+ "coprs_ns.copr_new_build",
+ url_on_success=url_for("coprs_ns.copr_builds",
+ username=copr.owner.username, coprname=copr.name)
+ )
-(a)coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/")
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])
@login_required
@req_with_copr
-def group_copr_add_build_upload(copr, form=None):
- return render_add_build_upload(
- copr, form, view='coprs_ns.copr_new_build_upload')
+def group_copr_new_build(copr):
+ return process_new_build_url(
+ copr,
+ "coprs_ns.copr_new_build",
+ url_on_success=url_for("coprs_ns.group_copr_builds",
+ group_name=copr.group.name, coprname=copr.name)
+ )
-def render_add_build_upload(copr, form, view):
- if not form:
- form = forms.BuildFormUploadFactory(copr.active_chroots)()
- return flask.render_template("coprs/detail/add_build/upload.html",
- copr=copr, form=form, view=view)
+def process_new_build_url(copr, add_view, url_on_success):
+ form = forms.BuildFormUrlFactory(copr.active_chroots)()
+
+ if form.validate_on_submit():
+ pkgs = form.pkgs.data.split("\n")
+
+ if not pkgs:
+ flask.flash("No builds submitted")
+ else:
+ # # check which chroots we need
+ # chroots = []
+ # for chroot in copr.active_chroots:
+ # if chroot.name in form.selected_chroots:
+ # chroots.append(chroot)
+
+ # build each package as a separate build
+ try:
+ for pkg in pkgs:
+ build_options = {
+ "enable_net": form.enable_net.data,
+ "timeout": form.timeout.data,
+ }
+ BuildsLogic.create_new_from_url(
+ flask.g.user, copr, pkg,
+ chroot_names=form.selected_chroots,
+ **build_options
+ )
+
+ except (ActionInProgressException, InsufficientRightsException) as e:
+ flask.flash(str(e), "error")
+ db.session.rollback()
+ else:
+ for pkg in pkgs:
+ flask.flash("New build has been created: {}".format(pkg))
+
+ db.session.commit()
+
+ return flask.redirect(url_on_success)
+ else:
+ return render_add_build(copr, form, add_view)
+
+
+################################ Tito builds ################################
@coprs_ns.route("/<username>/<coprname>/add_build_tito/")
@login_required
@@ -136,6 +191,7 @@ def copr_add_build_tito(copr, form=None):
return render_add_build_tito(
copr, form, view='coprs_ns.copr_new_build_tito')
+
@coprs_ns.route("/g/<group_name>/<coprname>/add_build_tito/")
@login_required
@req_with_copr
@@ -143,6 +199,7 @@ def group_copr_add_build_tito(copr, form=None):
return render_add_build_tito(
copr, form, view='coprs_ns.copr_new_build_tito')
+
def render_add_build_tito(copr, form, view, package=None):
if not form:
form = forms.BuildFormTitoFactory(copr.active_chroots)()
@@ -150,6 +207,25 @@ def render_add_build_tito(copr, form, view, package=None):
copr=copr, form=form, view=view, package=package)
+(a)coprs_ns.route("/<username>/<coprname>/new_build_tito/", methods=["POST"])
+@login_required
+@req_with_copr
+def copr_new_build_tito(copr):
+ view = 'coprs_ns.copr_new_build_tito'
+ url_on_success = url_for("coprs_ns.copr_builds",
+ username=copr.owner.username, coprname=copr.name)
+ return process_new_build_tito(copr, view, url_on_success)
+
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build_tito/", methods=["POST"])
+@login_required
+@req_with_copr
+def group_copr_new_build_tito(copr):
+ view = 'coprs_ns.copr_new_build_tito'
+ url_on_success = url_for("coprs_ns.group_copr_builds",
+ group_name=copr.group.name, coprname=copr.name)
+ return process_new_build_tito(copr, view, url_on_success)
+
def process_new_build_tito(copr, add_view, url_on_success):
form = forms.BuildFormTitoFactory(copr.active_chroots)()
@@ -183,25 +259,7 @@ def process_new_build_tito(copr, add_view, url_on_success):
return render_add_build_tito(copr, form, add_view)
-(a)coprs_ns.route("/<username>/<coprname>/new_build_tito/", methods=["POST"])
-@login_required
-@req_with_copr
-def copr_new_build_tito(copr):
- view = 'coprs_ns.copr_new_build_tito'
- url_on_success = url_for("coprs_ns.copr_builds",
- username=copr.owner.username, coprname=copr.name)
- return process_new_build_tito(copr, view, url_on_success)
-
-
-(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build_tito/", methods=["POST"])
-@login_required
-@req_with_copr
-def group_copr_new_build_tito(copr):
- view = 'coprs_ns.copr_new_build_tito'
- url_on_success = url_for("coprs_ns.group_copr_builds",
- group_name=copr.group.name, coprname=copr.name)
- return process_new_build_tito(copr, view, url_on_success)
-
+################################ Mock builds ################################
@coprs_ns.route("/<username>/<coprname>/add_build_mock/")
@login_required
@@ -278,32 +336,29 @@ def process_new_build_mock(copr, add_view, url_on_success):
return render_add_build_mock(copr, form, add_view)
-def process_new_build_upload(copr, add_view, url_on_success):
- form = forms.BuildFormUploadFactory(copr.active_chroots)()
- if form.validate_on_submit():
- build_options = {
- "enable_net": form.enable_net.data,
- "timeout": form.timeout.data,
- }
+################################ Upload builds ################################
- try:
- BuildsLogic.create_new_from_upload(
- flask.g.user, copr,
- f_uploader=lambda path: form.pkgs.data.save(path),
- orig_filename=form.pkgs.data.filename,
- chroot_names=form.selected_chroots,
- **build_options
- )
- db.session.commit()
- except (ActionInProgressException, InsufficientRightsException) as e:
- db.session.rollback()
- flask.flash(str(e), "error")
- else:
- flask.flash("New build has been created.")
+(a)coprs_ns.route("/<username>/<coprname>/add_build_upload/")
+@login_required
+@req_with_copr
+def copr_add_build_upload(copr, form=None):
+ return render_add_build_upload(
+ copr, form, view='coprs_ns.copr_new_build_upload')
- return flask.redirect(url_on_success)
- else:
- return render_add_build_upload(copr, form, add_view)
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/")
+@login_required
+@req_with_copr
+def group_copr_add_build_upload(copr, form=None):
+ return render_add_build_upload(
+ copr, form, view='coprs_ns.copr_new_build_upload')
+
+
+def render_add_build_upload(copr, form, view):
+ if not form:
+ form = forms.BuildFormUploadFactory(copr.active_chroots)()
+ return flask.render_template("coprs/detail/add_build/upload.html",
+ copr=copr, form=form, view=view)
@coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])
@@ -326,70 +381,58 @@ def group_copr_new_build_upload(copr):
return process_new_build_upload(copr, view, url_on_success)
-def process_new_build_url(copr, add_view, url_on_success):
- form = forms.BuildFormUrlFactory(copr.active_chroots)()
-
+def process_new_build_upload(copr, add_view, url_on_success):
+ form = forms.BuildFormUploadFactory(copr.active_chroots)()
if form.validate_on_submit():
- pkgs = form.pkgs.data.split("\n")
+ build_options = {
+ "enable_net": form.enable_net.data,
+ "timeout": form.timeout.data,
+ }
- if not pkgs:
- flask.flash("No builds submitted")
+ try:
+ BuildsLogic.create_new_from_upload(
+ flask.g.user, copr,
+ f_uploader=lambda path: form.pkgs.data.save(path),
+ orig_filename=form.pkgs.data.filename,
+ chroot_names=form.selected_chroots,
+ **build_options
+ )
+ db.session.commit()
+ except (ActionInProgressException, InsufficientRightsException) as e:
+ db.session.rollback()
+ flask.flash(str(e), "error")
else:
- # # check which chroots we need
- # chroots = []
- # for chroot in copr.active_chroots:
- # if chroot.name in form.selected_chroots:
- # chroots.append(chroot)
-
- # build each package as a separate build
- try:
- for pkg in pkgs:
- build_options = {
- "enable_net": form.enable_net.data,
- "timeout": form.timeout.data,
- }
- BuildsLogic.create_new_from_url(
- flask.g.user, copr, pkg,
- chroot_names=form.selected_chroots,
- **build_options
- )
-
- except (ActionInProgressException, InsufficientRightsException) as e:
- flask.flash(str(e), "error")
- db.session.rollback()
- else:
- for pkg in pkgs:
- flask.flash("New build has been created: {}".format(pkg))
-
- db.session.commit()
+ flask.flash("New build has been created.")
return flask.redirect(url_on_success)
else:
- return render_add_build(copr, form, add_view)
+ return render_add_build_upload(copr, form, add_view)
-(a)coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
+################################ Builds rebuilds ################################
+
+(a)coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
@login_required
@req_with_copr
-def copr_new_build(copr):
- return process_new_build_url(
- copr,
- "coprs_ns.copr_new_build",
- url_on_success=url_for("coprs_ns.copr_builds",
- username=copr.owner.username, coprname=copr.name)
- )
+def copr_new_build_rebuild(copr, build_id):
+ view='coprs_ns.copr_new_build'
+ url_on_success = url_for(
+ "coprs_ns.copr_builds",
+ username=copr.owner.username, coprname=copr.name)
+ return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)
-(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])
+
+(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
@login_required
@req_with_copr
-def group_copr_new_build(copr):
- return process_new_build_url(
- copr,
- "coprs_ns.copr_new_build",
- url_on_success=url_for("coprs_ns.group_copr_builds",
- group_name=copr.group.name, coprname=copr.name)
- )
+def group_copr_new_build_rebuild(copr, build_id):
+ view='coprs_ns.copr_new_build'
+ url_on_success = url_for(
+ "coprs_ns.group_copr_builds",
+ group_name=copr.group.name, coprname=copr.name)
+
+ return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)
def process_rebuild(copr, build_id, view, url_on_success):
@@ -422,31 +465,7 @@ def process_rebuild(copr, build_id, view, url_on_success):
return render_add_build(copr, form, view)
-(a)coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
-@login_required
-@req_with_copr
-def copr_new_build_rebuild(copr, build_id):
-
- view='coprs_ns.copr_new_build'
- url_on_success = url_for(
- "coprs_ns.copr_builds",
- username=copr.owner.username, coprname=copr.name)
-
- return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)
-
-
-(a)coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
-@login_required
-@req_with_copr
-def group_copr_new_build_rebuild(copr, build_id):
-
- view='coprs_ns.copr_new_build'
- url_on_success = url_for(
- "coprs_ns.group_copr_builds",
- group_name=copr.group.name, coprname=copr.name)
-
- return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)
-
+################################ Repeat ################################
@coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/",
methods=["GET", "POST"])
@@ -495,6 +514,8 @@ def process_copr_repeat_build(build_id, copr):
copr=copr, build=build, form=form)
+################################ Cancel ################################
+
def process_cancel_build(build):
try:
builds_logic.BuildsLogic.cancel_build(flask.g.user, build)
@@ -523,6 +544,8 @@ def group_copr_cancel_build(group_name, coprname, build_id):
return process_cancel_build(build)
+################################ Delete ################################
+
@coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/",
methods=["POST"])
@login_required
8 years, 1 month
[copr] master: check if dist-git returns hash (a443cff)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit a443cffbacc47e85dccce8203b39188b40b6a498
Author: Miroslav Such�� <msuchy(a)redhat.com>
Date: Mon Feb 15 12:09:43 2016 +0100
check if dist-git returns hash
because if there is some bug (like now) it can return "None", which then fail, when we try to
git checkout None
>---------------------------------------------------------------
.../coprs/views/backend_ns/backend_general.py | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
index f7338bd..1e1cb23 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -73,7 +73,8 @@ def dist_git_upload_completed():
build = build_chroots[0].build
# Is it OK?
- if "git_hash" in flask.request.json and "repo_name" in flask.request.json:
+ if "git_hash" in flask.request.json and "repo_name" in flask.request.json and \
+ flask.request.json["git_hash"] != "None" and flask.request.json["git_hash"] is None:
git_hash = flask.request.json["git_hash"]
pkg_name = flask.request.json["pkg_name"]
pkg_version = flask.request.json["pkg_version"]
8 years, 1 month