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