Kill buggy branch kwmap-templates
authorChristian Ebert <blacktrash@gmx.net>
Sat, 20 Jan 2007 01:55:22 +0100
branchkwmap-templates
changeset 116 265714c59607
parent 115 520818841684 (diff)
parent 114 09847a7eb5d7 (current diff)
child 117 201e9affcf0f
Kill buggy branch
hgkw/keyword.py
--- a/hgkw/keyword.py	Sat Jan 20 00:55:31 2007 +0100
+++ b/hgkw/keyword.py	Sat Jan 20 01:55:22 2007 +0100
@@ -66,7 +66,7 @@
 # some day
 from mercurial import context, filelog, revlog
 from mercurial import commands, cmdutil, templater, util
-from mercurial.node import *
+from mercurial.node import bin
 import os.path, re, sys, time
 
 deftemplates = {
@@ -97,14 +97,26 @@
         sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
         return os.path.splitext(os.path.basename(__file__))[0]
 
+def kwfmatches(ui, repo, files):
+    '''Selects candidates for keyword substitution
+    configured in keyword section in hgrc.'''
+    inc, exc = [], []
+    for pat, opt in ui.configitems('keyword'):
+        if opt != 'ignore':
+            inc.append(pat)
+        else:
+            exc.append(pat)
+    if not inc:
+        ui.debug(_('keyword: no filename globs for substitution\n'))
+        return []
+    kwfmatcher = util.matcher(repo.root, inc=inc, exc=['.hg*']+exc)[1]
+    return [f for f in files if kwfmatcher(f)]
+
 
 class kwtemplater(object):
     '''
     Sets up keyword templates, corresponding keyword regex, and
     provides keyword expansion function.
-
-    If a repo is configured for keyword substitution, this class
-    will be set as an (appendix) attribute to the repo.
     '''
     def __init__(self, ui, repo):
         self.ui = ui
@@ -114,6 +126,7 @@
                 '|'.join(re.escape(k) for k in self.templates.keys()))
         templater.common_filters['utcdate'] = utcdate
         self.t = cmdutil.changeset_templater(ui, repo, False, '', False)
+            
 
     def expand(self, mobj, path, node):
         '''Expands keyword with corresponding template.'''
@@ -129,21 +142,10 @@
 def reposetup(ui, repo):
     '''Sets up repo, and filelog especially, as kwrepo and kwfilelog
     for keyword substitution.  This is done for local repos only.'''
+
     if not repo.local():
         return
 
-    # get glob patterns to detect filenames
-    # for inclusion in or exclusion from keyword substitution
-    inc, exc = [], []
-    for pat, opt in ui.configitems('keyword'):
-        if opt != 'ignore':
-            inc.append(pat)
-        else:
-            exc.append(pat)
-    if not inc:
-        ui.debug(_('keyword: no filename globs for substitution\n'))
-        return
-
 
     class kwrepo(repo.__class__):
         def file(self, f):
@@ -161,15 +163,15 @@
             super(kwfilelog, self).__init__(opener, path, defversion)
             self._repo = repo
             self._path = path
-            # check at init if file configured for keyword substition
-            if not isinstance(repo, int) and repo.kwfmatcher(path):
-                self.kwsub = True
+            # only init kwtemplater if needed
+            if not isinstance(repo, int) and kwfmatches(ui, repo, [path]):
+                self.kwt = kwtemplater(ui, repo)
             else:
-                self.kwsub = False
+                self.kwt = None
 
         def iskwcandidate(self, data):
             '''Decides whether to act on keywords.'''
-            return self.kwsub and not util.binary(data)
+            return self.kwt is not None and not util.binary(data)
 
         def read(self, node):
             '''Substitutes keywords when reading filelog.'''
@@ -177,31 +179,25 @@
             if self.iskwcandidate(data):
                 c = context.filectx(self._repo, self._path,
                                     fileid=node, filelog=self)
-                return self._repo.kwt.re_kw.sub(lambda m:
-                        self._repo.kwt.expand(m, self._path, c.node()), data)
+                return self.kwt.re_kw.sub(lambda m:
+                        self.kwt.expand(m, self._path, c.node()), data)
             return data
 
         def add(self, text, meta, tr, link, p1=None, p2=None):
             '''Removes keyword substitutions when adding to filelog.'''
             if self.iskwcandidate(text):
-                text = self._repo.kwt.re_kw.sub(r'$\1$', text)
+                text = self.kwt.re_kw.sub(r'$\1$', text)
             return super(kwfilelog, self).add(text,
                             meta, tr, link, p1=p1, p2=p2)
 
         def cmp(self, node, text):
             '''Removes keyword substitutions for comparison.'''
             if self.iskwcandidate(text):
-                text = self._repo.kwt.re_kw.sub(r'$\1$', text)
+                text = self.kwt.re_kw.sub(r'$\1$', text)
             return super(kwfilelog, self).cmp(node, text)
 
-
     filelog.filelog = kwfilelog
     repo.__class__ = kwrepo
-
-    # create filematching function once for repo
-    repo.kwfmatcher = util.matcher(repo.root, inc=inc, exc=['.hg*']+exc)[1]
-    # initialize kwtemplater once for repo
-    repo.kwt = kwtemplater(ui, repo)
     # configure pretxncommit hook
     ui.setconfig('hooks', 'pretxncommit.keyword',
             'python:%s.pretxnkw' % getmodulename())
@@ -217,16 +213,16 @@
 
     files, match, anypats = cmdutil.matchpats(repo, sysargs, cmdopts)
     modified, added = repo.status(files=files, match=match)[:2]
-    candidates = [f for f in modified+added if repo.kwfmatcher(f)]
+    candidates = kwfmatches(ui, repo, modified+added)
     if not candidates:
         return
 
+    kwt = kwtemplater(ui, repo)
     node = bin(args['node'])
     for f in candidates:
         data = repo.wfile(f).read()
         if not util.binary(data):
-            data, kwct = repo.kwt.re_kw.subn(lambda m:
-                            repo.kwt.expand(m, f, node), data)
+            data, kwct = kwt.re_kw.subn(lambda m: kwt.expand(m, f, node), data)
             if kwct:
                 ui.debug(_('overwriting %s expanding keywords\n' % f))
                 repo.wfile(f, 'w').write(data)