summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/files.el10
-rw-r--r--test/lisp/files-tests.el8
2 files changed, 17 insertions, 1 deletions
diff --git a/lisp/files.el b/lisp/files.el
index b4872e46b01..204c26416a6 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -6915,7 +6915,15 @@ only these files will be asked to be saved."
(defun file-name-non-special (operation &rest arguments)
(let ((file-name-handler-alist nil)
(default-directory
- (if (eq operation 'insert-directory)
+ ;; Some operations respect file name handlers in
+ ;; `default-directory'. Because core function like
+ ;; `call-process' don't care about file name handlers in
+ ;; `default-directory', we here have to resolve the
+ ;; directory into a local one. For `process-file',
+ ;; `start-file-process', and `shell-command', this fixes
+ ;; Bug#25949.
+ (if (memq operation '(insert-directory process-file start-file-process
+ shell-command))
(directory-file-name
(expand-file-name
(unhandled-file-name-directory default-directory)))
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 9d456c512b0..80bbeb1bc54 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -243,5 +243,13 @@ be $HOME."
(concat "/:/:" subdir)))))
(delete-directory dir 'recursive))))
+(ert-deftest files-tests--file-name-non-special--subprocess ()
+ "Check that Bug#25949 is fixed."
+ (skip-unless (executable-find "true"))
+ (should (eq (let ((default-directory "/:/")) (process-file "true")) 0))
+ (should (processp (let ((default-directory "/:/"))
+ (start-file-process "foo" nil "true"))))
+ (should (eq (let ((default-directory "/:/")) (shell-command "true")) 0)))
+
(provide 'files-tests)
;;; files-tests.el ends here