# HG changeset patch # User FUJIWARA Katsunori # Date 1381765865 -32400 # Node ID 12a8bdd97b4fe2a578082bbffee721ed9c1a8c2f # Parent 4d3ce1646dfcfe7942f3dc7aa2e067c43fb9a644 context: use "vfs.lstat()" to examine target path instead of "os.path.*" This patch gets stat object of target path by "vfs.lstat()", and examines stat object to know the type of it. This follows the way in "workingctx.add()". This should be cheaper than original implementation invoking "lexists()", "isfile()" and "islink()". diff -r 4d3ce1646dfc -r 12a8bdd97b4f mercurial/context.py --- a/mercurial/context.py Tue Oct 15 00:51:04 2013 +0900 +++ b/mercurial/context.py Tue Oct 15 00:51:05 2013 +0900 @@ -1173,10 +1173,14 @@ wlock.release() def copy(self, source, dest): - p = self._repo.wjoin(dest) - if not os.path.lexists(p): + try: + st = self._repo.wvfs.lstat(dest) + except OSError, err: + if err.errno != errno.ENOENT: + raise self._repo.ui.warn(_("%s does not exist!\n") % dest) - elif not (os.path.isfile(p) or os.path.islink(p)): + return + if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)): self._repo.ui.warn(_("copy failed: %s is not a file or a " "symbolic link\n") % dest) else: