This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: patch -e from stdin broken?
Hi Igor,
Igor Peshansky wrote:
On Wed, 21 Feb 2007, Pedro Alves wrote:
(Here is the original message I tried to send earlier, sorry for the mess.)
Hi guys,
While looking at why 'quilt annotate' is broken in Cygwin, I found
something fishy on 'patch' in ed mode. Looks like reading the patch
from stdin is broken. Reading the patch from a file with -i works
ok. Here is how to reproduce:
$ touch a.txt
$ cat << EOF > b.txt
a new line
EOF
$ diff -e a.txt b.txt > ab.diff
$ cat ab.diff
0a
a new line
.
$ patch -e a.txt < ab.diff
$ /cygdrive/c/DOCUME~1/pt104167/LOCALS~1/Temp/poL0ERTu: No such file
or directory
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Looks like your $TMP is set to something Cygwin doesn't like... Try
setting it to, say, /tmp, and see if that makes patch -e happier...
Thanks for the hints. Sorry I didn't say earlier, but I had
already tried that. Cygwin does understand that path, just checked
(notice the /cygdrive/c/ prefix). Actually patch honors $TMPDIR first,
so I had tried setting it to /tmp, and the same thing happens:
export TMPDIR=/tmp
patch -e a.txt < ab.diff
/tmp/posrjz1q: No such file or directory
(yes, /tmp does exist)
(
Just found out another thing:
export TMPDIR=/
patch -e a.txt < ab.diff
#looks like it is hanging, but about 20 seconds later:
patch: **** Can't create file //ppMxHRaO : No such host or network path
The double slash should have been filtered before trying to open the
file. Humm, easy to solve on patch side, but setting TMPDIR=/ breaks
a lot of stuff, even gcc and make, so I guess it is one of those
"don't do it" - FAQ thingies, that I missed somewhere.
)
[snip]
That 'No such file' error message comes from ed, or so it seems.
It looks like something is going wrong with the pipe to ed
(patch/pch.c:do_ed_script), but I can't see what. The filename passed
to it is correct, but somehow, when the pipe is fflushed ed barks.
If I put a _cexit before the pipe is flushed, ed doesn't complain.
I also tested it on kubuntu 6.06, and on Solaris 10 with gnu patch,
gnu diff and Sun ed, and it worked correctly, so it does look
like a Cygwin specific problem.
You could also try playing with the "binmode" setting in the Cygwin
environment variable, which controls line endings in pipes.
I don't have any textmode mounts.
(end original message)
As Corinna found out, not specifying the file to patch, but doing
it interactively works ok. That should make it easier to debug.
$ patch -e < ab.diff
can't find file to patch at input line 1
Perhaps you used the wrong -p or --strip option?
File to patch: a.txt
$ cat a.txt
a new line
$
$ patch -e a.txt < ab.diff
/cygdrive/c/DOCUME~1/ADMINI~1/DEFINI~1/Temp/poh0o0Rq: No such file or
directory
Hmm, you also forgot to mention the directory where a.txt resides...
Try first doing this on a binary mount in some directory under Cygwin root
(e.g., /tmp). If that works, look into directories and environment
variable settings.
Doesn't work anywhere: ~, /tmp, /cygdrive/d, etc. Did it work for you,
when you followed the recipe I sent? If you didn't try, could you, please?
>mount
d:\cygwin\bin on /usr/bin type system (binmode)
d:\cygwin\lib on /usr/lib type system (binmode)
d:\cygwin on / type system (binmode)
d:\MinGW on /mingw type system (binmode)
c: on /cygdrive/c type system (binmode,noumount)
d: on /cygdrive/d type system (binmode,noumount)
e: on /cygdrive/e type system (binmode,noumount)
f: on /cygdrive/f type system (binmode,noumount)
l: on /cygdrive/l type system (binmode,noumount)
m: on /cygdrive/m type system (binmode,noumount)
x: on /cygdrive/x type system (binmode,noumount)
>set | grep CYG
CYGWIN=ntsec
CYGWIN_ROOT='\cygwin'
Cheers,
Pedro Alves
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/