Stefan Sperling wrote on Wed, Sep 15, 2010 at 21:40:16 +0200:
> On Wed, Sep 15, 2010 at 06:15:58PM +0200, Daniel Shahaf wrote:
> > Stefan Sperling wrote on Tue, Sep 14, 2010 at 21:18:26 +0200:
> > > On Tue, Sep 14, 2010 at 12:49:06PM +0100, Julian Foad wrote:
> > > > Right.  The issue seems to be "How do I determine what path I should
> > > > apply the patch to?"  If the patch style is
> > > > 
> > > > --- wc/file
> > > > +++ wc/file
> > > > 
> > > > or
> > > > 
> > > > --- old_wc/file
> > > > +++ new_wc/file
> > > > 
> > > > then you're going to be stripping the first component so it doesn't
> > > > matter which path you use.  If the patch is just to one file and looks
> > > > something like
> > > > 
> > > > --- wc/file.old
> > > > +++ wc/file
> > > > 
> > > > or
> > > > 
> > > > --- wc/file
> > > > +++ wc/file.new
> > > > 
> > > > or
> > > > 
> > > > --- wc/file.old
> > > > +++ wc/file.new
> > > > 
> > > > then obviously it's not so simple and the patch consumer (person) may
> > > > need to be able to tell "svn patch" which path it should look at if
> > > > we're to be able to handle cases like this.
> > > 
> > > Yes. I've been trying to come up with a good UI for selecting the right
> > > filename for svn patch to use. Any ideas?
> > 
> > Paraphrasing my commit reply a few hours ago, how about:
> > 
> > * Always use the name from the /^+++/ line by default (regardless of --rd).
> > * Have a --strip-extension flag.  (Effect: filename loses everything after 
> > the last dot)
> > * Have a the following config option:
> > [[[
> > # ~/.subversion/config
> > [miscellany]
> > patch-strip-extensions = .new .old .orig .org ~ \
> >                          .merge-left .merge-right .working
> > ]]]
> > for extensions that are stripped automagically.
> > 
> > Sounds sane?  (I haven't thought about this /too/ much, so beware of
> > bugs in the above idea)
> 
> Looking at the patch(1) man page, it sounds like we don't really need
> to reinvent the wheel here:
> 
>      patch will choose the file name by performing the following steps, with
>      the first match used:
> 
>      1.         If patch is operating in strict IEEE Std 1003.1-2008 
> (``POSIX'')
>         mode, the first of the ``old'', ``new'' and ``index'' file names
>         that exist is used.  Otherwise, patch will examine either the
>         ``old'' and ``new'' file names or, for a non-context diff, the
>         ``index'' file name, and choose the file name with the fewest path
>         components, the shortest basename, and the shortest total file name
>         length (in that order).

(OT: using 'old' first means it'll use "foo.orig" if that's the old path
and my editor uses .orig extension for backup files)

> 
>      2.         If no file exists, patch checks for the existence of the 
> files in an
>         SCCS or RCS directory (using the appropriate prefix or suffix) using
>         the criteria specified above.  If found, patch will attempt to get
>         or check out the file.
> 
>      3.         If no suitable file was found to patch, the patch file is a 
> context
>         or unified diff, and the old file was zero length, the new file name
>         is created and used.
> 
>      4.         If the file name still cannot be determined, patch will 
> prompt the
>         user for the file name to use.
> 
> I suppose we could implement the method described in step 1.

Which of the two methods described in step 1 do you have in mind?

Whatever we do, the algorithm should be predictable, i.e., a user should
be able to know (from reading a patch) what path it would be applied to.

> That would make us compatible to UNIX patch, and should resolve the two
> use cases I have in mind.
> 
> Step 2 doesn't apply to us. Step 3 is used already. Step 4 could be
> implemented as well (but I'd prefer to do that post-1.7).
> 
> Thoughts?
> 

Reply via email to