# HG changeset patch # User Yuya Nishihara # Date 1542720672 -32400 # Node ID 03bca908d9fb8df3baf29d6e4923b216cc93d460 # Parent e1c3a2e9df599951bbc93baef55d7caa218a126c vfs: add option to not create parent directories implicitly In blackbox, we don't want to create a ".hg" directory by mistake. This provides a race-safe option to achieve that. diff -r e1c3a2e9df59 -r 03bca908d9fb mercurial/vfs.py --- a/mercurial/vfs.py Thu Nov 15 02:55:33 2018 +0100 +++ b/mercurial/vfs.py Tue Nov 20 22:31:12 2018 +0900 @@ -345,12 +345,14 @@ self.audit(path, mode=mode) def __call__(self, path, mode="r", atomictemp=False, notindexed=False, - backgroundclose=False, checkambig=False, auditpath=True): + backgroundclose=False, checkambig=False, auditpath=True, + makeparentdirs=True): '''Open ``path`` file, which is relative to vfs root. - Newly created directories are marked as "not to be indexed by - the content indexing service", if ``notindexed`` is specified - for "write" mode access. + By default, parent directories are created as needed. Newly created + directories are marked as "not to be indexed by the content indexing + service", if ``notindexed`` is specified for "write" mode access. + Set ``makeparentdirs=False`` to not create directories implicitly. If ``backgroundclose`` is passed, the file may be closed asynchronously. It can only be used if the ``self.backgroundclosing()`` context manager @@ -389,7 +391,8 @@ # to a directory. Let the posixfile() call below raise IOError. if basename: if atomictemp: - util.makedirs(dirname, self.createmode, notindexed) + if makeparentdirs: + util.makedirs(dirname, self.createmode, notindexed) return util.atomictempfile(f, mode, self.createmode, checkambig=checkambig) try: @@ -407,7 +410,8 @@ if e.errno != errno.ENOENT: raise nlink = 0 - util.makedirs(dirname, self.createmode, notindexed) + if makeparentdirs: + util.makedirs(dirname, self.createmode, notindexed) if nlink > 0: if self._trustnlink is None: self._trustnlink = nlink > 1 or util.checknlink(f)