Implement $Hg$ scheme with update hook
The pivotal line for update hook is:
repo.dirstate.update(kwupdates, 'n')
This forces hg to consider the freshly written files as not modified.
Thanks to wfile(), this keeps executable bits etc.
Still needs more testing.
No need to check for basename/filename in keyword trigger.
update hook does not need re.
TODO:
Walk back in history, if last change of file didn't happen in 1
of the provided changesets (update/merge?)?
# $Hg$
from mercurial import demandimport
demandimport.enable()
from mercurial.i18n import _
import mercurial.util, re
# name of keyword encode filter:
kwencodefilter = 'hgkwencode'
# look for <Dollar>Hg<Dollar>
kwtrigger = '%sHg$' % '$'
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 (?)
# absfile = repo.wjoin(f)
# mercurial.util.copyfile(absfile, absfile+'.kwbak')
repo.wfile(f, 'w').write(text)
def expandkw(ui, repo, node, cid, candidates, update=False):
'''Important: returns False on success, True on failure.'''
# only check files that have hgkwencode assigned as encode filter
files = []
for pat, cmd in repo.ui.configitems('encode'):
if cmd.endswith(kwencodefilter):
mf = mercurial.util.matcher(repo.root, '', [pat], [], [])[1]
for candidate in candidates:
if mf(candidate):
# check again that there really are no duplicates
# if candidate not in files ???
files.append(candidate)
if not files: # nothing to do
return False
user, date = repo.changelog.read(node)[1:3]
user = mercurial.util.shortuser(user)
date = mercurial.util.datestr(date=date,
format=mercurial.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()
kwrepl = '%sHg: %s,v %s %s %s $' % ('$', f, cid, date, user)
if update and text.find(kwtrigger) > -1:
text = text.replace(kwtrigger, kwrepl)
wwritekw(ui, repo, f, text)
kwupdates.append(f)
elif not update:
re_kw = re.compile(r'[$]Hg(: %s,v [a-z0-9]{12} [^$]+? )?\$' % f)
text, kwct = re_kw.subn(kwrepl, 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')
return False