~ chicken-core (chicken-5) 2f067cdb09f27a1086b97661cd7469e5caf848bd
commit 2f067cdb09f27a1086b97661cd7469e5caf848bd Author: Mario Domenech Goulart <mario.goulart@gmail.com> AuthorDate: Fri Dec 14 15:18:33 2012 -0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Dec 21 22:51:40 2012 +0100 chicken-status: add -eggs command line option Currently, chicken-status lists information about extensions. Eggs can contain one or more extensions. This patch adds a -eggs (or -e) command line option to chicken-status, so it can list eggs instead of extensions. It is possible to make eggs install multiple extensions with different versions. chicken-install only stores versions of extensions in the local repo. It does not store information about egg versions. Thus, this patch does not address egg versions, since chicken-status is unable to determine them. It simply lists egg names. (felix) removed reference to non-existent -dump option in error message. Signed-off-by: felix <felix@call-with-current-continuation.org> diff --git a/NEWS b/NEWS index 719b96d2..dd8de6fa 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,10 @@ - Fixed EINTR handling in process-wait and when reading from file ports. - Irregex is updated to 0.9.2, which includes bugfixes and faster submatches. +- Core tools + - chicken-status + - Added -eggs command line option to list installed eggs + 4.8.0 - Security fixes diff --git a/chicken-status.scm b/chicken-status.scm index 8872c1cb..cc0e89a6 100644 --- a/chicken-status.scm +++ b/chicken-status.scm @@ -48,13 +48,27 @@ (define (grep rx lst) (filter (cut irregex-search rx <>) lst)) - (define (gather-eggs patterns) - (let ((eggs (gather-all-eggs))) + (define (gather-extensions patterns) + (let ((extensions (gather-all-extensions))) (delete-duplicates - (concatenate (map (cut grep <> eggs) patterns)) + (concatenate (map (cut grep <> extensions) patterns)) string=?))) - (define (gather-all-eggs) + (define (gather-eggs patterns) + (define (egg-name extension) + (and-let* ((egg (assq 'egg-name (read-info extension (repo-path))))) + (cadr egg))) + (let loop ((eggs '()) + (extensions (gather-extensions patterns))) + (if (null? extensions) + eggs + (let ((egg (egg-name (car extensions)))) + (loop (if (and egg (not (member egg eggs))) + (cons egg eggs) + eggs) + (cdr extensions)))))) + + (define (gather-all-extensions) (map pathname-file (glob (make-pathname (repo-path) "*" "setup-info")))) (define (format-string str cols #!optional right (padc #\space)) @@ -75,39 +89,42 @@ (min default-width w))) default-width))))) - (define (list-installed-eggs eggs) + (define (list-installed-extensions extensions) (let ((w (quotient (- (get-terminal-width) 2) 2))) (for-each - (lambda (egg) - (let ((version (assq 'version (read-info egg (repo-path))))) + (lambda (extension) + (let ((version (assq 'version (read-info extension (repo-path))))) (if version (print - (format-string (string-append egg " ") w #f #\.) + (format-string (string-append extension " ") w #f #\.) (format-string (string-append " version: " (->string (cadr version))) w #t #\.)) - (print egg)))) - (sort eggs string<?)))) + (print extension)))) + (sort extensions string<?)))) - (define (list-installed-files eggs) + (define (list-installed-eggs eggs) + (for-each print eggs)) + + (define (list-installed-files extensions) (for-each print (sort (append-map - (lambda (egg) - (let ((files (assq 'files (read-info egg (repo-path))))) + (lambda (extension) + (let ((files (assq 'files (read-info extension (repo-path))))) (if files (cdr files) '()))) - eggs) + extensions) string<?))) (define (dump-installed-versions) (for-each - (lambda (egg) - (let ((version (assq 'version (read-info egg (repo-path))))) - (pp (list (string->symbol egg) (->string (and version (cadr version))))))) - (gather-all-eggs))) + (lambda (extension) + (let ((version (assq 'version (read-info extension (repo-path))))) + (pp (list (string->symbol extension) (->string (and version (cadr version))))))) + (gather-all-extensions))) (define (usage code) (print #<<EOF @@ -119,7 +136,8 @@ usage: chicken-status [OPTION | PATTERN] ... -exact treat PATTERN as exact match (not a pattern) -host when cross-compiling, show status of host extensions only -target when cross-compiling, show status of target extensions only - -list dump installed eggs and their versions in "override" format + -list dump installed extensions and their versions in "override" format + -e -eggs list installed eggs EOF );| (exit code)) @@ -128,33 +146,41 @@ EOF (define (main args) (let ((files #f) + (eggs #f) (dump #f) (exact #f)) (let loop ((args args) (pats '())) (if (null? args) - (let ((status - (lambda () - (let* ((patterns - (map - irregex - (cond ((null? pats) '(".*")) - (exact (map (lambda (p) - (string-append "^" (irregex-quote p) "$")) - pats)) - (else (map ##sys#glob->regexp pats))))) - (eggs (gather-eggs patterns))) - (if (null? eggs) - (print "(none)") - ((if files list-installed-files list-installed-eggs) - eggs)))))) - (cond (dump (dump-installed-versions)) - ((and *host-extensions* *target-extensions*) - (print "host at " (repo-path) ":\n") - (status) - (fluid-let ((*host-extensions* #f)) - (print "\ntarget at " (repo-path) ":\n") - (status))) - (else (status)))) + (if (and eggs (or dump files)) + (begin + (with-output-to-port (current-error-port) + (cut print "-eggs cannot be used with -list.")) + (exit 1)) + (let ((status + (lambda () + (let* ((patterns + (map + irregex + (cond ((null? pats) '(".*")) + (exact (map (lambda (p) + (string-append "^" (irregex-quote p) "$")) + pats)) + (else (map ##sys#glob->regexp pats))))) + (eggs/exts ((if eggs gather-eggs gather-extensions) patterns))) + (if (null? eggs/exts) + (print "(none)") + ((cond (eggs list-installed-eggs) + (files list-installed-files) + (else list-installed-extensions)) + eggs/exts)))))) + (cond (dump (dump-installed-versions)) + ((and *host-extensions* *target-extensions*) + (print "host at " (repo-path) ":\n") + (status) + (fluid-let ((*host-extensions* #f)) + (print "\ntarget at " (repo-path) ":\n") + (status))) + (else (status))))) (let ((arg (car args))) (cond ((or (string=? arg "-help") (string=? arg "-h") @@ -175,6 +201,9 @@ EOF ((or (string=? arg "-f") (string=? arg "-files")) (set! files #t) (loop (cdr args) pats)) + ((or (string=? arg "-e") (string=? arg "-eggs")) + (set! eggs #t) + (loop (cdr args) pats)) ((string=? arg "-version") (print (chicken-version)) (exit 0))Trap