changeset 72500:35e43fe3d8ef

(grep-find-use-xargs): Use explicit value `exec' to mean "use find -exec"; nil now unambiguously means auto-detect. (grep-compute-defaults): Set grep-find-use-xargs to `exec' if not `gnu'. Use shell-quote-argument to build grep-find-command and grep-find-template. (rgrep): Use shell-quote-argument to properly quote arguments to find. Reported by Tom Seddon.
author Kim F. Storm <storm@cua.dk>
date Wed, 23 Aug 2006 23:23:02 +0000
parents 9311249baae0
children 645850634432
files lisp/progmodes/grep.el
diffstat 1 files changed, 38 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/progmodes/grep.el	Wed Aug 23 23:22:53 2006 +0000
+++ b/lisp/progmodes/grep.el	Wed Aug 23 23:23:02 2006 +0000
@@ -335,7 +335,7 @@
 (defvar grep-find-use-xargs nil
   "Whether \\[grep-find] uses the `xargs' utility by default.
 
-If nil, it uses `find -exec'; if `gnu', it uses `find -print0' and `xargs -0';
+If `exec', it uses `find -exec'; if `gnu', it uses `find -print0' and `xargs -0';
 if not nil and not `gnu', it uses `find -print' and `xargs'.
 
 This variable's value takes effect when `grep-compute-defaults' is called.")
@@ -419,21 +419,29 @@
 	      (format "%s <C> %s <R> <F>" grep-program grep-options)))
       (unless grep-find-use-xargs
 	(setq grep-find-use-xargs
-	      (if (and
-		   (grep-probe find-program `(nil nil nil ,null-device "-print0"))
-		   (grep-probe "xargs" `(nil nil nil "-0" "-e" "echo")))
-		  'gnu)))
+	      (cond
+	       ((and
+		 (grep-probe find-program `(nil nil nil ,null-device "-print0"))
+		 (grep-probe "xargs" `(nil nil nil "-0" "-e" "echo")))
+		'gnu)
+	       (t
+		'exec))))
       (unless grep-find-command
 	(setq grep-find-command
 	      (cond ((eq grep-find-use-xargs 'gnu)
 		     (format "%s . -type f -print0 | xargs -0 -e %s"
 			     find-program grep-command))
-		    (grep-find-use-xargs
+		    ((eq grep-find-use-xargs 'exec)
+		     (let ((cmd0 (format "%s . -type f -exec %s"
+					 find-program grep-command)))
+		       (cons
+			(format "%s {} %s %s"
+				cmd0 null-device
+				(shell-quote-argument ";"))
+			(1+ (length cmd0)))))
+		    (t
 		     (format "%s . -type f -print | xargs %s"
-			     find-program grep-command))
-		    (t (cons (format "%s . -type f -exec %s {} %s \\;"
-				     find-program grep-command null-device)
-			     (+ 22 (length grep-command)))))))
+			     find-program grep-command)))))
       (unless grep-find-template
 	(setq grep-find-template
 	      (let ((gcmd (format "%s <C> %s <R>"
@@ -441,11 +449,13 @@
 		(cond ((eq grep-find-use-xargs 'gnu)
 		       (format "%s . <X> -type f <F> -print0 | xargs -0 -e %s"
 			       find-program gcmd))
-		      (grep-find-use-xargs
+		      ((eq grep-find-use-xargs 'exec)
+		       (format "%s . <X> -type f <F> -exec %s {} %s %s"
+			       find-program gcmd null-device
+			       (shell-quote-argument ";")))
+		      (t
 		       (format "%s . <X> -type f <F> -print | xargs %s"
-			       find-program gcmd))
-		      (t (format "%s . <X> -type f <F> -exec %s {} %s \\;"
-				 find-program gcmd null-device))))))))
+			       find-program gcmd))))))))
   (unless (or (not grep-highlight-matches) (eq grep-highlight-matches t))
     (setq grep-highlight-matches
 	  (with-temp-buffer
@@ -736,18 +746,26 @@
       (let ((command (grep-expand-template
 		      grep-find-template
 		      regexp
-		      (concat "\\( -name "
+		      (concat (shell-quote-argument "(")
+			      " -name "
 			      (mapconcat #'shell-quote-argument
 					 (split-string files)
 					 " -o -name ")
-			      " \\)")
+			      " "
+			      (shell-quote-argument ")"))
 		       dir
 		       (and grep-find-ignored-directories
-			    (concat "\\( -path '*/"
-				    (mapconcat #'identity
+			    (concat (shell-quote-argument "(")
+				    ;; we should use shell-quote-argument here
+				    " -path "
+				    (mapconcat #'(lambda (dir)
+						   (shell-quote-argument
+						    (concat "*/" dir)))
 					       grep-find-ignored-directories
-					       "' -o -path '*/")
-				    "' \\) -prune -o ")))))
+					       " -o -path ")
+				    " "
+				    (shell-quote-argument ")")
+				    " -prune -o ")))))
 	(when command
 	  (if current-prefix-arg
 	      (setq command