mercurial/dirstate.py
changeset 5483 0c43f87baba3
parent 5396 5105b119edd2
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -50,7 +50,8 @@ class dirstate(object):
         elif name == '_dirs':
             self._dirs = {}
             for f in self._map:
-                self._incpath(f)
+                if self[f] != 'r':
+                    self._incpath(f)
             return self._dirs
         elif name == '_ignore':
             files = [self._join('.hgignore')]
@@ -205,7 +206,7 @@ class dirstate(object):
             d = f[:c]
             if d in self._dirs:
                 break
-            if d in self._map:
+            if d in self._map and self[d] != 'r':
                 raise util.Abort(_('file %r in dirstate clashes with %r') %
                                  (d, f))
         self._incpath(f)
@@ -213,6 +214,8 @@ class dirstate(object):
     def normal(self, f):
         'mark a file normal and clean'
         self._dirty = True
+        if self[f] == 'r':
+            self._incpathcheck(f)
         s = os.lstat(self._join(f))
         self._map[f] = ('n', s.st_mode, s.st_size, s.st_mtime, 0)
         if self._copymap.has_key(f):
@@ -221,6 +224,8 @@ class dirstate(object):
     def normallookup(self, f):
         'mark a file normal, but possibly dirty'
         self._dirty = True
+        if self[f] == 'r':
+            self._incpathcheck(f)
         self._map[f] = ('n', 0, -1, -1, 0)
         if f in self._copymap:
             del self._copymap[f]
@@ -228,6 +233,8 @@ class dirstate(object):
     def normaldirty(self, f):
         'mark a file normal, but dirty'
         self._dirty = True
+        if self[f] == 'r':
+            self._incpathcheck(f)
         self._map[f] = ('n', 0, -2, -1, 0)
         if f in self._copymap:
             del self._copymap[f]
@@ -260,8 +267,9 @@ class dirstate(object):
         'forget a file'
         self._dirty = True
         try:
+            if self[f] != 'r':
+                self._decpath(f)
             del self._map[f]
-            self._decpath(f)
         except KeyError:
             self._ui.warn(_("not in dirstate: %s!\n") % f)
 
@@ -522,7 +530,7 @@ class dirstate(object):
                     try:
                         st = lstat(_join(fn))
                     except OSError, inst:
-                        if inst.errno != errno.ENOENT:
+                        if inst.errno not in (errno.ENOENT, errno.ENOTDIR):
                             raise
                         st = None
                     # We need to re-check that it is a valid file