]> git.ipfire.org Git - pbs.git/commitdiff
builds: Add controls to clone builds
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 May 2023 16:37:05 +0000 (16:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 15 May 2023 16:37:05 +0000 (16:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/templates/builds/clone.html [new file with mode: 0644]
src/templates/builds/show.html
src/web/__init__.py
src/web/builds.py

index 88b13b3f585e0bae44ccf3407b0577cefa6ae7d7..b13acdf815348c4d1c0e936f64ffaaaf9d30863b 100644 (file)
@@ -182,6 +182,7 @@ templates_builders_modulesdir = $(templates_buildersdir)/modules
 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
diff --git a/src/templates/builds/clone.html b/src/templates/builds/clone.html
new file mode 100644 (file)
index 0000000..fe3e639
--- /dev/null
@@ -0,0 +1,56 @@
+{% 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 %}
index 862f97c16b6db8989a7401e3268203446e69b006..380bf5449b6ea8b38789cd40c1c0ad90b9d15478 100644 (file)
                                        <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">
index c87fcf04620a0082ca47b3800da6ee351fe3ba82..aef1d43520171d4dffa9142dc6aa80d47b8195f3 100644 (file)
@@ -135,6 +135,7 @@ class Application(tornado.web.Application):
                        (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),
index 6d0c0e1fc832d5e12e64c76a2b8d3cd4fe3f1b23..d6c4521308fbf8d8ac2a6bfed0227cd6d7900837 100644 (file)
@@ -96,6 +96,42 @@ class ShowHandler(base.BaseHandler):
                        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):