patch -e from stdin broken?

Pedro Alves pedro_alves@portugalmail.pt
Wed Feb 21 22:23:00 GMT 2007


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/



More information about the Cygwin mailing list