store: replace invocation of "getsize()" by "vfs.stat()"
authorFUJIWARA Katsunori <foozy@lares.dti.ne.jp>
Tue, 09 Oct 2012 01:41:55 +0900
changeset 17727 6492b39a44d5
parent 17726 7cb7e17c23b2
child 17728 004bd533880d
store: replace invocation of "getsize()" by "vfs.stat()" This patch replaces invocation of "getsize()", which calls "os.stat()" internally, by "vfs.stat()". The object referred by "self.rawvfs" is used internally by "_fncachevfs" and doesn't encode filename for each file API invocation. This patch invokes "os.stat()" via "self.rawvfs" to avoid redundant filename encoding: invocation of "os.stat()" via "self.vfs" hides filename encoding and encoding result from caller, so it is not appropriate, when both encoded and non-encoded filenames should be yield. Even though changeset b42b0729744d improved stream_out performance by "self.pathsep + path", this patch replaces it by "os.path.join(self.base, path)" of vfs. So, this may increase cost to join path components. But this shouldn't have large impact, because: - such cost is much less than cost of "os.stat()" which causes system call invocation - "datafiles()" of store object is invoked only for "hg manifest --all" or "hg verify" which are both heavy functions
mercurial/store.py
--- a/mercurial/store.py	Tue Oct 09 01:41:55 2012 +0900
+++ b/mercurial/store.py	Tue Oct 09 01:41:55 2012 +0900
@@ -459,6 +459,7 @@
         self.pathsep = self.path + '/'
         self.createmode = _calcmode(vfs)
         vfs.createmode = self.createmode
+        self.rawvfs = vfs
         fnc = fncache(vfs)
         self.fncache = fnc
         self.vfs = _fncachevfs(vfs, fnc, encode)
@@ -467,16 +468,14 @@
     def join(self, f):
         return self.pathsep + self.encode(f)
 
-    def getsize(self, path):
-        return os.stat(self.pathsep + path).st_size
-
     def datafiles(self):
         rewrite = False
         existing = []
+        getstat = self.rawvfs.stat
         for f in sorted(self.fncache):
             ef = self.encode(f)
             try:
-                yield f, ef, self.getsize(ef)
+                yield f, ef, getstat(ef).st_size
                 existing.append(f)
             except OSError, err:
                 if err.errno != errno.ENOENT: