##// END OF EJS Templates
merge with stable
merge with stable

File last commit:

r15387:87248de0 stable
r15788:07b6af90 merge default
Show More
keyword.py
701 lines | 26.2 KiB | text/x-python | PythonLexer
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 # keyword.py - $Keyword$ expansion for Mercurial
#
Christian Ebert
keyword: update copyright
r10653 # Copyright 2007-2010 Christian Ebert <blacktrash@gmx.net>
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 #
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 #
# $Id$
#
# Keyword expansion hack against the grain of a DSCM
#
# There are many good reasons why this is not needed in a distributed
# SCM, still it may be useful in very small projects based on single
Martin Geisler
keyword: word-wrap help texts at 70 characters
r7993 # files (like LaTeX packages), that are mostly addressed to an
# audience not running a version control system.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 #
# For in-depth discussion refer to
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 # <http://mercurial.selenic.com/wiki/KeywordPlan>.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 #
# Keyword expansion is based on Mercurial's changeset template mappings.
#
# Binary files are not touched.
#
# Files to act upon/ignore are specified in the [keyword] section.
# Customized keyword template mappings in the [keywordmaps] section.
#
# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
Cédric Duval
extensions: improve the consistency of synopses...
r8894 '''expand keywords in tracked files
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 This extension expands RCS/CVS-like or self-customized $Keywords$ in
tracked text files selected by your configuration.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 Keywords are only expanded in local repositories and not stored in the
change history. The mechanism can be regarded as a convenience for the
current user or for archive distribution.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: explain file-wise expansion in help
r12203 Keywords expand to the changeset data pertaining to the latest change
relative to the working directory parent of each file.
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 Configuration is done in the [keyword], [keywordset] and [keywordmaps]
sections of hgrc files.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
commands: use minirst parser when displaying help
r9157 Example::
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
[keyword]
# expand keywords in every python file except those matching "x*"
**.py =
x* = ignore
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 [keywordset]
# prefer svn- over cvs-like default keywordmaps
svn = True
Christian Ebert
Use more note admonitions in help texts
r12390 .. note::
The more specific you are in your filename patterns the less you
lose speed in huge repositories.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 For [keywordmaps] template mapping and expansion demonstration and
Martin Geisler
Use hg role in help strings
r10973 control run :hg:`kwdemo`. See :hg:`help templates` for a list of
Christian Ebert
keyword: reference templating help, add utcdate filter example
r9307 available templates and filters.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: convert a verbatim block to a field list
r13885 Three additional date template filters are provided:
Christian Ebert
keyword: add 2 svn-like date filters...
r11213
Martin Geisler
keyword: convert a verbatim block to a field list
r13885 :``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)"
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
Use hg role in help strings
r10973 The default template mappings (view with :hg:`kwdemo -d`) can be
replaced with customized keywords and templates. Again, run
Christian Ebert
keyword: s/config/configuration/ in help
r13025 :hg:`kwdemo` to control the results of your configuration changes.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: update documentation for kwshrink...
r13270 Before changing/disabling active keywords, you must run :hg:`kwshrink`
to avoid storing expanded keywords in the change history.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 To force expansion after enabling it, or a configuration change, run
Martin Geisler
Use hg role in help strings
r10973 :hg:`kwexpand`.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 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.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''
Nicolas Dumazet
filectx: use ctx.size comparisons to speed up ctx.cmp...
r12709 from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
Christian Ebert
keyword: disable expansion in kwfilelog.read() if file renamed in node...
r12628 from mercurial import localrepo, match, patch, templatefilters, templater, util
Adrian Buehlmann
move canonpath from util to scmutil
r13971 from mercurial import scmutil
Christian Ebert
keyword: no expansion in web diffs...
r6072 from mercurial.hgweb import webcommands
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 from mercurial.i18n import _
Matt Mackall
keyword: backout realpath change (issue3071)
r15387 import os, re, shutil, tempfile
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
commands.optionalrepo += ' kwdemo'
Martin Geisler
keyword: use cmdutil.command decorator
r14300 cmdtable = {}
command = cmdutil.command(cmdtable)
Christian Ebert
keyword: nokwcommands, restricted string variables at top level...
r6024 # hg commands that do not act on keywords
Christian Ebert
keyword: support copy and rename...
r12626 nokwcommands = ('add addremove annotate bundle export grep incoming init log'
' outgoing push tip verify convert email glog')
Christian Ebert
keyword: nokwcommands, restricted string variables at top level...
r6024
Christian Ebert
keyword: detect restricted commands thru variable
r5961 # hg commands that trigger expansion only when writing to working dir,
# not when reading filelog, and unexpand when reading from working dir
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
Christian Ebert
keyword: detect restricted commands thru variable
r5961
Christian Ebert
keyword: support extensions using dorecord, e.g. crecord...
r11168 # names of extensions using dorecord
recordextensions = 'record'
Christian Ebert
keyword: support (q)record...
r11045
Christian Ebert
keyword: colorize hg kwfiles output
r13078 colortable = {
'kwfiles.enabled': 'green bold',
Christian Ebert
keyword: make kwfiles show deleted files configured for expansion
r13079 'kwfiles.deleted': 'cyan bold underline',
Christian Ebert
keyword: colorize hg kwfiles output
r13078 'kwfiles.enabledunknown': 'green',
'kwfiles.ignored': 'bold',
'kwfiles.ignoredunknown': 'none'
}
Christian Ebert
keyword: add 2 svn-like date filters...
r11213 # date like in cvs' $Date
Patrick Mezard
templates: document missing keywords or filters...
r13592 def utcdate(text):
Christian Ebert
keyword: docstrings for additional date filters
r13633 ''':utcdate: Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
'''
Patrick Mezard
templates: document missing keywords or filters...
r13592 return util.datestr((text[0], 0), '%Y/%m/%d %H:%M:%S')
Christian Ebert
keyword: add 2 svn-like date filters...
r11213 # date like in svn's $Date
Patrick Mezard
templates: document missing keywords or filters...
r13592 def svnisodate(text):
Christian Ebert
keyword: docstrings for additional date filters
r13633 ''':svnisodate: Date. Returns a date in this format: "2009-08-18 13:00:13
+0200 (Tue, 18 Aug 2009)".
'''
Patrick Mezard
templates: document missing keywords or filters...
r13592 return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
Christian Ebert
keyword: add 2 svn-like date filters...
r11213 # date like in svn's $Id
Patrick Mezard
templates: document missing keywords or filters...
r13592 def svnutcdate(text):
Christian Ebert
keyword: docstrings for additional date filters
r13633 ''':svnutcdate: Date. Returns a UTC-date in this format: "2009-08-18
11:00:13Z".
'''
Patrick Mezard
templates: document missing keywords or filters...
r13592 return util.datestr((text[0], 0), '%Y-%m-%d %H:%M:%SZ')
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: offer additional datefilters when the extension is enabled...
r13634 templatefilters.filters.update({'utcdate': utcdate,
'svnisodate': svnisodate,
'svnutcdate': svnutcdate})
Christian Ebert
keyword: make main class and hg command accessible...
r6115 # make keyword tools accessible
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 kwtools = {'templater': None, 'hgcmd': ''}
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 def _defaultkwmaps(ui):
'''Returns default keywordmaps according to keywordset configuration.'''
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 templates = {
'Revision': '{node|short}',
'Author': '{author|user}',
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 }
kwsets = ({
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 'Date': '{date|utcdate}',
Christian Ebert
keyword: the CVS keyword is $RCSfile$, not $RCSFile$...
r9943 'RCSfile': '{file|basename},v',
timeless
keyword: clarify object of backwards compatibility
r9950 'RCSFile': '{file|basename},v', # kept for backwards compatibility
# with hg-keyword
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 'Source': '{root}/{file},v',
'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 }, {
'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
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 def _shrinktext(text, subfunc):
'''Helper for keyword expansion removal in text.
Depending on subfunc also returns number of substitutions.'''
return subfunc(r'$\1$', text)
Christian Ebert
keyword: code cleanup...
r12723 def _preselect(wstatus, changed):
'''Retrieves modfied and added files from a working directory state
and returns the subset of each contained in given changed files
retrieved from a change context.'''
modified, added = wstatus[:2]
modified = [f for f in modified if f in changed]
added = [f for f in added if f in changed]
return modified, added
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 class kwtemplater(object):
'''
Sets up keyword templates, corresponding keyword regex, and
provides keyword substitution functions.
'''
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 def __init__(self, ui, repo, inc, exc):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 self.ui = ui
self.repo = repo
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 self.match = match.match(repo.root, '', [], inc, exc)
Christian Ebert
keyword: make main class and hg command accessible...
r6115 self.restrict = kwtools['hgcmd'] in restricted.split()
Christian Ebert
keyword: switch kwtemplater.record in kw_dorecord()...
r12631 self.record = False
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
kwmaps = self.ui.configitems('keywordmaps')
if kwmaps: # override default templates
Christian Ebert
keyword: collect kwmaps using a generator expression...
r9081 self.templates = dict((k, templater.parsestring(v, False))
for k, v in kwmaps)
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 else:
self.templates = _defaultkwmaps(self.ui)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 @util.propertycache
def escape(self):
'''Returns bar-separated and escaped keywords.'''
return '|'.join(map(re.escape, self.templates.keys()))
@util.propertycache
def rekw(self):
'''Returns regex for unexpanded keywords.'''
return re.compile(r'\$(%s)\$' % self.escape)
@util.propertycache
def rekwexp(self):
'''Returns regex for expanded keywords.'''
return re.compile(r'\$(%s): [^$\n\r]*? \$' % self.escape)
Dirkjan Ochtman
keyword: be more efficient about ctx usage
r7375 def substitute(self, data, path, ctx, subfunc):
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 '''Replaces keywords in data with expanded template.'''
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def kwsub(mobj):
kw = mobj.group(1)
Christian Ebert
keyword: make the templater a local variable...
r10894 ct = cmdutil.changeset_templater(self.ui, self.repo,
False, None, '', False)
ct.use_template(self.templates[kw])
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 self.ui.pushbuffer()
Christian Ebert
keyword: make the templater a local variable...
r10894 ct.show(ctx, root=self.repo.root, file=path)
Christian Ebert
keyword: split line continuation in 2 steps (style)
r6023 ekw = templatefilters.firstline(self.ui.popbuffer())
return '$%s: %s $' % (kw, ekw)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 return subfunc(kwsub, data)
Christian Ebert
keyword: function to look up changectx for expansion...
r12920 def linkctx(self, path, fileid):
'''Similar to filelog.linkrev, but returns a changectx.'''
return self.repo.filectx(path, fileid=fileid).changectx()
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 def expand(self, path, node, data):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''Returns data with keywords expanded.'''
Christian Ebert
keyword: rename matcher() to match() mimicking changes in main
r8638 if not self.restrict and self.match(path) and not util.binary(data):
Christian Ebert
keyword: function to look up changectx for expansion...
r12920 ctx = self.linkctx(path, node)
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 return self.substitute(data, path, ctx, self.rekw.sub)
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 return data
Christian Ebert
keyword: make iskwfile() a weeding method in lieu of a boolean...
r12627 def iskwfile(self, cand, ctx):
'''Returns subset of candidates which are configured for keyword
Christian Ebert
keyword: correct grammar in iskwfile docstring
r15324 expansion but are not symbolic links.'''
Christian Ebert
keyword: make iskwfile() a weeding method in lieu of a boolean...
r12627 return [f for f in cand if self.match(f) and not 'l' in ctx.flags(f)]
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: enforce subn method via boolean switch...
r12685 def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 '''Overwrites selected files expanding/shrinking keywords.'''
Christian Ebert
keyword: fix regressions introduced in d87f3ff904ba...
r12844 if self.restrict or lookup or self.record: # exclude kw_copy
Christian Ebert
keyword: make iskwfile() a weeding method in lieu of a boolean...
r12627 candidates = self.iskwfile(candidates, ctx)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 if not candidates:
return
Christian Ebert
keyword: fix regressions introduced in d87f3ff904ba...
r12844 kwcmd = self.restrict and lookup # kwexpand/kwshrink
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 if self.restrict or expand and lookup:
Christian Ebert
keyword: postpone manifest calculation in kwtemplater.overwrite...
r11350 mf = ctx.manifest()
Christian Ebert
keyword: avoid x = a and b or c
r15030 if self.restrict or rekw:
re_kw = self.rekw
else:
re_kw = self.rekwexp
if expand:
msg = _('overwriting %s expanding keywords\n')
else:
msg = _('overwriting %s shrinking keywords\n')
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 for f in candidates:
if self.restrict:
data = self.repo.file(f).read(mf[f])
else:
data = self.repo.wread(f)
if util.binary(data):
continue
if expand:
if lookup:
Christian Ebert
keyword: use wopener(..., atomictemp=True) to overwrite
r15083 ctx = self.linkctx(f, mf[f])
data, found = self.substitute(data, f, ctx, re_kw.subn)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 elif self.restrict:
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 found = re_kw.search(data)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 else:
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 data, found = _shrinktext(data, re_kw.subn)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 if found:
self.ui.note(msg % f)
Christian Ebert
keyword: use wopener(..., atomictemp=True) to overwrite
r15083 fp = self.repo.wopener(f, "wb", atomictemp=True)
fp.write(data)
fp.close()
Christian Ebert
keyword: fix regressions introduced in d87f3ff904ba...
r12844 if kwcmd:
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 self.repo.dirstate.normal(f)
elif self.record:
self.repo.dirstate.normallookup(f)
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114
def shrink(self, fname, text):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''Returns text with all keyword substitutions removed.'''
Christian Ebert
keyword: rename matcher() to match() mimicking changes in main
r8638 if self.match(fname) and not util.binary(text):
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 return _shrinktext(text, self.rekwexp.sub)
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 return text
def shrinklines(self, fname, lines):
'''Returns lines with keyword substitutions removed.'''
Christian Ebert
keyword: rename matcher() to match() mimicking changes in main
r8638 if self.match(fname):
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 text = ''.join(lines)
Bryan O'Sullivan
Get rid of reimplementations of util.binary
r6508 if not util.binary(text):
Christian Ebert
keyword: turn regexes and escaped keywords into a propertycache
r12926 return _shrinktext(text, self.rekwexp.sub).splitlines(True)
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 return lines
def wread(self, fname, data):
'''If in restricted mode returns data read from wdir with
keyword substitutions removed.'''
Christian Ebert
keyword: avoid x = a and b or c
r15030 if self.restrict:
return self.shrink(fname, data)
return data
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
class kwfilelog(filelog.filelog):
'''
Subclass of filelog to hook into its read, add, cmp methods.
Keywords are "stored" unexpanded, and processed on reading.
'''
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 def __init__(self, opener, kwt, path):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 super(kwfilelog, self).__init__(opener, path)
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 self.kwt = kwt
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 self.path = path
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
def read(self, node):
'''Expands keywords when reading filelog.'''
data = super(kwfilelog, self).read(node)
Christian Ebert
keyword: disable expansion in kwfilelog.read() if file renamed in node...
r12628 if self.renamed(node):
return data
Christian Ebert
keyword: make main class and hg command accessible...
r6115 return self.kwt.expand(self.path, node, data)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
def add(self, text, meta, tr, link, p1=None, p2=None):
'''Removes keyword substitutions when adding to filelog.'''
Christian Ebert
keyword: make main class and hg command accessible...
r6115 text = self.kwt.shrink(self.path, text)
Christian Ebert
keyword: compact setting of optional arguments
r6504 return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
def cmp(self, node, text):
'''Removes keyword substitutions for comparison.'''
Christian Ebert
keyword: make main class and hg command accessible...
r6115 text = self.kwt.shrink(self.path, text)
Christian Ebert
keyword: disable expansion in kwfilelog.read() if file renamed in node...
r12628 return super(kwfilelog, self).cmp(node, text)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: reuse already present working contexts for match...
r14835 def _status(ui, repo, wctx, kwt, *pats, **opts):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''Bails out if [keyword] configuration is not active.
Returns status of working directory.'''
Christian Ebert
keyword: make main class and hg command accessible...
r6115 if kwt:
Christian Ebert
keyword: reuse already present working contexts for match...
r14835 return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
Christian Ebert
keyword: remove deprecated options
r10652 unknown=opts.get('unknown') or opts.get('all'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 if ui.configitems('keyword'):
raise util.Abort(_('[keyword] patterns cannot match'))
raise util.Abort(_('no [keyword] patterns configured'))
def _kwfwrite(ui, repo, expand, *pats, **opts):
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 '''Selects files and passes them to kwtemplater.overwrite.'''
Christian Ebert
keyword: pass context to kwtemplater.overwrite...
r11320 wctx = repo[None]
if len(wctx.parents()) > 1:
Christian Ebert
keyword: mimic cmdutil.bail_if_changed even more...
r6672 raise util.Abort(_('outstanding uncommitted merge'))
Christian Ebert
keyword: make main class and hg command accessible...
r6115 kwt = kwtools['templater']
Christian Ebert
keyword: remove spurious locks, improve handling of wlock...
r10604 wlock = repo.wlock()
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 try:
Christian Ebert
keyword: reuse already present working contexts for match...
r14835 status = _status(ui, repo, wctx, kwt, *pats, **opts)
Christian Ebert
keyword: remove spurious locks, improve handling of wlock...
r10604 modified, added, removed, deleted, unknown, ignored, clean = status
if modified or added or removed or deleted:
raise util.Abort(_('outstanding uncommitted changes'))
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 kwt.overwrite(wctx, clean, True, expand)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 finally:
Christian Ebert
keyword: remove spurious locks, improve handling of wlock...
r10604 wlock.release()
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: use cmdutil.command decorator
r14300 @command('kwdemo',
[('d', 'default', None, _('show default keyword template maps')),
('f', 'rcfile', '',
_('read maps from rcfile'), _('FILE'))],
_('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def demo(ui, repo, *args, **opts):
'''print [keywordmaps] configuration and an expansion example
Martin Geisler
keyword: word-wrap help texts at 70 characters
r7993 Show current, custom, or default keyword template maps and their
timeless
keyword: improve English
r8763 expansions.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 Extend the current configuration by specifying maps as arguments
and using -f/--rcfile to source an external hgrc file.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 Use -d/--default to disable current configuration.
Christian Ebert
keyword: reference templating help, add utcdate filter example
r9307
Martin Geisler
Use our custom hg reStructuredText role some more...
r11193 See :hg:`help templates` for information on templates and filters.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''
def demoitems(section, items):
ui.write('[%s]\n' % section)
Martin Geisler
keyword: sort demo output to ensure deterministic output
r9942 for k, v in sorted(items):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 ui.write('%s = %s\n' % (k, v))
fn = 'demo.txt'
tmpdir = tempfile.mkdtemp('', 'kwdemo.')
Martin Geisler
expand "repo" to "repository" in help texts
r8027 ui.note(_('creating temporary repository at %s\n') % tmpdir)
Christian Ebert
keyword: compact setting of optional arguments
r6504 repo = localrepo.localrepository(ui, tmpdir, True)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 ui.setconfig('keyword', fn, '')
Christian Ebert
keyword: inform user about current keywordset in kwdemo...
r13298 svn = ui.configbool('keywordset', 'svn')
# explicitly set keywordset for demo output
ui.setconfig('keywordset', 'svn', svn)
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281
uikwmaps = ui.configitems('keywordmaps')
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 if args or opts.get('rcfile'):
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 ui.status(_('\n\tconfiguration using custom keyword template maps\n'))
if uikwmaps:
ui.status(_('\textending current template maps\n'))
if opts.get('default') or not uikwmaps:
Christian Ebert
keyword: inform user about current keywordset in kwdemo...
r13298 if svn:
ui.status(_('\toverriding default svn keywordset\n'))
else:
ui.status(_('\toverriding default cvs keywordset\n'))
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 if opts.get('rcfile'):
ui.readconfig(opts.get('rcfile'))
if args:
# simulate hgrc parsing
rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
fp = repo.opener('hgrc', 'w')
fp.writelines(rcmaps)
fp.close()
ui.readconfig(repo.join('hgrc'))
kwmaps = dict(ui.configitems('keywordmaps'))
elif opts.get('default'):
Christian Ebert
keyword: inform user about current keywordset in kwdemo...
r13298 if svn:
ui.status(_('\n\tconfiguration using default svn keywordset\n'))
else:
ui.status(_('\n\tconfiguration using default cvs keywordset\n'))
Christian Ebert
keyword: offer svn-like default keywordmaps...
r11214 kwmaps = _defaultkwmaps(ui)
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 if uikwmaps:
ui.status(_('\tdisabling current template maps\n'))
Christian Ebert
keyword: improve use of dicts...
r5946 for k, v in kwmaps.iteritems():
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 ui.setconfig('keywordmaps', k, v)
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 else:
ui.status(_('\n\tconfiguration using current keyword template maps\n'))
Christian Ebert
keyword: avoid x = a and b or c
r15030 if uikwmaps:
kwmaps = dict(uikwmaps)
else:
kwmaps = _defaultkwmaps(ui)
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281
Christian Ebert
keyword: collect filename patterns, wrap dispatch._parse in uisetup...
r6502 uisetup(ui)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 reposetup(ui, repo)
Christian Ebert
keyword: do not bother about detecting extension path in demo...
r10714 ui.write('[extensions]\nkeyword =\n')
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 demoitems('keyword', ui.configitems('keyword'))
Christian Ebert
keyword: inform user about current keywordset in kwdemo...
r13298 demoitems('keywordset', ui.configitems('keywordset'))
Christian Ebert
keyword: improve use of dicts...
r5946 demoitems('keywordmaps', kwmaps.iteritems())
Martin Geisler
keyword: sort demo output to ensure deterministic output
r9942 keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
Dan Villiom Podlaski Christiansen
prevent transient leaks of file handle by using new helper functions...
r14168 repo.wopener.write(fn, keywords)
Dirkjan Ochtman
move working dir/dirstate methods from localrepo to workingctx
r11303 repo[None].add([fn])
Christian Ebert
keyword: make kwdemo less verbose...
r10713 ui.note(_('\nkeywords written to %s:\n') % fn)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 ui.note(keywords)
Christian Ebert
keyword: make kwdemo less verbose...
r10713 repo.dirstate.setbranch('demobranch')
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 for name, cmd in ui.configitems('hooks'):
if name.split('.', 1)[0].find('commit') > -1:
repo.ui.setconfig('hooks', name, '')
Christian Ebert
keyword: mark improved demo commit message for translation...
r10499 msg = _('hg keyword configuration and expansion example')
Christian Ebert
keyword: make kwdemo less verbose...
r10713 ui.note("hg ci -m '%s'\n" % msg)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 repo.commit(text=msg)
Christian Ebert
keyword: refactor kwdemo and make output translatable...
r9281 ui.status(_('\n\tkeywords expanded\n'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 ui.write(repo.wread(fn))
shutil.rmtree(tmpdir, ignore_errors=True)
Martin Geisler
keyword: use cmdutil.command decorator
r14300 @command('kwexpand', commands.walkopts, _('hg kwexpand [OPTION]... [FILE]...'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def expand(ui, repo, *pats, **opts):
timeless
keyword: improve English
r8763 '''expand keywords in the working directory
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Run after (re)enabling keyword expansion.
kwexpand refuses to run if given files contain local changes.
'''
# 3rd argument sets expansion to True
_kwfwrite(ui, repo, True, *pats, **opts)
Martin Geisler
keyword: use cmdutil.command decorator
r14300 @command('kwfiles',
[('A', 'all', None, _('show keyword status flags of all files')),
('i', 'ignore', None, _('show files excluded from expansion')),
('u', 'unknown', None, _('only show unknown (not tracked) files')),
] + commands.walkopts,
_('hg kwfiles [OPTION]... [FILE]...'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def files(ui, repo, *pats, **opts):
Christian Ebert
keyword: improve help for kwfiles...
r8957 '''show files configured for keyword expansion
Christian Ebert
keyword: improve help for kwfiles
r8950
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 List which files in the working directory are matched by the
[keyword] configuration patterns.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 Useful to prevent inadvertent keyword expansion and to speed up
execution by including only files that are actual candidates for
expansion.
Christian Ebert
keyword: improve help for kwfiles
r8950
Martin Geisler
Use hg role in help strings
r10973 See :hg:`help keyword` on how to construct patterns both for
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 inclusion and exclusion of files.
Christian Ebert
keyword: improve help for kwfiles...
r8957
Christian Ebert
keyword: uppercase short option for kwfiles --all, like hg status -A...
r9494 With -A/--all and -v/--verbose the codes used to show the status
Martin Geisler
keyword: wrap docstrings at 70 characters
r9264 of files are::
Christian Ebert
keyword: reformat kwfiles help for minirst parser
r9195
K = keyword expansion candidate
Christian Ebert
keyword: kwfiles --unknown instead of --untracked...
r9491 k = keyword expansion candidate (not tracked)
Christian Ebert
keyword: reformat kwfiles help for minirst parser
r9195 I = ignored
Christian Ebert
keyword: kwfiles --unknown instead of --untracked...
r9491 i = ignored (not tracked)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 '''
Christian Ebert
keyword: make main class and hg command accessible...
r6115 kwt = kwtools['templater']
Christian Ebert
keyword: reuse already present working contexts for match...
r14835 wctx = repo[None]
status = _status(ui, repo, wctx, kwt, *pats, **opts)
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 cwd = pats and repo.getcwd() or ''
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 modified, added, removed, deleted, unknown, ignored, clean = status
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 files = []
Christian Ebert
keyword: remove deprecated options
r10652 if not opts.get('unknown') or opts.get('all'):
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 files = sorted(modified + added + clean)
Christian Ebert
keyword: make iskwfile() a weeding method in lieu of a boolean...
r12627 kwfiles = kwt.iskwfile(files, wctx)
Christian Ebert
keyword: make kwfiles show deleted files configured for expansion
r13079 kwdeleted = kwt.iskwfile(deleted, wctx)
Christian Ebert
keyword: make iskwfile() a weeding method in lieu of a boolean...
r12627 kwunknown = kwt.iskwfile(unknown, wctx)
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 if not opts.get('ignore') or opts.get('all'):
Christian Ebert
keyword: make kwfiles show deleted files configured for expansion
r13079 showfiles = kwfiles, kwdeleted, kwunknown
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 else:
Christian Ebert
keyword: make kwfiles show deleted files configured for expansion
r13079 showfiles = [], [], []
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 if opts.get('all') or opts.get('ignore'):
Christian Ebert
keyword: make kwfiles -u show untracked files only (like status)...
r9493 showfiles += ([f for f in files if f not in kwfiles],
[f for f in unknown if f not in kwunknown])
Christian Ebert
keyword: make kwfiles show deleted files configured for expansion
r13079 kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
kwstates = zip('K!kIi', showfiles, kwlabels)
Christian Ebert
keyword: colorize hg kwfiles output
r13078 for char, filenames, kwstate in kwstates:
Christian Ebert
keyword: do not shadow builtin format (detected by pychecker)
r7417 fmt = (opts.get('all') or ui.verbose) and '%s %%s\n' % char or '%s\n'
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 for f in filenames:
Christian Ebert
keyword: colorize hg kwfiles output
r13078 ui.write(fmt % repo.pathto(f, cwd), label='kwfiles.' + kwstate)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Martin Geisler
keyword: use cmdutil.command decorator
r14300 @command('kwshrink', commands.walkopts, _('hg kwshrink [OPTION]... [FILE]...'))
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def shrink(ui, repo, *pats, **opts):
timeless
keyword: improve English
r8763 '''revert expanded keywords in the working directory
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: update documentation for kwshrink...
r13270 Must be run before changing/disabling active keywords.
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
kwshrink refuses to run if given files contain local changes.
'''
# 3rd argument sets expansion to False
_kwfwrite(ui, repo, False, *pats, **opts)
Christian Ebert
keyword: collect filename patterns, wrap dispatch._parse in uisetup...
r6502 def uisetup(ui):
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 ''' Monkeypatches dispatch._parse to retrieve user command.'''
Christian Ebert
keyword: collect filename patterns, wrap dispatch._parse in uisetup...
r6502
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 def kwdispatch_parse(orig, ui, args):
'''Monkeypatch dispatch._parse to obtain running hg command.'''
cmd, func, args, options, cmdoptions = orig(ui, args)
kwtools['hgcmd'] = cmd
return cmd, func, args, options, cmdoptions
Christian Ebert
keyword: collect filename patterns, wrap dispatch._parse in uisetup...
r6502
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
Christian Ebert
keyword: collect filename patterns, wrap dispatch._parse in uisetup...
r6502
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 def reposetup(ui, repo):
'''Sets up repo as kwrepo for keyword substitution.
Overrides file method to return kwfilelog instead of filelog
if file matches user configuration.
Wraps commit to overwrite configured files with updated
keyword substitutions.
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 Monkeypatches patch and webcommands.'''
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Matt Mackall
bundlerepo: reintroduce dirstate
r7853 try:
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
Matt Mackall
bundlerepo: reintroduce dirstate
r7853 or '.hg' in util.splitpath(repo.root)
or repo._url.startswith('bundle:')):
return
except AttributeError:
pass
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: move collecting of [keyword] patterns to reposetup (issue2303)...
r11678 inc, exc = [], ['.hg*']
for pat, opt in ui.configitems('keyword'):
if opt != 'ignore':
inc.append(pat)
else:
exc.append(pat)
if not inc:
return
kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
class kwrepo(repo.__class__):
Christian Ebert
keyword: move expand/shrink decisions into kwtemplater...
r6114 def file(self, f):
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815 if f[0] == '/':
f = f[1:]
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 return kwfilelog(self.sopener, kwt, f)
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: support mq; handle (q)record more gracefully...
r5884 def wread(self, filename):
data = super(kwrepo, self).wread(filename)
Christian Ebert
keyword: make main class and hg command accessible...
r6115 return kwt.wread(filename, data)
Christian Ebert
keyword: support mq; handle (q)record more gracefully...
r5884
Christian Ebert
keyword: eliminate potential reference cycles from kwrepo...
r9096 def commit(self, *args, **opts):
Christian Ebert
keyword: make repo.commit use a custom commitctx wrapper...
r8996 # use custom commitctx for user commands
# other extensions can still wrap repo.commitctx directly
Christian Ebert
keyword: eliminate potential reference cycles from kwrepo...
r9096 self.commitctx = self.kwcommitctx
try:
Christian Ebert
keyword: do not postpone commit hooks...
r10495 return super(kwrepo, self).commit(*args, **opts)
Christian Ebert
keyword: eliminate potential reference cycles from kwrepo...
r9096 finally:
del self.commitctx
Christian Ebert
keyword: make repo.commit use a custom commitctx wrapper...
r8996
def kwcommitctx(self, ctx, error=False):
Christian Ebert
keyword: remove spurious locks, improve handling of wlock...
r10604 n = super(kwrepo, self).commitctx(ctx, error)
# no lock needed, only called from repo.commit() which already locks
Christian Ebert
keyword: support (q)record...
r11045 if not kwt.record:
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 restrict = kwt.restrict
kwt.restrict = True
Christian Ebert
keyword: pass context to kwtemplater.overwrite...
r11320 kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 False, True)
kwt.restrict = restrict
Christian Ebert
keyword: remove spurious locks, improve handling of wlock...
r10604 return n
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Greg Ward
rollback: avoid unsafe rollback when not at tip (issue2998)...
r15183 def rollback(self, dryrun=False, force=False):
Christian Ebert
keyword: code cleanup...
r12723 wlock = self.wlock()
Christian Ebert
keyword: support rollback by restoring expansion to previous values...
r12498 try:
if not dryrun:
Christian Ebert
keyword: rename variable "cfiles" to "changed" for clarity
r12604 changed = self['.'].files()
Greg Ward
rollback: avoid unsafe rollback when not at tip (issue2998)...
r15183 ret = super(kwrepo, self).rollback(dryrun, force)
Christian Ebert
keyword: support rollback by restoring expansion to previous values...
r12498 if not dryrun:
ctx = self['.']
Christian Ebert
keyword: code cleanup...
r12723 modified, added = _preselect(self[None].status(), changed)
kwt.overwrite(ctx, modified, True, True)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 kwt.overwrite(ctx, added, True, False)
Christian Ebert
keyword: support rollback by restoring expansion to previous values...
r12498 return ret
finally:
wlock.release()
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 # monkeypatches
Patrick Mezard
patch: generalize the use of patchmeta in applydiff()...
r14566 def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
rejects or conflicts due to expanded keywords in working dir.'''
Patrick Mezard
patch: generalize the use of patchmeta in applydiff()...
r14566 orig(self, ui, gp, backend, store, eolmode)
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503 # shrink keywords read from working dir
self.lines = kwt.shrinklines(self.fname, self.lines)
Dirkjan Ochtman
patch: turn patch.diff() into a generator...
r7308 def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
Martin Geisler
diff: recurse into subrepositories with --subrepos/-S flag
r12167 opts=None, prefix=''):
Christian Ebert
keyword: do not expand at all during diff...
r12497 '''Monkeypatch patch.diff to avoid expansion.'''
kwt.restrict = True
Martin Geisler
diff: recurse into subrepositories with --subrepos/-S flag
r12167 return orig(repo, node1, node2, match, changes, opts, prefix)
Christian Ebert
keyword: disable expansion for annotate...
r6667
Matt Mackall
extensions: use new wrapper functions
r7216 def kwweb_skip(orig, web, req, tmpl):
'''Wraps webcommands.x turning off keyword expansion.'''
Christian Ebert
keyword: rename matcher() to match() mimicking changes in main
r8638 kwt.match = util.never
Matt Mackall
extensions: use new wrapper functions
r7216 return orig(web, req, tmpl)
Christian Ebert
keyword: privatize remaining monkeypatches by moving them into reposetup...
r6503
Christian Ebert
keyword: support copy and rename...
r12626 def kw_copy(orig, ui, repo, pats, opts, rename=False):
'''Wraps cmdutil.copy so that copy/rename destinations do not
contain expanded keywords.
Christian Ebert
keyword: copy: when copied source is a symlink, follow it...
r13069 Note that the source of a regular file destination may also be a
symlink:
Christian Ebert
keyword: support copy and rename...
r12626 hg cp sym x -> x is symlink
cp sym x; hg cp -A sym x -> x is file (maybe expanded keywords)
Christian Ebert
keyword: copy: when copied source is a symlink, follow it...
r13069 For the latter we have to follow the symlink to find out whether its
target is configured for expansion and we therefore must unexpand the
keywords in the destination.'''
Christian Ebert
keyword: support copy and rename...
r12626 orig(ui, repo, pats, opts, rename)
if opts.get('dry_run'):
return
wctx = repo[None]
Christian Ebert
keyword: copy: when copied source is a symlink, follow it...
r13069 cwd = repo.getcwd()
def haskwsource(dest):
'''Returns true if dest is a regular file and configured for
expansion or a symlink which points to a file configured for
expansion. '''
source = repo.dirstate.copied(dest)
if 'l' in wctx.flags(source):
Adrian Buehlmann
move canonpath from util to scmutil
r13971 source = scmutil.canonpath(repo.root, cwd,
Matt Mackall
keyword: backout realpath change (issue3071)
r15387 os.path.realpath(source))
Christian Ebert
keyword: copy: when copied source is a symlink, follow it...
r13069 return kwt.match(source)
Christian Ebert
keyword: support copy and rename...
r12626 candidates = [f for f in repo.dirstate.copies() if
Christian Ebert
keyword: copy: when copied source is a symlink, follow it...
r13069 not 'l' in wctx.flags(f) and haskwsource(f)]
Christian Ebert
keyword: support copy and rename...
r12626 kwt.overwrite(wctx, candidates, False, False)
Christian Ebert
keyword: support (q)record...
r11045 def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
'''Wraps record.dorecord expanding keywords after recording.'''
wlock = repo.wlock()
try:
# record returns 0 even when nothing has changed
# therefore compare nodes before and after
Christian Ebert
keyword: switch kwtemplater.record in kw_dorecord()...
r12631 kwt.record = True
Christian Ebert
keyword: support (q)record...
r11045 ctx = repo['.']
Christian Ebert
keyword: code cleanup...
r12723 wstatus = repo[None].status()
Christian Ebert
keyword: support (q)record...
r11045 ret = orig(ui, repo, commitfunc, *pats, **opts)
Christian Ebert
keyword: specific regular expressions depending on read mode...
r12630 recctx = repo['.']
if ctx != recctx:
Christian Ebert
keyword: code cleanup...
r12723 modified, added = _preselect(wstatus, recctx.files())
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 kwt.restrict = False
Christian Ebert
keyword: enforce subn method via boolean switch...
r12685 kwt.overwrite(recctx, modified, False, True)
kwt.overwrite(recctx, added, False, True, True)
Christian Ebert
keyword: refactor kwtemplater.overwrite()...
r12625 kwt.restrict = True
Christian Ebert
keyword: support (q)record...
r11045 return ret
finally:
wlock.release()
Nicolas Dumazet
filectx: use ctx.size comparisons to speed up ctx.cmp...
r12709 def kwfilectx_cmp(orig, self, fctx):
# keyword affects data size, comparing wdir and filelog size does
# not make sense
Christian Ebert
keyword: only use expensive fctx.cmp when needed...
r12732 if (fctx._filerev is None and
(self._repo._encodefilterpats or
kwt.match(fctx.path()) and not 'l' in fctx.flags()) or
self.size() == fctx.size()):
return self._filelog.cmp(self._filenode, fctx.data())
return True
Nicolas Dumazet
filectx: use ctx.size comparisons to speed up ctx.cmp...
r12709 extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
Matt Mackall
extensions: use new wrapper functions
r7216 extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
Christian Ebert
keyword: do not expand at all during diff...
r12497 extensions.wrapfunction(patch, 'diff', kw_diff)
Christian Ebert
keyword: support copy and rename...
r12626 extensions.wrapfunction(cmdutil, 'copy', kw_copy)
Matt Mackall
extensions: use new wrapper functions
r7216 for c in 'annotate changeset rev filediff diff'.split():
extensions.wrapfunction(webcommands, c, kwweb_skip)
Christian Ebert
keyword: support extensions using dorecord, e.g. crecord...
r11168 for name in recordextensions.split():
try:
record = extensions.find(name)
extensions.wrapfunction(record, 'dorecord', kw_dorecord)
except KeyError:
pass
Christian Ebert
Add extension for filewise RCS-keyword expansion in working dir...
r5815
Christian Ebert
keyword: move repo.__class__ assignment out of monkeypatch context...
r13299 repo.__class__ = kwrepo