2019-02-06 16:14:44 +00:00
|
|
|
(define-module (guix-data-service comparison)
|
|
|
|
|
#:use-module (srfi srfi-1)
|
|
|
|
|
#:use-module (srfi srfi-11)
|
|
|
|
|
#:use-module (ice-9 vlist)
|
|
|
|
|
#:use-module (ice-9 match)
|
|
|
|
|
#:use-module (squee)
|
2019-02-10 09:42:22 +00:00
|
|
|
#:use-module (guix-data-service model derivation)
|
2019-02-06 16:14:44 +00:00
|
|
|
#:export (package-data->package-data-vhashes
|
|
|
|
|
package-differences-data
|
2019-02-24 15:38:08 +00:00
|
|
|
package-data-vhash->derivations
|
2019-03-06 22:58:05 +00:00
|
|
|
package-data-vhash->derivations-and-build-status
|
2019-02-06 16:14:44 +00:00
|
|
|
package-data-vhashes->new-packages
|
|
|
|
|
package-data-vhashes->removed-packages
|
|
|
|
|
package-data-version-changes
|
2019-03-11 22:11:14 +00:00
|
|
|
package-data-derivation-changes))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
|
|
|
|
(define (package-differences-data conn base_guix_revision_id target_guix_revision_id)
|
|
|
|
|
(define query
|
2019-03-11 22:11:14 +00:00
|
|
|
"
|
|
|
|
|
WITH base_packages AS (
|
|
|
|
|
SELECT packages.*, derivations.file_name,
|
|
|
|
|
package_derivations.system, package_derivations.target
|
|
|
|
|
FROM packages
|
|
|
|
|
INNER JOIN package_derivations
|
|
|
|
|
ON packages.id = package_derivations.package_id
|
|
|
|
|
INNER JOIN derivations
|
|
|
|
|
ON package_derivations.derivation_id = derivations.id
|
|
|
|
|
WHERE package_derivations.id IN (
|
|
|
|
|
SELECT guix_revision_package_derivations.package_derivation_id
|
|
|
|
|
FROM guix_revision_package_derivations
|
|
|
|
|
WHERE revision_id = $1
|
|
|
|
|
)
|
2019-02-06 16:14:44 +00:00
|
|
|
), target_packages AS (
|
2019-03-11 22:11:14 +00:00
|
|
|
SELECT packages.*, derivations.file_name,
|
|
|
|
|
package_derivations.system, package_derivations.target
|
|
|
|
|
FROM packages
|
|
|
|
|
INNER JOIN package_derivations
|
|
|
|
|
ON packages.id = package_derivations.package_id
|
|
|
|
|
INNER JOIN derivations
|
|
|
|
|
ON package_derivations.derivation_id = derivations.id
|
|
|
|
|
WHERE package_derivations.id IN (
|
|
|
|
|
SELECT guix_revision_package_derivations.package_derivation_id
|
|
|
|
|
FROM guix_revision_package_derivations
|
|
|
|
|
WHERE revision_id = $2
|
|
|
|
|
)
|
2019-02-06 16:14:44 +00:00
|
|
|
)
|
2019-03-11 22:11:14 +00:00
|
|
|
SELECT base_packages.name, base_packages.version,
|
|
|
|
|
base_packages.package_metadata_id, base_packages.file_name,
|
|
|
|
|
base_packages.system, base_packages.target,
|
|
|
|
|
target_packages.name, target_packages.version,
|
|
|
|
|
target_packages.package_metadata_id, target_packages.file_name,
|
|
|
|
|
target_packages.system, target_packages.target
|
2019-02-06 16:14:44 +00:00
|
|
|
FROM base_packages
|
2019-03-11 22:11:14 +00:00
|
|
|
FULL OUTER JOIN target_packages
|
|
|
|
|
ON base_packages.name = target_packages.name
|
|
|
|
|
AND base_packages.version = target_packages.version
|
|
|
|
|
AND base_packages.system = target_packages.system
|
|
|
|
|
AND base_packages.target = target_packages.target
|
|
|
|
|
WHERE
|
|
|
|
|
base_packages.id IS NULL OR
|
|
|
|
|
target_packages.id IS NULL OR
|
|
|
|
|
base_packages.id != target_packages.id OR
|
|
|
|
|
base_packages.file_name != target_packages.file_name
|
|
|
|
|
ORDER BY base_packages.name DESC, base_packages.version, target_packages.name, target_packages.version")
|
2019-02-06 16:14:44 +00:00
|
|
|
|
|
|
|
|
(exec-query conn query (list base_guix_revision_id target_guix_revision_id)))
|
|
|
|
|
|
|
|
|
|
(define (package-data->package-data-vhashes package-data)
|
|
|
|
|
(define (add-data-to-vhash data vhash)
|
|
|
|
|
(let ((key (first data)))
|
|
|
|
|
(if (string-null? key)
|
|
|
|
|
vhash
|
|
|
|
|
(vhash-cons key
|
|
|
|
|
(drop data 1)
|
|
|
|
|
vhash))))
|
|
|
|
|
|
|
|
|
|
(apply values
|
|
|
|
|
(fold (lambda (row result)
|
2019-03-11 22:11:14 +00:00
|
|
|
(let-values (((base-row-part target-row-part) (split-at row 6)))
|
2019-02-06 16:14:44 +00:00
|
|
|
(match result
|
|
|
|
|
((base-package-data target-package-data)
|
|
|
|
|
(list (add-data-to-vhash base-row-part base-package-data)
|
|
|
|
|
(add-data-to-vhash target-row-part target-package-data))))))
|
|
|
|
|
(list vlist-null vlist-null)
|
|
|
|
|
package-data)))
|
|
|
|
|
|
2019-02-24 15:38:08 +00:00
|
|
|
(define (package-data-vhash->derivations conn packages-vhash)
|
2019-02-10 09:42:22 +00:00
|
|
|
(define (vhash->derivation-ids vhash)
|
|
|
|
|
(vhash-fold (lambda (key value result)
|
|
|
|
|
(cons (third value)
|
|
|
|
|
result))
|
|
|
|
|
'()
|
|
|
|
|
vhash))
|
|
|
|
|
|
|
|
|
|
(let* ((derivation-ids
|
2019-02-24 15:38:08 +00:00
|
|
|
(vhash->derivation-ids packages-vhash))
|
2019-02-10 09:42:22 +00:00
|
|
|
(derivation-data
|
|
|
|
|
(select-derivations-by-id conn derivation-ids)))
|
|
|
|
|
derivation-data))
|
|
|
|
|
|
2019-03-17 22:44:09 +00:00
|
|
|
(define (package-data-vhash->derivations-and-build-status conn packages-vhash
|
|
|
|
|
systems targets
|
|
|
|
|
build-statuses)
|
2019-03-11 22:11:14 +00:00
|
|
|
(define (vhash->derivation-file-names vhash)
|
2019-03-06 22:58:05 +00:00
|
|
|
(vhash-fold (lambda (key value result)
|
|
|
|
|
(cons (third value)
|
|
|
|
|
result))
|
|
|
|
|
'()
|
|
|
|
|
vhash))
|
|
|
|
|
|
2019-03-11 22:11:14 +00:00
|
|
|
(let* ((derivation-file-names
|
2019-03-24 11:59:44 +00:00
|
|
|
(vhash->derivation-file-names packages-vhash)))
|
|
|
|
|
(if (null? derivation-file-names)
|
|
|
|
|
'()
|
|
|
|
|
(select-derivations-and-build-status
|
|
|
|
|
conn
|
|
|
|
|
#:file-names derivation-file-names
|
|
|
|
|
#:systems (if (null? systems) #f systems)
|
|
|
|
|
#:targets (if (null? targets) #f targets)
|
|
|
|
|
#:build-statuses (if (null? build-statuses) #f build-statuses)))))
|
2019-03-06 22:58:05 +00:00
|
|
|
|
2019-03-24 17:35:19 +00:00
|
|
|
(define (package-data-vhash->package-name-and-version-hash-table vhash)
|
2019-02-06 16:14:44 +00:00
|
|
|
(vhash-fold (lambda (name details result)
|
2019-03-11 22:11:14 +00:00
|
|
|
(let ((key (cons name (first details))))
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-set! result
|
|
|
|
|
key
|
|
|
|
|
(cons (cdr details)
|
|
|
|
|
(or (hash-ref result key)
|
|
|
|
|
'())))
|
|
|
|
|
result))
|
|
|
|
|
(make-hash-table)
|
2019-02-06 16:14:44 +00:00
|
|
|
vhash))
|
|
|
|
|
|
|
|
|
|
(define (package-data-vhashes->new-packages base-packages-vhash target-packages-vhash)
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-map->list
|
|
|
|
|
(match-lambda*
|
2019-03-16 21:55:09 +00:00
|
|
|
(((name . version) metadata ...)
|
|
|
|
|
`((name . ,name)
|
|
|
|
|
(version . ,version))))
|
2019-03-24 17:35:19 +00:00
|
|
|
(package-data-vhash->package-name-and-version-hash-table
|
|
|
|
|
(vlist-filter (match-lambda
|
|
|
|
|
((name . details)
|
|
|
|
|
(not (vhash-assoc name base-packages-vhash))))
|
|
|
|
|
target-packages-vhash))))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
|
|
|
|
(define (package-data-vhashes->removed-packages base-packages-vhash target-packages-vhash)
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-map->list
|
|
|
|
|
(match-lambda*
|
2019-03-16 21:55:09 +00:00
|
|
|
(((name . version) metadata ...)
|
|
|
|
|
`((name . ,name)
|
|
|
|
|
(version . ,version))))
|
2019-03-24 17:35:19 +00:00
|
|
|
(package-data-vhash->package-name-and-version-hash-table
|
|
|
|
|
(vlist-filter (match-lambda
|
|
|
|
|
((name . details)
|
|
|
|
|
(not (vhash-assoc name target-packages-vhash))))
|
|
|
|
|
base-packages-vhash))))
|
|
|
|
|
|
|
|
|
|
(define (package-data-vhash->package-versions-hash-table package-data-vhash)
|
2019-03-11 22:11:14 +00:00
|
|
|
(define (system-and-target<? a b)
|
|
|
|
|
(if (string=? (car a) (car b))
|
|
|
|
|
(string<? (cdr a) (cdr b))
|
|
|
|
|
(string<? (car a) (car b))))
|
|
|
|
|
|
|
|
|
|
(define (add-version-system-and-target-to-alist alist data)
|
|
|
|
|
(match data
|
|
|
|
|
((version package-metadata-id derivation-id system target)
|
|
|
|
|
(let ((systems-for-version (or (and=> (assoc version alist) cdr)
|
|
|
|
|
'())))
|
|
|
|
|
`((,version . ,(sort (cons (cons system target)
|
|
|
|
|
systems-for-version)
|
|
|
|
|
system-and-target<?))
|
|
|
|
|
,@(alist-delete version alist))))))
|
|
|
|
|
|
2019-02-06 16:14:44 +00:00
|
|
|
(vhash-fold (lambda (name details result)
|
|
|
|
|
(let ((version (first details))
|
2019-03-24 17:35:19 +00:00
|
|
|
(known-versions (or (hash-ref result name)
|
2019-03-11 22:11:14 +00:00
|
|
|
'())))
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-set! result
|
|
|
|
|
name
|
|
|
|
|
(add-version-system-and-target-to-alist known-versions
|
|
|
|
|
details))
|
|
|
|
|
result))
|
|
|
|
|
(make-hash-table)
|
2019-02-06 16:14:44 +00:00
|
|
|
package-data-vhash))
|
|
|
|
|
|
|
|
|
|
(define (package-data-version-changes base-packages-vhash target-packages-vhash)
|
2019-03-24 17:35:19 +00:00
|
|
|
(let ((base-versions
|
|
|
|
|
(package-data-vhash->package-versions-hash-table
|
|
|
|
|
base-packages-vhash))
|
|
|
|
|
(target-versions
|
|
|
|
|
(package-data-vhash->package-versions-hash-table
|
|
|
|
|
target-packages-vhash)))
|
|
|
|
|
|
|
|
|
|
(hash-fold (lambda (name target-versions result)
|
|
|
|
|
(let ((base-versions (hash-ref base-versions name)))
|
|
|
|
|
(if base-versions
|
|
|
|
|
(let ((base-version-numbers (map car base-versions))
|
|
|
|
|
(target-version-numbers (map car target-versions)))
|
|
|
|
|
(if (equal? base-version-numbers target-version-numbers)
|
|
|
|
|
result
|
|
|
|
|
(cons
|
|
|
|
|
`(,name . ((base . ,(list->vector base-version-numbers))
|
|
|
|
|
(target . ,(list->vector target-version-numbers))))
|
|
|
|
|
result)))
|
|
|
|
|
result)))
|
|
|
|
|
'()
|
|
|
|
|
target-versions)))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
2019-03-11 22:11:14 +00:00
|
|
|
(define (package-data-derivation-changes base-packages-vhash target-packages-vhash)
|
2019-02-06 16:14:44 +00:00
|
|
|
(define base-package-details-by-name-and-version
|
2019-03-24 17:35:19 +00:00
|
|
|
(package-data-vhash->package-name-and-version-hash-table base-packages-vhash))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
|
|
|
|
(define target-package-details-by-name-and-version
|
2019-03-24 17:35:19 +00:00
|
|
|
(package-data-vhash->package-name-and-version-hash-table target-packages-vhash))
|
2019-02-06 16:14:44 +00:00
|
|
|
|
2019-03-11 22:11:14 +00:00
|
|
|
(define (derivation-system-and-target-list->alist lst)
|
|
|
|
|
(if (null? lst)
|
|
|
|
|
'()
|
2019-03-16 21:55:09 +00:00
|
|
|
`(,(match (first lst)
|
|
|
|
|
((derivation-file-name system target)
|
|
|
|
|
`((system . ,system)
|
|
|
|
|
(target . ,target)
|
|
|
|
|
(derivation-file-name . ,derivation-file-name))))
|
2019-03-11 22:11:14 +00:00
|
|
|
,@(derivation-system-and-target-list->alist (cdr lst)))))
|
|
|
|
|
|
2019-03-16 21:55:09 +00:00
|
|
|
(list->vector
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-fold
|
2019-03-16 21:55:09 +00:00
|
|
|
(lambda (name-and-version target-packages-entry result)
|
|
|
|
|
(let ((base-packages-entry
|
2019-03-24 17:35:19 +00:00
|
|
|
(hash-ref base-package-details-by-name-and-version
|
|
|
|
|
name-and-version)))
|
2019-03-16 21:55:09 +00:00
|
|
|
(if base-packages-entry
|
2019-03-24 17:35:19 +00:00
|
|
|
(let ((base-derivations (map cdr base-packages-entry))
|
2019-03-16 21:55:09 +00:00
|
|
|
(target-derivations (map cdr target-packages-entry)))
|
|
|
|
|
(if (equal? base-derivations target-derivations)
|
|
|
|
|
result
|
|
|
|
|
`(((name . ,(car name-and-version))
|
|
|
|
|
(version . ,(cdr name-and-version))
|
|
|
|
|
(base . ,(list->vector
|
|
|
|
|
(derivation-system-and-target-list->alist
|
|
|
|
|
base-derivations)))
|
|
|
|
|
(target . ,(list->vector
|
|
|
|
|
(derivation-system-and-target-list->alist
|
|
|
|
|
target-derivations))))
|
|
|
|
|
,@result)))
|
|
|
|
|
result)))
|
|
|
|
|
'()
|
|
|
|
|
target-package-details-by-name-and-version)))
|