This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: patch -e from stdin broken?


On Wed, 21 Feb 2007, Pedro Alves wrote:

> 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.
> )

This is a long-standing bug (in many apps, as you noticed)...

> > > [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?

You're right, I didn't try it.  When I did, I was able to reproduce your
error.

Patch is supposed to copy the source file to the temporary location, and
then feed it to "ed".  Looking at the strace, it seems that the file is
copied properly, with no errors, but then, for some reason, the "patch"
process unlinks the file during the invocation of "sh", before it invokes
"ed".  This unlink does not happen if the name of the file to patch is
supplied interactively.

I don't have the time for a more in-depth analysis at the moment, but
patch built from source OOTB, so you should be able to debug it locally.
HTH,
	Igor
-- 
				http://cs.nyu.edu/~pechtcha/
      |\      _,,,---,,_	    pechtcha@cs.nyu.edu | igor@watson.ibm.com
ZZZzz /,`.-'`'    -.  ;-;;,_		Igor Peshansky, Ph.D. (name changed!)
     |,4-  ) )-,_. ,\ (  `'-'		old name: Igor Pechtchanski
    '---''(_/--'  `-'\_) fL	a.k.a JaguaR-R-R-r-r-r-.-.-.  Meow!

Freedom is just another word for "nothing left to lose"...  -- Janis Joplin

--
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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]