Patchwork [1,of,7,VFS] subrepo: use vfs.readdir instead of os.listdir to avoid expensive stat calls

login
register
mail settings
Submitter Katsunori FUJIWARA
Date April 10, 2015, 3:54 p.m.
Message ID <17c9d35176133223e448.1428681263@juju>
Download mbox | patch
Permalink /patch/8592/
State Accepted
Commit 897a0715ee71a24af14416277aa7c0b28e75e82a
Headers show

Comments

Katsunori FUJIWARA - April 10, 2015, 3:54 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1428680829 -32400
#      Sat Apr 11 00:47:09 2015 +0900
# Node ID 17c9d35176133223e44820d39b30146d06048b1f
# Parent  e0e28e910fa3797fd0aa4f818e9b33c5bcbf0e53
subrepo: use vfs.readdir instead of os.listdir to avoid expensive stat calls

"kind" information given from "vfs.readdir()" makes expensive stat
calls "os.path.isdir()" and "os.path.islink()" useless.

Patch

diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -1632,11 +1632,11 @@  class gitsubrepo(abstractsubrepo):
         # local-only history
         self.ui.note(_('removing subrepo %s\n') % self._relpath)
         self._gitcommand(['config', 'core.bare', 'true'])
-        for f in os.listdir(self._abspath):
+        for f, kind in self.wvfs.readdir():
             if f == '.git':
                 continue
             path = os.path.join(self._abspath, f)
-            if os.path.isdir(path) and not os.path.islink(path):
+            if kind == stat.S_IFDIR:
                 shutil.rmtree(path)
             else:
                 os.remove(path)