vfs: simplify path audit disabling in stream clone
authorPierre-Yves David <pierre-yves.david@octobus.net>
Sun, 02 Jul 2017 02:28:04 +0200
changeset 33257 15e9cbe6ae49
parent 33256 4ea0b7a613f9
child 33258 761ccfeff8b1
vfs: simplify path audit disabling in stream clone The whole 'mustaudit' API is quite complex compared to its actual usage by its unique user in stream clone. Instead we add a "auditpath" parameter to 'vfs.__call_'. The stream clone code then explicitly open files with path auditing disabled. The 'mustaudit' API will be cleaned up in the next changeset.
mercurial/streamclone.py
mercurial/vfs.py
--- a/mercurial/streamclone.py	Sun Jul 02 02:19:05 2017 +0200
+++ b/mercurial/streamclone.py	Sun Jul 02 02:28:04 2017 +0200
@@ -225,10 +225,11 @@
                 # partially encode name over the wire for backwards compat
                 yield '%s\0%d\n' % (store.encodedir(name), size)
                 if size <= 65536:
-                    with svfs(name, 'rb') as fp:
+                    with svfs(name, 'rb', auditpath=False) as fp:
                         yield fp.read(size)
                 else:
-                    for chunk in util.filechunkiter(svfs(name), limit=size):
+                    data = svfs(name, auditpath=False)
+                    for chunk in util.filechunkiter(data, limit=size):
                         yield chunk
         finally:
             svfs.mustaudit = oldaudit
--- a/mercurial/vfs.py	Sun Jul 02 02:19:05 2017 +0200
+++ b/mercurial/vfs.py	Sun Jul 02 02:28:04 2017 +0200
@@ -320,7 +320,8 @@
         os.chmod(name, self.createmode & 0o666)
 
     def __call__(self, path, mode="r", text=False, atomictemp=False,
-                 notindexed=False, backgroundclose=False, checkambig=False):
+                 notindexed=False, backgroundclose=False, checkambig=False,
+                 auditpath=True):
         '''Open ``path`` file, which is relative to vfs root.
 
         Newly created directories are marked as "not to be indexed by
@@ -344,11 +345,12 @@
         only for writing), and is useful only if target file is
         guarded by any lock (e.g. repo.lock or repo.wlock).
         '''
-        if self._audit:
-            r = util.checkosfilename(path)
-            if r:
-                raise error.Abort("%s: %r" % (r, path))
-        self.audit(path)
+        if auditpath:
+            if self._audit:
+                r = util.checkosfilename(path)
+                if r:
+                    raise error.Abort("%s: %r" % (r, path))
+            self.audit(path)
         f = self.join(path)
 
         if not text and "b" not in mode: