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