~ 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