~ chicken-core (chicken-5) c1738c6caba83b0b8f6f102a35ab48a309435e54


commit c1738c6caba83b0b8f6f102a35ab48a309435e54
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Apr 21 22:25:43 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Apr 21 22:25:43 2011 +0200

    chicken-install -override

diff --git a/chicken-install.scm b/chicken-install.scm
index dbca988e..c55cfc88 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -98,6 +98,7 @@
   (define *target-extension* *cross-chicken*)
   (define *debug-setup* #f)
   (define *keep-going* #f)
+  (define *override* '())
 
   (define (get-prefix #!optional runtime)
     (cond ((and *cross-chicken*
@@ -150,6 +151,11 @@
 				 (cons (car a) (cadr a))
 				 (broken x)))
 			   (cdr x)))))
+		  ((override)
+		   (set! *override* 
+		     (if (and (pair? (cdr x)) (string? (cadr x)))
+			 (read-file (cadr x))
+			 (cdr x))))
 		  (else (broken x))))
 	      (read-file deff))))
       (pair? *default-sources*) ))
@@ -304,15 +310,36 @@
       (list "The following installed extensions are outdated, because `"
             (car e+d+v)
             "' requires later versions:\n")
-      (map
+      (filter-map
        (lambda (e)
-         (conc
-          "  " (car e)
-          " (" (let ([v (assq 'version (extension-information (car e)))]) (if v (cadr v) "???"))
-               " -> " (cdr e) ")"
-          #\newline) )
-       upgrade)
-      '("\nDo you want to replace the existing extensions?"))) )
+	 (cond ((assq (string->symbol (car e)) *override*) =>
+		(lambda (a)
+		  (unless (equal? (cadr a) (cdr e))
+		    (warning
+		     (sprintf "version `~a' of extension `~a' overrides required version `~a'"
+		       (cadr a) (car a) (cdr e))))
+		  #f))
+	       (else
+		(conc
+		 "  " (car e)
+		 " (" (let ((v (assq 'version (extension-information (car e))))) 
+			(if v (cadr v) "???"))
+		 " -> " (cdr e) ")"
+		 #\newline) )
+	       upgrade)
+	 '("\nDo you want to replace the existing extensions?"))) )))
+
+  (define (override-version egg)
+    (let ((name (string->symbol (if (pair? egg) (car egg) egg))))
+      (cond ((assq name *override*) =>
+	     (lambda (a)
+	       (when (and (pair? egg) (not (equal? (cadr a) (cdr egg))))
+		 (warning
+		  (sprintf "version `~a' of extension `~a' overrides explicitly given version `~a'"
+		    (cadr a) name (cdr egg))))
+	       (cadr a)))
+	    ((pair? egg) (cdr egg))
+	    (else #f))))
 
   (define (retrieve eggs)
     (print "retrieving ...")
@@ -323,9 +350,9 @@
                 ;; push to front
                 (set! *eggs+dirs+vers* (cons a (delete a *eggs+dirs+vers* eq?))) ) ]
              [else
-              (let ([name (if (pair? egg) (car egg) egg)]
-                    [version (and (pair? egg) (cdr egg))])
-                (let-values ([(dir ver) (try-default-sources name version)])
+              (let ((name (if (pair? egg) (car egg) egg))
+                    (version (override-version egg)))
+                (let-values (((dir ver) (try-default-sources name version)))
                   (unless dir (error "extension or version not found"))
                   (print " " name " located at " dir)
                   (set! *eggs+dirs+vers* (cons (list name dir ver) *eggs+dirs+vers*)) ) ) ] ) )
@@ -335,13 +362,13 @@
        (lambda (e+d+v)
          (unless (member (car e+d+v) *checked*)
            (set! *checked* (cons (car e+d+v) *checked*))
-           (let ([mfile (make-pathname (cadr e+d+v) (car e+d+v) "meta")])
+           (let ((mfile (make-pathname (cadr e+d+v) (car e+d+v) "meta")))
              (cond [(file-exists? mfile)
-                    (let ([meta (with-input-from-file mfile read)])
+                    (let ((meta (with-input-from-file mfile read)))
 		      (print "checking platform for `" (car e+d+v) "' ...")
 		      (check-platform (car e+d+v) meta)
                       (print "checking dependencies for `" (car e+d+v) "' ...")
-                      (let-values ([(missing upgrade) (outdated-dependencies meta)])
+                      (let-values (((missing upgrade) (outdated-dependencies meta)))
 			(set! missing (apply-mappings missing)) ;XXX only missing - wrong?
 			(set! *dependencies*
 			  (cons
@@ -627,6 +654,7 @@ usage: chicken-install [OPTION | EXTENSION[:VERSION]] ...
        -debug                   enable full display of error message information
        -keep-going              continue installation even if dependency fails
        -scan DIRECTORY          scan local directory for highest available egg versions
+       -override FILENAME       override versions for installed eggs with information from file
 EOF
 );|
     (exit code))
@@ -768,6 +796,10 @@ EOF
                         (unless (pair? (cdr args)) (usage 1))
 			(set! scan (cadr args))
 			(loop (cddr args) eggs))
+		       ((string=? "-override" arg)
+                        (unless (pair? (cdr args)) (usage 1))
+			(set! *override* (read-file (cadr args)))
+			(loop (cddr args) eggs))			
 		       ((string=? "-trunk" arg)
 			(set! *trunk* #t)
 			(loop (cdr args) eggs))
diff --git a/manual/Extensions b/manual/Extensions
index 67b81b5b..52cb3b07 100644
--- a/manual/Extensions
+++ b/manual/Extensions
@@ -568,6 +568,7 @@ Available options:
 ; {{-debug}} : print full call-trace when encountering errors in the setup script
 ; {{-keep-going}} : continue installation, even if a dependency fails
 ; {{-scan DIRECTORY}} : scan local egg source repository or highest available versions
+; {{-override FILENAME}} : override versions for installed eggs with information given in {{FILENAME}}, which can be generated by {{-scan}} or by the {{-list}} option of the {{chicken-status}} program
 
 {{chicken-install}} recognizes the {{http_proxy}} environment variable, if set.
 
Trap