# HG changeset patch # User Bryan O'Sullivan # Date 1200692951 28800 # Node ID e7ec2217f2d80ae40944a7f1aaf1ce95251b43fd # Parent a0e20a5eba3cc83fb8ddb22f49aad1dc5cdf3cd5# Parent 53be157543d481ee3cbc216a82f3d16daa6eb707 Merge with crew diff -r a0e20a5eba3c -r e7ec2217f2d8 hgext/keyword.py --- a/hgext/keyword.py Fri Jan 18 19:53:38 2008 +0100 +++ b/hgext/keyword.py Fri Jan 18 13:49:11 2008 -0800 @@ -69,12 +69,16 @@ To force expansion after enabling it, or a configuration change, run "hg kwexpand". +Also, when committing with the record extension or using mq's qrecord, be aware +that keywords cannot be updated. Again, run "hg kwexpand" on the files in +question to update keyword expansions after all changes have been checked in. + Expansions spanning more than one line and incremental expansions, like CVS' $Log$, are not supported. A keyword template map "Log = {desc}" expands to the first line of the changeset description. ''' -from mercurial import commands, cmdutil, context, fancyopts, filelog +from mercurial import commands, cmdutil, context, dispatch, filelog from mercurial import patch, localrepo, revlog, templater, util from mercurial.node import * from mercurial.i18n import _ @@ -86,6 +90,14 @@ '''Returns hgdate in cvs-like UTC format.''' return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0])) +def _kwrestrict(cmd): + '''Returns True if cmd should trigger restricted expansion. + Keywords will only expanded when writing to working dir. + Crucial for mq as expanded keywords should not make it into patches.''' + return cmd in ('diff1', + 'qimport', 'qnew', 'qpush', 'qrefresh', 'record', 'qrecord') + + _kwtemplater = None class kwtemplater(object): @@ -103,10 +115,11 @@ 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}', } - def __init__(self, ui, repo, inc, exc): + def __init__(self, ui, repo, inc, exc, hgcmd): self.ui = ui self.repo = repo self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1] + self.hgcmd = hgcmd self.commitnode = None self.path = '' @@ -144,7 +157,7 @@ def expand(self, node, data): '''Returns data with keywords expanded.''' - if util.binary(data): + if util.binary(data) or _kwrestrict(self.hgcmd): return data return self.substitute(node, data, self.re_kw.sub) @@ -395,22 +408,27 @@ This is done for local repos only, and only if there are files configured at all for keyword substitution.''' - def kwbailout(): - '''Obtains command via simplified cmdline parsing, - returns True if keyword expansion not needed.''' - nokwcommands = ('add', 'addremove', 'bundle', 'clone', 'copy', - 'export', 'grep', 'identify', 'incoming', 'init', - 'log', 'outgoing', 'push', 'remove', 'rename', - 'rollback', 'tip', - 'convert') - args = fancyopts.fancyopts(sys.argv[1:], commands.globalopts, {}) - if args: - aliases, i = cmdutil.findcmd(ui, args[0], commands.table) - return aliases[0] in nokwcommands + if not repo.local(): + return - if not repo.local() or kwbailout(): + nokwcommands = ('add', 'addremove', 'bundle', 'clone', 'copy', + 'export', 'grep', 'identify', 'incoming', 'init', + 'log', 'outgoing', 'push', 'remove', 'rename', + 'rollback', 'tip', + 'convert') + hgcmd, func, args, opts, cmdopts = dispatch._parse(ui, sys.argv[1:]) + if hgcmd in nokwcommands: 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'] for pat, opt in ui.configitems('keyword'): if opt != 'ignore': @@ -421,7 +439,7 @@ return global _kwtemplater - _kwtemplater = kwtemplater(ui, repo, inc, exc) + _kwtemplater = kwtemplater(ui, repo, inc, exc, hgcmd) class kwrepo(repo.__class__): def file(self, f, kwmatch=False): @@ -431,6 +449,12 @@ return kwfilelog(self.sopener, f) return filelog.filelog(self.sopener, f) + def wread(self, filename): + data = super(kwrepo, self).wread(filename) + if _kwrestrict(hgcmd) and _kwtemplater.matcher(filename): + return _kwtemplater.shrink(data) + return data + def commit(self, files=None, text='', user=None, date=None, match=util.always, force=False, force_editor=False, p1=None, p2=None, extra={}): diff -r a0e20a5eba3c -r e7ec2217f2d8 tests/test-keyword.out --- a/tests/test-keyword.out Fri Jan 18 19:53:38 2008 +0100 +++ b/tests/test-keyword.out Fri Jan 18 13:49:11 2008 -0800 @@ -36,6 +36,10 @@ To force expansion after enabling it, or a configuration change, run "hg kwexpand". +Also, when committing with the record extension or using mq's qrecord, be aware +that keywords cannot be updated. Again, run "hg kwexpand" on the files in +question to update keyword expansions after all changes have been checked in. + Expansions spanning more than one line and incremental expansions, like CVS' $Log$, are not supported. A keyword template map "Log = {desc}" expands to the first line of the changeset description. @@ -184,7 +188,7 @@ diff -r f782df5f9602 c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -0,0 +1,3 @@ -+expand $Id: c,v 0ba462c0f077 1970/01/01 00:00:01 user $ ++expand $Id$ +do not process $Id: +xxx $ % rollback