Standalone version for keyword.py
Check "expand" patterns in the [keyword] config section.
Removed keyword in file itself to simplify patterns.
Revert (again) to basename.
from mercurial.i18n import _
from mercurial import util
import os.path, re
def expandkw(ui, repo, rev, cid, candidates, update=False):
'''Expands logged <Dollar>Hg<Dollar> in working directory.'''
# name of keyword encode filter:
kwencodefilter = 'hgkwencode'
# update only needs string search for encoded keyword
# as hgkwencode always runs before
kwstr = '$Hg$'
# pretxncommit looks for both encoded and decoded keywords
re_kw = re.compile(r'\$Hg[^$]*?\$')
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
files = candidates
user, date = repo.changelog.read(rev)[1:3]
user = util.shortuser(user)
date = util.datestr(date=date, format=util.defaultdateformats[0])
# %Y-%m-%d %H:%M:%S
# collect filenames that were changed by hg update
kwupdates = []
for f in files:
text = repo.wfile(f).read()
if not util.binary(text):
# TODO for update:
# walk back through file history onto last add/modify
# like "hg log -l1 f"
kw = '$Hg: %s,v %s %s %s $' % (
os.path.basename(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:
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')