--- a/hgkw/keyword.py Tue Feb 05 16:09:21 2008 -0600
+++ b/hgkw/keyword.py Sat Feb 09 09:42:00 2008 +0100
@@ -84,13 +84,13 @@
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'
# hg commands that do not act on keywords
nokwcommands = ('add addremove bundle copy export grep identify incoming init'
- ' log outgoing push remove rename rollback tip convert')
+ ' log outgoing push remove rename rollback tip convert email')
# hg commands that trigger expansion only when writing to working dir,
# not when reading filelog, and unexpand when reading from working dir
@@ -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):
'''
@@ -118,11 +141,11 @@
'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
}
- def __init__(self, ui, repo, inc, exc, restricted):
+ def __init__(self, ui, repo, inc, exc, restrict):
self.ui = ui
self.repo = repo
self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
- self.restricted = restricted
+ self.restrict = restrict
self.commitnode = None
self.path = ''
@@ -161,7 +184,7 @@
def expand(self, node, data):
'''Returns data with keywords expanded.'''
- if self.restricted or util.binary(data):
+ if self.restrict or util.binary(data):
return data
return self.substitute(node, data, self.re_kw.sub)
@@ -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,23 +420,18 @@
This is done for local repos only, and only if there are
files configured at all for keyword substitution.'''
- if not repo.local():
- return
-
- hgcmd, func, args, opts, cmdopts = dispatch._parse(ui, sys.argv[1:])
- if hgcmd in nokwcommands.split():
- return
+ global _kwtemplater
+ hgcmd, hgcmdopts = _cmd, _cmdoptions
- if hgcmd == 'diff':
- # only expand if comparing against working dir
- node1, node2 = cmdutil.revpair(repo, cmdopts.get('rev'))
- if node2 is not None:
+ try:
+ if (not repo.local() or hgcmd in nokwcommands.split()
+ or '.hg' in repo.root.split('/')
+ or repo._url.startswith('bundle:')):
return
- # shrink if rev is not current node
- if node1 is not None and node1 != repo.changectx().node():
- hgcmd = 'diff1'
+ except AttributeError:
+ pass
- inc, exc = [], ['.hgtags']
+ inc, exc = [], ['.hg*']
for pat, opt in ui.configitems('keyword'):
if opt != 'ignore':
inc.append(pat)
@@ -437,9 +440,17 @@
if not inc:
return
- global _kwtemplater
- _restricted = hgcmd in restricted.split()
- _kwtemplater = kwtemplater(ui, repo, inc, exc, _restricted)
+ 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)
class kwrepo(repo.__class__):
def file(self, f, kwmatch=False):
@@ -451,7 +462,7 @@
def wread(self, filename):
data = super(kwrepo, self).wread(filename)
- if _restricted and _kwtemplater.matcher(filename):
+ if restrict and _kwtemplater.matcher(filename):
return _kwtemplater.shrink(data)
return data