--- 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