~ 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