Subject: bug#14541: 24.3.50; `ediff-buffers' does not play well with recent Cygwin version

From: Drew Adams <[email-masked]>
Date: Sun, 2 Jun 2013 21:12:40 -0700 (PDT)

I used to use an old (2007?) version of Cygwin.  I just
installed the latest Cygwin verion on Windows 7.  I use the same setup
for Emacs as previously (cygwin-mount.el, then setup-cygwin.el, both
from Emacs Wiki).

Previously, Cygwin handled MS DOS-style file names OK.
But `ediff-buffers' passes such file names for its temporary files,
and the latest version of Cygwin (on Windows 7 at least) does not,
by default, handle such file names: it issues a warning, which means
that Emacs raises an error and prints the Cygwin warning.

This makes `ediff-buffers' unusable.  There is a workaround: set env var
CYGWIN to `nodosfilewarning'.  I have added that to file setup-cygwin.el
as a workaround.

But I wonder if `ediff-buffers' could perhaps prevent the error/warning
anyway.  I don't know whether it is really the 8-char DOS file-name
format that Cygwin objects to, but I think so.  Maybe just having it
use full Windows (not DOS) file names would be a fix?

This is the error shown in buffer *ediff-errors*:

cygwin warning:
  MS-DOS style path detected: c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/foo.el
  Preferred POSIX equivalent is: /cygdrive/c/Users/XXXXXX~1.XXX/AppData/Local/Temp/foo.el
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames

And this is the *Backtrace* I see:

Debugger entered--Lisp error:
(error "Errors in diff output.  Diff output is in #<buffer *ediff-diff*>")
  signal(error ("Errors in diff output.  Diff output is in #<buffer *ediff-diff*>"))
  error("Errors in diff output.  Diff output is in %S" #<buffer *ediff-diff*>)
  ediff-prepare-error-list("^\\([0-9,]+[acd][0-9,]+
?$\\|[<>] \\|---\\|.*Warning *:\\|.*No +newline\\|.*missing +newline\\|^
?$\\)" #<buffer *ediff-diff*>)
  ediff-setup-diff-regions("c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/foo.el"
                           "c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/bar.el" nil)
  ediff-setup(#<buffer foo.el> "c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/foo.el"
              #<buffer bar.el> "c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/bar.el" nil nil
((lambda nil (delete-file "c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/foo.el")
(delete-file "c:/Users/XXXXXX~1.XXX/AppData/Local/Temp/bar.el")
(if (stringp nil) (delete-file nil)))) ((ediff-job-name . ediff-buffers)) nil)
  ediff-buffers-internal("foo.el" "bar.el" nil nil ediff-buffers)
  ediff-buffers("foo.el" "bar.el")
  call-interactively(ediff-buffers nil nil)
  command-execute(ediff-buffers)

In GNU Emacs 24.3.50.1 (i386-mingw-nt6.1.7601)
 of 2013-06-01 on ODIEONE
Bzr revision: 112809 [email-masked]
Windowing system distributor `Microsoft Corp.', version 6.1.7601
Configured using:
 `configure --with-gcc (4.7) --no-opt --enable-checking --cflags
 -IC:/Devel/emacs/build/include --ldflags -LC:/Devel/emacs/build/lib'