aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/web/compare
diff options
context:
space:
mode:
Diffstat (limited to 'guix-data-service/web/compare')
-rw-r--r--guix-data-service/web/compare/controller.scm52
-rw-r--r--guix-data-service/web/compare/html.scm100
2 files changed, 152 insertions, 0 deletions
diff --git a/guix-data-service/web/compare/controller.scm b/guix-data-service/web/compare/controller.scm
index 381d25b..902b18c 100644
--- a/guix-data-service/web/compare/controller.scm
+++ b/guix-data-service/web/compare/controller.scm
@@ -53,6 +53,13 @@
(make-invalid-query-parameter
s "unknown commit"))))
+(define (parse-derivation conn)
+ (lambda (file-name)
+ (if (select-derivation-by-file-name conn file-name)
+ file-name
+ (make-invalid-query-parameter
+ file-name "unknown derivation"))))
+
(define (compare-controller request
method-and-path-components
mime-types
@@ -79,6 +86,15 @@
(render-compare-by-datetime mime-types
conn
parsed-query-parameters)))
+ (('GET "compare" "derivation")
+ (let* ((parsed-query-parameters
+ (parse-query-parameters
+ request
+ `((base_derivation ,(parse-derivation conn) #:required)
+ (target_derivation ,(parse-derivation conn) #:required)))))
+ (render-compare/derivation mime-types
+ conn
+ parsed-query-parameters)))
(('GET "compare" "derivations")
(let* ((parsed-query-parameters
(parse-query-parameters
@@ -287,6 +303,42 @@
lint-warnings-data)
#:extra-headers http-headers-for-unchanging-content)))))))))
+(define (render-compare/derivation mime-types
+ conn
+ query-parameters)
+ (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
+ (render-html
+ #:sxml (compare/derivation
+ query-parameters
+ '()))))
+
+ (let ((base-derivation (assq-ref query-parameters 'base_derivation))
+ (target-derivation (assq-ref query-parameters 'target_derivation)))
+ (let ((data
+ (derivation-differences-data conn
+ base-derivation
+ target-derivation)))
+ (case (most-appropriate-mime-type
+ '(application/json text/html)
+ mime-types)
+ ((application/json)
+ (render-json
+ data
+ #:extra-headers http-headers-for-unchanging-content))
+ (else
+ (render-html
+ #:sxml (compare/derivation
+ query-parameters
+ data)
+ #:extra-headers http-headers-for-unchanging-content)))))))
+
(define (render-compare/derivations mime-types
conn
query-parameters)
diff --git a/guix-data-service/web/compare/html.scm b/guix-data-service/web/compare/html.scm
index 86be5a9..90f4968 100644
--- a/guix-data-service/web/compare/html.scm
+++ b/guix-data-service/web/compare/html.scm
@@ -22,6 +22,7 @@
#:use-module (guix-data-service web query-parameters)
#:use-module (guix-data-service web view html)
#:export (compare
+ compare/derivation
compare/derivations
compare-by-datetime/derivations
compare/packages
@@ -232,6 +233,105 @@
warnings))))))
lint-warnings-data))))))))
+(define (compare/derivation query-parameters data)
+ (layout
+ #:body
+ `(,(header)
+ (div
+ (@ (class "container"))
+ (div
+ (@ (class "row"))
+ (h1 ,@(let ((base-commit (assq-ref query-parameters 'base_commit))
+ (target-commit (assq-ref query-parameters 'target_commit)))
+ (if (every string? (list base-commit target-commit))
+ `("Comparing "
+ (samp ,(string-take base-commit 8) "…")
+ " and "
+ (samp ,(string-take target-commit 8) "…"))
+ '("Comparing derivations")))))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-md-12"))
+ (div
+ (@ (class "well"))
+ (form
+ (@ (method "get")
+ (action "")
+ (class "form-horizontal"))
+ ,(form-horizontal-control
+ "Base derivation" query-parameters
+ #:required? #t
+ #:help-text "The derivation to use as the basis for the comparison."
+ #:font-family "monospace")
+ ,(form-horizontal-control
+ "Target derivation" query-parameters
+ #:required? #t
+ #:help-text "The derivation to compare against the base commit."
+ #:font-family "monospace")
+ (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")))
+ (a (@ (class "btn btn-default btn-lg pull-right")
+ (href ,(let ((query-parameter-string
+ (query-parameters->string query-parameters)))
+ (string-append
+ "/compare/derivation.json"
+ (if (string-null? query-parameter-string)
+ ""
+ (string-append "?" query-parameter-string))))))
+ "View JSON")))))
+ (div
+ (@ (class "row"))
+ (div
+ (@ (class "col-sm-12"))
+ (h2 "Outputs")
+ ,@(let ((outputs (assq-ref data 'outputs)))
+ (peek outputs))
+ (h2 "Inputs")
+ ,@(let ((inputs (assq-ref data 'inputs)))
+ `((table
+ (@ (class "table"))
+ (thead
+ (tr
+ (th "")
+ (th "Derivation")
+ (th "Outputs")))
+ (tbody
+ ,@(let ((base-inputs (assq-ref inputs 'base))
+ (target-inputs (assq-ref inputs 'target))
+ (common-inputs (assq-ref inputs 'common)))
+ (append-map
+ (lambda (label items)
+ (map
+ (match-lambda
+ ((derivation outputs)
+ `(tr
+ (td ,label)
+ (td ,derivation)
+ (td ,outputs))))
+ items))
+ (list "Base" "Target")
+ (list (assq-ref inputs 'base)
+ (assq-ref inputs 'target))))))))
+ (h2 "Sources")
+ ,@(let ((sources (assq-ref data 'sources)))
+ sources)
+ (h2 "System")
+ ,@(let ((system (assq-ref data 'system)))
+ system)
+ (h2 "Builder")
+ ,@(let ((builder (assq-ref data 'builder)))
+ builder)
+ (h2 "Arguments")
+ ,@(let ((arguments (assq-ref data 'arguments)))
+ arguments)
+ (h2 "Environment variables")
+ ,(let ((environment-variables (assq-ref data 'environment-variables)))
+ environment-variables)))))))
+
(define (compare/derivations query-parameters
valid-systems
valid-build-statuses