# HG changeset patch # User Christian Ebert # Date 1274530249 -7200 # Node ID 8ab7289402a48de404aee546468d56953fe86f30 # Parent 6c99007688cec5f3f819d5fc3cfa4e373ec13304# Parent fdbfecffd95b41f4227cb1da587d7154844b14a2 (stable) merge diff -r 6c99007688ce -r 8ab7289402a4 hgkw/keyword.py --- a/hgkw/keyword.py Tue May 18 16:31:10 2010 +0200 +++ b/hgkw/keyword.py Sat May 22 14:10:49 2010 +0200 @@ -35,8 +35,8 @@ change history. The mechanism can be regarded as a convenience for the current user or for archive distribution. -Configuration is done in the [keyword] and [keywordmaps] sections of -hgrc files. +Configuration is done in the [keyword], [keywordset] and [keywordmaps] +sections of hgrc files. Example:: @@ -45,6 +45,10 @@ **.py = x* = ignore + [keywordset] + # prefer svn- over cvs-like default keywordmaps + svn = True + NOTE: the more specific you are in your filename patterns the less you lose speed in huge repositories. @@ -52,8 +56,11 @@ control run :hg:`kwdemo`. See :hg:`help templates` for a list of available templates and filters. -An additional date template filter {date|utcdate} is provided. It -returns a date like "2006/09/18 15:13:13". +Three additional date template filters are provided:: + + utcdate "2006/09/18 15:13:13" + svnutcdate "2006-09-18 15:13:13Z" + svnisodate "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)" The default template mappings (view with :hg:`kwdemo -d`) can be replaced with customized keywords and templates. Again, run @@ -94,21 +101,24 @@ # names of extensions using dorecord recordextensions = 'record' -# provide cvs-like UTC date filter +# date like in cvs' $Date utcdate = lambda x: util.datestr((x[0], 0), '%Y/%m/%d %H:%M:%S') +# date like in svn's $Date +svnisodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)') +# date like in svn's $Id +svnutcdate = lambda x: util.datestr((x[0], 0), '%Y-%m-%d %H:%M:%SZ') # make keyword tools accessible kwtools = {'templater': None, 'hgcmd': '', 'inc': [], 'exc': ['.hg*']} -class kwtemplater(object): - ''' - Sets up keyword templates, corresponding keyword regex, and - provides keyword substitution functions. - ''' +def _defaultkwmaps(ui): + '''Returns default keywordmaps according to keywordset configuration.''' templates = { 'Revision': '{node|short}', 'Author': '{author|user}', + } + kwsets = ({ 'Date': '{date|utcdate}', 'RCSfile': '{file|basename},v', 'RCSFile': '{file|basename},v', # kept for backwards compatibility @@ -116,7 +126,21 @@ 'Source': '{root}/{file},v', 'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}', 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}', - } + }, { + 'Date': '{date|svnisodate}', + 'Id': '{file|basename},v {node|short} {date|svnutcdate} {author|user}', + 'LastChangedRevision': '{node|short}', + 'LastChangedBy': '{author|user}', + 'LastChangedDate': '{date|svnisodate}', + }) + templates.update(kwsets[ui.configbool('keywordset', 'svn')]) + return templates + +class kwtemplater(object): + ''' + Sets up keyword templates, corresponding keyword regex, and + provides keyword substitution functions. + ''' def __init__(self, ui, repo): self.ui = ui @@ -130,11 +154,15 @@ if kwmaps: # override default templates self.templates = dict((k, templater.parsestring(v, False)) for k, v in kwmaps) + else: + self.templates = _defaultkwmaps(self.ui) escaped = map(re.escape, self.templates.keys()) kwpat = r'\$(%s)(: [^$\n\r]*? )??\$' % '|'.join(escaped) self.re_kw = re.compile(kwpat) templatefilters.filters['utcdate'] = utcdate + templatefilters.filters['svnisodate'] = svnisodate + templatefilters.filters['svnutcdate'] = svnutcdate def substitute(self, data, path, ctx, subfunc): '''Replaces keywords in data with expanded template.''' @@ -313,14 +341,14 @@ kwmaps = dict(ui.configitems('keywordmaps')) elif opts.get('default'): ui.status(_('\n\tconfiguration using default keyword template maps\n')) - kwmaps = kwtemplater.templates + kwmaps = _defaultkwmaps(ui) if uikwmaps: ui.status(_('\tdisabling current template maps\n')) for k, v in kwmaps.iteritems(): ui.setconfig('keywordmaps', k, v) else: ui.status(_('\n\tconfiguration using current keyword template maps\n')) - kwmaps = dict(uikwmaps) or kwtemplater.templates + kwmaps = dict(uikwmaps) or _defaultkwmaps(ui) uisetup(ui) reposetup(ui, repo)