~ chicken-core (chicken-5) 2f19b0100e30dfbd94db6a4f9283e751b82a1659
commit 2f19b0100e30dfbd94db6a4f9283e751b82a1659
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 11 23:39:55 2011 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 11 23:39:55 2011 +0200
handle OR dependencies in chicken-install
diff --git a/chicken-install.scm b/chicken-install.scm
index e6d692b1..527c5598 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -232,6 +232,55 @@
(deps 'needs meta)
(if *run-tests* (deps 'test-depends meta) '())))
+ (define (check-dependency dep)
+ (cond ((or (symbol? dep) (string? dep))
+ (values
+ (and (not (ext-version dep))
+ (->string dep))
+ #f))
+ ((and (list? dep) (eq? 'or (car dep)))
+ (let scan ((ordeps (cdr dep)) (bestm #f) (bestu #f))
+ (if (null? ordeps)
+ (values
+ (cond (bestu #f) ; upgrade overrides new
+ (bestm bestm)
+ (else #f))
+ bestu)
+ (let-values (((m u) (check-dependency (car ordeps))))
+ (if (and (not m) (not u))
+ (values #f #f)
+ (scan (cdr ordeps)
+ (if (and m (not bestm))
+ m
+ bestm)
+ (if (and u (not bestu))
+ u
+ bestu)))))))
+ ((and (list? dep) (= 2 (length dep))
+ (or (string? (car dep)) (symbol? (car dep))))
+ (let ((v (ext-version (car dep))))
+ (cond ((not v)
+ (values
+ (->string (car dep))
+ #f))
+ ((not (version>=? v (->string (cadr dep))))
+ (when (and (string=? "chicken" (->string (car dep)))
+ (not *force*))
+ (error
+ (string-append
+ "Your CHICKEN version is not recent enough to use this extension - version "
+ (cadr dep)
+ " or newer is required")))
+ (values
+ #f
+ (cons (->string (car dep)) (->string (cadr dep)))))
+ (else (values #f #f)))))
+ (else
+ (warning
+ "invalid dependency syntax in extension meta information"
+ dep)
+ (values #f #f))))
+
(define (outdated-dependencies meta)
(let ((ds (meta-dependencies meta)))
(let loop ((deps ds) (missing '()) (upgrade '()))
@@ -239,35 +288,10 @@
(values (reverse missing) (reverse upgrade))
(let ((dep (car deps))
(rest (cdr deps)))
- (cond ((or (symbol? dep) (string? dep))
- (loop rest
- (if (ext-version dep)
- missing
- (cons (->string dep) missing))
- upgrade))
- ((and (list? dep) (= 2 (length dep))
- (or (string? (car dep)) (symbol? (car dep))))
- (let ((v (ext-version (car dep))))
- (cond ((not v)
- (loop rest (cons (->string (car dep)) missing) upgrade))
- ((not (version>=? v (->string (cadr dep))))
- (when (and (string=? "chicken" (->string (car dep)))
- (not *force*))
- (error
- (string-append
- "Your CHICKEN version is not recent enough to use this extension - version "
- (cadr dep)
- " or newer is required")))
- (loop rest missing
- (alist-cons
- (->string (car dep)) (->string (cadr dep))
- upgrade)))
- (else (loop rest missing upgrade)))))
- (else
- (warning
- "invalid dependency syntax in extension meta information"
- dep)
- (loop rest missing upgrade))))))))
+ (let-values (((m u) (check-dependency dep)))
+ (loop rest
+ (if m (cons m missing) missing)
+ (if u (cons u upgrade) upgrade))))))))
(define *eggs+dirs+vers* '())
(define *dependencies* '())
Trap