keyword: monkeypatch dispatch._parse to avoid redundant run
authorChristian Ebert <blacktrash@gmx.net>
Thu, 07 Feb 2008 22:25:00 +0100
changeset 6052 75425961e955
parent 6051 1038b1458d7a
child 6053 4e87e785c5bf
keyword: monkeypatch dispatch._parse to avoid redundant run Inspired by Thomas Arendsen Hein.
hgext/keyword.py
--- a/hgext/keyword.py	Wed Feb 06 23:14:33 2008 +0100
+++ b/hgext/keyword.py	Thu Feb 07 22:25:00 2008 +0100
@@ -82,7 +82,7 @@
 from mercurial import patch, localrepo, templater, templatefilters, util
 from mercurial.node import *
 from mercurial.i18n import _
-import re, shutil, sys, tempfile, time
+import re, shutil, tempfile, time
 
 commands.optionalrepo += ' kwdemo'
 
@@ -99,7 +99,30 @@
     return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
 
 
-_kwtemplater = None
+_kwtemplater, _cmd, _cmdoptions = None, None, None
+ 
+# store originals of monkeypatches
+_patchfile_init = patch.patchfile.__init__
+_dispatch_parse = dispatch._parse
+
+def _kwpatchfile_init(self, ui, fname, missing=False):
+    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
+    rejects or conflicts due to expanded keywords in working dir.'''
+    _patchfile_init(self, ui, fname, missing=missing)
+    if _kwtemplater.matcher(self.fname):
+        # shrink keywords read from working dir
+        kwshrunk = _kwtemplater.shrink(''.join(self.lines))
+        self.lines = kwshrunk.splitlines(True)
+
+def _kwdispatch_parse(ui, args):
+    '''Monkeypatch dispatch._parse to obtain
+    current command and command options (global _cmd, _cmdoptions).'''
+    global _cmd, _cmdoptions
+    _cmd, func, args, options, _cmdoptions = _dispatch_parse(ui, args)
+    return _cmd, func, args, options, _cmdoptions
+
+dispatch._parse = _kwdispatch_parse
+
 
 class kwtemplater(object):
     '''
@@ -211,21 +234,6 @@
             return t2 != text
         return revlog.revlog.cmp(self, node, text)
 
-
-# store original patch.patchfile.__init__
-_patchfile_init = patch.patchfile.__init__
-
-def _kwpatchfile_init(self, ui, fname, missing=False):
-    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
-    rejects or conflicts due to expanded keywords in working dir.'''
-    _patchfile_init(self, ui, fname, missing=missing)
-
-    if _kwtemplater.matcher(self.fname):
-        # shrink keywords read from working dir
-        kwshrunk = _kwtemplater.shrink(''.join(self.lines))
-        self.lines = kwshrunk.splitlines(True)
-
-
 def _iskwfile(f, link):
     return not link(f) and _kwtemplater.matcher(f)
 
@@ -410,26 +418,17 @@
     This is done for local repos only, and only if there are
     files configured at all for keyword substitution.'''
 
+    global _kwtemplater
+    hgcmd, hgcmdopts = _cmd, _cmdoptions
+
     try:
-        if (not repo.local() or '.hg' in repo.root.split('/')
+        if (not repo.local() or hgcmd in nokwcommands.split() 
+            or '.hg' in repo.root.split('/')
             or repo._url.startswith('bundle:')):
             return
     except AttributeError:
         pass
 
-    hgcmd, func, args, opts, cmdopts = dispatch._parse(ui, sys.argv[1:])
-    if hgcmd in nokwcommands.split():
-        return
-
-    if hgcmd == 'diff':
-        # only expand if comparing against working dir
-        node1, node2 = cmdutil.revpair(repo, cmdopts.get('rev'))
-        if node2 is not None:
-            return
-        # shrink if rev is not current node
-        if node1 is not None and node1 != repo.changectx().node():
-            hgcmd = 'diff1'
-
     inc, exc = [], ['.hg*']
     for pat, opt in ui.configitems('keyword'):
         if opt != 'ignore':
@@ -439,7 +438,15 @@
     if not inc:
         return
 
-    global _kwtemplater
+    if hgcmd == 'diff':
+        # only expand if comparing against working dir
+        node1, node2 = cmdutil.revpair(repo, hgcmdopts.get('rev'))
+        if node2 is not None:
+            return
+        # shrink if rev is not current node
+        if node1 is not None and node1 != repo.changectx().node():
+            hgcmd = 'diff1'
+
     restrict = hgcmd in restricted.split()
     _kwtemplater = kwtemplater(ui, repo, inc, exc, restrict)