~ chicken-core (chicken-5) afa2a403074c0fa166971d0e2f7dbf838f66e40a


commit afa2a403074c0fa166971d0e2f7dbf838f66e40a
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Jul 27 00:25:43 2010 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Tue Jul 27 00:25:43 2010 +0200

    -exact option for chicken-uninstall

diff --git a/chicken-uninstall.scm b/chicken-uninstall.scm
index fb232b13..8a074b4d 100644
--- a/chicken-uninstall.scm
+++ b/chicken-uninstall.scm
@@ -53,7 +53,8 @@
     (let ((eggs (map pathname-file 
 		     (glob (make-pathname (repo-path) "*" "setup-info")))))
       (delete-duplicates
-       (concatenate (map (cut grep <> eggs) patterns))
+       (concatenate 
+	(map (cut grep <> eggs) patterns))
        string=?)))
 
   (define (quit code)
@@ -96,48 +97,63 @@ usage: chicken-uninstall [OPTION | PATTERN] ...
   -h   -help                    show this message and exit
   -v   -version                 show version and exit
        -force                   don't ask, delete whatever matches
+       -exact                   treat PATTERN as exact match (not a pattern)
   -s   -sudo                    use sudo(1) for deleting files
        -host                    when cross-compiling, uninstall host extensions only
        -target                  when cross-compiling, uninstall target extensions only
 EOF
-);|
+);| (sic)
     (exit code))
 
   (define *short-options* '(#\h #\s))
 
   (define (main args)
-    (let loop ((args args) (pats '()))
-      (if (null? args)
-	  (uninstall (if (null? pats) (usage 1) (reverse pats)))
-	  (let ((arg (car args)))
-	    (cond ((or (string=? arg "-help") 
-		       (string=? arg "-h")
-		       (string=? arg "--help"))
-		   (usage 0))
-		  ((or (string=? arg "-v") (string=? arg "-version"))
-		   (print (chicken-version))
-		   (exit 0))
-		  ((string=? arg "-target")
-		   (set! *host-extensions* #f)
-		   (loop (cdr args) pats))
-		  ((string=? arg "-host")
-		   (set! *target-extensions* #f)
-		   (loop (cdr args) pats))
-		  ((string=? arg "-force")
-		   (set! *force* #t)
-		   (loop (cdr args) pats))
-		  ((or (string=? arg "-s") (string=? arg "-sudo"))
-		   (sudo-install #t)
-		   (loop (cdr args) pats))
-		  ((and (positive? (string-length arg))
-			(char=? #\- (string-ref arg 0)))
-		   (if (> (string-length arg) 2)
-		       (let ((sos (string->list (substring arg 1))))
-			 (if (every (cut memq <> *short-options*) sos)
-			     (loop (append (map (cut string #\- <>) sos) (cdr args)) pats)
-			     (usage 1)))
-		       (usage 1)))
-		  (else (loop (cdr args) (cons (glob->regexp arg) pats))))))))
+    (let ((exact #f))
+      (let loop ((args args) (pats '()))
+	(cond ((null? args)
+	       (when (null? pats) (usage 1))
+	       (uninstall
+		(reverse 
+		 (map
+		  (lambda (p)
+		    (if exact
+			(regexp (string-append "^" (regexp-escape p) "$"))
+			(glob->regexp p)))
+		  pats))))
+	      (else
+	       (let ((arg (car args)))
+		 (cond ((or (string=? arg "-help") 
+			    (string=? arg "-h")
+			    (string=? arg "--help"))
+			(usage 0))
+		       ((or (string=? arg "-v") (string=? arg "-version"))
+			(print (chicken-version))
+			(exit 0))
+		       ((string=? arg "-target")
+			(set! *host-extensions* #f)
+			(loop (cdr args) pats))
+		       ((string=? arg "-host")
+			(set! *target-extensions* #f)
+			(loop (cdr args) pats))
+		       ((string=? arg "-force")
+			(set! *force* #t)
+			(loop (cdr args) pats))
+		       ((string=? arg "-exact")
+			(set! exact #t)
+			(loop (cdr args) pats))
+		       ((or (string=? arg "-s") (string=? arg "-sudo"))
+			(sudo-install #t)
+			(loop (cdr args) pats))
+		       ((and (positive? (string-length arg))
+			     (char=? #\- (string-ref arg 0)))
+			(if (> (string-length arg) 2)
+			    (let ((sos (string->list (substring arg 1))))
+			      (if (every (cut memq <> *short-options*) sos)
+				  (loop
+				   (append (map (cut string #\- <>) sos) (cdr args)) pats)
+				  (usage 1)))
+			    (usage 1)))
+		       (else (loop (cdr args) (cons arg pats))))))))))
 
   (main (command-line-arguments))
   
diff --git a/manual/Extensions b/manual/Extensions
index e1aa4906..1a8882ca 100644
--- a/manual/Extensions
+++ b/manual/Extensions
@@ -597,7 +597,7 @@ Available options:
 ; {{-s   -sudo}} : use {{sudo(1)}} for deleting files
 ; {{-host}} : when cross-compiling, remove extensions for host system only
 ; {{-target}} : when cross-compiling, remove extensions for target system only
-
+; {{-exact}} : match extension-name exactly (do not match as pattern)
 
 === chicken-status reference
 
Trap