Stream the /compare.json response

Since this could be quite large.
This commit is contained in:
Christopher Baines 2025-07-04 10:36:26 +01:00
parent 62cf3ff7cb
commit a5e9e2f6a5

View file

@ -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