unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
@ 2018-04-02 11:56 Simon Leinen
  2018-04-02 18:05 ` Michael Albinus
  0 siblings, 1 reply; 7+ messages in thread
From: Simon Leinen @ 2018-04-02 11:56 UTC (permalink / raw)
  To: 31022

From a drawin host, visit a file on a non-darwin remote host via tramp,
using C-x C-f /sshx:HOST:/DIR/FILE

From that buffer, try to visit another file on that same host, or simply
trigger file name completion by typing e.g. C-x C-f TAB

Instead of the desired result, you will see an error message such as

  tramp-file-name-handler: Lisp nesting exceeds ‘max-lisp-eval-depth’

(See below for analysis and a proposed patch.)

Using debug-on-quit, I obtained the following backtrace:

Debugger entered--Lisp error: (quit)
  signal(quit nil)
  tramp-file-name-handler(process-file "/bin/sh" nil #<buffer  *string-output*-55262> nil "-c" "getconf DARWIN_USER_TEMP_DIR")
  apply(tramp-file-name-handler process-file "/bin/sh" nil #<buffer  *string-output*-55262> nil ("-c" "getconf DARWIN_USER_TEMP_DIR"))
  process-file("/bin/sh" nil #<buffer  *string-output*-55262> nil "-c" "getconf DARWIN_USER_TEMP_DIR")
  apply(process-file "/bin/sh" nil #<buffer  *string-output*-55262> nil ("-c" "getconf DARWIN_USER_TEMP_DIR"))
  tramp-handle-shell-command("getconf DARWIN_USER_TEMP_DIR" t nil)
  apply(tramp-handle-shell-command ("getconf DARWIN_USER_TEMP_DIR" t nil))
  tramp-sh-file-name-handler(shell-command "getconf DARWIN_USER_TEMP_DIR" t nil)
  apply(tramp-sh-file-name-handler shell-command ("getconf DARWIN_USER_TEMP_DIR" t nil))
  tramp-file-name-handler(shell-command "getconf DARWIN_USER_TEMP_DIR" t nil)
  shell-command("getconf DARWIN_USER_TEMP_DIR" t)
  shell-command-to-string("getconf DARWIN_USER_TEMP_DIR")
  (progn (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR"))
  (condition-case nil (progn (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")) (error nil))
  (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR"))
  (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp))
  (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")
  (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))
  (file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp"))))
  eval((file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))))
  tramp-sh-handle-expand-file-name("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-handle-expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-sh-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-file-name-handler expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  file-directory-p("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'")
  (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)
  (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp))
  (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")
  (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))
  (file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp"))))
  eval((file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))))
  tramp-sh-handle-expand-file-name("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-handle-expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-sh-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-file-name-handler expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  file-directory-p("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'")
  (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)
  (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp))
  (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")
  (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))
  (file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp"))))
  eval((file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))))
  tramp-sh-handle-expand-file-name("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-handle-expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-sh-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  apply(tramp-sh-file-name-handler expand-file-name ("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/"))
  tramp-file-name-handler(expand-file-name "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'" "/sshx:unil0005:/var/log/ceph/")
  file-directory-p("getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'")
  (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)
  (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp))
  (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")
  (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))
  (file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp"))))
  eval((file-name-as-directory (cond ((memq system-type '(ms-dos windows-nt)) (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) ((eq system-type 'darwin) (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") (let ((tmp (ignore-errors (shell-command-to-string "getconf DARWIN_USER_TEMP_DIR")))) (and (stringp tmp) (setq tmp (replace-regexp-in-string "\n\\'" "" tmp)) (file-directory-p tmp) tmp)) "/tmp")) (t (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))))
  tramp-sh-handle-expand-file-name("/sshx:unil0005:/var/log/ceph" nil)
  apply(tramp-sh-handle-expand-file-name ("/sshx:unil0005:/var/log/ceph" nil))
  tramp-sh-file-name-handler(expand-file-name "/sshx:unil0005:/var/log/ceph" nil)
  apply(tramp-sh-file-name-handler expand-file-name ("/sshx:unil0005:/var/log/ceph" nil))
  tramp-file-name-handler(expand-file-name "/sshx:unil0005:/var/log/ceph" nil)
  expand-file-name("/sshx:unil0005:/var/log/ceph")
  tramp-handle-file-remote-p("/sshx:unil0005:/var/log/ceph" nil nil)
  apply(tramp-handle-file-remote-p ("/sshx:unil0005:/var/log/ceph" nil nil))
  tramp-sh-file-name-handler(file-remote-p "/sshx:unil0005:/var/log/ceph" nil nil)
  apply(tramp-sh-file-name-handler file-remote-p ("/sshx:unil0005:/var/log/ceph" nil nil))
  tramp-file-name-handler(file-remote-p "/sshx:unil0005:/var/log/ceph" nil nil)
  file-remote-p("/sshx:unil0005:/var/log/ceph")
  tramp-handle-substitute-in-file-name("/sshx:unil0005:/var/log/ceph")
  apply(tramp-handle-substitute-in-file-name "/sshx:unil0005:/var/log/ceph")
  tramp-sh-file-name-handler(substitute-in-file-name "/sshx:unil0005:/var/log/ceph")
  apply(tramp-sh-file-name-handler substitute-in-file-name "/sshx:unil0005:/var/log/ceph")
  tramp-file-name-handler(substitute-in-file-name "/sshx:unil0005:/var/log/ceph")
  substitute-in-file-name("/sshx:unil0005:/var/log/ceph")
  completion--sifn-requote(29 "/sshx:unil0005:/var/log/ceph/")
  completion--twq-try("/sshx:unil0005:/var/log/ceph/" "/sshx:unil0005:/var/log/ceph/" "/sshx:unil0005:/var/log/ceph/" 29 substitute-in-file-name completion--sifn-requote)
  #f(compiled-function (unquoted-result op) #<bytecode 0x42920bed>)(("/sshx:unil0005:/var/log/ceph/" . 29) 1)
  completion--nth-completion(1 "/sshx:unil0005:/var/log/ceph/" read-file-name-internal file-exists-p 29 (metadata (category . file) (completion--unquote-requote . t)))
  completion-try-completion("/sshx:unil0005:/var/log/ceph/" read-file-name-internal file-exists-p 29 (metadata (category . file) (completion--unquote-requote . t)))
  completion--do-completion(12 41)
  completion--in-region-1(12 41)
  #f(compiled-function (start end collection predicate) #<bytecode 0x410da4d3>)(12 41 read-file-name-internal file-exists-p)
  apply(#f(compiled-function (start end collection predicate) #<bytecode 0x410da4d3>) (12 41 read-file-name-internal file-exists-p))
  #f(compiled-function (funs global args) #<bytecode 0x40f1289d>)(nil nil (12 41 read-file-name-internal file-exists-p))
  completion--in-region(12 41 read-file-name-internal file-exists-p)
  completion-in-region(12 41 read-file-name-internal file-exists-p)
  minibuffer-complete()
  funcall-interactively(minibuffer-complete)
  call-interactively(minibuffer-complete nil nil)
  command-execute(minibuffer-complete)
  read-from-minibuffer("Find file: " "/sshx:unil0005:/var/log/ceph/" (keymap (keymap (32)) keymap (10 . minibuffer-complete-and-exit) (13 . minibuffer-complete-and-exit) keymap (menu-bar keymap (minibuf "Minibuf" keymap (tab menu-item "Complete" minibuffer-complete :help "Complete as far as possible") (space menu-item "Complete Word" minibuffer-complete-word :help "Complete at most one word") (63 menu-item "List Completions" minibuffer-completion-help :help "Display all possible completions") "Minibuf")) (27 keymap (118 . switch-to-completions)) (prior . switch-to-completions) (63 . minibuffer-completion-help) (32 . minibuffer-complete-word) (9 . minibuffer-complete) keymap (menu-bar keymap (minibuf "Minibuf" keymap (previous menu-item "Previous History Item" previous-history-element :help "Put previous minibuffer history element in the minibuffer") (next menu-item "Next History Item" next-history-element :help "Put next minibuffer history element in the minibuffer") (isearch-backward menu-item "Isearch History Backward" isearch-backward :help "Incrementally search minibuffer history backward") (isearch-forward menu-item "Isearch History Forward" isearch-forward :help "Incrementally search minibuffer history forward") (return menu-item "Enter" exit-minibuffer :key-sequence "\15" :help "Terminate input and exit minibuffer") (quit menu-item "Quit" abort-recursive-edit :help "Abort input and exit minibuffer") "Minibuf")) (10 . exit-minibuffer) (13 . exit-minibuffer) (7 . abort-recursive-edit) (C-tab . file-cache-minibuffer-complete) (9 . self-insert-command) (XF86Back . previous-history-element) (up . previous-line-or-history-element) (prior . previous-history-element) (XF86Forward . next-history-element) (down . next-line-or-history-element) (next . next-history-element) (27 keymap (114 . previous-matching-history-element) (115 . next-matching-history-element) (112 . previous-history-element) (110 . next-history-element))) nil file-name-history "/sshx:unil0005:/var/log/ceph/" nil)
  completing-read-default("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/sshx:unil0005:/var/log/ceph/" file-name-history "/sshx:unil0005:/var/log/ceph/" nil)
  completing-read("Find file: " read-file-name-internal file-exists-p confirm-after-completion "/sshx:unil0005:/var/log/ceph/" file-name-history "/sshx:unil0005:/var/log/ceph/")
  read-file-name-default("Find file: " nil "/sshx:unil0005:/var/log/ceph/" confirm-after-completion nil nil)
  read-file-name("Find file: " nil "/sshx:unil0005:/var/log/ceph/" confirm-after-completion)
  find-file-read-args("Find file: " confirm-after-completion)
  byte-code("\300\301\302 \"\207" [find-file-read-args "Find file: " confirm-nonexistent-file-or-buffer] 3)
  call-interactively(find-file nil nil)
  command-execute(find-file)

The problem here is that tramp ((TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY))
evaluates the standard value of TEMPORARY-FILE-DIRECTORY (defined in
cus-start.el), which calls SHELL-COMMAND-TO-STRING on the remote system,
and also FILE-DIRECTORY-P, which will be replaced by tramp's version on
the remote system.  My remote systems are GNU/Linux, not Darwin, and the
"getconf DARWIN_USER_TEMP_DIR" command returns

"getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'"

According to a comment in cus-start.el, the FILE-DIRECTORY-P should
handle that case:

				 ;; Handles "getconf: Unrecognized variable..."
				 (file-directory-p tmp)

...but in the remote case, FILE-DIRECTORY-P will end up recursively
calling TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY.

TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY can be fixed by disabling
TRAMP-MODE around its evaluation of the TEMPORARY-FILE-DIRECTORY
expression:

diff --git a/lisp/net/tramp-compat.el b/lisp/net/tramp-compat.el
index aa0c99bf9c..954e026fcd 100644
--- a/lisp/net/tramp-compat.el
+++ b/lisp/net/tramp-compat.el
@@ -50,12 +50,15 @@ tramp-compat-funcall
   `(when (functionp ,function)
      (with-no-warnings (funcall ,function ,@arguments))))
 
+(defvar tramp-mode)
+
 (defsubst tramp-compat-temporary-file-directory ()
   "Return name of directory for temporary files.
 It is the default value of `temporary-file-directory'."
   ;; We must return a local directory.  If it is remote, we could run
   ;; into an infloop.
-  (eval (car (get 'temporary-file-directory 'standard-value))))
+  (let ((tramp-mode nil))
+    (eval (car (get 'temporary-file-directory 'standard-value)))))
 
 (defsubst tramp-compat-make-temp-file (f &optional dir-flag)
   "Create a local temporary file (compat function).


This change is consistent with the comment in the function that says
that a local directory should always be returned.

I don't know whether the top-level (DEFVAR TRAMP-MODE) is the correct
idiom for making sure we bind the global variable TRAMP-MODE, which is
defined in another file using DEFCUSTOM.  Please advise.



In GNU Emacs 27.0.50 (build 9, x86_64-apple-darwin17.4.0, X toolkit, Xaw3d scroll bars)
 of 2018-04-02 built on macsl
Repository revision: 7228488effa78dcb75284cb6d247b24804e0e7f5
Windowing system distributor 'The X.Org Foundation', version 11.0.11804000
System Description:  Mac OS X 10.13.3

Recent messages:
Saving /Users/leinen/News/.newsrc.eld...done
nnimap read 0k from mail.ethz.ch
Processing kill file /Users/leinen/News/KILL...done
Saving file /Users/leinen/News/.newsrc...
Wrote /Users/leinen/News/.newsrc
Saving /Users/leinen/News/.newsrc.eld...
Saving file /Users/leinen/News/.newsrc.eld...
Wrote /Users/leinen/News/.newsrc.eld
Saving /Users/leinen/News/.newsrc.eld...done
(No changes need to be saved)

Configured using:
 'configure --verbose --with-x --with-x-toolkit=lucid --with-ns=no
 --without-makeinfo
 LIBXML2_CFLAGS=-I/usr/local/opt/libxml2/include/libxml2
 'LIBXML2_LIBS=-L/usr/local/opt/libxml2/lib -lxml2' --with-jpeg=no
 --with-gif=no --with-tiff=no --x-libraries=/usr/X11/lib
 --x-includes=/usr/X11/include --with-xpm=no
 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/X11/lib/pkgconfig:/usr/X11/share/pkgconfig'

Configured features:
XAW3D PNG RSVG DBUS GSETTINGS NOTIFY ACL GNUTLS LIBXML2 FREETYPE XFT
ZLIB TOOLKIT_SCROLL_BARS LUCID X11 THREADS JSON

Important settings:
  value of $LC_CTYPE: en_US.UTF-8
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Group

Minor modes in effect:
  gnus-undo-mode: t
  shell-dirtrack-mode: t
  auto-insert-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  temp-buffer-resize-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
/Users/leinen/.emacs.d/elpa/confluence-20151020.1828/confluence-edit hides /Users/leinen/.emacs.d/elpa/confluence-edit-20110609.1452/confluence-edit
/Users/leinen/.emacs.d/elpa/ruby-mode-20121202.2143/ruby-mode hides /Users/leinen/emacs/lisp/ruby-mode
/Users/leinen/.emacs.d/elpa/bbdb-20180330.2018/bbdb-anniv hides /Users/leinen/emacs/lisp/bbdb-anniv
/Users/leinen/.emacs.d/elpa/bbdb-20180330.2018/bbdb-pgp hides /Users/leinen/emacs/lisp/bbdb-pgp
/Users/leinen/.emacs.d/elpa/puppet-mode-20171220.2249/puppet-mode hides /Users/leinen/emacs/lisp/puppet-mode
/Users/leinen/.emacs.d/elpa/yang-mode-20180306.407/yang-mode hides /Users/leinen/emacs/lisp/yang-mode
/Users/leinen/.emacs.d/elpa/muse-3.20.2/httpd hides /Users/leinen/emacs/lisp/httpd
/Users/leinen/emacs/lisp/u-vm-color hides /usr/local/share/emacs/site-lisp/vm/u-vm-color
/Users/leinen/.emacs.d/elpa/svg-0.1/svg hides /usr/local/share/emacs/27.0.50/lisp/svg
/Users/leinen/emacs/lisp/mouse-copy hides /usr/local/share/emacs/27.0.50/lisp/mouse-copy
/Users/leinen/.emacs.d/elpa/ruby-mode-20121202.2143/ruby-mode hides /usr/local/share/emacs/27.0.50/lisp/progmodes/ruby-mode
/Users/leinen/.emacs.d/elpa/org-20180402/ob-stan hides /usr/local/share/emacs/27.0.50/lisp/org/ob-stan
/Users/leinen/.emacs.d/elpa/org-20180402/ob-exp hides /usr/local/share/emacs/27.0.50/lisp/org/ob-exp
/Users/leinen/.emacs.d/elpa/org-20180402/ob-J hides /usr/local/share/emacs/27.0.50/lisp/org/ob-J
/Users/leinen/.emacs.d/elpa/org-20180402/org-eshell hides /usr/local/share/emacs/27.0.50/lisp/org/org-eshell
/Users/leinen/.emacs.d/elpa/org-20180402/ob-emacs-lisp hides /usr/local/share/emacs/27.0.50/lisp/org/ob-emacs-lisp
/Users/leinen/.emacs.d/elpa/org-20180402/org-gnus hides /usr/local/share/emacs/27.0.50/lisp/org/org-gnus
/Users/leinen/.emacs.d/elpa/org-20180402/ob-css hides /usr/local/share/emacs/27.0.50/lisp/org/ob-css
/Users/leinen/.emacs.d/elpa/org-20180402/ob-lob hides /usr/local/share/emacs/27.0.50/lisp/org/ob-lob
/Users/leinen/.emacs.d/elpa/org-20180402/ob-forth hides /usr/local/share/emacs/27.0.50/lisp/org/ob-forth
/Users/leinen/.emacs.d/elpa/org-20180402/org-macs hides /usr/local/share/emacs/27.0.50/lisp/org/org-macs
/Users/leinen/.emacs.d/elpa/org-20180402/ob hides /usr/local/share/emacs/27.0.50/lisp/org/ob
/Users/leinen/.emacs.d/elpa/org-20180402/org-version hides /usr/local/share/emacs/27.0.50/lisp/org/org-version
/Users/leinen/.emacs.d/elpa/org-20180402/ob-scheme hides /usr/local/share/emacs/27.0.50/lisp/org/ob-scheme
/Users/leinen/.emacs.d/elpa/org-20180402/ox hides /usr/local/share/emacs/27.0.50/lisp/org/ox
/Users/leinen/.emacs.d/elpa/org-20180402/ob-abc hides /usr/local/share/emacs/27.0.50/lisp/org/ob-abc
/Users/leinen/.emacs.d/elpa/org-20180402/ob-C hides /usr/local/share/emacs/27.0.50/lisp/org/ob-C
/Users/leinen/.emacs.d/elpa/org-20180402/org-capture hides /usr/local/share/emacs/27.0.50/lisp/org/org-capture
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ref hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ref
/Users/leinen/.emacs.d/elpa/org-20180402/ob-clojure hides /usr/local/share/emacs/27.0.50/lisp/org/ob-clojure
/Users/leinen/.emacs.d/elpa/org-20180402/org-mouse hides /usr/local/share/emacs/27.0.50/lisp/org/org-mouse
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ledger hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ledger
/Users/leinen/.emacs.d/elpa/org-20180402/org-ctags hides /usr/local/share/emacs/27.0.50/lisp/org/org-ctags
/Users/leinen/.emacs.d/elpa/org-20180402/org-entities hides /usr/local/share/emacs/27.0.50/lisp/org/org-entities
/Users/leinen/.emacs.d/elpa/org-20180402/org-archive hides /usr/local/share/emacs/27.0.50/lisp/org/org-archive
/Users/leinen/.emacs.d/elpa/org-20180402/ob-screen hides /usr/local/share/emacs/27.0.50/lisp/org/ob-screen
/Users/leinen/.emacs.d/elpa/org-20180402/ob-haskell hides /usr/local/share/emacs/27.0.50/lisp/org/ob-haskell
/Users/leinen/.emacs.d/elpa/org-20180402/ob-asymptote hides /usr/local/share/emacs/27.0.50/lisp/org/ob-asymptote
/Users/leinen/.emacs.d/elpa/org-20180402/org-mhe hides /usr/local/share/emacs/27.0.50/lisp/org/org-mhe
/Users/leinen/.emacs.d/elpa/org-20180402/org-table hides /usr/local/share/emacs/27.0.50/lisp/org/org-table
/Users/leinen/.emacs.d/elpa/org-20180402/ob-keys hides /usr/local/share/emacs/27.0.50/lisp/org/ob-keys
/Users/leinen/.emacs.d/elpa/org-20180402/ox-org hides /usr/local/share/emacs/27.0.50/lisp/org/ox-org
/Users/leinen/.emacs.d/elpa/org-20180402/org-plot hides /usr/local/share/emacs/27.0.50/lisp/org/org-plot
/Users/leinen/.emacs.d/elpa/org-20180402/ob-awk hides /usr/local/share/emacs/27.0.50/lisp/org/ob-awk
/Users/leinen/.emacs.d/elpa/org-20180402/ob-groovy hides /usr/local/share/emacs/27.0.50/lisp/org/ob-groovy
/Users/leinen/.emacs.d/elpa/org-20180402/ob-octave hides /usr/local/share/emacs/27.0.50/lisp/org/ob-octave
/Users/leinen/.emacs.d/elpa/org-20180402/org-faces hides /usr/local/share/emacs/27.0.50/lisp/org/org-faces
/Users/leinen/.emacs.d/elpa/org-20180402/org-colview hides /usr/local/share/emacs/27.0.50/lisp/org/org-colview
/Users/leinen/.emacs.d/elpa/org-20180402/ob-R hides /usr/local/share/emacs/27.0.50/lisp/org/ob-R
/Users/leinen/.emacs.d/elpa/org-20180402/org-timer hides /usr/local/share/emacs/27.0.50/lisp/org/org-timer
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ebnf hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ebnf
/Users/leinen/.emacs.d/elpa/org-20180402/org-mobile hides /usr/local/share/emacs/27.0.50/lisp/org/org-mobile
/Users/leinen/.emacs.d/elpa/org-20180402/ob-fortran hides /usr/local/share/emacs/27.0.50/lisp/org/ob-fortran
/Users/leinen/.emacs.d/elpa/org-20180402/ob-shell hides /usr/local/share/emacs/27.0.50/lisp/org/ob-shell
/Users/leinen/.emacs.d/elpa/org-20180402/ob-perl hides /usr/local/share/emacs/27.0.50/lisp/org/ob-perl
/Users/leinen/.emacs.d/elpa/org-20180402/ob-sqlite hides /usr/local/share/emacs/27.0.50/lisp/org/ob-sqlite
/Users/leinen/.emacs.d/elpa/org-20180402/ob-sed hides /usr/local/share/emacs/27.0.50/lisp/org/ob-sed
/Users/leinen/.emacs.d/elpa/org-20180402/org-list hides /usr/local/share/emacs/27.0.50/lisp/org/org-list
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ruby hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ruby
/Users/leinen/.emacs.d/elpa/org-20180402/ob-eval hides /usr/local/share/emacs/27.0.50/lisp/org/ob-eval
/Users/leinen/.emacs.d/elpa/org-20180402/org-habit hides /usr/local/share/emacs/27.0.50/lisp/org/org-habit
/Users/leinen/.emacs.d/elpa/org-20180402/org-clock hides /usr/local/share/emacs/27.0.50/lisp/org/org-clock
/Users/leinen/.emacs.d/elpa/org-20180402/ox-html hides /usr/local/share/emacs/27.0.50/lisp/org/ox-html
/Users/leinen/.emacs.d/elpa/org-20180402/org-src hides /usr/local/share/emacs/27.0.50/lisp/org/org-src
/Users/leinen/.emacs.d/elpa/org-20180402/ob-lisp hides /usr/local/share/emacs/27.0.50/lisp/org/ob-lisp
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ditaa hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ditaa
/Users/leinen/.emacs.d/elpa/org-20180402/org-pcomplete hides /usr/local/share/emacs/27.0.50/lisp/org/org-pcomplete
/Users/leinen/.emacs.d/elpa/org-20180402/org-lint hides /usr/local/share/emacs/27.0.50/lisp/org/org-lint
/Users/leinen/.emacs.d/elpa/org-20180402/org-rmail hides /usr/local/share/emacs/27.0.50/lisp/org/org-rmail
/Users/leinen/.emacs.d/elpa/org-20180402/ox-latex hides /usr/local/share/emacs/27.0.50/lisp/org/ox-latex
/Users/leinen/.emacs.d/elpa/org-20180402/ob-sass hides /usr/local/share/emacs/27.0.50/lisp/org/ob-sass
/Users/leinen/.emacs.d/elpa/org-20180402/ob-io hides /usr/local/share/emacs/27.0.50/lisp/org/ob-io
/Users/leinen/.emacs.d/elpa/org-20180402/ob-tangle hides /usr/local/share/emacs/27.0.50/lisp/org/ob-tangle
/Users/leinen/.emacs.d/elpa/org-20180402/ob-calc hides /usr/local/share/emacs/27.0.50/lisp/org/ob-calc
/Users/leinen/.emacs.d/elpa/org-20180402/ob-java hides /usr/local/share/emacs/27.0.50/lisp/org/ob-java
/Users/leinen/.emacs.d/elpa/org-20180402/ox-icalendar hides /usr/local/share/emacs/27.0.50/lisp/org/ox-icalendar
/Users/leinen/.emacs.d/elpa/org-20180402/org-eww hides /usr/local/share/emacs/27.0.50/lisp/org/org-eww
/Users/leinen/.emacs.d/elpa/org-20180402/ox-md hides /usr/local/share/emacs/27.0.50/lisp/org/ox-md
/Users/leinen/.emacs.d/elpa/org-20180402/ox-beamer hides /usr/local/share/emacs/27.0.50/lisp/org/ox-beamer
/Users/leinen/.emacs.d/elpa/org-20180402/org-element hides /usr/local/share/emacs/27.0.50/lisp/org/org-element
/Users/leinen/.emacs.d/elpa/org-20180402/org-protocol hides /usr/local/share/emacs/27.0.50/lisp/org/org-protocol
/Users/leinen/.emacs.d/elpa/org-20180402/ob-mscgen hides /usr/local/share/emacs/27.0.50/lisp/org/ob-mscgen
/Users/leinen/.emacs.d/elpa/org-20180402/ob-gnuplot hides /usr/local/share/emacs/27.0.50/lisp/org/ob-gnuplot
/Users/leinen/.emacs.d/elpa/org-20180402/ob-latex hides /usr/local/share/emacs/27.0.50/lisp/org/ob-latex
/Users/leinen/.emacs.d/elpa/org-20180402/org-id hides /usr/local/share/emacs/27.0.50/lisp/org/org-id
/Users/leinen/.emacs.d/elpa/org-20180402/ob-vala hides /usr/local/share/emacs/27.0.50/lisp/org/ob-vala
/Users/leinen/.emacs.d/elpa/org-20180402/ox-man hides /usr/local/share/emacs/27.0.50/lisp/org/ox-man
/Users/leinen/.emacs.d/elpa/org-20180402/org-feed hides /usr/local/share/emacs/27.0.50/lisp/org/org-feed
/Users/leinen/.emacs.d/elpa/org-20180402/ob-lua hides /usr/local/share/emacs/27.0.50/lisp/org/ob-lua
/Users/leinen/.emacs.d/elpa/org-20180402/ob-table hides /usr/local/share/emacs/27.0.50/lisp/org/ob-table
/Users/leinen/.emacs.d/elpa/org-20180402/ob-ocaml hides /usr/local/share/emacs/27.0.50/lisp/org/ob-ocaml
/Users/leinen/.emacs.d/elpa/org-20180402/ob-coq hides /usr/local/share/emacs/27.0.50/lisp/org/ob-coq
/Users/leinen/.emacs.d/elpa/org-20180402/ob-picolisp hides /usr/local/share/emacs/27.0.50/lisp/org/ob-picolisp
/Users/leinen/.emacs.d/elpa/org-20180402/org-indent hides /usr/local/share/emacs/27.0.50/lisp/org/org-indent
/Users/leinen/.emacs.d/elpa/org-20180402/ob-lilypond hides /usr/local/share/emacs/27.0.50/lisp/org/ob-lilypond
/Users/leinen/.emacs.d/elpa/org-20180402/ob-matlab hides /usr/local/share/emacs/27.0.50/lisp/org/ob-matlab
/Users/leinen/.emacs.d/elpa/org-20180402/org-datetree hides /usr/local/share/emacs/27.0.50/lisp/org/org-datetree
/Users/leinen/.emacs.d/elpa/org-20180402/ob-python hides /usr/local/share/emacs/27.0.50/lisp/org/ob-python
/Users/leinen/.emacs.d/elpa/org-20180402/org-bbdb hides /usr/local/share/emacs/27.0.50/lisp/org/org-bbdb
/Users/leinen/.emacs.d/elpa/org-20180402/ob-makefile hides /usr/local/share/emacs/27.0.50/lisp/org/ob-makefile
/Users/leinen/.emacs.d/elpa/org-20180402/org-duration hides /usr/local/share/emacs/27.0.50/lisp/org/org-duration
/Users/leinen/.emacs.d/elpa/org-20180402/org-agenda hides /usr/local/share/emacs/27.0.50/lisp/org/org-agenda
/Users/leinen/.emacs.d/elpa/org-20180402/ob-dot hides /usr/local/share/emacs/27.0.50/lisp/org/ob-dot
/Users/leinen/.emacs.d/elpa/org-20180402/ob-js hides /usr/local/share/emacs/27.0.50/lisp/org/ob-js
/Users/leinen/.emacs.d/elpa/org-20180402/ox-publish hides /usr/local/share/emacs/27.0.50/lisp/org/ox-publish
/Users/leinen/.emacs.d/elpa/org-20180402/org-inlinetask hides /usr/local/share/emacs/27.0.50/lisp/org/org-inlinetask
/Users/leinen/.emacs.d/elpa/org-20180402/ob-org hides /usr/local/share/emacs/27.0.50/lisp/org/ob-org
/Users/leinen/.emacs.d/elpa/org-20180402/ob-core hides /usr/local/share/emacs/27.0.50/lisp/org/ob-core
/Users/leinen/.emacs.d/elpa/org-20180402/org-compat hides /usr/local/share/emacs/27.0.50/lisp/org/org-compat
/Users/leinen/.emacs.d/elpa/org-20180402/org-docview hides /usr/local/share/emacs/27.0.50/lisp/org/org-docview
/Users/leinen/.emacs.d/elpa/org-20180402/ox-odt hides /usr/local/share/emacs/27.0.50/lisp/org/ox-odt
/Users/leinen/.emacs.d/elpa/org-20180402/ob-plantuml hides /usr/local/share/emacs/27.0.50/lisp/org/ob-plantuml
/Users/leinen/.emacs.d/elpa/org-20180402/ox-ascii hides /usr/local/share/emacs/27.0.50/lisp/org/ox-ascii
/Users/leinen/.emacs.d/elpa/org-20180402/org-loaddefs hides /usr/local/share/emacs/27.0.50/lisp/org/org-loaddefs
/Users/leinen/.emacs.d/elpa/org-20180402/org-w3m hides /usr/local/share/emacs/27.0.50/lisp/org/org-w3m
/Users/leinen/.emacs.d/elpa/org-20180402/org-bibtex hides /usr/local/share/emacs/27.0.50/lisp/org/org-bibtex
/Users/leinen/.emacs.d/elpa/org-20180402/org-info hides /usr/local/share/emacs/27.0.50/lisp/org/org-info
/Users/leinen/.emacs.d/elpa/org-20180402/ob-hledger hides /usr/local/share/emacs/27.0.50/lisp/org/ob-hledger
/Users/leinen/.emacs.d/elpa/org-20180402/ob-maxima hides /usr/local/share/emacs/27.0.50/lisp/org/ob-maxima
/Users/leinen/.emacs.d/elpa/org-20180402/org hides /usr/local/share/emacs/27.0.50/lisp/org/org
/Users/leinen/.emacs.d/elpa/org-20180402/org-macro hides /usr/local/share/emacs/27.0.50/lisp/org/org-macro
/Users/leinen/.emacs.d/elpa/org-20180402/ob-sql hides /usr/local/share/emacs/27.0.50/lisp/org/ob-sql
/Users/leinen/.emacs.d/elpa/org-20180402/org-attach hides /usr/local/share/emacs/27.0.50/lisp/org/org-attach
/Users/leinen/.emacs.d/elpa/org-20180402/ob-processing hides /usr/local/share/emacs/27.0.50/lisp/org/ob-processing
/Users/leinen/.emacs.d/elpa/org-20180402/ox-texinfo hides /usr/local/share/emacs/27.0.50/lisp/org/ox-texinfo
/Users/leinen/.emacs.d/elpa/org-20180402/org-irc hides /usr/local/share/emacs/27.0.50/lisp/org/org-irc
/Users/leinen/.emacs.d/elpa/org-20180402/org-crypt hides /usr/local/share/emacs/27.0.50/lisp/org/org-crypt
/Users/leinen/.emacs.d/elpa/org-20180402/org-footnote hides /usr/local/share/emacs/27.0.50/lisp/org/org-footnote
/Users/leinen/.emacs.d/elpa/org-20180402/org-install hides /usr/local/share/emacs/27.0.50/lisp/org/org-install
/Users/leinen/.emacs.d/elpa/org-20180402/ob-comint hides /usr/local/share/emacs/27.0.50/lisp/org/ob-comint
/Users/leinen/.emacs.d/elpa/org-20180402/ob-shen hides /usr/local/share/emacs/27.0.50/lisp/org/ob-shen

Features:
(shadow warnings emacsbug vc-dispatcher m4-mode vc-filewise vc-rcs
html-mode html-helper-mode tempo sgml-mode gnus-draft url-http url-gw
url-auth url-queue url-cache url url-proxy url-privacy url-expand
url-methods url-history url-cookie url-domsuf flow-fill shr-color color
nroff-mode jka-compr files-x tramp-sh url-util shr svg xml dom mailalias
supercite regi nnir misearch multi-isearch sort gnus-cite mm-archive
gnus-bcklg gnus-async gnus-kill qp mail-extr gnus-ml disp-table nndraft
nnmh utf-7 nnml gnus-init dot-gnus-sa edmacro kmacro bbdb-gnus bbdb-mua
bbdb-com crm bbdb bbdb-site timezone epa-file network-stream nsm
starttls gnus-agent gnus-srvr gnus-score score-mode nnvirtual gnus-msg
gnus-art mm-uu mml2015 mm-view mml-smime smime dig mailcap nntp
gnus-cache gnus-sum gnus-group gnus-undo gnus-start gnus-cloud nnimap
nnmail mail-source tls gnutls netrc nnoo gnus-spec gnus-int gnus-range
message rmc puny dired dired-loaddefs rfc822 mml mml-sec epa mm-decode
mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader
gnus-win imenu elec-pair proof-site proof-autoloads pg-vars slime-mrepl
inferior-slime slime-fancy slime-trace-dialog slime-fontifying-fu
slime-package-fu slime-references slime-compiler-notes-tree
slime-scratch slime-presentations bridge slime-macrostep macrostep
slime-mdot-fu slime-enclosing-context slime-fuzzy slime-fancy-trace
slime-fancy-inspector slime-c-p-c slime-editing-commands slime-autodoc
slime-repl slime-parse slime compile etags xref project arc-mode
archive-mode noutline outline easy-mmode pp hyperspec thingatpt
browse-url finder-inf tex-site confluence-edit-autoloads docker-tramp
tramp-cache epoch-view-autoloads idle-highlight-autoloads gh-common
marshal eieio-compat logito-autoloads rx pod-mode-autoloads
rnc-mode-autoloads ruby-mode-autoloads slime-autoloads
windresize-autoloads info package let-alist derived pcase cl-extra
help-mode easymenu url-handlers url-parse url-vars epg epg-config subr-x
tramp trampver tramp-compat tramp-loaddefs ucs-normalize shell pcomplete
comint ansi-color ring parse-time format-spec advice avoid gnus nnheader
gnus-util rmail rmail-loaddefs time-date wid-edit autoinsert cus-start
cus-load solarized-light-theme solarized-definitions cl smtpmail
auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache json map seq byte-opt gv bytecomp byte-compile cconv
cl-loaddefs cl-lib sendmail rfc2047 rfc2045 ietf-drums mail-utils
timeclock vm-startup vm-search vm-edit vm-reply vm-mark vm-smime
vm-delete vm-digest vm-undo vm-page vm-virtual vm-summary-faces vm-pop
utf7 mm-util mail-prsvr vm-imap vm-thread vm-mime vm-motion vm-mouse
vm-toolbar vm-menu vm-window vm-crypto vm-summary vm-folder vm-minibuf
vm-misc vm-sort vm-autoloads vm-vars vm-version vm mule-util early-init
tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image
regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode
lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer
select scroll-bar mouse jit-lock font-lock syntax facemenu font-core
term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang
vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932
hebrew greek romanian slovak czech european ethiopic indian cyrillic
chinese composite charscript charprop case-table epa-hook jka-cmpr-hook
help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs
button faces cus-face macroexp files text-properties overlay sha1 md5
base64 format env code-pages mule custom widget hashtable-print-readable
backquote dbusbind kqueue dynamic-setting system-font-setting
font-render-setting x-toolkit x multi-tty make-network-process emacs)

Memory information:
((conses 16 778286 58414)
 (symbols 48 72192 17)
 (miscs 40 5684 1196)
 (strings 32 248834 19595)
 (string-bytes 1 6736383)
 (vectors 16 91150)
 (vector-slots 8 2290391 251626)
 (floats 8 471 798)
 (intervals 56 2321 850)
 (buffers 992 79))





^ permalink raw reply related	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-02 11:56 bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler Simon Leinen
@ 2018-04-02 18:05 ` Michael Albinus
  2018-04-02 20:43   ` Simon Leinen
  0 siblings, 1 reply; 7+ messages in thread
From: Michael Albinus @ 2018-04-02 18:05 UTC (permalink / raw)
  To: Simon Leinen; +Cc: 31022

[-- Attachment #1: Type: text/plain, Size: 1606 bytes --]

Simon Leinen <simon.leinen@switch.ch> writes:

Hi Simon,

Thanks for the bug report.

> From a drawin host, visit a file on a non-darwin remote host via tramp,
> using C-x C-f /sshx:HOST:/DIR/FILE
>
> From that buffer, try to visit another file on that same host, or simply
> trigger file name completion by typing e.g. C-x C-f TAB
>
> Instead of the desired result, you will see an error message such as
>
>   tramp-file-name-handler: Lisp nesting exceeds ‘max-lisp-eval-depth’
>
> The problem here is that tramp ((TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY))
> evaluates the standard value of TEMPORARY-FILE-DIRECTORY (defined in
> cus-start.el), which calls SHELL-COMMAND-TO-STRING on the remote system,
> and also FILE-DIRECTORY-P, which will be replaced by tramp's version on
> the remote system.  My remote systems are GNU/Linux, not Darwin, and the
> "getconf DARWIN_USER_TEMP_DIR" command returns
>
> "getconf: Unrecognized variable `DARWIN_USER_TEMP_DIR'"
>
> According to a comment in cus-start.el, the FILE-DIRECTORY-P should
> handle that case:
>
> 				 ;; Handles "getconf: Unrecognized variable..."
> 				 (file-directory-p tmp)
>
> ...but in the remote case, FILE-DIRECTORY-P will end up recursively
> calling TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY.
>
> TRAMP-COMPAT-TEMPORARY-FILE-DIRECTORY can be fixed by disabling
> TRAMP-MODE around its evaluation of the TEMPORARY-FILE-DIRECTORY
> expression:

That would be an option, yes. But I prefer to fix it at the place the
problem happens, in cus-start.el.

Does the following patch cures the problem?


[-- Attachment #2: Type: text/plain, Size: 661 bytes --]

diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 9ba1e105a1..f31d1df309 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -277,9 +277,10 @@ minibuffer-prompt-properties--setter
 		     ((eq system-type 'darwin)
 		      (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
 			  ;; See bug#7135.
-			  (let ((tmp (ignore-errors
-				       (shell-command-to-string
-					"getconf DARWIN_USER_TEMP_DIR"))))
+			  (let* (file-name-handler-alist
+				 (tmp (ignore-errors
+				        (shell-command-to-string
+					 "getconf DARWIN_USER_TEMP_DIR"))))
 			    (and (stringp tmp)
 				 (setq tmp (replace-regexp-in-string
 					    "\n\\'" "" tmp))

[-- Attachment #3: Type: text/plain, Size: 24 bytes --]


Best regards, Michael.

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-02 18:05 ` Michael Albinus
@ 2018-04-02 20:43   ` Simon Leinen
  2018-04-03  6:12     ` Michael Albinus
  0 siblings, 1 reply; 7+ messages in thread
From: Simon Leinen @ 2018-04-02 20:43 UTC (permalink / raw)
  To: Michael Albinus; +Cc: 31022

Michael Albinus writes:
> That would be an option, yes. But I prefer to fix it at the place the
> problem happens, in cus-start.el.

> Does the following patch cures the problem?

Yes it does.  I agree that this seems more thorough as a fix.

Thanks!
-- 
Simon.

> diff --git a/lisp/cus-start.el b/lisp/cus-start.el
> index 9ba1e105a1..f31d1df309 100644
> --- a/lisp/cus-start.el
> +++ b/lisp/cus-start.el
> @@ -277,9 +277,10 @@ minibuffer-prompt-properties--setter
>  		     ((eq system-type 'darwin)
>  		      (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP")
>  			  ;; See bug#7135.
> -			  (let ((tmp (ignore-errors
> -				       (shell-command-to-string
> -					"getconf DARWIN_USER_TEMP_DIR"))))
> +			  (let* (file-name-handler-alist
> +				 (tmp (ignore-errors
> +				        (shell-command-to-string
> +					 "getconf DARWIN_USER_TEMP_DIR"))))
>  			    (and (stringp tmp)
>  				 (setq tmp (replace-regexp-in-string
>  					    "\n\\'" "" tmp))





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-02 20:43   ` Simon Leinen
@ 2018-04-03  6:12     ` Michael Albinus
  2018-04-03  7:11       ` Eli Zaretskii
  2018-04-03  8:50       ` Simon Leinen
  0 siblings, 2 replies; 7+ messages in thread
From: Michael Albinus @ 2018-04-03  6:12 UTC (permalink / raw)
  To: Simon Leinen; +Cc: 31022

Simon Leinen <simon.leinen@switch.ch> writes:

Hi Simon,

>> That would be an option, yes. But I prefer to fix it at the place the
>> problem happens, in cus-start.el.
>
>> Does the following patch cures the problem?
>
> Yes it does.  I agree that this seems more thorough as a fix.

Thanks for confirmation.

This patch is such simple, that it could go into the emacs-26
branch. But I let it for Eli to decide.

> Thanks!

Best regards, Michael.





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-03  6:12     ` Michael Albinus
@ 2018-04-03  7:11       ` Eli Zaretskii
  2018-04-03  7:56         ` Michael Albinus
  2018-04-03  8:50       ` Simon Leinen
  1 sibling, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2018-04-03  7:11 UTC (permalink / raw)
  To: Michael Albinus; +Cc: 31022, simon.leinen

> From: Michael Albinus <michael.albinus@gmx.de>
> Date: Tue, 03 Apr 2018 08:12:17 +0200
> Cc: 31022@debbugs.gnu.org
> 
> >> Does the following patch cures the problem?
> >
> > Yes it does.  I agree that this seems more thorough as a fix.
> 
> Thanks for confirmation.
> 
> This patch is such simple, that it could go into the emacs-26
> branch. But I let it for Eli to decide.

It's okay to put this on the release branch.

Thanks.





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-03  7:11       ` Eli Zaretskii
@ 2018-04-03  7:56         ` Michael Albinus
  0 siblings, 0 replies; 7+ messages in thread
From: Michael Albinus @ 2018-04-03  7:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: simon.leinen, 31022-done

Version: 26.1

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Michael Albinus <michael.albinus@gmx.de>
>> Date: Tue, 03 Apr 2018 08:12:17 +0200
>> Cc: 31022@debbugs.gnu.org
>> 
>> >> Does the following patch cures the problem?
>> >
>> > Yes it does.  I agree that this seems more thorough as a fix.
>> 
>> Thanks for confirmation.
>> 
>> This patch is such simple, that it could go into the emacs-26
>> branch. But I let it for Eli to decide.
>
> It's okay to put this on the release branch.

Done. Closing the bug.

> Thanks.

Best regards, Michael.





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler
  2018-04-03  6:12     ` Michael Albinus
  2018-04-03  7:11       ` Eli Zaretskii
@ 2018-04-03  8:50       ` Simon Leinen
  1 sibling, 0 replies; 7+ messages in thread
From: Simon Leinen @ 2018-04-03  8:50 UTC (permalink / raw)
  To: Michael Albinus; +Cc: 31022

Hi Michael,

>>> That would be an option, yes. But I prefer to fix it at the place the
>>> problem happens, in cus-start.el.
>> 
>>> Does the following patch cures the problem?
>> 
>> Yes it does.  I agree that this seems more thorough as a fix.

> Thanks for confirmation.

> This patch is such simple, that it could go into the emacs-26
> branch. But I let it for Eli to decide.

Right. It would be good to have this in Emacs 26. For me it was the most
annoying regression I had in a while.

Best regards, and thanks again for your work!
-- 
Simon.





^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-04-03  8:50 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-02 11:56 bug#31022: 27.0.50; darwin: Infinite recursion in tramp-file-name-handler Simon Leinen
2018-04-02 18:05 ` Michael Albinus
2018-04-02 20:43   ` Simon Leinen
2018-04-03  6:12     ` Michael Albinus
2018-04-03  7:11       ` Eli Zaretskii
2018-04-03  7:56         ` Michael Albinus
2018-04-03  8:50       ` Simon Leinen

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).