# HG changeset patch # User Christian Ebert # Date 1169254522 -3600 # Node ID 265714c59607ec2bd1f1b1eb66db19bbca6e8c37 # Parent 5208188416845705e02bbed8474bf811972f7aeb# Parent 09847a7eb5d73773ec7b89b4127cc37f4801b0dc Kill buggy branch diff -r 09847a7eb5d7 -r 265714c59607 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)