Subject: 24.4.90; tramp sets bad PAGER, commands which reference it fail
From: Richard Lowe <[email-masked]>
To: [email-masked]
Date: Sat, 14 Feb 2015 23:56:26 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

Change ae5602c51c721196922620b263a490137bba7fe0 "Backport Tramp changes
from trunk." contained a chunk like this:

diff --git a/lisp/net/tramp-sh.el b/lisp/net/tramp-sh.el
index 6f55b86..1976e0e 100644
--- a/lisp/net/tramp-sh.el
+++ b/lisp/net/tramp-sh.el
@@ -3967,15 +4076,22 @@ process to set up.  VEC specifies the connection."
   (let ((env (append (when (tramp-get-remote-locale vec) ; Discard `(nil)'.
 		       `(,(tramp-get-remote-locale vec)))
 		     (copy-sequence tramp-remote-process-environment)))
-	unset item)
+	unset vars item)
     (while env
       (setq item (tramp-compat-split-string (car env) "="))
       (setcdr item (mapconcat 'identity (cdr item) "="))
       (if (and (stringp (cdr item)) (not (string-equal (cdr item) "")))
-	  (tramp-send-command
-	   vec (format "%s=%s; export %s" (car item) (cdr item) (car item)) t)
+	  (push (format "%s %s" (car item) (cdr item)) vars)
 	(push (car item) unset))
       (setq env (cdr env)))
+    (when vars
+      (tramp-send-command
+       vec
+       (format "while read var val; do export $var=$val; done <<'%s'\n%s\n%s"
+	       tramp-end-of-heredoc
+	       (mapconcat 'identity vars "\n")
+	       tramp-end-of-heredoc)
+       t))
     (when unset
       (tramp-send-command
        vec (format "unset %s" (mapconcat 'identity unset " ")) t))))

Presumably this is tidying as part of:
    (tramp-open-connection-setup-interactive-shell):
    Prefer utf-8 coding.  (Bug#17859)

Where `tramp-remote-process-environment' by default contains
"PAGER=\"\"", after this change we will export into the remote
environment literally PAGER="\"\"" (that is it will be in the environment, with the
value "").  Since "" isn't an application, things which use the pager
will then fail, much as if you had done:

  $ PAGER="\"\"" git log

You can reproduce this by running emacs -Q, opening a dired on a remote
directory under git control (C-x C-d /somehost:/some/directory/in/git),
and trying to run 'git show' (M-! git show).  This will fail, saying:
  "": : command not found

It's not clear to me whether the change quoted above is somehow flawed,
or whether the setting of PAGER in `tramp-remote-process-environment' is
flawed.  I think the setting is to workaround the fact that if the RHS
of the assignment in `tramp-remote-process-environment' is empty, we
won't actually do anything (which seems a bit weird, given the number of
variables in there that will be ignored), and the new code quoted above
results in more faithfully quoting things, triggering the bug.

In GNU Emacs 24.4.90.1 (i386-apple-darwin14.0.0, NS apple-appkit-1343.16)
 of 2015-02-12 on quisling.home
Repository revision: ae5602c51c721196922620b263a490137bba7fe0
Windowing system distributor `Apple', version 10.3.1343
Configured using:
 `configure --with-ns --without-pop'

Important settings:
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  shell-dirtrack-mode: t
  tooltip-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
Tramp: Opening connection for metropolis using scp...
Tramp: Sending command `exec ssh   -o ControlMaster=auto -o ControlPath='tramp.%r@%h:%p' -o ControlPersist=no -e none metropolis'
Tramp: Waiting for prompts from remote shell...done
Tramp: Found remote shell prompt on `metropolis'
Tramp: Opening connection for metropolis using scp...done
ls does not support --dired; see `dired-use-ls-dired' for more details.
s-! is undefined
Quit

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rfc822 mml easymenu mml-sec
mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils
mailheader sendmail rfc2047 rfc2045 ietf-drums mail-utils tramp-cache
tramp-sh tramp tramp-compat auth-source eieio byte-opt bytecomp
byte-compile cl-extra cl-loaddefs cl-lib cconv eieio-core gnus-util
mm-util mail-prsvr password-cache tramp-loaddefs trampver shell
pcomplete comint ansi-color ring format-spec advice help-fns dired
time-date tooltip electric uniquify ediff-hook vc-hooks lisp-float-type
mwheel ns-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list newcomment lisp-mode prog-mode register page menu-bar
rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax
facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese
tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak
czech european ethiopic indian cyrillic chinese case-table epa-hook
jka-cmpr-hook help simple abbrev minibuffer 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 make-network-process cocoa ns multi-tty emacs)

Memory information:
((conses 16 101198 8658)
 (symbols 48 20448 0)
 (miscs 40 46 198)
 (strings 32 21041 5061)
 (string-bytes 1 641937)
 (vectors 16 13414)
 (vector-slots 8 420900 6141)
 (floats 8 81 271)
 (intervals 56 1073 223)
 (buffers 960 14))