diff --git a/guix-data-service/web/compare/controller.scm b/guix-data-service/web/compare/controller.scm index c992186..e6ea566 100644 --- a/guix-data-service/web/compare/controller.scm +++ b/guix-data-service/web/compare/controller.scm @@ -26,6 +26,8 @@ #:use-module (texinfo html) #:use-module (texinfo plain-text) #:use-module (json) + #:use-module (fibers) + #:use-module (knots promise) #:use-module (knots parallelism) #:use-module (knots resource-pool) #:use-module (guix-data-service utils) @@ -307,97 +309,134 @@ (version-changes (package-data-version-changes base-packages-vhash target-packages-vhash))) - (fibers-let ((lint-warnings-data - (with-resource-from-pool (connection-pool) conn - (group-list-by-first-n-fields - 2 - (lint-warning-differences-data conn - base-revision-id - target-revision-id - locale)))) - (channel-news-data - (with-resource-from-pool (connection-pool) conn - (channel-news-differences-data conn + (let ((lint-warnings-data-promise + (fibers-delay + (lambda () + (with-resource-from-pool (connection-pool) conn + (group-list-by-first-n-fields + 2 + (lint-warning-differences-data conn base-revision-id - target-revision-id)))) + target-revision-id + locale)))))) + (channel-news-data-promise + (fibers-delay + (lambda () + (with-resource-from-pool (connection-pool) conn + (channel-news-differences-data conn + base-revision-id + target-revision-id)))))) + ;; TODO Make this neater + (spawn-fiber + (lambda () + (fibers-force lint-warnings-data-promise)) + #:parallel? #t) + (spawn-fiber + (lambda () + (fibers-force channel-news-data-promise)) + #:parallel? #t) + (case (most-appropriate-mime-type '(application/json text/html) mime-types) ((application/json) (render-json - `((base-commit . ,(assq-ref query-parameters 'base_commit)) - (target-commit . ,(assq-ref query-parameters 'target_commit)) - (channel-news . ,(list->vector + (lambda (port) + (scm-alist->streaming-json + `((base-commit . ,(assq-ref query-parameters 'base_commit)) + (target-commit . ,(assq-ref query-parameters 'target_commit)) + (channel-news + . + ,(lambda (port) + (list->json-array + (match-lambda + ((commit tag title_text body_text change) + `(,@(if (null? commit) + '() + `((commit . ,commit))) + ,@(if (null? tag) + '() + `((tag . ,tag))) + (title-text + . ,(map + (match-lambda + ((lang . text) + (cons + lang + (texinfo->variants-alist text)))) + title_text)) + (body-text + . ,(map + (match-lambda + ((lang . text) + (cons + lang + (texinfo->variants-alist text)))) + body_text)) + (change . ,change)))) + (fibers-force channel-news-data-promise) + port))) + (new-packages + . + ,(lambda (port) + (list->json-array + identity + new-packages + port))) + (removed-packages + . + ,(lambda (port) + (list->json-array + identity + removed-packages + port))) + (version-changes + . ,(lambda (port) + (list->json-array + (match-lambda + ((name data ...) + `((name . ,name) + ,@data))) + version-changes + port))) + (lint_warnings + . + ,(lambda (port) + (list->json-array + (match-lambda + (((package-name package-version) + . warnings) + + `((package + . ((name . ,package-name) + (version . ,package-version))) + (warnings + . ,(list->vector (map (match-lambda - ((commit tag title_text body_text change) - `(,@(if (null? commit) - '() - `((commit . ,commit))) - ,@(if (null? tag) - '() - `((tag . ,tag))) - (title-text - . ,(map - (match-lambda - ((lang . text) - (cons - lang - (texinfo->variants-alist text)))) - title_text)) - (body-text - . ,(map - (match-lambda - ((lang . text) - (cons - lang - (texinfo->variants-alist text)))) - body_text)) - (change . ,change)))) - channel-news-data))) - (new-packages . ,(list->vector new-packages)) - (removed-packages . ,(list->vector removed-packages)) - (version-changes . ,(list->vector - (map - (match-lambda - ((name data ...) - `((name . ,name) - ,@data))) - version-changes))) - (lint_warnings - . ,(list->vector - (map - (match-lambda - (((package-name package-version) - . warnings) + ((lint-checker-name + message + lint-checker-description + lint-checker-network-dependent + file line column-number + change) - `((package - . ((name . ,package-name) - (version . ,package-version))) - (warnings - . ,(list->vector - (map - (match-lambda - ((lint-checker-name - message - lint-checker-description - lint-checker-network-dependent - file line column-number - change) - - `((change . ,change) - (checker - . ((name . ,lint-checker-name) - (description - . ,lint-checker-description))) - (message . ,message) - (location - . ((file . ,file) - (line . ,(string->number line)) - (column . ,(string->number - column-number))))))) - warnings)))))) - lint-warnings-data)))) + `((change . ,change) + (checker + . ((name . ,lint-checker-name) + (description + . ,lint-checker-description))) + (message . ,message) + (location + . ((file . ,file) + (line . ,(string->number line)) + (column . ,(string->number + column-number))))))) + warnings)))))) + (fibers-force lint-warnings-data-promise) + port)))) + port)) + #:stream? #t #:extra-headers http-headers-for-unchanging-content)) (else (fibers-let ((lint-warnings-locale-options @@ -422,9 +461,9 @@ new-packages removed-packages version-changes - lint-warnings-data + (fibers-force lint-warnings-data-promise) lint-warnings-locale-options - channel-news-data) + (fibers-force channel-news-data-promise)) #:extra-headers http-headers-for-unchanging-content)))))))))) (define (render-compare-by-datetime mime-types