diff mercurial/localrepo.py @ 13032:e41e2b79883d

dirstate: warn on invalid parents rather than aborting This allows more graceful recovery from some mangled dirstates
author Matt Mackall <mpm@selenic.com>
date Mon, 22 Nov 2010 12:43:31 -0600
parents cc4e13c92dfa
children 9beac11b8c56
line wrap: on
line diff
--- a/mercurial/localrepo.py	Mon Nov 22 18:15:58 2010 +0100
+++ b/mercurial/localrepo.py	Mon Nov 22 12:43:31 2010 -0600
@@ -178,7 +178,19 @@
 
     @propertycache
     def dirstate(self):
-        return dirstate.dirstate(self.opener, self.ui, self.root)
+        warned = [0]
+        def validate(node):
+            try:
+                r = self.changelog.rev(node)
+                return node
+            except error.LookupError:
+                if not warned[0]:
+                    warned[0] = True
+                    self.ui.warn(_("warning: ignoring unknown"
+                                   " working parent %s!\n" % short(node)))
+                return nullid
+
+        return dirstate.dirstate(self.opener, self.ui, self.root, validate)
 
     def __getitem__(self, changeid):
         if changeid is None: