guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

04/04: Support finding fixed output derivations for packages


From: Christopher Baines
Subject: 04/04: Support finding fixed output derivations for packages
Date: Sat, 26 Dec 2020 08:41:47 -0500 (EST)

cbaines pushed a commit to branch master
in repository data-service.

commit f58fe208fd680fa4480f0f363209dc5ee5faa8bb
Author: Christopher Baines <mail@cbaines.net>
AuthorDate: Sat Dec 26 13:40:09 2020 +0000

    Support finding fixed output derivations for packages
    
    This finds all the fixed output derivations in the graph of packages. I'm
    planning to use this to queue builds for these derivations on a regular 
basis,
    to monitor when fixed output derivations break (as the thing they download 
has
    disappeared for example).
---
 guix-data-service/web/revision/controller.scm | 117 +++++++++++++++++++++
 guix-data-service/web/revision/html.scm       | 143 ++++++++++++++++++++++++++
 2 files changed, 260 insertions(+)

diff --git a/guix-data-service/web/revision/controller.scm 
b/guix-data-service/web/revision/controller.scm
index 8dc75a8..f9fd2db 100644
--- a/guix-data-service/web/revision/controller.scm
+++ b/guix-data-service/web/revision/controller.scm
@@ -58,6 +58,7 @@
             render-revision-package-reproduciblity
             render-revision-package-substitute-availability
             render-revision-package-derivations
+            render-revision-fixed-output-package-derivations
             render-revision-package-derivation-outputs
             render-unknown-revision
             render-view-revision))
@@ -219,6 +220,32 @@
                                                 #:path-base path))
          (render-unknown-revision mime-types
                                   commit-hash)))
+    (('GET "revision" commit-hash "fixed-output-package-derivations")
+     (if (parallel-via-thread-pool-channel
+          (with-thread-postgresql-connection
+           (lambda (conn)
+             (guix-commit-exists? conn commit-hash))))
+         (let ((parsed-query-parameters
+                (guard-against-mutually-exclusive-query-parameters
+                 (parse-query-parameters
+                  request
+                  `((system ,parse-system #:default "x86_64-linux")
+                    (target ,parse-target #:default "")
+                    (latest_build_status ,parse-build-status)
+                    (after_name          ,identity)
+                    (limit_results       ,parse-result-limit
+                                         #:no-default-when (all_results)
+                                         #:default 50)
+                    (all_results         ,parse-checkbox-value)))
+                 '((limit_results all_results)))))
+
+           (render-revision-fixed-output-package-derivations
+            mime-types
+            commit-hash
+            parsed-query-parameters
+            #:path-base path))
+         (render-unknown-revision mime-types
+                                  commit-hash)))
     (('GET "revision" commit-hash "package-derivation-outputs")
      (if (parallel-via-thread-pool-channel
           (with-thread-postgresql-connection
@@ -1061,6 +1088,96 @@
                           #:header-text header-text
                           #:header-link header-link))))))))))
 
+(define* (render-revision-fixed-output-package-derivations
+          mime-types
+          commit-hash
+          query-parameters
+          #:key
+          (path-base "/revision/")
+          (header-text
+           `("Revision " (samp ,commit-hash)))
+          (header-link
+           (string-append "/revision/"
+                          commit-hash)))
+  (if (any-invalid-query-parameters? query-parameters)
+      (case (most-appropriate-mime-type
+             '(application/json text/html)
+             mime-types)
+        ((application/json)
+         (render-json
+          `((error . "invalid query"))))
+        (else
+         (letpar& ((systems
+                    (with-thread-postgresql-connection valid-systems))
+                   (targets
+                    (with-thread-postgresql-connection valid-targets)))
+           (render-html
+            #:sxml (view-revision-fixed-output-package-derivations
+                    commit-hash
+                    query-parameters
+                    systems
+                    (valid-targets->options targets)
+                    '()
+                    '()
+                    #f
+                    #:path-base path-base
+                    #:header-text header-text
+                    #:header-link header-link)))))
+      (let ((limit-results
+             (assq-ref query-parameters 'limit_results))
+            (all-results
+             (assq-ref query-parameters 'all_results))
+            (search-query
+             (assq-ref query-parameters 'search_query))
+            (fields
+             (assq-ref query-parameters 'field)))
+        (letpar&
+            ((derivations
+              (with-thread-postgresql-connection
+               (lambda (conn)
+                 (select-fixed-output-package-derivations-in-revision
+                  conn
+                  commit-hash
+                  (assq-ref query-parameters 'system)
+                  (assq-ref query-parameters 'target)
+                  #:latest-build-status (assq-ref query-parameters
+                                                  'latest_build_status)
+                  #:limit-results limit-results
+                  #:after-derivation-file-name
+                  (assq-ref query-parameters 'after_name)))))
+             (build-server-urls
+              (with-thread-postgresql-connection
+               select-build-server-urls-by-id)))
+          (let ((show-next-page?
+                 (if all-results
+                     #f
+                     (and (not (null? derivations))
+                          (>= (length derivations)
+                              limit-results)))))
+            (case (most-appropriate-mime-type
+                   '(application/json text/html)
+                   mime-types)
+              ((application/json)
+               (render-json
+                `((derivations . ,(list->vector derivations)))))
+              (else
+               (letpar& ((systems
+                          (with-thread-postgresql-connection valid-systems))
+                         (targets
+                          (with-thread-postgresql-connection valid-targets)))
+                 (render-html
+                  #:sxml (view-revision-fixed-output-package-derivations
+                          commit-hash
+                          query-parameters
+                          systems
+                          (valid-targets->options targets)
+                          derivations
+                          build-server-urls
+                          show-next-page?
+                          #:path-base path-base
+                          #:header-text header-text
+                          #:header-link header-link))))))))))
+
 (define* (render-revision-package-derivation-outputs
           mime-types
           commit-hash
diff --git a/guix-data-service/web/revision/html.scm 
b/guix-data-service/web/revision/html.scm
index 8ed7eee..2a1008e 100644
--- a/guix-data-service/web/revision/html.scm
+++ b/guix-data-service/web/revision/html.scm
@@ -36,6 +36,7 @@
             view-revision-packages
             view-revision-packages-translation-availability
             view-revision-package-derivations
+            view-revision-fixed-output-package-derivations
             view-revision-package-derivation-outputs
             view-revision-system-tests
             view-revision-channel-instances
@@ -1682,6 +1683,148 @@ figure {
                     "Next page")))
               '())))))))
 
+(define* (view-revision-fixed-output-package-derivations
+          commit-hash
+          query-parameters
+          valid-systems
+          valid-targets
+          derivations
+          build-server-urls
+          show-next-page?
+          #:key (path-base "/revision/")
+          header-text
+          header-link)
+  (define build-status-options
+    '((""          . "")
+      ("Succeeded" . "succeeded")
+      ("Failed"    . "failed")
+      ;;("Unknown"   . "unknown") TODO
+      ))
+
+  (layout
+   #:body
+   `(,(header)
+     (div
+      (@ (class "container"))
+      (div
+       (@ (class "row"))
+       (div
+        (@ (class "col-sm-12"))
+        (h3 (a (@ (style "white-space: nowrap;")
+                  (href ,header-link))
+               ,@header-text))))
+      (div
+       (@ (class "row"))
+       (div
+        (@ (class "col-md-12"))
+        (div
+         (@ (class "well"))
+         (form
+          (@ (method "get")
+             (action "")
+             (style "padding-bottom: 0")
+             (class "form-horizontal"))
+          ,(form-horizontal-control
+            "System" query-parameters
+            #:options valid-systems
+            #:allow-selecting-multiple-options #f
+            #:help-text "Only include derivations for this system."
+            #:font-family "monospace")
+          ,(form-horizontal-control
+            "Target" query-parameters
+            #:options valid-targets
+            #:allow-selecting-multiple-options #f
+            #:help-text "Only include derivations that are build for this 
system."
+            #:font-family "monospace")
+          ,(form-horizontal-control
+            "Latest build status" query-parameters
+            #:allow-selecting-multiple-options #f
+            #:options build-status-options
+            #:help-text "Only show derivations with this overall build 
status.")
+          ,(form-horizontal-control
+            "After name" query-parameters
+            #:help-text
+            "List derivations that are alphabetically after the given name.")
+          ,(form-horizontal-control
+            "Limit results" query-parameters
+            #:help-text "The maximum number of derivations to return.")
+          ,(form-horizontal-control
+            "All results" query-parameters
+            #:type "checkbox"
+            #:help-text "Return all results.")
+          (div (@ (class "form-group form-group-lg"))
+               (div (@ (class "col-sm-offset-2 col-sm-10"))
+                    (button (@ (type "submit")
+                               (class "btn btn-lg btn-primary"))
+                            "Update results")))))))
+      (div
+       (@ (class "row"))
+       (div
+        (@ (class "col-sm-12"))
+        (a (@ (class "btn btn-default btn-lg pull-right")
+              (href ,(let ((query-parameter-string
+                            (query-parameters->string query-parameters)))
+                       (string-append
+                        path-base ".json"
+                        (if (string-null? query-parameter-string)
+                            ""
+                            (string-append "?" query-parameter-string))))))
+           "View JSON")))
+      (div
+       (@ (class "row"))
+       (div
+        (@ (class "col-md-12"))
+        (h1 "Fixed output package derivations")
+        (p "Showing " ,(length derivations) " results")
+        (table
+         (@ (class "table"))
+         (thead
+          (tr
+           (th "File name")
+           (th "Latest build")))
+         (tbody
+          ,@(map
+             (lambda (row)
+               (let ((derivation-file-name (assq-ref row 
'derivation_file_name))
+                     (latest-build         (assq-ref row 'latest_build)))
+                 `(tr
+                   (td (a (@ (href ,derivation-file-name))
+                          ,(display-store-item-short derivation-file-name)))
+                   (td
+                    (dl
+                     (@ (style "margin-bottom: 0;"))
+                     ,@(if (eq? 'null latest-build)
+                           '()
+                           (let ((build-server-id
+                                  (assq-ref latest-build 'build_server_id)))
+                             `((dt
+                                (@ (style "font-weight: unset;"))
+                                (a (@ (href
+                                       ,(assq-ref build-server-urls
+                                                  build-server-id)))
+                                   ,(assq-ref build-server-urls
+                                              build-server-id)))
+                               (dd
+                                (a (@ (href ,(build-url
+                                              build-server-id
+                                              (assq-ref latest-build
+                                                         
'build_server_build_id)
+                                              derivation-file-name)))
+                                   ,(build-status-alist->build-icon
+                                     latest-build)))))))))))
+             derivations)))
+        ,@(if show-next-page?
+              `((div
+                 (@ (class "row"))
+                 (a (@ (href
+                        ,(next-page-link path-base
+                                         query-parameters
+                                         'after_name
+                                         (assq-ref (last derivations)
+                                                   'derivation_file_name))))
+                    "Next page")))
+              '())))))))
+
 (define* (view-revision-package-derivation-outputs commit-hash
                                                    query-parameters
                                                    derivation-outputs



reply via email to

[Prev in Thread] Current Thread [Next in Thread]