Subject: Re: bug#6136: Emerge doesn't handle file names with spaces on MS Windows

From: [email-masked]
Date: Sat, 06 Aug 2016 10:06:37 -0400

fixed 6136 23.3.90
quit

Was reported a second time
(http://article.gmane.org/gmane.emacs.help/80250) and then fixed by
576bce32 (2011-03-19 "Fix emerge.el on MS-Windows and MS-DOS...")

Eli Zaretskii <[email-masked]> writes:

> I think emerge-protect-metachars should simply use
> shell-quote-argument, on all platforms.  Then it won't need to
> distinguish between the different flavors, and it won't need to know
> which characters need protection, something that is shell-dependent
> and thus tricky even on Unix.

But the non-Windows case still uses emerge-metachars.  Should we make it
same on all platforms:

>From 7f960d1e91eb69ac14c55de2dc4a78adbf1274f1 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <[email-masked]>
Date: Sat, 6 Aug 2016 09:51:15 -0400
Subject: [PATCH v1] Make emerge always use shell-quote-argument

* lisp/vc/emerge.el (emerge-metachars): Obsolete.
(emerge-protect-metachars): Delete.
(emerge-make-diff-list, emerge-make-diff3-list): Replace all calls to
`emerge-protect-metachars' with `shell-quote-argument' so that shell
quoting is done the same on all system types (Bug #6136).  Also shell
quote `emerge-diff-program' and `emerge-diff3-program'.
---
 lisp/vc/emerge.el | 37 ++++++++++++-------------------------
 1 file changed, 12 insertions(+), 25 deletions(-)

diff --git a/lisp/vc/emerge.el b/lisp/vc/emerge.el
index de25cba..058b15c 100644
--- a/lisp/vc/emerge.el
+++ b/lisp/vc/emerge.el
@@ -621,9 +621,10 @@ emerge-make-diff-list
    (erase-buffer)
    (shell-command
     (format "%s %s %s %s"
-	    emerge-diff-program emerge-diff-options
-	    (emerge-protect-metachars file-A)
-	    (emerge-protect-metachars file-B))
+	    (shell-quote-argument emerge-diff-program)
+            emerge-diff-options
+	    (shell-quote-argument file-A)
+	    (shell-quote-argument file-B))
     t))
   (emerge-prepare-error-list emerge-diff-ok-lines-regexp)
   (emerge-convert-diffs-to-markers
@@ -792,10 +793,11 @@ emerge-make-diff3-list
    (erase-buffer)
    (shell-command
     (format "%s %s %s %s %s"
-	    emerge-diff3-program emerge-diff-options
-	    (emerge-protect-metachars file-A)
-	    (emerge-protect-metachars file-ancestor)
-	    (emerge-protect-metachars file-B))
+	    (shell-quote-argument emerge-diff3-program)
+            emerge-diff-options
+	    (shell-quote-argument file-A)
+	    (shell-quote-argument file-ancestor)
+	    (shell-quote-argument file-B))
     t))
   (emerge-prepare-error-list emerge-diff3-ok-lines-regexp)
   (emerge-convert-diffs-to-markers
@@ -3171,26 +3173,11 @@ emerge-unslashify-name
 
 ;; Metacharacters that have to be protected from the shell when executing
 ;; a diff/diff3 command.
-(defcustom emerge-metachars
-  (if (memq system-type '(ms-dos windows-nt))
-      "[ \t\"<>|?*^&=]"
-    "[ \t\n!\"#$&'()*;<=>?[\\^`{|~]")
-  "Characters that must be quoted when used in a shell command line.
-More precisely, a [...] regexp to match any one such character."
+(defcustom emerge-metachars nil
+  "Obsolete, emerge now uses `shell-quote-argument'."
   :type 'regexp
   :group 'emerge)
-
-;; Quote metacharacters (using \) when executing a diff/diff3 command.
-(defun emerge-protect-metachars (s)
-  (if (memq system-type '(ms-dos windows-nt))
-      (shell-quote-argument s)
-    (let ((limit 0))
-      (while (string-match emerge-metachars s limit)
-	(setq s (concat (substring s 0 (match-beginning 0))
-			"\\"
-			(substring s (match-beginning 0))))
-	(setq limit (1+ (match-end 0)))))
-    s))
+(make-obsolete-variable 'emerge-metachars nil "25.2")
 
 (provide 'emerge)
 
-- 
2.8.0