# HG changeset patch # User Christian Ebert # Date 1169254337 -3600 # Node ID 5208188416845705e02bbed8474bf811972f7aeb # Parent b2cc6a8d4a180de144d97cae9ea574cac41be8b0 FIX: no appending of attributes to repo, back to b2cc6a8d4a18 The idea was to good/unclean to be true. Raised unknown exception on commit when exiting $EDITOR with return 1. Integrate "innocent" changes since then though. diff -r b2cc6a8d4a18 -r 520818841684 hgkw/keyword.py --- a/hgkw/keyword.py Thu Jan 18 00:06:11 2007 +0100 +++ b/hgkw/keyword.py Sat Jan 20 01:52:17 2007 +0100 @@ -14,14 +14,18 @@ For in-depth discussion refer to . -You can either use the default cvs-like keywords or provide your -own in hgrc. +Keywords are only expanded in local repositories and not logged by +Mercurial internally. The mechanism can be regarded as a convenience +for the current user and may be turned off anytime. -It is recommended to enable this extension on a per-repo basis only. -You can still configure keywordmaps globally. +Substitution takes place on every commit and update of the working +repository. -Expansions spanning more than one line are truncated to their first line. -Incremental expansion (like CVS' $Log$) is not supported. +Keyword expansion is based on Mercurial's changeset template mappings. +The extension provides an additional UTC-date filter. + +The user has the choice either to create his own keywords and their +expansions or to use the CVS-like default ones. Default $keywords$ and their $keyword: substition $ are: Revision: changeset id @@ -32,10 +36,13 @@ Id: basename,v csetid %Y/%m/%d %H:%M:%S username Header: /path/to/basename,v csetid %Y/%m/%d %H:%M:%S username +Expansions spanning more than one line are truncated to their first line. +Incremental expansion (like CVS' $Log$) is not supported. + Simple setup in hgrc: # enable extension - hgext.keyword = /full/path/to/script + keyword = /full/path/to/keyword.py # or, if script in hgext folder: # hgext.keyword = @@ -57,8 +64,9 @@ # above line for backwards compatibility; can be changed to # from mercurial.i18n import _ # some day -from mercurial import cmdutil, templater, util -from mercurial.node import * +from mercurial import context, filelog, revlog +from mercurial import commands, cmdutil, templater, util +from mercurial.node import bin import os.path, re, sys, time deftemplates = { @@ -75,14 +83,32 @@ '''Returns hgdate in cvs-like UTC format.''' return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0])) +def getmodulename(): + '''Makes sure pretxncommit-hook can import keyword module + regardless of where its located.''' + for k, v in sys.modules.iteritems(): + if v is None: + continue + if not hasattr(v, '__file__'): + continue + if v.__file__.startswith(__file__): + return k + else: + 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 = [pat for pat, opt in ui.configitems('keyword') if opt != 'ignore'] + inc, exc = [], [] + for pat, opt in ui.configitems('keyword'): + if opt != 'ignore': + inc.append(pat) + else: + exc.append(pat) if not inc: - ui.warn(_('keyword: no filename globs for expansion\n')) + ui.debug(_('keyword: no filename globs for substitution\n')) return [] - exc = [pat for pat, opt in ui.configitems('keyword') if opt == 'ignore'] kwfmatcher = util.matcher(repo.root, inc=inc, exc=['.hg*']+exc)[1] return [f for f in files if kwfmatcher(f)] @@ -109,18 +135,18 @@ self.t.use_template(template) self.ui.pushbuffer() self.t.show(changenode=node, root=self.repo.root, file=path) - expansion = templater.firstline(self.ui.popbuffer()) - return '$%s: %s $' % (kw, expansion) + kwsub = templater.firstline(self.ui.popbuffer()) + return '$%s: %s $' % (kw, kwsub) def reposetup(ui, repo): '''Sets up repo, and filelog especially, as kwrepo and kwfilelog for keyword substitution. This is done for local repos only.''' - from mercurial import context, filelog, revlog if not repo.local(): return + class kwrepo(repo.__class__): def file(self, f): if f[0] == '/': @@ -172,26 +198,14 @@ filelog.filelog = kwfilelog repo.__class__ = kwrepo - # make pretxncommit hook import kwmodule regardless of where it's located - for k, v in sys.modules.iteritems(): - if v is None: - continue - if not hasattr(v, '__file__'): - continue - if v.__file__.startswith(__file__): - mod = k - break - else: - sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) - mod = os.path.splitext(os.path.basename(__file__))[0] - ui.setconfig('hooks', 'pretxncommit.keyword', 'python:%s.pretxnkw' % mod) - del mod + # configure pretxncommit hook + ui.setconfig('hooks', 'pretxncommit.keyword', + 'python:%s.pretxnkw' % getmodulename()) def pretxnkw(ui, repo, hooktype, **args): '''pretxncommit hook that collects candidates for keyword expansion on commit and expands keywords in working dir.''' - from mercurial import commands cmd, sysargs, globalopts, cmdopts = commands.parse(ui, sys.argv[1:])[1:] if repr(cmd).split()[1] in ('tag', 'import_'):