# HG changeset patch # User Christian Ebert # Date 1202376725 -3600 # Node ID e93c63004ec292c542dd0c01c71e99f71fa703e6 # Parent 482c91f8c23050155c930574cede53d24a4f0c2c Monkeypatch dispatch._parse to avoid running it twice Inspired by Thomas Arendsen Hain. diff -r 482c91f8c230 -r e93c63004ec2 hgkw/keyword.py --- a/hgkw/keyword.py Thu Feb 07 01:49:17 2008 +0100 +++ b/hgkw/keyword.py Thu Feb 07 10:32:05 2008 +0100 @@ -84,7 +84,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' @@ -101,7 +101,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): ''' @@ -213,21 +236,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) @@ -412,26 +420,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 = [], ['.hgtags', '.hg_archival.txt'] for pat, opt in ui.configitems('keyword'): if opt != 'ignore': @@ -441,7 +440,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)