diff --git a/hgext/mq.py b/hgext/mq.py
--- a/hgext/mq.py
+++ b/hgext/mq.py
@@ -2957,7 +2957,9 @@ def reposetup(ui, repo):
 
             mqtags = [(patch.node, patch.name) for patch in q.applied]
 
-            if mqtags[-1][0] not in self:
+            try:
+                r = self.changelog.rev(mqtags[-1][0])
+            except error.RepoLookupError:
                 self.ui.warn(_('mq status file refers to unknown node %s\n')
                              % short(mqtags[-1][0]))
                 return result
@@ -2982,12 +2984,13 @@ def reposetup(ui, repo):
 
             cl = self.changelog
             qbasenode = q.applied[0].node
-            if qbasenode not in self:
+            try:
+                qbase = cl.rev(qbasenode)
+            except error.LookupError:
                 self.ui.warn(_('mq status file refers to unknown node %s\n')
                              % short(qbasenode))
                 return super(mqrepo, self)._branchtags(partial, lrev)
 
-            qbase = cl.rev(qbasenode)
             start = lrev + 1
             if start < qbase:
                 # update the cache (excluding the patches) and save it
diff --git a/tests/test-mq-qpush-fail.t b/tests/test-mq-qpush-fail.t
--- a/tests/test-mq-qpush-fail.t
+++ b/tests/test-mq-qpush-fail.t
@@ -51,6 +51,22 @@ test qpush on empty series
   summary:     add foo
   
 
+test corrupt status file
+  $ hg qpush
+  applying patch1
+  now at: patch1
+  $ cp .hg/patches/status .hg/patches/status.orig
+  $ hg qpop
+  popping patch1
+  patch queue now empty
+  $ cp .hg/patches/status.orig .hg/patches/status
+  $ hg qpush
+  mq status file refers to unknown node * (glob)
+  abort: working directory revision is not qtip
+  [255]
+  $ rm .hg/patches/status .hg/patches/status.orig
+
+
 bar should be gone; other unknown/ignored files should still be around
 
   $ hg status -A