Subject: 25.0.92; Tramp: Windows does not always set COMSPEC, tramp blows up in a string-match
From: Jerry Asher <[email-masked]>
To: [email-masked]
Date: Sat, 2 Apr 2016 09:06:57 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

--text follows this line--

I started the 64 bit version of windows emacs from a shortcut on my
taskbar. I
created the shortcut a few minutes ago by running emacs from the command
line, then pinning the shortcut. (There is a big caveat and I'll discuss
that at the end.)

Starting emacs up in restoring my desktop it loaded a python file. That
python file triggered python mode. Somewhere in there, ...

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  string-match("cmd\\.exe" nil)
  (if (string-match "cmd\\.exe" tramp-encoding-shell) "/c" "-c")
  eval((if (string-match "cmd\\.exe" tramp-encoding-shell) "/c" "-c"))
  custom-initialize-reset(tramp-encoding-command-switch (if (string-match
"cmd\\.exe" tramp-encoding-shell) "/c" "-c"))
  custom-declare-variable(tramp-encoding-command-switch (if (string-match
"cmd\\.exe" tramp-encoding-shell) "/c" "-c") "Use this switch together with
`tramp-encoding-shell' for local commands.\nSee the variable
`tramp-encoding-shell' for more information." :group tramp :type string)
  byte-code("\300\301!\210\302\303\304\305\306\307\306\310\311\312\313\314&
\210\315\316\317\320\306\303\321\322& \210\315\323\324\325\306\303\321\326&
\210\327\330!\203:

I believe the problem is in tramp.el which assumes that COMSPEC has been
set.

(defcustom tramp-encoding-shell
  (if (memq system-type '(windows-nt))
      (getenv "COMSPEC")
    "/bin/sh")

The problem is that Windows can sometimes (see caveat below) start emacs
such that COMSPEC is not defined.

I think perhaps a fix would be something along the lines of:

(defcustom tramp-encoding-shell
  (if (memq system-type '(windows-nt))
      (or (getenv "COMSPEC")
          (concat (getenv "systemroot") "\\system32\\cmd.exe"))
    "/bin/sh")

I'm not a windows developer, but it seems that modulo the systemroot, the
system32\cmd.exe path is always (?) the right path.

So here's the caveat, I have poked the emacs.exe image so that it does not
start as a console app, but so that it starts as a windows app. Now, I am
not a windows developer, I do not know that this is why COMSPEC has not
been set, but boy, it's got to be, right? ?

For more on how to poke the emacs.exe image to start as a windows app, see
here https://github.com/jerryasher/consoleAppToWin basically, doing so
seems to make both ntemacs and cygwin emacs run a bit nicer, and so far,
this is the only issue I've seen crop up.

Now, you might reasonably claim that since I am starting up emacs in a very
non-standard unsupported manner, the issue is totally mine and no fix is
necessary. And there is some logic to that.

Regardless, I would say the assumption that COMSPEC is always set and so
therefore if it fails it is okay to assign nil to tramp-encoding-shell
knowing that later on it will be in a string-match is problematic in and of
itself.

But I've seen other users report the basic cmd.exe tramp-encoding-shell
string match problem, see:

https://www.google.com/search?q=string-match%28
"cmd%5C%5C.exe"+nil%29+tramp-encoding-shell

I don't know that my fix would fix those issues as well, but those issues
point to a basic problem where tramp-encoding-shell is set to nil and then
later compared in string-match.

So why not assign tramp-encoding-shell a default that will probably work
instead?

Thanks,

Jerry Asher

In GNU Emacs 25.0.92.1 (x86_64-w64-mingw32)
 of 2016-03-03 built on KAEL
Windowing system distributor 'Microsoft Corp.', version 6.1.7601
Configured using:
 'configure --prefix=/tmp/emacs --without-imagemagick 'CFLAGS=-O2
 -fomit-frame-pointer -g0''

Configured features:
XPM JPEG TIFF GIF PNG RSVG SOUND DBUS NOTIFY ACL GNUTLS LIBXML2 ZLIB
TOOLKIT_SCROLL_BARS

Important settings:
  value of $LANG: ENU
  locale-coding-system: cp1252

Major mode: Emacs-Lisp

Minor modes in effect:
  diff-auto-refine-mode: t
  shell-dirtrack-mode: t
  display-time-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-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
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent messages:
Mark saved where search started
Mark set
nil
Auto-saving...
Unable to load color "peach"
Mark set [3 times]
Quit
Mark saved where search started [2 times]
Auto-saving...done
Unable to load color "peach" [2 times]

Load-path shadows:
c:/Users/Jerry/.emacs.d/user-library/loaddefs hides
c:/gnu/emacs-bin-w64-25.0.92-O2/emacs/share/emacs/25.0.92/lisp/loaddefs
c:/Users/Jerry/Dropbox/elpa/seq-2.15/seq hides
c:/gnu/emacs-bin-w64-25.0.92-O2/emacs/share/emacs/25.0.92/lisp/emacs-lisp/seq
c:/gnu/emacs-bin-w64-25.0.92-O2/emacs/share/emacs/25.0.92/lisp/emacs-lisp/cl-generic
hides c:/Users/Jerry/Dropbox/elpa/cl-generic-0.2/cl-generic

Features:
(shadow sort mail-extr emacsbug message rfc822 mml mml-sec epg mm-decode
mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader
sendmail rfc2047 rfc2045 ietf-drums mail-utils thingatpt find-or-tag
find-func dired-aux dired misearch multi-isearch vc vc-dispatcher vc-git
diff-mode easy-mmode warnings tramp-compat auth-source gnus-util mm-util
help-fns mail-prsvr password-cache tramp-loaddefs trampver ucs-normalize
shell pcomplete format-spec advice json map ido seq seq-25 grep compile
files-x etags xref project eieio byte-opt bytecomp byte-compile cl-extra
help-mode cconv eieio-core cus-edit wid-edit projectile-init
paredit-init package-sync-init nssh-mode-init neotree-init
multiple-cursor-init modeline-tweaks markdown-init magit-init
javascript-init find-or-tag-init expand-region-init edmacro kmacro
eldoc-init dired-init dev-requires desktop-init cygwin-init cygwin-mount
ange-ftp comint ansi-color ring basic-defuns.el cl-seq cl-macs gv
cl-loaddefs pcase cl-lib amazon-tweaks update-auto-loads utf-coding
required-libraries print-list key-bindings finder-inf slime-autoloads
info package easymenu epg-config time cus-start cus-load time-date
mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks
lisp-float-type mwheel dos-w32 ls-lisp disp-table w32-win w32-vars
term/common-win tool-bar dnd fontset image regexp-opt fringe
tabulated-list newcomment elisp-mode lisp-mode prog-mode register page
menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock
syntax facemenu font-core 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 charscript case-table epa-hook jka-cmpr-hook help
simple abbrev 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
w32notify dbusbind w32 multi-tty make-network-process emacs)

Memory information:
((conses 16 369391 18287)
 (symbols 56 30368 0)
 (miscs 48 160 430)
 (strings 32 54134 10687)
 (string-bytes 1 1555262)
 (vectors 16 45846)
 (vector-slots 8 806255 5532)
 (floats 8 306 365)
 (intervals 56 11467 2656)
 (buffers 976 28))