# HG changeset patch # User Kim F. Storm # Date 1156375382 0 # Node ID 35e43fe3d8ef0da98c4f490cefee24165f4df390 # Parent 9311249baae09317acd5411cf61f35fff3295bd4 (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. diff -r 9311249baae0 -r 35e43fe3d8ef lisp/progmodes/grep.el --- 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 %s " 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 %s " @@ -441,11 +449,13 @@ (cond ((eq grep-find-use-xargs 'gnu) (format "%s . -type f -print0 | xargs -0 -e %s" find-program gcmd)) - (grep-find-use-xargs + ((eq grep-find-use-xargs 'exec) + (format "%s . -type f -exec %s {} %s %s" + find-program gcmd null-device + (shell-quote-argument ";"))) + (t (format "%s . -type f -print | xargs %s" - find-program gcmd)) - (t (format "%s . -type 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