Mercurial > hg
changeset 17727:6492b39a44d5
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
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Tue, 09 Oct 2012 01:41:55 +0900 |
parents | 7cb7e17c23b2 |
children | 004bd533880d |
files | mercurial/store.py |
diffstat | 1 files changed, 3 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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: