Start to visualise derivations

This commit is contained in:
Christopher Baines 2019-03-07 08:43:16 +00:00
parent 891cf42fc6
commit 8f4da3c872
Signed by: cbaines
GPG key ID: 5E28A33B0B84F577
3 changed files with 140 additions and 9 deletions

View file

@ -7,7 +7,10 @@
#:use-module (guix inferior) #:use-module (guix inferior)
#:use-module (guix derivations) #:use-module (guix derivations)
#:use-module (guix-data-service model utils) #:use-module (guix-data-service model utils)
#:export (select-existing-derivations #:export (select-derivation-by-file-name
select-derivation-outputs-by-derivation-id
select-derivation-inputs-by-derivation-id
select-existing-derivations
select-derivations-by-id select-derivations-by-id
select-derivations-and-build-status-by-id select-derivations-and-build-status-by-id
insert-into-derivations insert-into-derivations
@ -122,6 +125,19 @@
derivation-output-ids)) derivation-output-ids))
(define (select-derivation-by-file-name conn file-name)
(define query
(string-append
"SELECT id, file_name, builder, args, env_vars, system "
"FROM derivations "
"WHERE file_name = $1"))
(match (exec-query conn query (list file-name))
(()
#f)
((result)
result)))
(define (select-derivation-output-id conn name path) (define (select-derivation-output-id conn name path)
(match (exec-query (match (exec-query
conn conn
@ -138,6 +154,35 @@
#f "cannot find derivation-output with name ~A and path ~A" #f "cannot find derivation-output with name ~A and path ~A"
name path))))) name path)))))
(define (select-derivation-outputs-by-derivation-id conn id)
(define query
(string-append
"SELECT derivation_outputs.name, derivation_output_details.path, "
"derivation_output_details.hash_algorithm, derivation_output_details.hash, "
"derivation_output_details.recursive "
"FROM derivation_outputs "
"INNER JOIN derivation_output_details ON "
"derivation_outputs.derivation_output_details_id = derivation_output_details.id "
"WHERE derivation_id = $1"))
(exec-query conn query (list id)))
(define (select-derivation-inputs-by-derivation-id conn id)
(define query
(string-append
"SELECT derivations.file_name, derivation_outputs.name, "
"derivation_output_details.path "
"FROM derivation_inputs "
"INNER JOIN derivation_outputs"
" ON derivation_outputs.id = derivation_inputs.derivation_output_id "
"INNER JOIN derivation_output_details"
" ON derivation_outputs.derivation_output_details_id = derivation_output_details.id "
"INNER JOIN derivations"
" ON derivation_outputs.derivation_id = derivations.id "
"WHERE derivation_inputs.derivation_id = $1"))
(exec-query conn query (list id)))
(define (insert-derivation-input conn derivation-id derivation-input) (define (insert-derivation-input conn derivation-id derivation-input)
(define (insert-into-derivation-inputs output-ids) (define (insert-into-derivation-inputs output-ids)
(string-append "INSERT INTO derivation_inputs " (string-append "INSERT INTO derivation_inputs "

View file

@ -29,6 +29,7 @@
#:use-module (guix-data-service comparison) #:use-module (guix-data-service comparison)
#:use-module (guix-data-service model guix-revision) #:use-module (guix-data-service model guix-revision)
#:use-module (guix-data-service model package) #:use-module (guix-data-service model package)
#:use-module (guix-data-service model derivation)
#:use-module (guix-data-service model build) #:use-module (guix-data-service model build)
#:use-module (guix-data-service jobs load-new-guix-revision) #:use-module (guix-data-service jobs load-new-guix-revision)
#:use-module (guix-data-service web render) #:use-module (guix-data-service web render)
@ -200,6 +201,27 @@
base-packages-vhash base-packages-vhash
target-packages-vhash)))))) target-packages-vhash))))))
(define (render-derivation conn derivation-file-name)
(let ((derivation (select-derivation-by-file-name conn
derivation-file-name)))
(if derivation
(let ((derivation-inputs (select-derivation-inputs-by-derivation-id
conn
(first derivation)))
(derivation-outputs (select-derivation-outputs-by-derivation-id
conn
(first derivation))))
(apply render-html
(view-derivation derivation
derivation-inputs
derivation-outputs)))
#f ;; TODO
)))
(define (render-store-item conn filename)
(apply render-html
(view-store-item filename)))
(define (controller request body conn) (define (controller request body conn)
(match-lambda (match-lambda
((GET) ((GET)
@ -215,10 +237,10 @@
(view-revision commit-hash (view-revision commit-hash
(select-packages-in-revision conn (select-packages-in-revision conn
commit-hash)))) commit-hash))))
((GET "derivation" derivation-file-name ...) ((GET "gnu" "store" filename)
(apply render-html (if (string-suffix? ".drv" filename)
(view-derivation (string-append (render-derivation conn (string-append "/gnu/store/" filename))
"/" (string-join derivation-file-name "/"))))) (render-store-item conn (string-append "/gnu/store/" filename))))
((GET "compare") ((GET "compare")
(with-base-and-target-commits (with-base-and-target-commits
request conn request conn

View file

@ -27,6 +27,7 @@
view-revision view-revision
view-builds view-builds
view-derivation view-derivation
view-store-item
compare compare
compare/derivations compare/derivations
compare/packages compare/packages
@ -253,7 +254,19 @@
"View build on " ,build-server-url))))) "View build on " ,build-server-url)))))
builds)))))))) builds))))))))
(define (view-derivation derivation-file-name) (define (display-store-item-short item)
`((span (@ (style "font-size: small; font-family: monospace; display: block;"))
,(string-take item 44))
(span (@ (style "font-size: x-large; font-family: monospace;"))
,(string-drop item 44))))
(define (display-store-item item)
`((span (@ (style "font-size: small; font-family: monospace;"))
,(string-take item 44))
(span (@ (style "font-size: x-large; font-family: monospace;"))
,(string-drop item 44))))
(define (view-store-item filename)
(layout (layout
#:extra-headers #:extra-headers
'((cache-control . ((max-age . 60)))) '((cache-control . ((max-age . 60))))
@ -263,7 +276,56 @@
(@ (class "container")) (@ (class "container"))
(div (div
(@ (class "row")) (@ (class "row"))
(h1 "Derivation " (samp ,derivation-file-name))))))) (h1 (samp ,filename)))))))
(define (view-derivation derivation derivation-inputs derivation-outputs)
(layout
#:extra-headers
'((cache-control . ((max-age . 60))))
#:body
`(,(header)
(div
(@ (class "container"))
,(match derivation
((id file-name builder args env-vars system)
`(div
(@ (class "row"))
(h1 "Derivation " (samp ,file-name)))))
(div
(@ (class "row"))
(div
(@ (class "col-md-4"))
(h3 "Inputs")
(table
(@ (class "table"))
(thead
(tr
(th "File name")))
(tdata
,@(map (match-lambda
((file-name output-name path)
`(tr
(td (a (@ (href ,file-name))
,(display-store-item-short path))))))
derivation-inputs))))
(div
(@ (class "col-md-4"))
"Details")
(div
(@ (class "col-md-4"))
(h3 "Outputs")
(table
(@ (class "table"))
(thead
(tr
(th "File name")))
(tdata
,@(map (match-lambda
((output-name path hash-algorithm hash recursive?)
`(tr
(td (a (@ (href ,path))
,(display-store-item-short path))))))
derivation-outputs)))))))))
(define (compare base-commit (define (compare base-commit
target-commit target-commit
@ -434,7 +496,8 @@
(match-lambda (match-lambda
((id file-name build-status) ((id file-name build-status)
`(tr `(tr
(td ,file-name) (td (a (@ (href ,file-name))
,(display-store-item file-name)))
(td ,build-status)))) (td ,build-status))))
base-derivations)))) base-derivations))))
(div (div
@ -454,7 +517,8 @@
(match-lambda (match-lambda
((id file-name build-status) ((id file-name build-status)
`(tr `(tr
(td ,file-name) (td (a (@ (href ,file-name))
,(display-store-item file-name)))
(td ,build-status)))) (td ,build-status))))
target-derivations)))))))) target-derivations))))))))