aboutsummaryrefslogtreecommitdiff
path: root/pypi/sdist-store.scm
diff options
context:
space:
mode:
Diffstat (limited to 'pypi/sdist-store.scm')
-rw-r--r--pypi/sdist-store.scm190
1 files changed, 190 insertions, 0 deletions
diff --git a/pypi/sdist-store.scm b/pypi/sdist-store.scm
new file mode 100644
index 0000000..f1e0277
--- /dev/null
+++ b/pypi/sdist-store.scm
@@ -0,0 +1,190 @@
+(define-module (pypi sdist-store)
+ #:use-module (logging logger)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-13)
+ #:use-module (ice-9 vlist)
+ #:use-module (ice-9 match)
+ #:use-module (ice-9 hash-table)
+ #:use-module (ice-9 pretty-print)
+ #:use-module (guix ui)
+ #:use-module (guix packages)
+ #:use-module (guix build utils)
+ #:use-module (guix download)
+ #:use-module (pypi sdist)
+ #:use-module (pypi version)
+ #:use-module (pypi requirement)
+ #:export (make-sdist-store
+ add-sdist
+ add-sdists
+ get-sdist
+ get-sdists
+ get-sdist-list
+ get-sdists-by-version-meeting-requirement
+ get-sdist-best-matching-requirement
+ get-sdist-best-matching-requirements
+ store-can-satisfy-requirement?
+ log-sdist-store
+ create-sdists-module))
+
+(define (vhash-set key value vhash)
+ (vhash-cons
+ key
+ value
+ (vhash-delete
+ key
+ vhash)))
+
+(define (make-sdist-store)
+ vlist-null)
+
+(define (add-sdist store sd)
+ (let*
+ ((info (sdist-info sd))
+ (name (normalise-requirement-name (pkg-info-name info)))
+ (version (pkg-info-version info))
+ (versions
+ (vhash-assoc
+ (normalise-requirement-name name)
+ store)))
+ (vhash-set
+ name
+ (vhash-set
+ version
+ sd
+ (if versions
+ (cdr versions)
+ vlist-null))
+ store)))
+
+(define (log-sdist-store level sdist-store)
+ (for-each
+ (match-lambda
+ ((name . versions)
+ (log-msg level name ":")
+ (for-each
+ (match-lambda
+ ((version . sdist)
+ (log-msg level " " version)))
+ (vlist->list versions))))
+ (vlist->list sdist-store)))
+
+(define (add-sdists store sds)
+ (fold
+ (lambda (sd store)
+ (add-sdist store sd))
+ store
+ sds))
+
+(define (get-sdists store name) ; TODO: Change this, as it does not get sdists (instead it gets an alist)
+ (let
+ ((p
+ (vhash-assoc (normalise-requirement-name name) store)))
+ (if p
+ (vlist->list (cdr p))
+ '())))
+
+(define (get-sdists-by-version-meeting-requirement sdist-store requirement)
+ (filter
+ (match-lambda
+ ((version . sd)
+ (sdist-meets-requirement sd requirement)))
+ (get-sdists sdist-store (requirement-name requirement))))
+
+(define (get-sdist store name version)
+ (assoc-ref
+ (get-sdists store name)
+ version))
+
+(define (sort-version-alist al)
+ (let*
+ ((versions (map car al))
+ (sorted-versions (sort-versions versions)))
+ (map
+ (lambda (version)
+ (cons version (assoc-ref al version)))
+ sorted-versions)))
+
+
+(define (get-sdist-list store)
+ (apply
+ append
+ (map
+ cdr
+ (stable-sort
+ (vlist->list
+ (vlist-map
+ (match-lambda
+ ((name . versions)
+ (cons
+ name
+ (map cdr
+ (sort-version-alist
+ (vlist->list versions))))))
+ store))
+ (lambda (x y)
+ (string<? (car x) (car y)))))))
+
+
+(define (create-sdists-module store module path)
+ (call-with-output-file
+ path
+ (lambda (port)
+ (pretty-print
+ `(define-module ,module
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-13)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix build utils)
+ #:use-module (pypi sdist)
+ #:use-module (pypi requirement))
+ port)
+ (pretty-print
+ `(define-public
+ sdists
+ ,(append
+ '(list)
+ (map get-quoted-sdist (get-sdist-list store))))
+ port))))
+
+(define (store-can-satisfy-requirement? store r)
+ (get-sdist-best-matching-requirement store r))
+
+(define (get-sdist-best-matching-requirement store r)
+ (get-sdist-best-matching-requirements store (list r)))
+
+(define (get-sdist-best-matching-requirements store requirements)
+ (let*
+ ((unique-names
+ (apply
+ lset-adjoin
+ (append
+ (list equal? '())
+ (map (lambda (r) (normalise-requirement-name
+ (requirement-name r)))
+ requirements))))
+ (normalised-name (first unique-names)))
+ (if (not (eq? 1 (length unique-names)))
+ (error "Not all requirements are for the name package"
+ requirements))
+ (let ((sorted-suitable-versions
+ (let*
+ ((sdists (filter
+ (lambda (sd)
+ (every
+ (lambda (r)
+ (sdist-meets-requirement sd r))
+ requirements))
+ (map cdr (get-sdists store normalised-name))))
+ (sdists-and-versions
+ (map
+ (lambda (sd) (cons (pkg-info-version (sdist-info sd)) sd))
+ sdists))
+ (sorted-versions
+ (sort-versions (map car sdists-and-versions))))
+ (map
+ (lambda (v) (assoc-ref sdists-and-versions v))
+ sorted-versions))))
+ (if (> (length sorted-suitable-versions) 0)
+ (first sorted-suitable-versions)
+ #f))))