dist_templates_builds_DATA = \
src/templates/builds/bug.html \
src/templates/builds/bug-created.html \
+ src/templates/builds/clone.html \
src/templates/builds/delete.html \
src/templates/builds/index.html \
src/templates/builds/show.html
--- /dev/null
+{% extends "../modal.html" %}
+
+{% block title %}{{ build }} - {{ _("Clone") }}{% end block %}
+
+{% block breadcrumbs %}
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li>
+ <a href="/packages">{{ _("Packages") }}</a>
+ </li>
+ <li>
+ <a href="/packages/{{ build.pkg.name }}">{{ build.pkg.name }}</a>
+ </li>
+ <li>
+ <a href="/builds/{{ build.uuid }}">{{ build.pkg.evr }}</a>
+ </li>
+ <li class="is-active">
+ <a href="#" aria-current="page">{{ _("Clone") }}</a>
+ </li>
+ </ul>
+ </nav>
+{% end block %}
+
+{% block modal_title %}
+ <h4 class="title is-4">{{ _("Clone Build") }}</h4>
+ <h6 class="subtitle is-6">{{ build }}</h6>
+{% end block %}
+
+{% block modal %}
+ <form method="POST" action="">
+ {% raw xsrf_form_html() %}
+
+ {# Repositories #}
+ <div class="field">
+ <label class="label">{{ _("Repository") }}</label>
+ <div class="control">
+ <div class="select is-fullwidth">
+ <select name="repo" required>
+ <option value="">{{ _("- Select One -") }}</option>
+
+ {% for repo in sorted(repos) %}
+ <option value="{{ repo.slug }}">{{ repo }}</option>
+ {% end %}
+ </select>
+ </div>
+ </div>
+ </div>
+
+ {# Submit! #}
+ <div class="field">
+ <button type="submit" class="button is-info is-fullwidth">
+ {{ _("Clone Build") }}
+ </button>
+ </div>
+ </form>
+{% end block %}
<span>{{ _("Source Package") }}</span>
</a>
+ {# Clone #}
+ {% if not build.is_test() %}
+ <a class="button is-light" href="/builds/{{ build.uuid }}/clone">
+ {{ _("Clone") }}
+ </a>
+ {% end %}
+
{# Delete #}
{% if build.can_be_deleted(current_user) %}
<a class="button is-danger" href="/builds/{{ build.uuid }}/delete">
(r"/builds", builds.IndexHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds.ShowHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bug", builds.BugHandler),
+ (r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/clone", builds.CloneHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/comment", builds.CommentHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", builds.DeleteHandler),
(r"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/repos/add", builds.ReposAddHandler),
distro=build.distro, bugs=bugs)
+class CloneHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self, uuid):
+ build = self.backend.builds.get_by_uuid(uuid)
+ if not build:
+ raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
+
+ # Fetch repositories
+ try:
+ repos = self.current_user.repos[build.distro]
+ except KeyError:
+ repos = []
+
+ self.render("builds/clone.html", build=build, repos=repos)
+
+ @tornado.web.authenticated
+ async def post(self, uuid):
+ build = self.backend.builds.get_by_uuid(uuid)
+ if not build:
+ raise tornado.web.HTTPError(404, "Could not find build %s" % uuid)
+
+ # Fetch the repository
+ repo = self.current_user.get_repo(build.distro, self.get_argument("repo"))
+
+ # Clone the build
+ with self.db.transaction():
+ clone = await self.backend.builds.create(
+ repo=repo, package=build.pkg, owner=self.current_user,
+ )
+
+ # Launch all jobs (in the background)
+ self.backend.run_task(self.backend.builds.launch, [clone])
+
+ self.redirect("/builds/%s" % clone.uuid)
+
+
class DeleteHandler(base.BaseHandler):
@tornado.web.authenticated
def get(self, uuid):