[copr] master: use correct name of variable (50b54c2)
by Miroslav Suchý
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 50b54c2a62d6586c0945bb7174a6625c6cac36b4
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Tue Jul 22 16:12:41 2014 +0200
use correct name of variable
>---------------------------------------------------------------
cli/copr_cli/subcommands.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/cli/copr_cli/subcommands.py b/cli/copr_cli/subcommands.py
index 6b03008..ab72f59 100644
--- a/cli/copr_cli/subcommands.py
+++ b/cli/copr_cli/subcommands.py
@@ -246,7 +246,7 @@ def build(copr, pkgs, memory, timeout, wait=True, result=None, chroots=None):
copr)
data = {"pkgs": " ".join(pkgs),
- "memory": memory,
+ "memory_reqs": memory,
"timeout": timeout
}
9 years, 9 months
[copr] master: [frontend] status page fix (778276d)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 778276dda9c2d398d50adee353aadd2da8ffbc8a
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Tue Jul 22 16:56:17 2014 +0200
[frontend] status page fix
>---------------------------------------------------------------
.../coprs/templates/status/running.html | 4 ++--
.../coprs/templates/status/waiting.html | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/templates/status/running.html b/frontend/coprs_frontend/coprs/templates/status/running.html
index 05fbed3..ebb4965 100644
--- a/frontend/coprs_frontend/coprs/templates/status/running.html
+++ b/frontend/coprs_frontend/coprs/templates/status/running.html
@@ -22,8 +22,8 @@
{% for task in tasks %}
<tr>
<td>{{ task.build.started_on | time_ago }}</td>
- <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.user.name, coprname = task.build.copr.name) }}">{{task.build.user.name}}/{{task.build.copr.name}}</a></td>
- <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.user.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.copr.owner.name, coprname = task.build.copr.name) }}">{{task.build.copr.owner.name}}/{{task.build.copr.name}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.copr.owner.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
<td>{{ task.build.pkgs | pkg_name }} </td>
<td>{{ task.mock_chroot.name }}</td>
</tr>
diff --git a/frontend/coprs_frontend/coprs/templates/status/waiting.html b/frontend/coprs_frontend/coprs/templates/status/waiting.html
index 2052686..f818022 100644
--- a/frontend/coprs_frontend/coprs/templates/status/waiting.html
+++ b/frontend/coprs_frontend/coprs/templates/status/waiting.html
@@ -22,8 +22,8 @@
{% for task in tasks %}
<tr>
<td>{{ task.build.submitted_on | time_ago }}</td>
- <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.user.name, coprname = task.build.copr.name) }}">{{task.build.user.name}}/{{task.build.copr.name}}</a></td>
- <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.user.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.copr.owner.name, coprname = task.build.copr.name) }}">{{task.build.copr.owner.name}}/{{task.build.copr.name}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.copr.owner.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
<td>{{ task.build.pkgs | pkg_name }} </td>
<td>{{ task.mock_chroot.name }}</td>
</tr>
9 years, 9 months
[copr] master: [frontend] How to enable a repo on a Overview page (d7183ea)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit d7183eac426c7e8049c6aa80282006be3e537906
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Tue Jul 22 16:45:19 2014 +0200
[frontend] How to enable a repo on a Overview page
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/static/copr.css | 12 ++++++++++++
.../coprs/templates/coprs/detail/overview.html | 2 ++
2 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/static/copr.css b/frontend/coprs_frontend/coprs/static/copr.css
index 552c4b9..c697ec4 100644
--- a/frontend/coprs_frontend/coprs/static/copr.css
+++ b/frontend/coprs_frontend/coprs/static/copr.css
@@ -497,4 +497,16 @@ textarea {
background: #1F4B89 none;
border: none;
color: white;
+}
+
+.dnf-enable-field {
+ background-color: #ededed;
+ padding-top: 5px;
+ padding-left: 5px;
+ padding-bottom: 5px;
+ margin-bottom: 10px;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
index 7dab91c..fb71b63 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
@@ -16,6 +16,8 @@
Contact the owner directly for bugs or issues (IE: not bugzilla).
</p>
</div>
+ <div class="dnf-enable-field"> # <input onClick="this.select();"type="text" value="dnf copr enable {{copr.owner.name}}/{{ copr.name}}" readonly="readonly">
+ More info about <a target="_blank" href="https://fedorahosted.org/copr/wiki/HowToEnableRepo">how to enable a repo on the wiki page.</a></div>
<table class="releases">
<tr>
<th class="leftmost">Release</th>
9 years, 9 months
[copr] master: [frontend] build listing fix (3be56d6)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 3be56d64ae62fdb853b0e0e677937c91b950b29a
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Tue Jul 22 14:47:58 2014 +0200
[frontend] build listing fix
>---------------------------------------------------------------
.../coprs_frontend/coprs/logic/builds_logic.py | 2 +-
.../coprs/views/coprs_ns/coprs_builds.py | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index 91abfc6..9fb04e1 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -29,7 +29,7 @@ class BuildsLogic(object):
username = kwargs.get("username", None)
coprname = kwargs.get("coprname", None)
- query = models.Build.query.order_by(models.Build.submitted_on.desc())
+ query = models.Build.query.order_by(models.Build.id.desc())
# if we get copr, query by its id
if copr:
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 0cdde22..04813bd 100644
--- a/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
+++ b/frontend/coprs_frontend/coprs/views/coprs_ns/coprs_builds.py
@@ -62,7 +62,7 @@ def copr_builds(username, coprname, page=1):
flask.g.user, copr=copr)
paginator = helpers.Paginator(
- builds_query, copr.build_count, page, per_page_override=30)
+ builds_query, copr.build_count, page, per_page_override=10)
return flask.render_template("coprs/detail/builds.html",
copr=copr,
@@ -93,7 +93,7 @@ def copr_new_build(username, coprname):
copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
if not copr:
return page_not_found(
- "Copr with name {0} does not exist.".format(coprname))
+ "Project {0}/{1} does not exist.".format(username, coprname))
form = forms.BuildFormFactory.create_form_cls(copr.active_chroots)()
9 years, 9 months
[copr] master: [frontend] status page extension - running tasks (5f7593a)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 5f7593a3f103fb1dcf00246ecd7ab137d8d7dcda
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Tue Jul 22 12:22:03 2014 +0200
[frontend] status page extension - running tasks
>---------------------------------------------------------------
.../coprs_frontend/coprs/logic/builds_logic.py | 6 +++
.../coprs_frontend/coprs/templates/coprs/show.html | 2 +-
.../coprs_frontend/coprs/templates/status.html | 48 ++++++--------------
.../coprs/templates/status/running.html | 33 +++++++++++++
.../coprs/templates/status/waiting.html | 33 +++++++++++++
.../coprs/views/status_ns/status_general.py | 34 ++++++--------
6 files changed, 102 insertions(+), 54 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/logic/builds_logic.py b/frontend/coprs_frontend/coprs/logic/builds_logic.py
index 60e1826..91abfc6 100644
--- a/frontend/coprs_frontend/coprs/logic/builds_logic.py
+++ b/frontend/coprs_frontend/coprs/logic/builds_logic.py
@@ -18,6 +18,12 @@ class BuildsLogic(object):
return query
@classmethod
+ def get_build_tasks(cls, status):
+ query = models.BuildChroot.query.filter(models.BuildChroot.status == status)
+ query.order_by(models.BuildChroot.build_id.desc())
+ return query
+
+ @classmethod
def get_multiple(cls, user, **kwargs):
copr = kwargs.get("copr", None)
username = kwargs.get("username", None)
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/show.html b/frontend/coprs_frontend/coprs/templates/coprs/show.html
index 8bfe36a..2d329ec 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/show.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/show.html
@@ -15,7 +15,7 @@
<p class="other-text">projects</p>
<hr>
<p class="coprs-count">
- <a href="{{url_for("status_ns.status_home")}}">Copr status</a>
+ <a href="{{url_for("status_ns.waiting")}}">Copr status</a>
</p>
</div>
{% endif %}
diff --git a/frontend/coprs_frontend/coprs/templates/status.html b/frontend/coprs_frontend/coprs/templates/status.html
index 2f5f107..34eee5f 100644
--- a/frontend/coprs_frontend/coprs/templates/status.html
+++ b/frontend/coprs_frontend/coprs/templates/status.html
@@ -1,37 +1,17 @@
{% extends "layout.html" %}
-{% block title %} Copr status {% endblock %}
-{% block header %} Copr status {% endblock %}
+{% block title %} Task queue - Copr {% endblock %}
+{% block header %} Task queue - Copr {% endblock %}
{% block body %}
-<h1>{%if number == 0:%}
- No tasks
- {%elif number == 1:%}
- {{number}} task
- {%else%}
- {{number}} tasks
- {%endif%}
- in queue
-</h1>
-
- </h2>
-<table class="status-table">
- <tr>
- <th>Waiting</th>
- <th>Project</th>
- <th>Packages</th>
- <th>Chroot</th>
- </tr>
- {% for build in builds %}
- <tr>
- <td>{{ build.time | time_ago }}</td>
- <td><a href="{{ url_for('coprs_ns.copr_detail', username = build.owner, coprname = build.copr) }}">{{build.owner}}/{{build.copr}}</a></td>
- <td>{%for pkg in build.pkgs[0:2]:%}{{pkg}}<br>{%endfor%}
- {%if build.pkgs|length > 2:%}
- ...{{build.pkgs|length}} more
- {%endif%}
- </td>
- <td>{{ build.chroot }}</td>
- </tr>
- {% endfor %}
-</table>
-
+<h1> Task queue </h1>
+<div class="horizontal-menu">
+ <ul>
+ <li class="{% block waiting_selected %}unselected{% endblock %}">
+ <a href="{{ url_for('status_ns.waiting') }}">Waiting</a>
+ </li>
+ <li class="{% block running_selected %}unselected{% endblock %}">
+ <a href="{{ url_for('status_ns.running') }}">Running</a>
+ </li>
+ </ul>
+</div>
+{% block status_body %}{% endblock %}
{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/status/running.html b/frontend/coprs_frontend/coprs/templates/status/running.html
new file mode 100644
index 0000000..05fbed3
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/status/running.html
@@ -0,0 +1,33 @@
+{% extends "status.html" %}
+{% block running_selected %}selected{% endblock %}
+{% block status_body %}
+<h2>{%if number == 0:%}
+ No tasks
+ {%elif number == 1:%}
+ {{number}} task
+ {%else%}
+ {{number}} tasks
+ {%endif%}
+ are running
+</h2>
+
+<table class="status-table">
+ <tr>
+ <th>Running</th>
+ <th>Project</th>
+ <th>Build</th>
+ <th>Packages</th>
+ <th>Chroot</th>
+ </tr>
+ {% for task in tasks %}
+ <tr>
+ <td>{{ task.build.started_on | time_ago }}</td>
+ <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.user.name, coprname = task.build.copr.name) }}">{{task.build.user.name}}/{{task.build.copr.name}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.user.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
+ <td>{{ task.build.pkgs | pkg_name }} </td>
+ <td>{{ task.mock_chroot.name }}</td>
+ </tr>
+ {% endfor %}
+</table>
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/status/waiting.html b/frontend/coprs_frontend/coprs/templates/status/waiting.html
new file mode 100644
index 0000000..2052686
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/status/waiting.html
@@ -0,0 +1,33 @@
+{% extends "status.html" %}
+{% block waiting_selected %}selected{% endblock %}
+{% block status_body %}
+<h2>{%if number == 0:%}
+ No tasks
+ {%elif number == 1:%}
+ {{number}} task
+ {%else%}
+ {{number}} tasks
+ {%endif%}
+ are waiting
+</h2>
+
+<table class="status-table">
+ <tr>
+ <th>Waiting</th>
+ <th>Project</th>
+ <th>Build</th>
+ <th>Packages</th>
+ <th>Chroot</th>
+ </tr>
+ {% for task in tasks %}
+ <tr>
+ <td>{{ task.build.submitted_on | time_ago }}</td>
+ <td><a href="{{ url_for('coprs_ns.copr_detail', username = task.build.user.name, coprname = task.build.copr.name) }}">{{task.build.user.name}}/{{task.build.copr.name}}</a></td>
+ <td><a href="{{ url_for('coprs_ns.copr_build', username = task.build.user.name, coprname = task.build.copr.name, build_id = task.build_id) }}">{{task.build_id}}</a></td>
+ <td>{{ task.build.pkgs | pkg_name }} </td>
+ <td>{{ task.mock_chroot.name }}</td>
+ </tr>
+ {% endfor %}
+</table>
+
+{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/views/status_ns/status_general.py b/frontend/coprs_frontend/coprs/views/status_ns/status_general.py
index d83585a..2608420 100644
--- a/frontend/coprs_frontend/coprs/views/status_ns/status_general.py
+++ b/frontend/coprs_frontend/coprs/views/status_ns/status_general.py
@@ -3,25 +3,21 @@ import flask, os
from urlparse import urlparse
from coprs.views.status_ns import status_ns
from coprs.logic import builds_logic
+from coprs import helpers
@status_ns.route("/")
-def status_home():
- builds_number = 0
- builds_list = []
-
+(a)status_ns.route("/waiting/")
+def waiting():
+ tasks = []
for build in builds_logic.BuildsLogic.get_waiting():
- for chroot in build.chroots:
- pkgs = []
- for url in build.pkgs.split(' '):
- pkgs.append(os.path.basename(urlparse(url)[2]))
- build_dict = {
- 'chroot' : chroot.name,
- 'time' : build.submitted_on,
- 'owner' : build.copr.owner.name,
- 'pkgs' : pkgs,
- 'copr' : build.copr.name}
- builds_list.append(build_dict)
- builds_number = len(builds_list)
- return flask.render_template("status.html",
- builds=builds_list,
- number=builds_number)
+ tasks += build.build_chroots
+ return flask.render_template("status/waiting.html",
+ number=len(list(tasks)),
+ tasks=tasks)
+
+(a)status_ns.route("/running/")
+def running():
+ tasks = builds_logic.BuildsLogic.get_build_tasks(helpers.StatusEnum("running"))
+ return flask.render_template("status/running.html",
+ number=len(list(tasks)),
+ tasks=tasks)
9 years, 9 months
[copr] master: [frontend] modified chroots in overview (97519f6)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 97519f6fc948c1b277a1d752348309f038306237
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Mon Jul 21 14:50:06 2014 +0200
[frontend] modified chroots in overview
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/models.py | 11 +++++++++
frontend/coprs_frontend/coprs/static/copr.css | 15 +++++++++++++
.../coprs/templates/coprs/detail/overview.html | 23 +++++++++++++++++++-
.../coprs_frontend/coprs/templates/layout.html | 4 ++-
4 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index d9538a3..e30b819 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -204,6 +204,17 @@ class Copr(db.Model, helpers.Serializer):
result = copr_chroot.buildroot_pkgs
return result
+ @property
+ def modified_chroots(self):
+ """
+ Return list of chroots which has been modified
+ """
+ modified_chroots=[]
+ for chroot in self.active_chroots:
+ if self.buildroot_pkgs(chroot):
+ modified_chroots.append(chroot)
+ return modified_chroots
+
class CoprPermission(db.Model, helpers.Serializer):
diff --git a/frontend/coprs_frontend/coprs/static/copr.css b/frontend/coprs_frontend/coprs/static/copr.css
index e140730..552c4b9 100644
--- a/frontend/coprs_frontend/coprs/static/copr.css
+++ b/frontend/coprs_frontend/coprs/static/copr.css
@@ -483,3 +483,18 @@ textarea {
.centered {
text-align: center;
}
+
+.hidden {
+ display: none;
+}
+
+.chroot-dialog {
+ font-size: 1em;
+ font-family: Cantarell, "Droid Sans", Verdana, sans-serif;
+}
+
+.chroot-dialog div.ui-dialog-titlebar {
+ background: #1F4B89 none;
+ border: none;
+ color: white;
+
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
index 5dd2c41..7dab91c 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/overview.html
@@ -42,7 +42,12 @@
{% else %}
<td></td>
{% endif %}
- <td>{{ mock_chroot.arch }}</td>
+ <td>
+ {{ mock_chroot.arch }}
+ {% if copr.buildroot_pkgs(mock_chroot): %}
+ <a id="modified-chroot-{{mock_chroot.name}}">[modified]</a>
+ {% endif %}
+ </td>
{% if mock_chroot.os_release != copr.active_chroots[loop.index0 - 1].os_release or
mock_chroot.os_version != copr.active_chroots[loop.index0 - 1].os_version or
loop.index0 == 0 %}
@@ -72,6 +77,22 @@
</ul>
{% endif %}
+{% for chroot in copr.modified_chroots %}
+<div id="dialog-{{chroot.name}}" class="hidden" title="{{chroot.name}} minimal buildroot">
+ <ul>
+ {% for pkg in copr.buildroot_pkgs(chroot).split(" "): %}
+ <li>{{ pkg }}</li>
+ {% endfor %}
+ </ul>
+</div>
+<script>
+ $("#modified-chroot-{{chroot.name}}").click(function(){
+ $("#dialog-{{chroot.name}}").dialog({dialogClass:'chroot-dialog'});
+ });
+</script>
+{% endfor %}
+
+
<hr>
{{ copr_legal_flag_form(form, copr) }}
{% endblock %}
diff --git a/frontend/coprs_frontend/coprs/templates/layout.html b/frontend/coprs_frontend/coprs/templates/layout.html
index 5a607bc..66823e4 100644
--- a/frontend/coprs_frontend/coprs/templates/layout.html
+++ b/frontend/coprs_frontend/coprs/templates/layout.html
@@ -2,10 +2,12 @@
<html>
<head>
<title>{% block title %}Coprs Build System{% endblock %}</title>
- <link rel=stylesheet type=text/css href="{{ url_for('static', filename='copr.css') }}">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
+ <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/jquery-ui.min.js"></script>
+ <link rel="stylesheet" href="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.0/themes/smoothness/jquery-ui.css" />
<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 rel=stylesheet type=text/css href="{{ url_for('static', filename='copr.css') }}">
<script src="{{ url_for('static', filename='copr.js') }}"></script>
</head>
<body>
9 years, 9 months
[copr] master: FrontendCallback prettified (26e3ba8)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 26e3ba807e6bb807dd0f06c4a6b821ba8bb91fb3
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Mon Jul 21 12:46:20 2014 +0200
FrontendCallback prettified
>---------------------------------------------------------------
backend/backend/actions.py | 2 +-
backend/backend/callback.py | 93 ++++++++++++--------
backend/backend/dispatcher.py | 58 ++++++-------
.../coprs/views/backend_ns/backend_general.py | 6 +-
4 files changed, 86 insertions(+), 73 deletions(-)
diff --git a/backend/backend/actions.py b/backend/backend/actions.py
index 0600723..19e0270 100644
--- a/backend/backend/actions.py
+++ b/backend/backend/actions.py
@@ -118,4 +118,4 @@ class Action(object):
self.event("Action legal-flag: ignoring")
if "result" in result:
- self.frontend_callback.post_to_frontend({"actions": [result]})
+ self.frontend_callback.update({"actions": [result]})
diff --git a/backend/backend/callback.py b/backend/backend/callback.py
index d2312fe..937cd3e 100644
--- a/backend/backend/callback.py
+++ b/backend/backend/callback.py
@@ -1,62 +1,81 @@
import json
import requests
+from functools import wraps
+import time
class FrontendCallback(object):
+ """
+ Object to send data back to fronted
+ """
- """ Object to send data back to fronted """
-
- def __init__(self, opts):
+ def __init__(self, opts, log=None):
super(FrontendCallback, self).__init__()
self.frontend_url = opts.frontend_url
self.frontend_auth = opts.frontend_auth
+ self.log = log
self.msg = None
- def post_to_frontend(self, data):
- """ Send data to frontend """
-
- headers = {"content-type": "application/json"}
- url = "{0}/update/".format(self.frontend_url)
- auth = ("user", self.frontend_auth)
-
- self.msg = None
- try:
- r = requests.post(url, data=json.dumps(data), auth=auth,
- headers=headers)
- if r.status_code != 200:
- self.msg = "Failed to submit to frontend: {0}: {1}".format(
- r.status_code, r.text)
-
- except requests.RequestException, e:
- self.msg = "Post request failed: {0}".format(e)
-
- if self.msg:
- return False
- else:
- return True
-
- def build_starting(self, data):
+ def _post_to_frontend(self, data, url_path):
+ """
+ Make a request to the frontend
+ """
headers = {"content-type": "application/json"}
- url = "{0}/starting_build/".format(self.frontend_url)
+ url = "{0}/{1}/".format(self.frontend_url, url_path)
auth = ("user", self.frontend_auth)
self.msg = None
- r = None
+ response = None
try:
- r = requests.post(url, data=json.dumps(data), auth=auth,
+ response = requests.post(url, data=json.dumps(data), auth=auth,
headers=headers)
- if r.status_code != 200 or "canceled" not in r.json():
+ if response.status_code != 200:
self.msg = "Failed to submit to frontend: {0}: {1}".format(
- r.status_code, r.text)
+ response.status_code, response.text)
raise requests.RequestException(self.msg)
-
except requests.RequestException, e:
self.msg = "Post request failed: {0}".format(e)
raise
-
- return r.json()["canceled"]
-
-
+ return response
+
+
+ def _post_to_frontend_repeatedly(self, data, url_path, max_repeats=10):
+ """
+ Make a request max_repeats-time to the frontend
+ """
+ repeats = 0
+ while repeats <= max_repeats:
+ try:
+ response = self._post_to_frontend(data, url_path)
+ break
+ except requests.RequestException:
+ if self.log:
+ self.log(self.msg)
+ if repeats == max_repeats:
+ raise
+ repeats += 1
+ time.sleep(5)
+ return response
+
+
+ def update(self, data):
+ """
+ Send data to be updated in the frontend
+ """
+ self._post_to_frontend_repeatedly(data, "update")
+
+
+ def starting_build(self, build_id, chroot_name):
+ """
+ Announce to the frontend that a build is starting.
+ Return: True if the build can start
+ False if the build can not start (can be cancelled or deleted)
+ """
+ data = {"build_id": build_id, "chroot": chroot_name}
+ response = self._post_to_frontend_repeatedly(data, "starting_build")
+ if "can_start" not in response.json():
+ raise requests.RequestException("Bad respond from the frontend")
+ return response.json()["can_start"]
diff --git a/backend/backend/dispatcher.py b/backend/backend/dispatcher.py
index 310070b..04082d2 100644
--- a/backend/backend/dispatcher.py
+++ b/backend/backend/dispatcher.py
@@ -7,7 +7,6 @@ import Queue
import json
import subprocess
import multiprocessing
-import requests
import ansible
import ansible.utils
@@ -364,23 +363,11 @@ class Worker(multiprocessing.Process):
return jobdata
- # maybe we move this to the callback?
- def post_to_frontend(self, data):
- """send data to frontend"""
- i = 10
- while i > 0:
- result = self.frontend_callback.post_to_frontend(data)
- if not result:
- self.callback.log(self.frontend_callback.msg)
- i -= 1
- time.sleep(5)
- else:
- i = 0
- return result
- # maybe we move this to the callback?
def mark_started(self, job):
-
+ """
+ Send data about started build to the frontend
+ """
build = {"id": job.build_id,
"started_on": job.started_on,
"results": job.results,
@@ -389,13 +376,17 @@ class Worker(multiprocessing.Process):
}
data = {"builds": [build]}
- if not self.post_to_frontend(data):
+ try:
+ self.frontend_callback.update(data)
+ except:
raise errors.CoprWorkerError(
"Could not communicate to front end to submit status info")
- # maybe we move this to the callback?
- def return_results(self, job):
+ def return_results(self, job):
+ """
+ Send the build results to the frontend
+ """
self.callback.log(
"{0} status {1}. Took {2} seconds".format(
job.build_id, job.status, job.ended_on - job.started_on))
@@ -411,28 +402,31 @@ class Worker(multiprocessing.Process):
data = {"builds": [build]}
- if not self.post_to_frontend(data):
+ try:
+ self.frontend_callback.update(data)
+ except:
raise errors.CoprWorkerError(
"Could not communicate to front end to submit results")
os.unlink(job.jobfile)
- # maybe we move this to the callback?
- def build_starting(self, job):
- # FIXME very bad name....
- """ Is the build canceled? If not, set it as Starting and return True
- """
- data = {"build_id": job.build_id,
- "chroot": job.chroot}
- result = None
+ def starting_build(self, job):
+ """
+ Announce to the frontend that a build is starting.
+ Return: True if the build can start
+ False if the build can not start (build is cancelled)
+ """
+ response = None
try:
- result = self.frontend_callback.build_starting(data)
- except requests.RequestException, e:
+ response = self.frontend_callback.starting_build(
+ job.build_id,
+ job.chroot)
+ except:
raise errors.CoprWorkerError(
"Could not communicate to front end to submit results")
- return result
+ return response
def pkg_built_before(self, pkgs, chroot, destdir):
@@ -480,7 +474,7 @@ class Worker(multiprocessing.Process):
# Checking whether the build is not cancelled
- if self.build_starting(job):
+ if not self.starting_build(job):
continue
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 dd7e8c1..3c1b723 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -97,17 +97,17 @@ def starting_build():
Check if the build is not cancelled and set it to running state
"""
- result = {"canceled": True}
+ result = {"can_start": False}
if "build_id" in flask.request.json and "chroot" in flask.request.json:
build = builds_logic.BuildsLogic.get_by_id(flask.request.json["build_id"])
- if build and not build.cancelled:
+ if build and not build.canceled:
builds_logic.BuildsLogic.update_state_from_dict(build, {
"chroot": flask.request.json["chroot"],
"status": 6}) # starting
db.session.commit()
- result["canceled"] = False
+ result["can_start"] = True
return flask.jsonify(result)
9 years, 9 months
[copr] master: Starting state implemented, cancelling fixed (dd04bd1)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit dd04bd18526ecb599da914b6d02c4afead15a29c
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Fri Jul 18 14:12:05 2014 +0200
Starting state implemented, cancelling fixed
>---------------------------------------------------------------
backend/backend/callback.py | 26 ++++++++++++++++++++
backend/backend/dispatcher.py | 21 +++++++++++++++-
.../coprs/views/backend_ns/backend_general.py | 19 ++++++++++++--
3 files changed, 62 insertions(+), 4 deletions(-)
diff --git a/backend/backend/callback.py b/backend/backend/callback.py
index 0502188..d2312fe 100644
--- a/backend/backend/callback.py
+++ b/backend/backend/callback.py
@@ -34,3 +34,29 @@ class FrontendCallback(object):
return False
else:
return True
+
+
+ def build_starting(self, data):
+ headers = {"content-type": "application/json"}
+ url = "{0}/starting_build/".format(self.frontend_url)
+ auth = ("user", self.frontend_auth)
+
+ self.msg = None
+ r = None
+ try:
+ r = requests.post(url, data=json.dumps(data), auth=auth,
+ headers=headers)
+ if r.status_code != 200 or "canceled" not in r.json():
+ self.msg = "Failed to submit to frontend: {0}: {1}".format(
+ r.status_code, r.text)
+ raise requests.RequestException(self.msg)
+
+ except requests.RequestException, e:
+ self.msg = "Post request failed: {0}".format(e)
+ raise
+
+ return r.json()["canceled"]
+
+
+
+
diff --git a/backend/backend/dispatcher.py b/backend/backend/dispatcher.py
index f812379..310070b 100644
--- a/backend/backend/dispatcher.py
+++ b/backend/backend/dispatcher.py
@@ -7,6 +7,7 @@ import Queue
import json
import subprocess
import multiprocessing
+import requests
import ansible
import ansible.utils
@@ -416,6 +417,23 @@ class Worker(multiprocessing.Process):
os.unlink(job.jobfile)
+ # maybe we move this to the callback?
+ def build_starting(self, job):
+ # FIXME very bad name....
+ """ Is the build canceled? If not, set it as Starting and return True
+ """
+ data = {"build_id": job.build_id,
+ "chroot": job.chroot}
+
+ result = None
+ try:
+ result = self.frontend_callback.build_starting(data)
+ except requests.RequestException, e:
+ raise errors.CoprWorkerError(
+ "Could not communicate to front end to submit results")
+
+ return result
+
def pkg_built_before(self, pkgs, chroot, destdir):
"""
@@ -462,7 +480,8 @@ class Worker(multiprocessing.Process):
# Checking whether the build is not cancelled
- # TODO
+ if self.build_starting(job):
+ continue
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 cb5839b..dd7e8c1 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -90,13 +90,26 @@ def update():
return flask.jsonify(result)
-(a)backend_ns.route("/starting_build/<build_id>/", methods=["POST", "PUT"])
+(a)backend_ns.route("/starting_build/", methods=["POST", "PUT"])
@misc.backend_authenticated
-def start_build(build_id):
+def starting_build():
"""
Check if the build is not cancelled and set it to running state
"""
- pass
+
+ result = {"canceled": True}
+
+ if "build_id" in flask.request.json and "chroot" in flask.request.json:
+ build = builds_logic.BuildsLogic.get_by_id(flask.request.json["build_id"])
+
+ if build and not build.cancelled:
+ builds_logic.BuildsLogic.update_state_from_dict(build, {
+ "chroot": flask.request.json["chroot"],
+ "status": 6}) # starting
+ db.session.commit()
+ result["canceled"] = False
+
+ return flask.jsonify(result)
9 years, 9 months
[copr] master: [frontend] new build status: Starting (4b2d105)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit 4b2d10523c7460a9bdeb7fe9e3c92fc1d7559bff
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Fri Jul 18 11:49:13 2014 +0200
[frontend] new build status: Starting
>---------------------------------------------------------------
frontend/coprs_frontend/coprs/helpers.py | 3 ++-
frontend/coprs_frontend/coprs/models.py | 18 ++++++++++++------
frontend/coprs_frontend/coprs/static/copr.css | 4 ++++
.../coprs/views/backend_ns/backend_general.py | 12 ++++++++++++
4 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/frontend/coprs_frontend/coprs/helpers.py b/frontend/coprs_frontend/coprs/helpers.py
index bb26265..b1e62b9 100644
--- a/frontend/coprs_frontend/coprs/helpers.py
+++ b/frontend/coprs_frontend/coprs/helpers.py
@@ -63,7 +63,8 @@ class StatusEnum(object):
"canceled": 2,
"running": 3,
"pending": 4,
- "skipped": 5} # if there was this package built already
+ "skipped": 5, # if there was this package built already
+ "starting": 6} # build picked by worker but no VM initialized
class Paginator(object):
diff --git a/frontend/coprs_frontend/coprs/models.py b/frontend/coprs_frontend/coprs/models.py
index ffb7009..d9538a3 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -267,11 +267,16 @@ class Build(db.Model, helpers.Serializer):
@property
def has_pending_chroot(self):
- return helpers.StatusEnum("pending") in self.chroot_states
+ # FIXME bad name
+ # used when checking if the repo is initialized and results can be set
+ # i think this is the only purpose - check
+ return helpers.StatusEnum("pending") in self.chroot_states or \
+ helpers.StatusEnum("starting") in self.chroot_states
@property
def has_unfinished_chroot(self):
return helpers.StatusEnum("pending") in self.chroot_states or \
+ helpers.StatusEnum("starting") in self.chroot_states or \
helpers.StatusEnum("running") in self.chroot_states
@property
@@ -283,7 +288,7 @@ class Build(db.Model, helpers.Serializer):
if self.canceled:
return helpers.StatusEnum("canceled")
- for state in ["failed", "running", "pending", "succeeded", "skipped"]:
+ for state in ["failed", "running", "starting", "pending", "succeeded", "skipped"]:
if helpers.StatusEnum(state) in self.chroot_states:
return helpers.StatusEnum(state)
@@ -303,7 +308,7 @@ class Build(db.Model, helpers.Serializer):
"""
Find out if this build is cancelable.
- ATM, build is cancelable only if it wasn"t grabbed by backend.
+ Build is cancelabel only when it's pending (not started)
"""
return self.status == helpers.StatusEnum("pending")
@@ -313,11 +318,12 @@ class Build(db.Model, helpers.Serializer):
"""
Find out if this build is repeatable.
- Build is repeatable only if it's not pending
- (because it would just duplicate the same thing in db)
+ Build is repeatable only if it's not pending, starting or running
"""
- return self.status != helpers.StatusEnum("pending")
+ return self.status != helpers.StatusEnum("pending") and \
+ self.status != helpers.StatusEnum("starting") and \
+ self.status != helpers.StatusEnum("running")
@property
def deletable(self):
diff --git a/frontend/coprs_frontend/coprs/static/copr.css b/frontend/coprs_frontend/coprs/static/copr.css
index 87048df..e140730 100644
--- a/frontend/coprs_frontend/coprs/static/copr.css
+++ b/frontend/coprs_frontend/coprs/static/copr.css
@@ -346,6 +346,10 @@ tr.build-row-skipped {
color: #55b;
}
+.build-starting {
+ color: #c84;
+}
+
.build-running {
color: #c84;
}
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 1a9f473..cb5839b 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -88,3 +88,15 @@ def update():
"non_existing_{0}_ids".format(typ): non_existing_ids})
return flask.jsonify(result)
+
+
+(a)backend_ns.route("/starting_build/<build_id>/", methods=["POST", "PUT"])
+(a)misc.backend_authenticated
+def start_build(build_id):
+ """
+ Check if the build is not cancelled and set it to running state
+ """
+ pass
+
+
+
9 years, 9 months
[copr] master: [backend] faster skipping (ccc8f4f)
by asamalik@fedoraproject.org
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : master
>---------------------------------------------------------------
commit ccc8f4ff5c5ee66bd0060349f489e4d4691dc203
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Wed Jul 16 15:40:24 2014 +0200
[backend] faster skipping
>---------------------------------------------------------------
backend/backend/dispatcher.py | 148 +++++++++++++++++++++++++++-------------
backend/backend/mockremote.py | 19 +----
2 files changed, 104 insertions(+), 63 deletions(-)
diff --git a/backend/backend/dispatcher.py b/backend/backend/dispatcher.py
index 94d8b8d..f812379 100644
--- a/backend/backend/dispatcher.py
+++ b/backend/backend/dispatcher.py
@@ -172,6 +172,50 @@ class Worker(multiprocessing.Process):
# XXX - Maybe log traceback as well with traceback.format_exc()
self.callback.log("failed to publish message: {0}".format(e))
+
+ def _announce_start(self, job, ip="none"):
+ """
+ Announce everywhere that a build process started now.
+ """
+ job.started_on = time.time()
+ self.mark_started(job)
+
+ template = "build start: user:{user} copr:{copr}" \
+ " build:{build} ip:{ip} pid:{pid}"
+
+ content = dict(user=job.user_name, copr=job.copr_name,
+ build=job.build_id, ip=ip, pid=self.pid)
+ self.event("build.start", template, content)
+
+ template = "chroot start: chroot:{chroot} user:{user}" \
+ "copr:{copr} build:{build} ip:{ip} pid:{pid}"
+
+ content = dict(chroot=job.chroot, user=job.user_name,
+ copr=job.copr_name, build=job.build_id,
+ ip=ip, pid=self.pid)
+
+ self.event("chroot.start", template, content)
+
+
+ def _announce_end(self, job, ip="none"):
+ """
+ Announce everywhere that a build process ended now.
+ """
+ job.ended_on = time.time()
+
+ self.return_results(job)
+ self.callback.log("worker finished build: {0}".format(ip))
+ template = "build end: user:{user} copr:{copr} build:{build}" \
+ " ip:{ip} pid:{pid} status:{status}"
+
+ content = dict(user=job.user_name, copr=job.copr_name,
+ build=job.build_id, ip=ip, pid=self.pid,
+ status=job.status, chroot=job.chroot)
+ self.event("build.end", template, content)
+ pass
+
+
+
def run_ansible_playbook(self, args, name="running playbook", attempts=3):
"""
call ansible playbook
@@ -372,6 +416,21 @@ class Worker(multiprocessing.Process):
os.unlink(job.jobfile)
+
+ def pkg_built_before(self, pkgs, chroot, destdir):
+ """
+ Check whether the package has already been built in this chroot.
+ """
+ s_pkg = os.path.basename(pkgs[0])
+ pdn = s_pkg.replace(".src.rpm", "")
+ resdir = "{0}/{1}/{2}".format(destdir, chroot, pdn)
+ resdir = os.path.normpath(resdir)
+ if os.path.exists(resdir):
+ if os.path.exists(os.path.join(resdir, "success")):
+ return True
+ return False
+
+
def run(self):
"""
Worker should startup and check if it can function
@@ -388,7 +447,7 @@ class Worker(multiprocessing.Process):
except Queue.Empty:
break
- # parse the job json into our info
+ # Parse the job json into our info
job = self.parse_job(jobfile)
if job is None:
@@ -399,11 +458,44 @@ class Worker(multiprocessing.Process):
time.sleep(self.opts.sleeptime)
continue
+ job.jobfile = jobfile
+
+
+ # Checking whether the build is not cancelled
+ # TODO
+
+
+
+ # Initialize Fedmsg
+ # (this assumes there are certs and a fedmsg config on disk)
+ try:
+ if self.opts.fedmsg_enabled:
+ fedmsg.init(
+ name="relay_inbound",
+ cert_prefix="copr",
+ active=True)
+
+ except Exception, e:
+ self.callback.log(
+ "failed to initialize fedmsg: {0}".format(e))
+
+
+ # Checking whether to build or skip
+ if self.pkg_built_before(job.pkgs, job.chroot, job.destdir):
+ self._announce_start(job)
+ self.callback.log("Skipping: package {0} has been"\
+ "already built before.".format(
+ ' '.join(job.pkgs)))
+ job.status = 5 # skipped
+ self._announce_end(job)
+ continue
+
+
+
# FIXME
# this is our best place to sanity check the job before starting
# up any longer process
- job.jobfile = jobfile
# spin up our build instance
if self.create:
@@ -416,41 +508,13 @@ class Worker(multiprocessing.Process):
except ansible.errors.AnsibleError, e:
self.callback.log(
"failure to setup instance: {0}".format(e))
-
raise
- try:
- # This assumes there are certs and a fedmsg config on disk
- try:
- if self.opts.fedmsg_enabled:
- fedmsg.init(
- name="relay_inbound",
- cert_prefix="copr",
- active=True)
- except Exception, e:
- self.callback.log(
- "failed to initialize fedmsg: {0}".format(e))
+ try:
+ self._announce_start(job, ip)
status = 1 # succeeded
- job.started_on = time.time()
- self.mark_started(job)
-
- template = "build start: user:{user} copr:{copr}" \
- " build:{build} ip:{ip} pid:{pid}"
-
- content = dict(user=job.user_name, copr=job.copr_name,
- build=job.build_id, ip=ip, pid=self.pid)
- self.event("build.start", template, content)
-
- template = "chroot start: chroot:{chroot} user:{user}" \
- "copr:{copr} build:{build} ip:{ip} pid:{pid}"
-
- content = dict(chroot=job.chroot, user=job.user_name,
- copr=job.copr_name, build=job.build_id,
- ip=ip, pid=self.pid)
-
- self.event("chroot.start", template, content)
chroot_destdir = os.path.normpath(
job.destdir + '/' + job.chroot)
@@ -471,7 +535,8 @@ class Worker(multiprocessing.Process):
# FIXME
# need a plugin hook or some mechanism to check random
# info about the pkgs
- # this should use ansible to download the pkg on the remote system
+ # this should use ansible to download the pkg on
+ # the remote system
# and run a series of checks on the package before we
# start the build - most importantly license checks.
@@ -512,10 +577,7 @@ class Worker(multiprocessing.Process):
callback=mockremote.CliLogCallBack(
quiet=True, logfn=chrootlogfile))
- skipped, build_details = mr.build_pkgs(job.pkgs)
-
- if skipped:
- status = 5 # skipped
+ build_details = mr.build_pkgs(job.pkgs)
job.update(build_details)
@@ -537,18 +599,8 @@ class Worker(multiprocessing.Process):
job.timeout, job.destdir,
job.chroot, str(job.repos)))
- job.ended_on = time.time()
-
job.status = status
- self.return_results(job)
- self.callback.log("worker finished build: {0}".format(ip))
- template = "build end: user:{user} copr:{copr} build:{build}" \
- " ip:{ip} pid:{pid} status:{status}"
-
- content = dict(user=job.user_name, copr=job.copr_name,
- build=job.build_id, ip=ip, pid=self.pid,
- status=job.status, chroot=job.chroot)
- self.event("build.end", template, content)
+ self._announce_end(job, ip)
finally:
# clean up the instance
diff --git a/backend/backend/mockremote.py b/backend/backend/mockremote.py
index 7632b9b..ed8ceda 100755
--- a/backend/backend/mockremote.py
+++ b/backend/backend/mockremote.py
@@ -614,7 +614,6 @@ class MockRemote(object):
downloaded_pkgs = {}
build_details = {}
- skipped = False
try_again = True
to_be_built = pkgs
@@ -632,19 +631,9 @@ class MockRemote(object):
p_path = self._get_pkg_destpath(pkg)
- # check the destdir to see if these pkgs need to be built
- if os.path.exists(p_path):
- if os.path.exists(os.path.join(p_path, "success")):
- skipped = True
- self.callback.log(
- "Skipping already built pkg {0}".format(
- os.path.basename(pkg)))
-
- continue
- # if we"re asking to build it and it is marked as fail - nuke
- # the failure and try rebuilding it
- elif os.path.exists(os.path.join(p_path, "fail")):
- os.unlink(os.path.join(p_path, "fail"))
+ # if it's marked as fail, nuke the failure and try to rebuild it
+ if os.path.exists(os.path.join(p_path, "fail")):
+ os.unlink(os.path.join(p_path, "fail"))
# off to the builder object
# building
@@ -736,7 +725,7 @@ class MockRemote(object):
else:
try_again = False
- return skipped, build_details
+ return build_details
def parse_args(args):
9 years, 9 months