Subject: Re: bug#43226: 28.0.50; Running Tramp tests on MS-Windows leaves zombie processes on the remote

From: Eli Zaretskii <[email-masked]>
Date: Wed, 26 Oct 2022 15:01:12 +0300

> From: Henrik Ahlgren <[email-masked]>
> Cc: Michael Albinus <[email-masked]>, [email-masked]
> Date: Wed, 26 Oct 2022 14:34:09 +0300
> 
> This issue is documented on the FAQ section of the Magit manual:
> 
>   A.2.13 I am unable to stage when using Tramp from MS Windows
>   ------------------------------------------------------------
> 
>   Magit may be unable to stage (or otherwise apply) individual hunks when
>   you are connected to remote machine using Tramp and the local machine
>   uses MS Windows.
> 
>      There appears to be a problem with ‘process-send-eof’ in this
>   scenario, as mentioned at the end of ‘tramp-tests.el’.  I have contacted
>   the Tramp maintainer about this.  For now this unfortunately means that
>   it just doesn’t work and we cannot do anything about it.  If you have
>   more information, then please comment on
>   <https://github.com/magit/magit/issues/3624>.

This doesn't really add any useful information.

> After some debugging I figured out that by simply adding
> (process-send-string process "\004") in magic-process.el before (maybe
> even instead?) of process-send-eof, it works perfectly well. Maybe it's
> a valid workaround, or even the proper fix, but clearly there is some
> point of having a separate function for sending EOF.
> 
> In the C implementation of process-send-eof (Emacs 27.1), it seems to only
> send EOF if the process has pty_flag set:
> 
>   if (XPROCESS (proc)->pty_flag)
>     send_process (proc, "\004", 1, Qnil);
> 
> I think this could be the reason: after all I believe PTYs are a fairly
> recent feature in Windows and Emacs does not support it yet?

Emacs doesn't (and probably will not) support the Windows
Pseudo-Console because it falls short of what Emacs needs: it doesn't
allow to send stuff in arbitrary encoding via this channel.  I filed a
bug report with the developers many moons ago, but their response was
that it will probably never fixed.  So you can only talk to a program
that uses the current system codepage, which is useless for Emacs.

So the ->pty_flag case is not for Windows.  And even if we did try
using it, it wouldn't have worked for local processes, because Ctrl-D
is NOT the EOF character on Windows; it's Ctrl-Z, and then only if the
sub-process does text-mode reads (in binary mode, there's no way to
send EOF to a subprocess, only kill it).