diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -388,7 +388,7 @@ return self._map.copymap def _droppath(self, f): - if self[f] not in "?r" and "dirs" in self._map.__dict__: + if "dirs" in self._map.__dict__ and self[f] not in "?r": self._map.dirs.delpath(f) if "filefoldmap" in self._map.__dict__: @@ -402,16 +402,17 @@ oldstate = self[f] if state == 'a' or oldstate == 'r': scmutil.checkfilename(f) - if f in self._map.dirs: - raise error.Abort(_('directory %r already in dirstate') % f) - # shadows - for d in util.finddirs(f): - if d in self._map.dirs: - break - entry = self._map.get(d) - if entry is not None and entry[0] != 'r': - raise error.Abort( - _('file %r in dirstate clashes with %r') % (d, f)) + if "dirs" in self._map.__dict__: + if f in self._map.dirs: + raise error.Abort(_('directory %r already in dirstate') % f) + # shadows + for d in util.finddirs(f): + if d in self._map.dirs: + break + entry = self._map.get(d) + if entry is not None and entry[0] != 'r': + raise error.Abort( + _('file %r in dirstate clashes with %r') % (d, f)) if oldstate in "?r" and "dirs" in self._map.__dict__: self._map.dirs.addpath(f) self._dirty = True