diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -1051,12 +1051,16 @@ class queue(object): self.check_localchanges(repo) if move: - try: - index = self.series.index(patch, start) - fullpatch = self.full_series[index] - del self.full_series[index] - except ValueError: - raise util.Abort(_("patch '%s' not found") % patch) + if not patch: + raise util.Abort(_("please specify the patch to move")) + for i, rpn in enumerate(self.full_series[start:]): + # strip markers for patch guards + if self.guard_re.split(rpn, 1)[0] == patch: + break + index = start + i + assert index < len(self.full_series) + fullpatch = self.full_series[index] + del self.full_series[index] self.full_series.insert(start, fullpatch) self.parse_series() self.series_dirty = 1 diff --git a/tests/test-mq b/tests/test-mq --- a/tests/test-mq +++ b/tests/test-mq @@ -107,6 +107,11 @@ cd a 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 @@ -228,17 +233,29 @@ hg qpush test1b.patch+1 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 # no 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 --git a/tests/test-mq.out b/tests/test-mq.out --- a/tests/test-mq.out +++ b/tests/test-mq.out @@ -209,6 +209,8 @@ popping test2.patch popping test1b.patch popping test.patch patch queue now empty +cannot push 'test2.patch' - guarded by ['+posguard'] +number of unguarded, unapplied patches has changed from 2 to 3 applying test2.patch now at: test2.patch applying test1b.patch @@ -222,14 +224,23 @@ popping test.patch 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 now at: test1b.patch abort: patch bogus not in series +abort: please specify the patch to move 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