[PATCH] [Bug 5207] New: mq: qpush doesn't honor diff.noprefix

Matt Mackall mpm at selenic.com
Sat Apr 16 16:52:27 EDT 2016


On Sat, 2016-04-16 at 20:35 +0200, Jan Halla wrote:
> On Sat, Apr 16, 2016 at 06:06:15PM +0000, mercurial-bugs at selenic.com wrote:
> > 
> > https://bz.mercurial-scm.org/show_bug.cgi?id=5207
> > 
> >             Bug ID: 5207
> >            Summary: mq: qpush doesn't honor diff.noprefix
> >            Product: Mercurial
> >            Version: 3.7.3
> >           Hardware: PC
> >                 OS: Linux
> >             Status: UNCONFIRMED
> >           Severity: bug
> >           Priority: wish
> >          Component: mq
> >           Assignee: bugzilla at selenic.com
> >           Reporter: hallik at roztoky.net
> >                 CC: mercurial-devel at selenic.com
> > 
> > When diff.noprefix is True qnew and qrefresh create patches without [a,b]/
> > prefix (which is correct) but qpush can't apply these patches. Example:
> > 
> > $> hg init
> > $> mkdir -p r/s
> > $> echo original > r/s/t.txt
> > $> hg commit -A -m orig
> > adding r/s/t.txt
> > $> echo change > r/s/t.txt 
> > $> hg --config diff.noprefix=True qnew p1.diff
> > $> cat .hg/patches/p1.diff 
> > # HG changeset patch
> > # Parent  36ef0c04be112b0212bd38af1e641a5c5be00206
> > 
> > diff --git r/s/t.txt r/s/t.txt
> > --- r/s/t.txt
> > +++ r/s/t.txt
> > @@ -1,1 +1,1 @@
> > -original
> > +change
> > $> hg qpop 
> > popping p1.diff
> > patch queue now empty
> > $> hg qpush
> > applying p1.diff
> > unable to find 's/t.txt' for patching
> > 1 out of 1 hunks FAILED -- saving rejects to file s/t.txt.rej
> > patch failed, unable to continue (try -v)
> > patch failed, rejects left in working directory
> > errors during apply, please fix and qrefresh p1.diff
> > 
> May be a patch for this bug:
> 
> # HG changeset patch
> # User Jan Halla <hallik at roztoky.net>
> # Date 1460831316 -7200
> #      Sat Apr 16 20:28:36 2016 +0200
> # Node ID 0248cf2a6e53ec054e247bdb0794e25bc1084b5a
> # Parent  d9539959167df7cb3acd08c4ab53d8e8a7f027cb
> mq: strip parameter of patch function honor diff.noprefix configuration
> (issue5207)
> 
> Set strip to 0 when not plain mode and diff.noprefix is true

This is ok, but the ideal fix we've previously discussed is to autodetect when
the a/ and b/ prefixes aren't present in the patch import code. Your version
will break if you change diff.noprefix in the middle of the stack.

It's also probably a mistake for mq to honor the noprefix setting at all until
we've fixed the import side. So for now we should probably do:

diff -r 9d3e280864fb hgext/mq.py
--- a/hgext/mq.py	Sat Apr 16 15:14:25 2016 -0500
+++ b/hgext/mq.py	Sat Apr 16 15:25:26 2016 -0500
@@ -488,6 +488,8 @@
 
     def diffopts(self, opts=None, patchfn=None):
         diffopts = patchmod.diffopts(self.ui, opts)
+        # we're not prepared to import patches with no prefix
+        diffopts.noprefix = False
         if self.gitmode == 'auto':
             diffopts.upgrade = True
         elif self.gitmode == 'keep':

-- 
Mathematics is the supreme nostalgia of our time.



More information about the Mercurial-devel mailing list