Provide the packages page with translations
Signed-off-by: Christopher Baines <mail@cbaines.net>
This commit is contained in:
parent
8d9a4d105c
commit
a3ac33c0e1
4 changed files with 158 additions and 19 deletions
|
|
@ -30,7 +30,9 @@
|
||||||
#:use-module (guix-data-service model location)
|
#:use-module (guix-data-service model location)
|
||||||
#:use-module (guix-data-service model utils)
|
#:use-module (guix-data-service model utils)
|
||||||
#:export (select-package-metadata-by-revision-name-and-version
|
#:export (select-package-metadata-by-revision-name-and-version
|
||||||
inferior-packages->package-metadata-ids))
|
inferior-packages->package-metadata-ids
|
||||||
|
|
||||||
|
package-description-and-synopsis-locale-options-guix-revision))
|
||||||
|
|
||||||
(define locales
|
(define locales
|
||||||
'("cs_CZ.utf8"
|
'("cs_CZ.utf8"
|
||||||
|
|
@ -101,9 +103,9 @@
|
||||||
" AND ")))
|
" AND ")))
|
||||||
|
|
||||||
(define (select-package-metadata-by-revision-name-and-version
|
(define (select-package-metadata-by-revision-name-and-version
|
||||||
conn revision-commit-hash name version)
|
conn revision-commit-hash name version locale)
|
||||||
(define query "
|
(define query "
|
||||||
SELECT package_metadata.synopsis, package_metadata.description,
|
SELECT translated_package_synopsis.synopsis, translated_package_descriptions.description,
|
||||||
package_metadata.home_page,
|
package_metadata.home_page,
|
||||||
locations.file, locations.line, locations.column_number,
|
locations.file, locations.line, locations.column_number,
|
||||||
(SELECT JSON_AGG((license_data.*))
|
(SELECT JSON_AGG((license_data.*))
|
||||||
|
|
@ -120,6 +122,42 @@ INNER JOIN packages
|
||||||
ON package_metadata.id = packages.package_metadata_id
|
ON package_metadata.id = packages.package_metadata_id
|
||||||
LEFT OUTER JOIN locations
|
LEFT OUTER JOIN locations
|
||||||
ON package_metadata.location_id = locations.id
|
ON package_metadata.location_id = locations.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_description_sets.id) package_description_sets.id, package_descriptions.description
|
||||||
|
FROM package_descriptions
|
||||||
|
INNER JOIN package_description_sets
|
||||||
|
ON package_descriptions.id = ANY (package_description_sets.description_ids)
|
||||||
|
INNER JOIN package_metadata
|
||||||
|
ON package_metadata.package_description_set_id = package_description_sets.id
|
||||||
|
INNER JOIN packages
|
||||||
|
ON packages.package_metadata_id = package_metadata.id
|
||||||
|
AND packages.name = $2
|
||||||
|
AND packages.version = $3
|
||||||
|
ORDER BY package_description_sets.id,
|
||||||
|
CASE WHEN package_descriptions.locale = $4 THEN 2
|
||||||
|
WHEN package_descriptions.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_descriptions
|
||||||
|
ON package_metadata.package_description_set_id = translated_package_descriptions.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_synopsis_sets.id) package_synopsis_sets.id, package_synopsis.synopsis
|
||||||
|
FROM package_synopsis
|
||||||
|
INNER JOIN package_synopsis_sets
|
||||||
|
ON package_synopsis.id = ANY (package_synopsis_sets.synopsis_ids)
|
||||||
|
INNER JOIN package_metadata
|
||||||
|
ON package_metadata.package_synopsis_set_id = package_synopsis_sets.id
|
||||||
|
INNER JOIN packages
|
||||||
|
ON packages.package_metadata_id = package_metadata.id
|
||||||
|
AND packages.name = $2
|
||||||
|
AND packages.version = $3
|
||||||
|
ORDER BY package_synopsis_sets.id,
|
||||||
|
CASE WHEN package_synopsis.locale = $4 THEN 2
|
||||||
|
WHEN package_synopsis.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_synopsis
|
||||||
|
ON package_metadata.package_synopsis_set_id = translated_package_synopsis.id
|
||||||
WHERE packages.id IN (
|
WHERE packages.id IN (
|
||||||
SELECT package_derivations.package_id
|
SELECT package_derivations.package_id
|
||||||
FROM package_derivations
|
FROM package_derivations
|
||||||
|
|
@ -141,7 +179,7 @@ WHERE packages.id IN (
|
||||||
(if (string-null? license-json)
|
(if (string-null? license-json)
|
||||||
#()
|
#()
|
||||||
(json-string->scm license-json)))))
|
(json-string->scm license-json)))))
|
||||||
(exec-query conn query (list revision-commit-hash name version))))
|
(exec-query conn query (list revision-commit-hash name version locale))))
|
||||||
|
|
||||||
(define (insert-package-metadata metadata-rows)
|
(define (insert-package-metadata metadata-rows)
|
||||||
(string-append "INSERT INTO package_metadata "
|
(string-append "INSERT INTO package_metadata "
|
||||||
|
|
@ -167,7 +205,7 @@ WHERE packages.id IN (
|
||||||
(define (inferior-packages->translated-package-descriptions-and-synopsis inferior
|
(define (inferior-packages->translated-package-descriptions-and-synopsis inferior
|
||||||
inferior-package-id)
|
inferior-package-id)
|
||||||
|
|
||||||
(define (translate inferior-package-id)
|
(define (translate inferior-package)
|
||||||
`(let* ((package (hashv-ref %package-table ,inferior-package-id))
|
`(let* ((package (hashv-ref %package-table ,inferior-package-id))
|
||||||
(source-locale "en_US.utf8")
|
(source-locale "en_US.utf8")
|
||||||
(source-synopsis
|
(source-synopsis
|
||||||
|
|
@ -366,3 +404,26 @@ WHERE packages.id IN (
|
||||||
;; There is so much package metadata that it's worth creating a temporary
|
;; There is so much package metadata that it's worth creating a temporary
|
||||||
;; table
|
;; table
|
||||||
#:use-temporary-table? #t))
|
#:use-temporary-table? #t))
|
||||||
|
|
||||||
|
(define (package-description-and-synopsis-locale-options-guix-revision conn
|
||||||
|
revision-id)
|
||||||
|
(exec-query
|
||||||
|
conn
|
||||||
|
"SELECT DISTINCT coalesce(package_descriptions.locale, package_synopsis.locale)
|
||||||
|
FROM package_descriptions
|
||||||
|
INNER JOIN package_description_sets
|
||||||
|
ON package_descriptions.id = ANY (package_description_sets.description_ids)
|
||||||
|
INNER JOIN package_metadata
|
||||||
|
ON package_metadata.package_description_set_id = package_description_sets.id
|
||||||
|
INNER JOIN package_synopsis_sets
|
||||||
|
ON package_synopsis_sets.id = package_metadata.package_synopsis_set_id
|
||||||
|
INNER JOIN package_synopsis
|
||||||
|
ON package_synopsis.id = ANY (package_synopsis_sets.synopsis_ids)
|
||||||
|
INNER JOIN packages
|
||||||
|
ON packages.package_metadata_id = package_metadata.id
|
||||||
|
INNER JOIN package_derivations
|
||||||
|
ON package_derivations.package_id = packages.id
|
||||||
|
INNER JOIN guix_revision_package_derivations
|
||||||
|
ON package_derivations.id = guix_revision_package_derivations.package_derivation_id
|
||||||
|
WHERE guix_revision_package_derivations.revision_id = $1"
|
||||||
|
(list revision-id)))
|
||||||
|
|
|
||||||
|
|
@ -53,12 +53,13 @@
|
||||||
|
|
||||||
(define* (select-packages-in-revision conn commit-hash
|
(define* (select-packages-in-revision conn commit-hash
|
||||||
#:key limit-results
|
#:key limit-results
|
||||||
after-name)
|
after-name
|
||||||
|
locale)
|
||||||
(define query
|
(define query
|
||||||
(string-append "
|
(string-append "
|
||||||
WITH data AS (
|
WITH data AS (
|
||||||
SELECT packages.name, packages.version, package_metadata.synopsis,
|
SELECT packages.name, packages.version, translated_package_synopsis.synopsis,
|
||||||
package_metadata.description, package_metadata.home_page,
|
translated_package_descriptions.description, package_metadata.home_page,
|
||||||
locations.file, locations.line, locations.column_number,
|
locations.file, locations.line, locations.column_number,
|
||||||
(SELECT JSON_AGG((license_data.*))
|
(SELECT JSON_AGG((license_data.*))
|
||||||
FROM (
|
FROM (
|
||||||
|
|
@ -74,6 +75,32 @@ WITH data AS (
|
||||||
ON packages.package_metadata_id = package_metadata.id
|
ON packages.package_metadata_id = package_metadata.id
|
||||||
LEFT OUTER JOIN locations
|
LEFT OUTER JOIN locations
|
||||||
ON package_metadata.location_id = locations.id
|
ON package_metadata.location_id = locations.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_synopsis_sets.id) package_synopsis_sets.id,
|
||||||
|
package_synopsis.synopsis
|
||||||
|
FROM package_synopsis_sets
|
||||||
|
INNER JOIN package_synopsis
|
||||||
|
ON package_synopsis.id = ANY (package_synopsis_sets.synopsis_ids)
|
||||||
|
ORDER BY package_synopsis_sets.id,
|
||||||
|
CASE WHEN package_synopsis.locale = $2 THEN 2
|
||||||
|
WHEN package_synopsis.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_synopsis
|
||||||
|
ON package_metadata.package_synopsis_set_id = translated_package_synopsis.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_description_sets.id) package_description_sets.id,
|
||||||
|
package_descriptions.description
|
||||||
|
FROM package_description_sets
|
||||||
|
INNER JOIN package_descriptions
|
||||||
|
ON package_descriptions.id = ANY (package_description_sets.description_ids)
|
||||||
|
ORDER BY package_description_sets.id,
|
||||||
|
CASE WHEN package_descriptions.locale = $2 THEN 2
|
||||||
|
WHEN package_descriptions.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_descriptions
|
||||||
|
ON package_metadata.package_description_set_id = translated_package_descriptions.id
|
||||||
WHERE packages.id IN (
|
WHERE packages.id IN (
|
||||||
SELECT package_derivations.package_id
|
SELECT package_derivations.package_id
|
||||||
FROM package_derivations
|
FROM package_derivations
|
||||||
|
|
@ -88,7 +115,7 @@ WITH data AS (
|
||||||
SELECT DISTINCT name
|
SELECT DISTINCT name
|
||||||
FROM data"
|
FROM data"
|
||||||
(if after-name
|
(if after-name
|
||||||
"\nWHERE name > $2\n"
|
"\nWHERE name > $3\n"
|
||||||
"")
|
"")
|
||||||
" ORDER BY name"
|
" ORDER BY name"
|
||||||
(if limit-results
|
(if limit-results
|
||||||
|
|
@ -101,6 +128,7 @@ WHERE data.name IN (SELECT name FROM package_names);"))
|
||||||
|
|
||||||
(exec-query conn query
|
(exec-query conn query
|
||||||
`(,commit-hash
|
`(,commit-hash
|
||||||
|
,locale
|
||||||
,@(if after-name
|
,@(if after-name
|
||||||
(list after-name)
|
(list after-name)
|
||||||
'()))))
|
'()))))
|
||||||
|
|
@ -113,8 +141,8 @@ WHERE data.name IN (SELECT name FROM package_names);"))
|
||||||
"
|
"
|
||||||
SELECT packages.name,
|
SELECT packages.name,
|
||||||
packages.version,
|
packages.version,
|
||||||
package_metadata.synopsis,
|
translated_package_synopsis.synopsis,
|
||||||
package_metadata.description,
|
translated_package_descriptions.description,
|
||||||
package_metadata.home_page,
|
package_metadata.home_page,
|
||||||
locations.file, locations.line, locations.column_number,
|
locations.file, locations.line, locations.column_number,
|
||||||
(SELECT JSON_AGG((license_data.*))
|
(SELECT JSON_AGG((license_data.*))
|
||||||
|
|
@ -131,6 +159,32 @@ INNER JOIN package_metadata
|
||||||
ON packages.package_metadata_id = package_metadata.id
|
ON packages.package_metadata_id = package_metadata.id
|
||||||
LEFT OUTER JOIN locations
|
LEFT OUTER JOIN locations
|
||||||
ON package_metadata.location_id = locations.id
|
ON package_metadata.location_id = locations.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_synopsis_sets.id) package_synopsis_sets.id,
|
||||||
|
package_synopsis.synopsis
|
||||||
|
FROM package_synopsis_sets
|
||||||
|
INNER JOIN package_synopsis
|
||||||
|
ON package_synopsis.id = ANY (package_synopsis_sets.synopsis_ids)
|
||||||
|
ORDER BY package_synopsis_sets.id,
|
||||||
|
CASE WHEN package_synopsis.locale = $2 THEN 2
|
||||||
|
WHEN package_synopsis.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_synopsis
|
||||||
|
ON package_metadata.package_synopsis_set_id = translated_package_synopsis.id
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT DISTINCT ON (package_description_sets.id) package_description_sets.id,
|
||||||
|
package_descriptions.description
|
||||||
|
FROM package_description_sets
|
||||||
|
INNER JOIN package_descriptions
|
||||||
|
ON package_descriptions.id = ANY (package_description_sets.description_ids)
|
||||||
|
ORDER BY package_description_sets.id,
|
||||||
|
CASE WHEN package_descriptions.locale = $2 THEN 2
|
||||||
|
WHEN package_descriptions.locale = 'en_US.utf8' THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END DESC
|
||||||
|
) AS translated_package_descriptions
|
||||||
|
ON package_metadata.package_description_set_id = translated_package_descriptions.id
|
||||||
WHERE packages.id IN (
|
WHERE packages.id IN (
|
||||||
SELECT package_derivations.package_id
|
SELECT package_derivations.package_id
|
||||||
FROM package_derivations
|
FROM package_derivations
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,8 @@
|
||||||
(guard-against-mutually-exclusive-query-parameters
|
(guard-against-mutually-exclusive-query-parameters
|
||||||
(parse-query-parameters
|
(parse-query-parameters
|
||||||
request
|
request
|
||||||
`((after_name ,identity)
|
`((locale ,identity #:default "en_US.utf8")
|
||||||
|
(after_name ,identity)
|
||||||
(field ,identity #:multi-value
|
(field ,identity #:multi-value
|
||||||
#:default ("version" "synopsis"))
|
#:default ("version" "synopsis"))
|
||||||
(search_query ,identity)
|
(search_query ,identity)
|
||||||
|
|
@ -535,6 +536,14 @@
|
||||||
`("Revision " (samp ,commit-hash)))
|
`("Revision " (samp ,commit-hash)))
|
||||||
(header-link
|
(header-link
|
||||||
(string-append "/revision/" commit-hash)))
|
(string-append "/revision/" commit-hash)))
|
||||||
|
(define description-and-synopsis-locale-options
|
||||||
|
(map
|
||||||
|
(match-lambda
|
||||||
|
((locale)
|
||||||
|
locale))
|
||||||
|
(package-description-and-synopsis-locale-options-guix-revision
|
||||||
|
conn (commit->revision-id conn commit-hash))))
|
||||||
|
|
||||||
(if (any-invalid-query-parameters? query-parameters)
|
(if (any-invalid-query-parameters? query-parameters)
|
||||||
(case (most-appropriate-mime-type
|
(case (most-appropriate-mime-type
|
||||||
'(application/json text/html)
|
'(application/json text/html)
|
||||||
|
|
@ -549,6 +558,7 @@
|
||||||
'()
|
'()
|
||||||
'()
|
'()
|
||||||
#f
|
#f
|
||||||
|
#f
|
||||||
#:path-base path-base
|
#:path-base path-base
|
||||||
#:header-text header-text
|
#:header-text header-text
|
||||||
#:header-link header-link))))
|
#:header-link header-link))))
|
||||||
|
|
@ -568,7 +578,8 @@
|
||||||
conn
|
conn
|
||||||
commit-hash
|
commit-hash
|
||||||
#:limit-results limit-results
|
#:limit-results limit-results
|
||||||
#:after-name (assq-ref query-parameters 'after_name))))
|
#:after-name (assq-ref query-parameters 'after_name)
|
||||||
|
#:locale (assq-ref query-parameters 'locale))))
|
||||||
(git-repositories
|
(git-repositories
|
||||||
(git-repositories-containing-commit conn
|
(git-repositories-containing-commit conn
|
||||||
commit-hash))
|
commit-hash))
|
||||||
|
|
@ -625,6 +636,7 @@
|
||||||
packages
|
packages
|
||||||
git-repositories
|
git-repositories
|
||||||
show-next-page?
|
show-next-page?
|
||||||
|
description-and-synopsis-locale-options
|
||||||
#:path-base path-base
|
#:path-base path-base
|
||||||
#:header-text header-text
|
#:header-text header-text
|
||||||
#:header-link header-link)
|
#:header-link header-link)
|
||||||
|
|
@ -682,19 +694,25 @@
|
||||||
"/revision/" commit-hash))
|
"/revision/" commit-hash))
|
||||||
version-history-link)
|
version-history-link)
|
||||||
|
|
||||||
(define lint-warnings-locale-options
|
(define locale-options
|
||||||
(map
|
(map
|
||||||
(match-lambda
|
(match-lambda
|
||||||
((locale)
|
((locale)
|
||||||
locale))
|
locale))
|
||||||
(lint-warning-message-locales-for-revision conn commit-hash)))
|
(delete-duplicates
|
||||||
|
(append
|
||||||
|
(package-description-and-synopsis-locale-options-guix-revision
|
||||||
|
conn (commit->revision-id conn commit-hash))
|
||||||
|
(lint-warning-message-locales-for-revision conn commit-hash)))))
|
||||||
|
|
||||||
(let* ((metadata
|
(let* ((locale (assq-ref query-parameters 'locale))
|
||||||
|
(metadata
|
||||||
(select-package-metadata-by-revision-name-and-version
|
(select-package-metadata-by-revision-name-and-version
|
||||||
conn
|
conn
|
||||||
commit-hash
|
commit-hash
|
||||||
name
|
name
|
||||||
version))
|
version
|
||||||
|
locale))
|
||||||
(derivations
|
(derivations
|
||||||
(select-derivations-by-revision-name-and-version
|
(select-derivations-by-revision-name-and-version
|
||||||
conn
|
conn
|
||||||
|
|
@ -704,7 +722,6 @@
|
||||||
(git-repositories
|
(git-repositories
|
||||||
(git-repositories-containing-commit conn
|
(git-repositories-containing-commit conn
|
||||||
commit-hash))
|
commit-hash))
|
||||||
(locale (assq-ref query-parameters 'locale))
|
|
||||||
(lint-warnings
|
(lint-warnings
|
||||||
(select-lint-warnings-by-revision-package-name-and-version
|
(select-lint-warnings-by-revision-package-name-and-version
|
||||||
conn
|
conn
|
||||||
|
|
@ -742,7 +759,7 @@
|
||||||
git-repositories
|
git-repositories
|
||||||
lint-warnings
|
lint-warnings
|
||||||
query-parameters
|
query-parameters
|
||||||
lint-warnings-locale-options
|
locale-options
|
||||||
#:header-text header-text
|
#:header-text header-text
|
||||||
#:header-link header-link
|
#:header-link header-link
|
||||||
#:version-history-link
|
#:version-history-link
|
||||||
|
|
|
||||||
|
|
@ -519,6 +519,7 @@
|
||||||
packages
|
packages
|
||||||
git-repositories
|
git-repositories
|
||||||
show-next-page?
|
show-next-page?
|
||||||
|
locale-options
|
||||||
#:key path-base
|
#:key path-base
|
||||||
header-text header-link)
|
header-text header-link)
|
||||||
(define field-options
|
(define field-options
|
||||||
|
|
@ -553,6 +554,12 @@
|
||||||
(action "")
|
(action "")
|
||||||
(style "padding-bottom: 0")
|
(style "padding-bottom: 0")
|
||||||
(class "form-horizontal"))
|
(class "form-horizontal"))
|
||||||
|
,(form-horizontal-control
|
||||||
|
"Locale" query-parameters
|
||||||
|
#:options locale-options
|
||||||
|
#:allow-selecting-multiple-options #f
|
||||||
|
#:help-text
|
||||||
|
"Language.")
|
||||||
,(form-horizontal-control
|
,(form-horizontal-control
|
||||||
"Search query" query-parameters
|
"Search query" query-parameters
|
||||||
#:help-text
|
#:help-text
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue