mq: allow qpop if popped revisions are not working dir parents
authorDirkjan Ochtman <dirkjan@ochtman.nl>
Mon, 12 Jan 2009 09:07:02 +0100
changeset 7621 6d891df43a5f
parent 7620 fbfd92d51540
child 7622 4dd7b28003d2
mq: allow qpop if popped revisions are not working dir parents
hgext/mq.py
tests/test-mq
tests/test-mq-safety.out
tests/test-mq.out
--- a/hgext/mq.py	Mon Jan 12 09:53:55 2009 +0100
+++ b/hgext/mq.py	Mon Jan 12 09:07:02 2009 +0100
@@ -1011,6 +1011,14 @@
                     if p in rr:
                         self.ui.warn(_("qpop: forcing dirstate update\n"))
                         update = True
+            else:
+                parents = [p.hex() for p in repo[None].parents()]
+                needupdate = False
+                for entry in self.applied[start:]:
+                    if entry.rev in parents:
+                        needupdate = True
+                        break
+                update = needupdate
 
             if not force and update:
                 self.check_localchanges(repo)
@@ -1021,7 +1029,13 @@
             if update:
                 top = self.check_toppatch(repo)
 
-            if repo.changelog.heads(rev) != [revlog.bin(self.applied[-1].rev)]:
+            try:
+                heads = repo.changelog.heads(rev)
+            except revlog.LookupError:
+                node = short(rev)
+                raise util.Abort(_('trying to pop unknown node %s') % node)
+
+            if heads != [revlog.bin(self.applied[-1].rev)]:
                 raise util.Abort(_("popping would remove a revision not "
                                    "managed by this patch queue"))
 
--- a/tests/test-mq	Mon Jan 12 09:53:55 2009 +0100
+++ b/tests/test-mq	Mon Jan 12 09:07:02 2009 +0100
@@ -289,7 +289,7 @@
 hg strip -qn tip
 hg tip 2>&1 | sed -e 's/unknown node .*/unknown node/'
 hg branches 2>&1 | sed -e 's/unknown node .*/unknown node/'
-hg qpop
+hg qpop 2>&1 | sed -e 's/unknown node .*/unknown node/'
 
 cat >>$HGRCPATH <<EOF
 [diff]
@@ -510,3 +510,8 @@
 hg st
 hg diff --config diff.nodates=True
 hg qdiff --config diff.nodates=True
+
+echo % test popping revisions not in working dir ancestry
+hg qseries -v
+hg up qparent
+hg qpop
--- a/tests/test-mq-safety.out	Mon Jan 12 09:53:55 2009 +0100
+++ b/tests/test-mq-safety.out	Mon Jan 12 09:07:02 2009 +0100
@@ -1,7 +1,7 @@
 % try to commit on top of a patch
 abort: cannot commit over an applied mq patch
 % qpop/qrefresh on the wrong revision
-abort: working directory revision is not qtip
+abort: popping would remove a revision not managed by this patch queue
 using patch queue:
 abort: popping would remove a revision not managed by this patch queue
 abort: working directory revision is not qtip
--- a/tests/test-mq.out	Mon Jan 12 09:53:55 2009 +0100
+++ b/tests/test-mq.out	Mon Jan 12 09:07:02 2009 +0100
@@ -294,7 +294,7 @@
 
 mq status file refers to unknown node
 default                        0:cb9a9f314b8b
-abort: working directory revision is not qtip
+abort: trying to pop unknown node
 new file
 
 diff --git a/new b/new
@@ -538,3 +538,7 @@
  hello
 +world
 +universe
+% test popping revisions not in working dir ancestry
+0 A empty
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+Patch queue now empty