~ chicken-core (chicken-5) 69e468de3432734b3725d9c979e2c89b7e736f20


commit 69e468de3432734b3725d9c979e2c89b7e736f20
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat May 7 14:12:52 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat May 7 14:12:52 2011 +0200

    chicken-install -reinstall

diff --git a/chicken-install.scm b/chicken-install.scm
index a7f43789..ce8d8039 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -66,10 +66,17 @@
   (define-constant +module-db+ "modules.db")
   (define-constant +defaults-file+ "setup.defaults")
 
+  (define-foreign-variable C_TARGET_LIB_HOME c-string)
+  (define-foreign-variable C_INSTALL_BIN_HOME c-string)
+  (define-foreign-variable C_TARGET_PREFIX c-string)
+  (define-foreign-variable C_BINARY_VERSION int)
+  (define-foreign-variable C_WINDOWS_SHELL bool)
+  (define-foreign-variable C_CSI_PROGRAM c-string)
+
   (define *program-path*
     (or (and-let* ((p (get-environment-variable "CHICKEN_PREFIX")))
           (make-pathname p "bin") )
-        (foreign-value "C_INSTALL_BIN_HOME" c-string) ) )
+        C_INSTALL_BIN_HOME))
 
   (define *keep* #f)
   (define *keep-existing* #f)
@@ -82,7 +89,7 @@
   (define *default-sources* '())
   (define *default-location* #f)
   (define *default-transport* 'http)
-  (define *windows-shell* (foreign-value "C_WINDOWS_SHELL" bool))
+  (define *windows-shell* C_WINDOWS_SHELL)
   (define *proxy-host* #f)
   (define *proxy-port* #f)
   (define *proxy-user-pass* #f)
@@ -100,12 +107,18 @@
   (define *debug-setup* #f)
   (define *keep-going* #f)
   (define *override* '())
+  (define *reinstall* #f)
+
+  (define (repo-path)
+    (if (and *cross-chicken* (not *host-extension*))
+	(make-pathname C_TARGET_LIB_HOME (sprintf "chicken/~a" C_BINARY_VERSION))
+	(repository-path)))
 
   (define (get-prefix #!optional runtime)
     (cond ((and *cross-chicken*
 		(not *host-extension*))
 	   (or (and (not runtime) *prefix*)
-	       (foreign-value "C_TARGET_PREFIX" c-string)))
+	       C_TARGET_PREFIX))
 	  (else *prefix*)))
 
   (define (load-defaults)
@@ -259,7 +272,7 @@
   (define *checked* '())
 
   (define *csi* 
-    (shellpath (make-pathname *program-path* (foreign-value "C_CSI_PROGRAM" c-string))))
+    (shellpath (make-pathname *program-path* C_CSI_PROGRAM)))
 
   (define (try-extension name version trans locn)
     (condition-case
@@ -631,6 +644,11 @@
       (unless (zero? r)
         (error "shell command terminated with nonzero exit code" r str))))
 
+  (define (installed-extensions)
+    (map (lambda (sf)
+	   (cons (pathname-file sf) (first (read-file sf))))
+	 (glob (make-pathname (repo-path) "*" "setup-info"))))
+
   (define (command fstr . args)
     (let ((cmd (apply sprintf fstr args)))
       (print "  " cmd)
@@ -682,6 +700,12 @@ EOF
                  (else
                   (set! *proxy-host* uri)
                   (set! *proxy-port* 80)))))))
+
+  (define (info->egg info)
+    (let ((version (assq 'version (cdr info))))
+      (if version
+	  (cons (car info) (->string (cadr version)))
+	  (car info))))
   
   (define *short-options* '(#\h #\k #\l #\t #\s #\p #\r #\n #\v #\i #\u #\D))
 
@@ -699,6 +723,17 @@ EOF
 		     (scan (scan-directory scan))
                      (else
 		      (let ((defaults (load-defaults)))
+			(when (null? eggs)
+			  (if *reinstall*
+			      (let ((egginfos (installed-extensions)))
+				(if (or *force*
+					(yes-or-no? 
+					 (sprintf
+					     "About to re-install all ~a currently installed extensions - do you want to proceed?"
+					   (length egginfos))
+					 abort: #f))
+				    (set! eggs (map info->egg egginfos))
+				    (exit 1)))))
 			(when (null? eggs)
 			  (let ((setups (glob "*.setup")))
 			    (cond ((pair? setups)
@@ -812,9 +847,12 @@ EOF
                         (unless (pair? (cdr args)) (usage 1))
 			(set! *override* (read-file (cadr args)))
 			(loop (cddr args) eggs))
-		       ((or (string=? "-x") (string=? "-keep-installed" arg))
+		       ((or (string=? "-x" arg) (string=? "-keep-installed" arg))
 			(set! *keep-existing* #t)
 			(loop (cdr args) eggs))
+		       ((string=? "-reinstall" arg)
+			(set! *reinstall* #t)
+			(loop (cdr args) eggs))
 		       ((string=? "-trunk" arg)
 			(set! *trunk* #t)
 			(loop (cdr args) eggs))
diff --git a/manual/Extensions b/manual/Extensions
index c0cb916f..f7a09139 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
 ; {{-x   -keep-installed}} : ignore those extensions given on the command line, that are already installed
+; {{-reinstall}} : reinstall all currently installed extensions, keeping the current versions, if possible
 ; {{-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
 
Trap