diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -1968,6 +1968,19 @@ self._repo.wwrite(self._path, data, flags, backgroundclose=backgroundclose) + def clearunknown(self): + """Removes conflicting items in the working directory (and creates any + missing parent directories) so that ``write()`` can be called + successfully. + """ + if self._repo.wvfs.isdir(self._path) and not self._repo.wvfs.islink( + self._path): + self._repo.wvfs.removedirs(self._path) + + dirname = os.path.dirname(self._path) + if not self._repo.wvfs.isdir(dirname): + self._repo.wvfs.makedirs(dirname) + def setflags(self, l, x): self._repo.wvfs.setflags(self._path, l, x) diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -1150,9 +1150,7 @@ except OSError as e: if e.errno != errno.ENOENT: raise - - if repo.wvfs.isdir(f) and not repo.wvfs.islink(f): - repo.wvfs.removedirs(f) + wctx[f].clearunknown() wctx[f].write(fctx(f).data(), flags, backgroundclose=True) if i == 100: yield i, f