# $Hg$
from mercurial.i18n import _
from mercurial import util
import re
def expandkw(ui, repo, rev, cid, candidates, update=False):
'''Important: returns False on success, True on failure.'''
# name of keyword encode filter:
kwencodefilter = 'hgkwencode'
# update only needs string search for encoded keyword
# as hgkwencode always runs before
kwstr = '%sHg$' % '$'
# pretxncommit looks for both encoded and decoded keywords
kwpat = r'[$]Hg(: %s,v [a-z0-9]{12} [^$]+? )?\$'
def wwritekw(ui, repo, f, text):
'''Writes text with kwupdates keywords to f in working directory.'''
ui.note(_('expanding keywords in %s\n' % f))
# backup file, at least when commiting (?)
repo.wfile(f, 'w').write(text)
# only check files that have hgkwencode assigned as encode filter
files = []
# python2.4: files = set()
for pat, cmd in repo.ui.configitems('encode'):
if cmd.endswith(kwencodefilter):
mf = util.matcher(repo.root, '', [pat], [], [])[1]
for candidate in candidates:
if mf(candidate) and candidate not in files:
files.append(candidate)
# python2.4:
# if mf(candidate): files.add(candidate)
if not files: # nothing to do
return False
user, date = repo.changelog.read(rev)[1:3]
user = util.shortuser(user)
date = util.datestr(date=date, format=util.defaultdateformats[2])
# %Y-%m-%d %H:%M
# collect filenames that were changed by hg update
kwupdates = []
for f in files:
text = repo.wfile(f).read()
if not util.binary(text):
kw = '%sHg: %s,v %s %s %s $' % ('$', f, cid, date, user)
if update and text.find(kwstr) > -1:
text = text.replace(kwstr, kw)
wwritekw(ui, repo, f, text)
kwupdates.append(f)
elif not update:
re_kw = re.compile(kwpat % f)
text, kwct = re_kw.subn(kw, text)
if kwct:
wwritekw(ui, repo, f, text)
if kwupdates:
# cheat hg to believe that updated files were not modified
repo.dirstate.update(kwupdates, 'n')