[PATCH 4 of 4] filectx: use ctx.size comparisons to speed up ctx.cmp

Nicolas Dumazet nicdumz at gmail.com
Sun Oct 10 15:51:54 CDT 2010


# HG changeset patch
# User Nicolas Dumazet <nicdumz.commits at gmail.com>
# Date 1280239650 -32400
# Node ID d1e873885dcc8820af2fe0cdc6bfc7174215c92b
# Parent  323badaa606b66e7cdd8090b089aaab46c1f8541
filectx: use ctx.size comparisons to speed up ctx.cmp

Comparing sizes is cheaper than comparing file contents, as it does not
involve reading the file on disk or from the filelog.

It is however not always possible: some extensions, or encode filters,
change data when extracting it to the working directory.

diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -82,7 +82,7 @@
 {desc}" expands to the first line of the changeset description.
 '''
 
-from mercurial import commands, cmdutil, dispatch, filelog, extensions
+from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
 from mercurial import localrepo, match, patch, templatefilters, templater, util
 from mercurial.hgweb import webcommands
 from mercurial.i18n import _
@@ -586,6 +586,12 @@
 
     repo.__class__ = kwrepo
 
+    def kwfilectx_cmp(orig, self, fctx):
+        # keyword affects data size, comparing wdir and filelog size does
+        # not make sense
+        return self._filelog.cmp(self._filenode, fctx.data())
+    extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
+
     extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
     extensions.wrapfunction(patch, 'diff', kw_diff)
     extensions.wrapfunction(cmdutil, 'copy', kw_copy)
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -357,6 +357,9 @@
 
         returns True if different than fctx.
         """
+        if not self._repo._encodefilterpats and self.size() != fctx.size():
+            return True
+
         return self._filelog.cmp(self._filenode, fctx.data())
 
     def renamed(self):


More information about the Mercurial-devel mailing list