[PATCH] qpush --move: move the right patch even with comment lines

Mads Kiilerich mads at kiilerich.com
Thu Jul 8 07:21:44 CDT 2010


  Gilles Moris wrote, On 07/07/2010 09:05 AM:
> # HG changeset patch
> # User Gilles Moris<gilles.moris at free.fr>
> # Date 1278484536 -7200
> # Node ID bb6b602014b381955a4f9746bc9be586f4a16f0b
> # Parent  33175ca5db9136cfec76b7d28c2da7f876ca63c6
> qpush --move: move the right patch even with comment lines
>
> 88fc876a4833 caused that we find the index of the moving patch in self.series
> but look it up in self.full_series. The difference between these is that
> full_series also contains comment lines, and we thus moved the wrong patch.
>
> Use back self.full_series to find the moving patch, but take care of striping
> the patch guard markers before comparing the patch name. Test cases have been
> added for comments and empty lines in self.full_series, and for the case of
> guarded patches.
>
> Original patch contributed by Mads Kiilerich<mads at kiilerich.com>

That's an exaggeration ;-)

> diff -r 33175ca5db91 -r bb6b602014b3 hgext/mq.py
> --- a/hgext/mq.py	Thu Feb 12 22:55:51 2009 +0100
> +++ b/hgext/mq.py	Wed Jul 07 08:35:36 2010 +0200
> @@ -1047,7 +1047,12 @@
>
>               if move:
>                   try:
> -                    index = self.series.index(patch, start)
> +                    for i, rpn in enumerate(self.full_series[start:]):

Perhaps the simpler (but probably slightly less scalable)

for index, rpn in enumerate(self.full_series)[start:]:


> +                        # strip markers for patch guards
> +                        pn = rpn.split('#', 1)[0].rstrip()
> +                        if pn == patch:
> +                            break
> +                    index = start + i
>                       fullpatch = self.full_series[index]
>                       del self.full_series[index]
>                   except ValueError:

The try/except ValueError was a relatively elegant way to handle errors 
originally. But it looks a bit clumsy now. Couldn't it be done in a 
better way now with a simple if?

And so much happens inside the try that I wonder in which cases it could 
be trigged - and if we can reach "not found" at all and how that is 
distinguished from the specifying the last patch in the series. Perhaps 
we should add a test for "not found" and make sure we try to move that 
(and also the only) patch.

> diff -r 33175ca5db91 -r bb6b602014b3 tests/test-mq
> --- a/tests/test-mq	Thu Feb 12 22:55:51 2009 +0100
> +++ b/tests/test-mq	Wed Jul 07 08:35:36 2010 +0200
> @@ -104,6 +104,11 @@
>
>   hg qnew -m 'foo bar' test.patch
>
> +echo '# comment'>  .hg/patches/series.tmp
> +echo>>  .hg/patches/series.tmp # empty line
> +cat .hg/patches/series>>  .hg/patches/series.tmp
> +mv .hg/patches/series.tmp .hg/patches/series
> +
>   echo % qrefresh
>
>   echo a>>  a
> @@ -225,17 +230,28 @@
>
>   echo % qpush --move
>   hg qpop -a
> +hg qguard test1b.patch -- -negguard
> +hg qguard test2.patch -- +posguard
> +hg qpush --move test2.patch # can't move guarded patch
> +hg qselect posguard
>   hg qpush --move test2.patch # move to front
> -hg qpush --move test1b.patch
> +hg qpush --move test1b.patch # negative guard unselected
>   hg qpush --move test.patch # noop move
>   hg qseries -v
>   hg qpop -a
> -hg qpush --move test.patch # cleaning up
> +# cleaning up
> +hg qselect --none
> +hg qguard --none test1b.patch
> +hg qguard --none test2.patch
> +hg qpush --move test.patch
>   hg qpush --move test1b.patch
>   hg qpush --move bogus # nonexistent patch
>   hg qpush --move test.patch # already applied
>   hg qpush
>
> +echo % series after move
> +cat `hg root`/.hg/patches/series
> +
>   echo % pop, qapplied, qunapplied
>   hg qseries -v
>   echo % qapplied -1 test.patch
> diff -r 33175ca5db91 -r bb6b602014b3 tests/test-mq.out
> --- a/tests/test-mq.out	Thu Feb 12 22:55:51 2009 +0100
> +++ b/tests/test-mq.out	Wed Jul 07 08:35:36 2010 +0200
> @@ -204,6 +204,8 @@
>   popping test1b.patch
>   popping test.patch
>   patch queue now empty
> +cannot push 'test2.patch' - guarded by ['+posguard']

That output (revealing python list syntax) looks unfortunate. It seems 
like we found another bug?

> +number of unguarded, unapplied patches has changed from 2 to 3
>   applying test2.patch
>   now at: test2.patch
>   applying test1b.patch
> @@ -217,6 +219,8 @@
>   popping test1b.patch
>   popping test2.patch
>   patch queue now empty
> +guards deactivated
> +number of unguarded, unapplied patches has changed from 3 to 2
>   applying test.patch
>   now at: test.patch
>   applying test1b.patch
> @@ -225,6 +229,12 @@
>   abort: cannot push to a previous patch: test.patch
>   applying test2.patch
>   now at: test2.patch
> +% series after move
> +test.patch
> +test1b.patch
> +test2.patch
> +# comment
> +
>   % pop, qapplied, qunapplied
>   0 A test.patch
>   1 A test1b.patch
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list