aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix-data-service/jobs/load-new-guix-revision.scm875
-rw-r--r--guix-data-service/model/channel-instance.scm5
-rw-r--r--guix-data-service/model/derivation.scm65
-rw-r--r--guix-data-service/model/license.scm62
-rw-r--r--guix-data-service/model/package-derivation.scm28
-rw-r--r--guix-data-service/model/package.scm11
6 files changed, 513 insertions, 533 deletions
diff --git a/guix-data-service/jobs/load-new-guix-revision.scm b/guix-data-service/jobs/load-new-guix-revision.scm
index d54afea..796bfc5 100644
--- a/guix-data-service/jobs/load-new-guix-revision.scm
+++ b/guix-data-service/jobs/load-new-guix-revision.scm
@@ -18,6 +18,7 @@
(define-module (guix-data-service jobs load-new-guix-revision)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-11)
+ #:use-module (srfi srfi-43)
#:use-module (ice-9 match)
#:use-module (ice-9 threads)
#:use-module (ice-9 textual-ports)
@@ -457,72 +458,78 @@ WHERE job_id = $1")
#f)))
-(define (all-inferior-lint-warnings inf store packages)
- (define locales
- '("cs_CZ.UTF-8"
- "da_DK.UTF-8"
- "de_DE.UTF-8"
- "eo_EO.UTF-8"
- "es_ES.UTF-8"
- "fr_FR.UTF-8"
- "hu_HU.UTF-8"
- "nl_NL.UTF-8"
- "pl_PL.UTF-8"
- "pt_BR.UTF-8"
- ;;"sr_SR.UTF-8"
- "sv_SE.UTF-8"
- "vi_VN.UTF-8"
- "zh_CN.UTF-8"))
-
- (define (cleanup-inferior inf)
- (format (current-error-port)
- "inferior heap before cleanup: ~a MiB used (~a MiB heap)~%"
- (round
- (/ (inferior-eval
- '(let ((stats (gc-stats)))
- (- (assoc-ref stats 'heap-size)
- (assoc-ref stats 'heap-free-size)))
- inf)
- (expt 2. 20)))
- (round
- (/ (inferior-eval '(assoc-ref (gc-stats) 'heap-size) inf)
- (expt 2. 20))))
-
- ;; Clean the cached store connections, as there are caches associated with
- ;; these that take up lots of memory
- (inferior-eval
- '(when (defined? '%store-table) (hash-clear! %store-table))
- inf)
-
- (catch
- 'match-error
- (lambda ()
- (inferior-eval '(invalidate-derivation-caches!) inf))
- (lambda (key . args)
- (simple-format
- (current-error-port)
- "warning: ignoring match-error from calling inferior invalidate-derivation-caches!\n")))
-
- (inferior-eval '(gc) inf)
-
- (format (current-error-port)
- "inferior heap after cleanup: ~a MiB used (~a MiB heap)~%"
- (round
- (/ (inferior-eval
- '(let ((stats (gc-stats)))
- (- (assoc-ref stats 'heap-size)
- (assoc-ref stats 'heap-free-size)))
- inf)
- (expt 2. 20)))
- (round
- (/ (inferior-eval '(assoc-ref (gc-stats) 'heap-size) inf)
- (expt 2. 20)))))
-
- (define (lint-warnings-for-checker packages checker-name)
+(define locales
+ '("cs_CZ.UTF-8"
+ "da_DK.UTF-8"
+ "de_DE.UTF-8"
+ "eo_EO.UTF-8"
+ "es_ES.UTF-8"
+ "fr_FR.UTF-8"
+ "hu_HU.UTF-8"
+ "nl_NL.UTF-8"
+ "pl_PL.UTF-8"
+ "pt_BR.UTF-8"
+ ;;"sr_SR.UTF-8"
+ "sv_SE.UTF-8"
+ "vi_VN.UTF-8"
+ "zh_CN.UTF-8"))
+
+(define (inferior-lint-checkers inf)
+ (and
+ (or (inferior-eval '(and (resolve-module '(guix lint) #:ensure #f)
+ (use-modules (guix lint))
+ #t)
+ inf)
+ (begin
+ (simple-format (current-error-port)
+ "warning: no (guix lint) module found\n")
+ #f))
+ (inferior-eval
+ `(begin
+ (define (lint-descriptions-by-locale checker)
+ (let* ((source-locale "en_US.UTF-8")
+ (source-description
+ (begin
+ (setlocale LC_MESSAGES source-locale)
+ (G_ (lint-checker-description checker))))
+ (descriptions-by-locale
+ (filter-map
+ (lambda (locale)
+ (catch 'system-error
+ (lambda ()
+ (setlocale LC_MESSAGES locale))
+ (lambda (key . args)
+ (error
+ (simple-format
+ #f
+ "error changing locale to ~A: ~A ~A"
+ locale key args))))
+ (let ((description
+ (G_ (lint-checker-description checker))))
+ (setlocale LC_MESSAGES source-locale)
+ (if (string=? description source-description)
+ #f
+ (cons locale description))))
+ (list ,@locales))))
+ (cons (cons source-locale source-description)
+ descriptions-by-locale)))
+
+ (map (lambda (checker)
+ (list (lint-checker-name checker)
+ (lint-descriptions-by-locale checker)
+ (if (memq checker %network-dependent-checkers)
+ #t
+ #f)))
+ %all-checkers))
+ inf)))
+
+(define (inferior-lint-warnings inf store checker-name)
+ (define lint-warnings-for-checker
`(lambda (store)
- (let* ((checker (find (lambda (checker)
+ (let* ((checker-name (quote ,checker-name))
+ (checker (find (lambda (checker)
(eq? (lint-checker-name checker)
- ',checker-name))
+ checker-name))
%local-checkers))
(check (lint-checker-check checker)))
@@ -571,98 +578,32 @@ WHERE job_id = $1")
(cons (cons source-locale source-message)
messages-by-locale))))
- (filter-map
- (lambda (package-id)
- (let* ((package (hashv-ref %package-table package-id))
- (warnings
- (map process-lint-warning
- (with-exception-handler
- (lambda (exn)
- (simple-format (current-error-port)
- "exception checking ~A with ~A checker: ~A\n"
- package ',checker-name exn)
- (raise-exception exn))
- (lambda ()
- (if (and lint-checker-requires-store?-defined?
- (lint-checker-requires-store? checker))
-
- (check package #:store store)
- (check package)))
- #:unwind? #t))))
- (if (null? warnings)
- #f
- (cons package-id warnings))))
- (list ,@(map inferior-package-id packages))))))
-
- (and
- (or (inferior-eval '(and (resolve-module '(guix lint) #:ensure #f)
- (use-modules (guix lint))
- #t)
- inf)
- (begin
- (simple-format (current-error-port)
- "warning: no (guix lint) module found\n")
- #f))
- (let ((checkers
- (inferior-eval
- `(begin
- (define (lint-descriptions-by-locale checker)
- (let* ((source-locale "en_US.UTF-8")
- (source-description
- (begin
- (setlocale LC_MESSAGES source-locale)
- (G_ (lint-checker-description checker))))
- (descriptions-by-locale
- (filter-map
- (lambda (locale)
- (catch 'system-error
- (lambda ()
- (setlocale LC_MESSAGES locale))
- (lambda (key . args)
- (error
- (simple-format
- #f
- "error changing locale to ~A: ~A ~A"
- locale key args))))
- (let ((description
- (G_ (lint-checker-description checker))))
- (setlocale LC_MESSAGES source-locale)
- (if (string=? description source-description)
- #f
- (cons locale description))))
- (list ,@locales))))
- (cons (cons source-locale source-description)
- descriptions-by-locale)))
-
- (map (lambda (checker)
- (list (lint-checker-name checker)
- (lint-descriptions-by-locale checker)
- (if (memq checker %network-dependent-checkers)
- #t
- #f)))
- %all-checkers))
- inf)))
- (map
- (match-lambda
- ((name description network-dependent?)
- (cons
- (list name description network-dependent?)
- (if (or network-dependent?
- (eq? name 'derivation))
- '()
- (let ((warnings
- (with-time-logging (simple-format #f "getting ~A lint warnings"
- name)
- (inferior-eval-with-store
- inf
- store
- (lint-warnings-for-checker packages
- name)))))
- (cleanup-inferior inf)
- warnings)))))
- checkers))))
-
-(define (all-inferior-package-derivations store inf packages)
+ (vector-map
+ (lambda (_ package)
+ (map process-lint-warning
+ (with-exception-handler
+ (lambda (exn)
+ (simple-format (current-error-port)
+ "exception checking ~A with ~A checker: ~A\n"
+ package checker-name exn)
+ (raise-exception exn))
+ (lambda ()
+ (if (and lint-checker-requires-store?-defined?
+ (lint-checker-requires-store? checker))
+
+ (check package #:store store)
+ (check package)))
+ #:unwind? #t)))
+ gds-inferior-packages))))
+
+ (with-time-logging (simple-format #f "getting ~A lint warnings"
+ checker-name)
+ (inferior-eval-with-store
+ inf
+ store
+ lint-warnings-for-checker)))
+
+(define (inferior-fetch-system-target-pairs inf)
(define inf-systems
(inferior-guix-systems inf))
@@ -712,8 +653,15 @@ WHERE job_id = $1")
targets)))
cross-derivations))
+ (append supported-system-pairs
+ supported-system-cross-build-pairs))
+
+(define (inferior-package-derivations store inf system target)
(define proc
- '(lambda (store system-target-pair)
+ `(lambda (store)
+ (define system-target-pair
+ (cons ,system ,target))
+
(define target-system-alist
(if (defined? 'platforms (resolve-module '(guix platform)))
(filter-map
@@ -762,7 +710,7 @@ WHERE job_id = $1")
"error ~A: ~A\n" key args)
#f))))
- (define (derivation-for-system-and-target inferior-package-id package system target)
+ (define (derivation-for-system-and-target package system target)
(catch
'misc-error
(lambda ()
@@ -776,13 +724,10 @@ WHERE job_id = $1")
(package-derivation store package system))))
;; You don't always get what you ask for, so check
(if (string=? system (derivation-system derivation))
- (list inferior-package-id
- system
- target
- (let ((file-name
- (derivation-file-name derivation)))
- (add-temp-root store file-name)
- file-name))
+ (let ((file-name
+ (derivation-file-name derivation)))
+ (add-temp-root store file-name)
+ file-name)
(begin
(simple-format
(current-error-port)
@@ -801,140 +746,96 @@ WHERE job_id = $1")
args)
#f)))
- (filter-map
- (lambda (inferior-package-id)
- (let ((package (hashv-ref %package-table inferior-package-id)))
- (catch
- #t
- (lambda ()
- (let* ((system (car system-target-pair))
- (target (cdr system-target-pair))
- (supported-systems (get-supported-systems package system))
- (system-supported?
- (and supported-systems
- (->bool (member system supported-systems))))
- (target-supported?
- (or (not target)
- (let ((system-for-target
- (assoc-ref target-system-alist
- target)))
- (or (not system-for-target)
- (->bool
- (member system-for-target
- (package-supported-systems package)
- string=?)))))))
-
- (when (string=? (package-name package) "guix")
+ (vector-map
+ (lambda (_ package)
+ (catch
+ #t
+ (lambda ()
+ (let* ((system (car system-target-pair))
+ (target (cdr system-target-pair))
+ (supported-systems (get-supported-systems package system))
+ (system-supported?
+ (and supported-systems
+ (->bool (member system supported-systems))))
+ (target-supported?
+ (or (not target)
+ (let ((system-for-target
+ (assoc-ref target-system-alist
+ target)))
+ (or (not system-for-target)
+ (->bool
+ (member system-for-target
+ (package-supported-systems package)
+ string=?)))))))
+
+ (when (string=? (package-name package) "guix")
+ (simple-format
+ (current-error-port)
+ "looking at guix package (supported systems: ~A, system supported: ~A, target supported: ~A\n"
+ supported-systems
+ system-supported?
+ target-supported?))
+
+ (if system-supported?
+ (if target-supported?
+ (derivation-for-system-and-target package
+ system
+ target)
+ #f)
+ #f)))
+ (lambda (key . args)
+ (if (and (eq? key 'system-error)
+ (eq? (car args) 'fport_write))
+ (begin
(simple-format
(current-error-port)
- "looking at guix package (supported systems: ~A, system supported: ~A, target supported: ~A\n"
- supported-systems
- system-supported?
- target-supported?))
-
- (if system-supported?
- (if target-supported?
- (derivation-for-system-and-target inferior-package-id
- package
- system
- target)
- #f)
- #f)))
- (lambda (key . args)
- (if (and (eq? key 'system-error)
- (eq? (car args) 'fport_write))
- (begin
- (simple-format
- (current-error-port)
- "error: while processing ~A, exiting: ~A: ~A\n"
- (package-name package)
- key
- args)
- (exit 1))
- (begin
- (simple-format
- (current-error-port)
- "error: while processing ~A ignoring error: ~A: ~A\n"
- (package-name package)
- key
- args)
- #f))))))
- gds-inferior-package-ids)))
+ "error: while processing ~A, exiting: ~A: ~A\n"
+ (package-name package)
+ key
+ args)
+ (exit 1))
+ (begin
+ (simple-format
+ (current-error-port)
+ "error: while processing ~A ignoring error: ~A: ~A\n"
+ (package-name package)
+ key
+ args)
+ #f)))))
+ gds-inferior-packages)))
(inferior-eval
'(when (defined? 'systems (resolve-module '(guix platform)))
(use-modules (guix platform)))
inf)
- (inferior-eval
- `(define gds-inferior-package-ids
- (list ,@(map inferior-package-id packages)))
- inf)
+ (format (current-error-port)
+ "heap size: ~a MiB~%"
+ (round
+ (/ (assoc-ref (gc-stats) 'heap-size)
+ (expt 2. 20))))
- (inferior-eval
- `(define gds-packages-proc ,proc)
- inf)
+ (catch
+ 'match-error
+ (lambda ()
+ (inferior-eval '(invalidate-derivation-caches!) inf))
+ (lambda (key . args)
+ (simple-format
+ (current-error-port)
+ "warning: ignoring match-error from calling inferior invalidate-derivation-caches!\n")))
- (append-map!
- (lambda (system-target-pair)
- (format (current-error-port)
- "heap size: ~a MiB~%"
- (round
- (/ (assoc-ref (gc-stats) 'heap-size)
- (expt 2. 20))))
-
- (format (current-error-port)
- "inferior heap before cleanup: ~a MiB used (~a MiB heap)~%"
- (round
- (/ (inferior-eval
- '(let ((stats (gc-stats)))
- (- (assoc-ref stats 'heap-size)
- (assoc-ref stats 'heap-free-size)))
- inf)
- (expt 2. 20)))
- (round
- (/ (inferior-eval '(assoc-ref (gc-stats) 'heap-size) inf)
- (expt 2. 20))))
- (catch
- 'match-error
- (lambda ()
- (inferior-eval '(invalidate-derivation-caches!) inf))
- (lambda (key . args)
- (simple-format
- (current-error-port)
- "warning: ignoring match-error from calling inferior invalidate-derivation-caches!\n")))
-
- ;; Clean the cached store connections, as there are caches associated
- ;; with these that take up lots of memory
- (inferior-eval '(when (defined? '%store-table) (hash-clear! %store-table)) inf)
-
- (inferior-eval '(gc) inf)
-
- (format (current-error-port)
- "inferior heap after cleanup: ~a MiB used (~a MiB heap)~%"
- (round
- (/ (inferior-eval
- '(let ((stats (gc-stats)))
- (- (assoc-ref stats 'heap-size)
- (assoc-ref stats 'heap-free-size)))
- inf)
- (expt 2. 20)))
- (round
- (/ (inferior-eval '(assoc-ref (gc-stats) 'heap-size) inf)
- (expt 2. 20))))
-
- (with-time-logging
- (simple-format #f "getting derivations for ~A" system-target-pair)
- (inferior-eval-with-store
- inf
- store
- `(lambda (store)
- (gds-packages-proc store (cons ,(car system-target-pair)
- ,(cdr system-target-pair)))))))
- (append supported-system-pairs
- supported-system-cross-build-pairs)))
-
-(define (deduplicate-inferior-packages packages)
+ ;; Clean the cached store connections, as there are caches associated
+ ;; with these that take up lots of memory
+ (inferior-eval '(when (defined? '%store-table) (hash-clear! %store-table)) inf)
+
+ (with-time-logging
+ (simple-format #f "getting derivations for ~A" (cons system target))
+ (inferior-eval-with-store
+ inf
+ store
+ proc)))
+
+(define (sort-and-deduplicate-inferior-packages packages)
(pair-fold
(lambda (pair result)
(if (null? (cdr pair))
@@ -997,20 +898,42 @@ WHERE job_id = $1")
;; same name and version, but different derivations. Guix will warn
;; about this case though, generally this means only one of the
;; packages should be exported.
- (deduplicate-inferior-packages
- (append! packages non-exported-replacements))))
+ (sort-and-deduplicate-inferior-packages
+ (append! packages non-exported-replacements)))
+
+ (deduplicated-packages-length
+ (length deduplicated-packages)))
+
+ (inferior-eval
+ `(use-modules (srfi srfi-43))
+ inf)
+ (inferior-eval
+ `(define gds-inferior-packages
+ (make-vector ,deduplicated-packages-length))
+ inf)
+
+ (inferior-eval
+ `(for-each
+ (lambda (index id)
+ (vector-set! gds-inferior-packages
+ index
+ (or (hashv-ref %package-table id)
+ (error "missing package id"))))
+ (iota ,deduplicated-packages-length)
+ (list ,@(map inferior-package-id deduplicated-packages)))
+ inf)
- deduplicated-packages))
+ (list->vector deduplicated-packages)))
(define* (all-inferior-packages-data inf packages #:key (process-replacements? #t))
(let* ((package-license-data
(with-time-logging "fetching inferior package license metadata"
- (inferior-packages->license-data inf packages)))
+ (inferior-packages->license-data inf)))
(package-metadata
(with-time-logging "fetching inferior package metadata"
- (map
- (lambda (package)
+ (vector-map
+ (lambda (_ package)
(let ((translated-package-descriptions-and-synopsis
(inferior-packages->translated-package-descriptions-and-synopsis
inf package)))
@@ -1022,28 +945,31 @@ WHERE job_id = $1")
packages)))
(package-replacement-data
(if process-replacements?
- (map (lambda (package)
- (let ((replacement (inferior-package-replacement package)))
- (if replacement
- ;; I'm not sure if replacements can themselves be
- ;; replaced, but I do know for sure that there are
- ;; infinite chains of replacements (python(2)-urllib3
- ;; in 7c4c781aa40c42d4cd10b8d9482199f3db345e1b for
- ;; example).
- ;;
- ;; This code currently just capures the first level
- ;; of replacements
- (first
- (all-inferior-packages-data
- inf
- (list replacement)
- #:process-replacements? #f))
- #f)))
- packages)
+ (vector-map
+ (lambda (_ package)
+ (let ((replacement (inferior-package-replacement package)))
+ (if replacement
+ ;; I'm not sure if replacements can themselves be
+ ;; replaced, but I do know for sure that there are
+ ;; infinite chains of replacements (python(2)-urllib3
+ ;; in 7c4c781aa40c42d4cd10b8d9482199f3db345e1b for
+ ;; example).
+ ;;
+ ;; This code currently just capures the first level
+ ;; of replacements
+ (first
+ (all-inferior-packages-data
+ inf
+ (vector replacement)
+ #:process-replacements? #f))
+ #f)))
+ packages)
#f)))
- `((names . ,(map inferior-package-name packages))
- (versions . ,(map inferior-package-version packages))
+ `((names . ,(vector-map (lambda (_ pkg) (inferior-package-name pkg))
+ packages))
+ (versions . ,(vector-map (lambda (_ pkg) (inferior-package-version pkg))
+ packages))
(license-data . ,package-license-data)
(metadata . ,package-metadata)
(replacemnets . ,package-replacement-data))))
@@ -1055,25 +981,30 @@ WHERE job_id = $1")
conn
(inferior-packages->license-id-lists
conn
- (assq-ref inferior-packages-data 'license-data))))
+ ;; TODO Don't needlessly convert
+ (vector->list
+ (assq-ref inferior-packages-data 'license-data)))))
((all-package-metadata-ids new-package-metadata-ids)
(with-time-logging "inserting package metadata entries"
(inferior-packages->package-metadata-ids
conn
- (assq-ref inferior-packages-data 'metadata)
+ ;; TODO Don't needlessly convert
+ (vector->list
+ (assq-ref inferior-packages-data 'metadata))
package-license-set-ids)))
((replacement-ids)
(or (and=> (assq-ref inferior-packages-data 'replacements)
(lambda (all-replacement-data)
(with-time-logging "inserting package replacements"
- (map (lambda (replacement-data)
- (if replacement-data
- (first
- (insert-packages conn (list replacement-data)))
- (cons "integer" NULL)))
- all-replacement-data))))
- (make-list (length package-license-set-ids)
- (cons "integer" NULL)))))
+ (vector-map
+ (lambda (_ replacement-data)
+ (if replacement-data
+ (first
+ (insert-packages conn (list replacement-data)))
+ (cons "integer" NULL)))
+ all-replacement-data))))
+ (make-vector (length package-license-set-ids)
+ (cons "integer" NULL)))))
(unless (null? new-package-metadata-ids)
(with-time-logging "fetching package metadata tsvector entries"
@@ -1083,75 +1014,80 @@ WHERE job_id = $1")
(with-time-logging "getting package-ids"
(inferior-packages->package-ids
conn
- (zip (assq-ref inferior-packages-data 'names)
- (assq-ref inferior-packages-data 'versions)
+ ;; TODO Do this more efficiently
+ (zip (vector->list (assq-ref inferior-packages-data 'names))
+ (vector->list (assq-ref inferior-packages-data 'versions))
all-package-metadata-ids
- replacement-ids)))))
+ (vector->list replacement-ids))))))
-(define (insert-lint-warnings conn inferior-package-id->package-database-id
+(define (insert-lint-warnings conn
+ package-ids
lint-checker-ids
lint-warnings-data)
(lint-warnings-data->lint-warning-ids
conn
- (append-map
- (lambda (lint-checker-id warnings-by-package-id)
- (append-map
- (match-lambda
- ((package-id . warnings)
- (map
- (match-lambda
- ((location-data messages-by-locale)
- (let ((location-id
- (location->location-id
- conn
- (apply location location-data)))
- (lint-warning-message-set-id
- (lint-warning-message-data->lint-warning-message-set-id
- conn
- messages-by-locale)))
- (list lint-checker-id
- (inferior-package-id->package-database-id package-id)
- location-id
- lint-warning-message-set-id))))
- (fold (lambda (location-and-messages result)
- (if (member location-and-messages result)
- (begin
- (apply
- simple-format
- (current-error-port)
- "warning: skipping duplicate lint warning ~A ~A\n"
- location-and-messages)
- result)
- (append result
- (list location-and-messages))))
- '()
- warnings))))
- warnings-by-package-id))
+ (append-map!
+ (lambda (lint-checker-id warnings-per-package)
+ (if warnings-per-package
+ (vector-fold
+ (lambda (_ result package-id warnings)
+ (append!
+ result
+ (map
+ (match-lambda
+ ((location-data messages-by-locale)
+ (let ((location-id
+ (location->location-id
+ conn
+ (apply location location-data)))
+ (lint-warning-message-set-id
+ (lint-warning-message-data->lint-warning-message-set-id
+ conn
+ messages-by-locale)))
+ (list lint-checker-id
+ package-id
+ location-id
+ lint-warning-message-set-id))))
+ (fold (lambda (location-and-messages result)
+ ;; TODO Sort to delete duplicates, rather than use member
+ (if (member location-and-messages result)
+ (begin
+ (apply
+ simple-format
+ (current-error-port)
+ "warning: skipping duplicate lint warning ~A ~A\n"
+ location-and-messages)
+ result)
+ (append! result
+ (list location-and-messages))))
+ '()
+ warnings))))
+ '()
+ package-ids
+ warnings-per-package)
+ '()))
lint-checker-ids
- (map cdr lint-warnings-data))))
+ lint-warnings-data)))
(define (inferior-data->package-derivation-ids
conn inf
- inferior-package-id->package-database-id
- inferior-data-4-tuples)
- (let ((derivation-ids
- (derivation-file-names->derivation-ids
- conn
- (map fourth inferior-data-4-tuples)))
- (flat-package-ids-systems-and-targets
- (map
- (match-lambda
- ((inferior-package-id system target derivation-file-name)
- (list (inferior-package-id->package-database-id
- inferior-package-id)
- system
- (or target ""))))
- inferior-data-4-tuples)))
-
+ package-ids
+ inferior-packages-system-and-target-to-derivations-alist)
+ (append-map!
+ (lambda (data)
+ (let* ((system-and-target (car data))
+ (derivations-vector (cdr data))
+ (derivation-ids
+ (derivation-file-names->derivation-ids
+ conn
+ derivations-vector)))
- (insert-package-derivations conn
- flat-package-ids-systems-and-targets
- derivation-ids)))
+ (insert-package-derivations conn
+ (car system-and-target)
+ (or (cdr system-and-target) "")
+ package-ids
+ derivation-ids)))
+ inferior-packages-system-and-target-to-derivations-alist))
(define guix-store-path
(let ((store-path #f))
@@ -1516,12 +1452,35 @@ WHERE job_id = $1")
(let* ((packages
(with-time-logging "fetching inferior packages"
(inferior-packages-plus-replacements inf)))
- (inferior-lint-warnings
- (with-time-logging "fetching inferior lint warnings"
- (all-inferior-lint-warnings inf store packages)))
- (inferior-data-4-tuples
+ (inferior-lint-checkers-data
+ (inferior-lint-checkers inf))
+ (inferior-lint-warnings-data
+ (and inferior-lint-checkers-data
+ (with-time-logging "fetching inferior lint warnings"
+ (map
+ (match-lambda
+ ((checker-name _ network-dependent?)
+ (and (and (not network-dependent?)
+ ;; Running the derivation linter is
+ ;; currently infeasible
+ (not (eq? checker-name 'derivation)))
+ (inferior-lint-warnings inf
+ store
+ checker-name))))
+ inferior-lint-checkers-data))))
+ (inferior-system-target-pairs
+ (inferior-fetch-system-target-pairs inf))
+ (inferior-packages-system-and-target-to-derivations-alist
(with-time-logging "getting inferior derivations"
- (all-inferior-package-derivations store inf packages)))
+ (map
+ (match-lambda
+ ((system . target)
+ (cons (cons system target)
+ (inferior-package-derivations store
+ inf
+ system
+ target))))
+ inferior-system-target-pairs)))
(inferior-system-tests
(if skip-system-tests?
(begin
@@ -1544,84 +1503,70 @@ WHERE job_id = $1")
;; avoid any concurrency issues
(obtain-advisory-transaction-lock conn
'load-new-guix-revision-inserts))
- (let* ((package-ids
- (insert-packages conn packages-data))
- (inferior-package-id->package-database-id
- (let ((lookup-table
- (alist->hashq-table
- (map (lambda (package package-id)
- (cons (inferior-package-id package)
- package-id))
- packages
- package-ids))))
- (lambda (inferior-id)
- (or
- (hashq-ref lookup-table inferior-id)
- (error
- (simple-format
- #f
- "error: inferior-package-id->package-database-id: ~A missing\n"
- inferior-id)))))))
-
-
- (when inferior-lint-warnings
- (let* ((lint-checker-ids
- (lint-checkers->lint-checker-ids
- conn
- (map (match-lambda
- ((name descriptions-by-locale network-dependent)
- (list
- name
- network-dependent
- (lint-checker-description-data->lint-checker-description-set-id
- conn descriptions-by-locale))))
- (map car inferior-lint-warnings))))
- (lint-warning-ids
- (insert-lint-warnings
- conn
- inferior-package-id->package-database-id
- lint-checker-ids
- inferior-lint-warnings)))
- (insert-guix-revision-lint-checkers conn
- guix-revision-id
- lint-checker-ids)
-
- (chunk-for-each!
- (lambda (lint-warning-ids-chunk)
- (insert-guix-revision-lint-warnings conn
+ (with-time-logging
+ "inserting data"
+ (let* ((package-ids
+ (insert-packages conn packages-data)))
+ (when inferior-lint-warnings
+ (let* ((lint-checker-ids
+ (lint-checkers->lint-checker-ids
+ conn
+ (map (match-lambda
+ ((name descriptions-by-locale network-dependent)
+ (list
+ name
+ network-dependent
+ (lint-checker-description-data->lint-checker-description-set-id
+ conn descriptions-by-locale))))
+ inferior-lint-checkers-data)))
+ (lint-warning-ids
+ (insert-lint-warnings
+ conn
+ package-ids
+ lint-checker-ids
+ inferior-lint-warnings-data)))
+ (insert-guix-revision-lint-checkers conn
+ guix-revision-id
+ lint-checker-ids)
+
+ (chunk-for-each!
+ (lambda (lint-warning-ids-chunk)
+ (insert-guix-revision-lint-warnings conn
+ guix-revision-id
+ lint-warning-ids-chunk))
+ 5000
+ lint-warning-ids)))
+
+ (when inferior-system-tests
+ (insert-system-tests-for-guix-revision conn
guix-revision-id
- lint-warning-ids-chunk))
- 5000
- lint-warning-ids)))
-
- (when inferior-system-tests
- (insert-system-tests-for-guix-revision conn
- guix-revision-id
- inferior-system-tests))
-
- (let* ((package-derivation-ids
- (with-time-logging "inferior-data->package-derivation-ids"
- (inferior-data->package-derivation-ids
- conn inf inferior-package-id->package-database-id
- inferior-data-4-tuples)))
- (ids-count
- (length package-derivation-ids)))
- (chunk-for-each! (lambda (package-derivation-ids-chunk)
- (insert-guix-revision-package-derivations
- conn
- guix-revision-id
- package-derivation-ids-chunk))
- 2000
- package-derivation-ids)
- (simple-format
- #t "Successfully loaded ~A package/derivation pairs\n"
- ids-count))
-
- (with-time-logging
- "insert-guix-revision-package-derivation-distribution-counts"
- (insert-guix-revision-package-derivation-distribution-counts
- conn
- guix-revision-id))))
+ inferior-system-tests))
+
+ (let* ((package-derivation-ids
+ (with-time-logging "inferior-data->package-derivation-ids"
+ (inferior-data->package-derivation-ids
+ conn
+ inf
+ package-ids
+ inferior-packages-system-and-target-to-derivations-alist)))
+ (ids-count
+ (length package-derivation-ids)))
+ (chunk-for-each! (lambda (package-derivation-ids-chunk)
+ (insert-guix-revision-package-derivations
+ conn
+ guix-revision-id
+ package-derivation-ids-chunk))
+ 2000
+ package-derivation-ids)
+ (simple-format
+ #t "Successfully loaded ~A package/derivation pairs\n"
+ ids-count))
+
+ (with-time-logging
+ "insert-guix-revision-package-derivation-distribution-counts"
+ (insert-guix-revision-package-derivation-distribution-counts
+ conn
+ guix-revision-id)))))
#t)
(lambda (key . args)
(simple-format (current-error-port)
diff --git a/guix-data-service/model/channel-instance.scm b/guix-data-service/model/channel-instance.scm
index 956018e..84fc901 100644
--- a/guix-data-service/model/channel-instance.scm
+++ b/guix-data-service/model/channel-instance.scm
@@ -33,7 +33,8 @@
(let ((derivation-ids
(derivation-file-names->derivation-ids
conn
- (map cdr derivations-by-system))))
+ (list->vector
+ (map cdr derivations-by-system)))))
(exec-query
conn
@@ -49,7 +50,7 @@ VALUES "
system
derivation-id))
(map car derivations-by-system)
- derivation-ids)
+ (vector->list derivation-ids))
", "))))
#t)
diff --git a/guix-data-service/model/derivation.scm b/guix-data-service/model/derivation.scm
index 20f481a..98c2178 100644
--- a/guix-data-service/model/derivation.scm
+++ b/guix-data-service/model/derivation.scm
@@ -17,6 +17,7 @@
(define-module (guix-data-service model derivation)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-43)
#:use-module (ice-9 vlist)
#:use-module (ice-9 match)
#:use-module (ice-9 format)
@@ -1545,7 +1546,8 @@ LIMIT $1"
(update-derivation-ids-hash-table! conn
derivation-ids-hash-table
- input-derivation-file-names)
+ (list->vector
+ input-derivation-file-names))
(simple-format
#t
"debug: ensure-input-derivations-exist: checking for missing input derivations\n")
@@ -1743,18 +1745,20 @@ WHERE " criteria ";"))
(define (update-derivation-ids-hash-table! conn
derivation-ids-hash-table
file-names)
- (define file-names-count (length file-names))
+ (define file-names-count (vector-length file-names))
(simple-format #t "debug: update-derivation-ids-hash-table!: ~A file-names\n"
file-names-count)
(let ((missing-file-names
- (fold (lambda (file-name result)
- (if (hash-ref derivation-ids-hash-table
- file-name)
- result
- (cons file-name result)))
- '()
- file-names)))
+ (vector-fold
+ (lambda (_ result file-name)
+ (if (and file-name
+ (hash-ref derivation-ids-hash-table
+ file-name))
+ result
+ (cons file-name result)))
+ '()
+ file-names)))
(simple-format
#t "debug: update-derivation-ids-hash-table!: lookup ~A file-names, ~A not cached\n"
@@ -1773,6 +1777,9 @@ WHERE " criteria ";"))
(chunk! missing-file-names 1000)))))
(define (derivation-file-names->derivation-ids conn derivation-file-names)
+ (define derivations-count
+ (vector-length derivation-file-names))
+
(define (insert-source-files-missing-nars derivation-ids)
(define (derivation-ids->next-related-derivation-ids! ids seen-ids)
(delete-duplicates/sort!
@@ -1862,10 +1869,9 @@ INNER JOIN derivation_source_files
next-related-derivation-ids
seen-ids)))))))
- (if (null? derivation-file-names)
- '()
- (let* ((derivations-count (length derivation-file-names))
- (derivation-ids-hash-table (make-hash-table
+ (if (= 0 derivations-count)
+ #()
+ (let* ((derivation-ids-hash-table (make-hash-table
;; Account for more derivations in
;; the graph
(* 2 derivations-count))))
@@ -1879,10 +1885,16 @@ INNER JOIN derivation_source_files
(let ((missing-derivation-filenames
(deduplicate-strings
- (filter (lambda (derivation-file-name)
- (not (hash-ref derivation-ids-hash-table
- derivation-file-name)))
- derivation-file-names))))
+ (vector-fold
+ (lambda (_ result derivation-file-name)
+ (if (not derivation-file-name)
+ result
+ (if (hash-ref derivation-ids-hash-table
+ derivation-file-name)
+ result
+ (cons derivation-file-name result))))
+ '()
+ derivation-file-names))))
(chunk-for-each!
(lambda (missing-derivation-filenames-chunk)
@@ -1907,14 +1919,25 @@ INNER JOIN derivation_source_files
missing-derivation-filenames)
(let ((all-ids
- (map (lambda (derivation-file-name)
+ (vector-map
+ (lambda (_ derivation-file-name)
+ (if derivation-file-name
(or (hash-ref derivation-ids-hash-table
derivation-file-name)
- (error "missing derivation id")))
- derivation-file-names)))
+ (error "missing derivation id"))
+ #f))
+ derivation-file-names)))
(with-time-logging "insert-source-files-missing-nars"
- (insert-source-files-missing-nars all-ids))
+ (insert-source-files-missing-nars
+ ;; TODO Avoid this conversion
+ (vector-fold
+ (lambda (_ result x)
+ (if x
+ (cons x result)
+ result))
+ '()
+ all-ids)))
all-ids)))))
diff --git a/guix-data-service/model/license.scm b/guix-data-service/model/license.scm
index 9104882..ebca0eb 100644
--- a/guix-data-service/model/license.scm
+++ b/guix-data-service/model/license.scm
@@ -28,39 +28,39 @@
(define inferior-package-id
(@@ (guix inferior) inferior-package-id))
-(define (inferior-packages->license-data inf packages)
- (define (proc packages)
- `(map (lambda (inferior-package-id)
- (let ((package (hashv-ref %package-table inferior-package-id)))
- (match (package-license package)
- ((? license? license)
- (list
- (list (license-name license)
- (license-uri license)
- (license-comment license))))
- ((values ...)
- (map (match-lambda
- ((? license? license)
- (list (license-name license)
- (license-uri license)
- (license-comment license)))
- (x
- (simple-format
- (current-error-port)
- "error: unknown license value ~A for package ~A"
- x package)
- '()))
- values))
- (x
- (simple-format
- (current-error-port)
- "error: unknown license value ~A for package ~A"
- x package)
- '()))))
- (list ,@(map inferior-package-id packages))))
+(define (inferior-packages->license-data inf)
+ (define proc
+ `(vector-map
+ (lambda (_ package)
+ (match (package-license package)
+ ((? license? license)
+ (list
+ (list (license-name license)
+ (license-uri license)
+ (license-comment license))))
+ ((values ...)
+ (map (match-lambda
+ ((? license? license)
+ (list (license-name license)
+ (license-uri license)
+ (license-comment license)))
+ (x
+ (simple-format
+ (current-error-port)
+ "error: unknown license value ~A for package ~A"
+ x package)
+ '()))
+ values))
+ (x
+ (simple-format
+ (current-error-port)
+ "error: unknown license value ~A for package ~A"
+ x package)
+ '())))
+ gds-inferior-packages))
(inferior-eval '(use-modules (guix licenses)) inf)
- (inferior-eval (proc packages) inf))
+ (inferior-eval proc inf))
(define (inferior-packages->license-id-lists conn license-data)
(define (string-or-null v)
diff --git a/guix-data-service/model/package-derivation.scm b/guix-data-service/model/package-derivation.scm
index 109e0f1..2008409 100644
--- a/guix-data-service/model/package-derivation.scm
+++ b/guix-data-service/model/package-derivation.scm
@@ -17,6 +17,7 @@
(define-module (guix-data-service model package-derivation)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-43)
#:use-module (ice-9 vlist)
#:use-module (ice-9 match)
#:use-module (squee)
@@ -26,17 +27,26 @@
count-packages-derivations-in-revision))
(define (insert-package-derivations conn
- package-ids-systems-and-targets
+ system
+ target
+ package-ids
derivation-ids)
+ (define system-id
+ (system->system-id conn system))
+
(define data-4-tuples
- (map (match-lambda*
- (((package-id system target) derivation-id)
- (list package-id
- derivation-id
- (system->system-id conn system)
- target)))
- package-ids-systems-and-targets
- derivation-ids))
+ (vector-fold
+ (lambda (_ result package-id derivation-id)
+ (if derivation-id
+ (cons (list package-id
+ derivation-id
+ system-id
+ target)
+ result)
+ result))
+ '()
+ package-ids
+ derivation-ids))
(if (null? data-4-tuples)
'()
diff --git a/guix-data-service/model/package.scm b/guix-data-service/model/package.scm
index 7ec2b09..263f46c 100644
--- a/guix-data-service/model/package.scm
+++ b/guix-data-service/model/package.scm
@@ -264,11 +264,12 @@ INSERT INTO packages (name, version, package_metadata_id) VALUES "
RETURNING id"))
(define (inferior-packages->package-ids conn package-entries)
- (insert-missing-data-and-return-all-ids
- conn
- "packages"
- '(name version package_metadata_id replacement_package_id)
- package-entries))
+ (list->vector
+ (insert-missing-data-and-return-all-ids
+ conn
+ "packages"
+ '(name version package_metadata_id replacement_package_id)
+ package-entries)))
(define (select-package-versions-for-revision conn
commit