From 46f73b6b7c05389c67b02d32c8946ca665611cba Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sat, 4 Jan 2020 09:43:04 +0000 Subject: Support returning build information by output. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Being able to take a derivation and query the build information is useful, but in cases where there are multiple derivations that produce the same outputs, the probability of getting the data back from Cuirass is reduced. This is because Cuirass might not have build the exact derivation you have, but a different derivation that produces the same outputs (this can commonly happen when a related fixed output derivation changes). Cuirass doesn't store derivations if they produce the same outputs as a derivation it already knows about, so it can't determine if this is the case. Therefore, provide a way of querying build results by output, rather than derivation. The motivation behind this is to make it easier to import build information in to the Guix Data Service. * src/cuirass/database.scm (db-get-output): New procedure. * src/cuirass/http.scm (respond-output-not-found): New procedure. (request-path-components): Handle /output/… requests. * doc/cuirass.texi (Build information): Mention that you can get build information by output. --- src/cuirass/database.scm | 15 +++++++++++++++ src/cuirass/http.scm | 15 +++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'src') diff --git a/src/cuirass/database.scm b/src/cuirass/database.scm index ab6a4c7..308b5c3 100644 --- a/src/cuirass/database.scm +++ b/src/cuirass/database.scm @@ -47,6 +47,7 @@ build-status db-add-build db-update-build-status! + db-get-output db-get-build db-get-builds db-get-builds-by-search @@ -588,6 +589,20 @@ log file for DRV." (#:event . ,(assq-ref status-names status))))))))) +(define (db-get-output path) + "Retrieve the OUTPUT for PATH." + (with-db-critical-section db + ;; There isn't a unique index on path, but because Cuirass avoids adding + ;; derivations which introduce the same outputs, there should only be one + ;; result. + (match (sqlite-exec db "SELECT derivation, name FROM Outputs +WHERE path =" path " +LIMIT 1;") + (() #f) + ((#(derivation name)) + `((#:derivation . ,derivation) + (#:name . ,name)))))) + (define (db-get-outputs derivation) "Retrieve the OUTPUTS of the build identified by DERIVATION in the database." diff --git a/src/cuirass/http.scm b/src/cuirass/http.scm index 7579e1a..bf436c5 100644 --- a/src/cuirass/http.scm +++ b/src/cuirass/http.scm @@ -226,6 +226,11 @@ Hydra format." 404 (format #f "Build with ID ~a doesn't exist." build-id))) + (define (respond-output-not-found output-id) + (respond-json-with-error + 404 + (format #f "Output with ID ~a doesn't exist." output-id))) + (define (respond-html-eval-not-found eval-id) (respond-html (html-page "Page not found" @@ -331,6 +336,16 @@ Hydra format." (#f (respond-build-not-found build-id))) (respond-build-not-found build-id)))) + (('GET "output" id) + (let ((output (db-get-output + (string-append (%store-prefix) "/" id)))) + (if output + (let ((build (db-get-build (assq-ref output #:derivation)))) + (respond-json + (object->json-string + (append output + `((#:build . ,(or build #nil))))))) + (respond-output-not-found id)))) (('GET "api" "evaluations") (let* ((params (request-parameters request)) ;; 'nr parameter is mandatory to limit query size. -- cgit v1.2.3