Remove extra if-condition for kwtemplater setup in kwfilelog
This was over done in last cset, as repo is None by default kwarg,
and None may be tested for attribs.
# keyword.py - keyword expansion for Mercurial## Copyright 2007 Christian Ebert <blacktrash@gmx.net>## This software may be used and distributed according to the terms# of the GNU General Public License, incorporated herein by reference.## $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# files (like LaTeX packages), that are mostly addressed to an audience# not running a version control system.## For in-depth discussion refer to# <http://www.selenic.com/mercurial/wiki/index.cgi/KeywordPlan>.## Keyword expansion is based on Mercurial's changeset template mappings.# The extension provides an additional UTC-date filter ({date|utcdate}).## The user has the choice either to create his own keywords and their# expansions or to use the CVS-like default ones.## Default $keywords$ and their $keyword: substition $ are:# Revision: changeset id# Author: username# Date: %Y/%m/%d %H:%M:%S [UTC]# RCSFile: basename,v# Source: /path/to/basename,v# Id: basename,v csetid %Y/%m/%d %H:%M:%S username# Header: /path/to/basename,v csetid %Y/%m/%d %H:%M:%S username## Expansions spanning more than one line are truncated to their first line.# Incremental expansion (like CVS' $Log$) is not supported.## Simple setup in hgrc:## # enable extension# keyword = /full/path/to/keyword.py# # or, if script in hgext folder:# # hgext.keyword =## # filename patterns for expansion are configured in this section# # files matching patterns with value 'ignore' are ignored# [keyword]# **.py =# x* = ignore# ...# # in case you prefer your own keyword maps over the cvs-like defaults:# [keywordmaps]# HGdate = {date|rfc822date}# lastlog = {desc} ## same as {desc|firstline} in this context# checked in by = {author}# ...'''keyword expansion in local repositoriesThis extension expands RCS/CVS-like or self-customized keywords inthe text files selected by your configuration.Keywords are only expanded in local repositories and not logged byMercurial internally. The mechanism can be regarded as a conveniencefor the current user and may be turned off anytime.Substitution takes place on every commit and update of the workingrepository.Configuration is done in the [keyword] and [keywordmaps] sections ofhgrc files.'''try:frommercurial.demandloadimport*# stablefrommercurial.i18nimportgettextas_demandload(globals(),'mercurial:cmdutil,templater,util')demandload(globals(),'mercurial:context,filelog,revlog')demandload(globals(),'os.path re time')exceptImportError:# demandimportfrommercurial.i18nimport_frommercurialimportcmdutil,templater,utilfrommercurialimportcontext,filelog,revlogimportos.path,re,timedeftemplates={'Revision':'{node|short}','Author':'{author|user}','Date':'{date|utcdate}','RCSFile':'{file|basename},v','Source':'{root}/{file},v','Id':'{file|basename},v {node|short} {date|utcdate} {author|user}','Header':'{root}/{file},v {node|short} {date|utcdate} {author|user}',}defutcdate(date):'''Returns hgdate in cvs-like UTC format.'''returntime.strftime('%Y/%m/%d %H:%M:%S',time.gmtime(date[0]))classkwtemplater(object):''' Sets up keyword templates, corresponding keyword regex, and provides keyword substitution functions. '''def__init__(self,ui,repo):self.ui=uiself.repo=repotemplates=dict(ui.configitems('keywordmaps'))iftemplates:# parse templates here for less overhead in kwsub matchfuncforkintemplates.keys():templates[k]=templater.parsestring(templates[k],quoted=False)self.templates=templatesordeftemplatesself.re_kw=re.compile(r'\$(%s)[^$]*?\$'%'|'.join(re.escape(k)forkinself.templates.keys()))templater.common_filters['utcdate']=utcdatetry:self.t=cmdutil.changeset_templater(ui,repo,False,'',False)exceptTypeError:# depending on hg rev changeset_templater has extra "brinfo" argself.t=cmdutil.changeset_templater(ui,repo,False,None,'',False)defkwsub(self,mobj,path,node):'''Substitutes keyword using corresponding template.'''kw=mobj.group(1)self.t.use_template(self.templates[kw])self.ui.pushbuffer()self.t.show(changenode=node,root=self.repo.root,file=path)keywordsub=templater.firstline(self.ui.popbuffer())return'$%s: %s $'%(kw,keywordsub)defexpand(self,path,node,filelog,data):'''Returns data with expanded keywords.'''ifutil.binary(data):returndatac=context.filectx(self.repo,path,fileid=node,filelog=filelog)cnode=c.node()returnself.re_kw.sub(lambdam:self.kwsub(m,path,cnode),data)defshrink(self,text):'''Returns text with all keyword substitutions removed.'''ifutil.binary(text):returntextreturnself.re_kw.sub(r'$\1$',text)defoverwrite(self,candidates,node):'''Overwrites candidates in working dir expanding keywords.'''files=[]forfincandidates:data=self.repo.wfile(f).read()ifnotutil.binary(data):data,kwct=self.re_kw.subn(lambdam:self.kwsub(m,f,node),data)ifkwct:self.ui.debug(_('overwriting %s expanding keywords\n')%f)self.repo.wfile(f,'w').write(data)files.append(f)iffiles:self.repo.dirstate.update(files,'n')defreposetup(ui,repo):'''Sets up repo, and filelog especially, as kwrepo and kwfilelog for keyword substitution. This is done for local repos only.'''ifnotrepo.local():returninc,exc=[],['.hg*']forpat,optinrepo.ui.configitems('keyword'):ifopt!='ignore':inc.append(pat)else:exc.append(pat)ifnotinc:returnrepo.kwfmatcher=util.matcher(repo.root,inc=inc,exc=exc)[1]classkwrepo(repo.__class__):deffile(self,f):iff[0]=='/':f=f[1:]returnfilelog.filelog(self.sopener,f,self,self.revlogversion)defcommit(self,files=None,text="",user=None,date=None,match=util.always,force=False,lock=None,wlock=None,force_editor=False,p1=None,p2=None,extra={}):'''Wraps commit, expanding keywords of committed and configured files in working directory.'''node=super(kwrepo,self).commit(files=files,text=text,user=user,date=date,match=match,force=force,lock=lock,wlock=wlock,force_editor=force_editor,p1=p1,p2=p2,extra=extra)ifnodeisNone:returnnodecandidates=self.changelog.read(node)[3]candidates=[fforfincandidatesifself.kwfmatcher(f)andos.path.isfile(self.wjoin(f))]ifnotcandidates:returnnodekwt=kwtemplater(self.ui,self)kwt.overwrite(candidates,node)returnnodeclasskwfilelog(filelog.filelog):''' Superclass over filelog to customize it's read, add, cmp methods. Keywords are "stored" unexpanded, and expanded on reading. '''def__init__(self,opener,path,repo=None,defversion=revlog.REVLOG_DEFAULT_VERSION):super(kwfilelog,self).__init__(opener,path,defversion)self._repo=repoself._path=path# only init kwtemplater if neededifhasattr(repo,'kwfmatcher')andrepo.kwfmatcher(path):self.kwt=kwtemplater(repo.ui,repo)else:self.kwt=Nonedefread(self,node):'''Substitutes keywords when reading filelog.'''data=super(kwfilelog,self).read(node)ifself.kwt:data=self.kwt.expand(self._path,node,self,data)returndatadefadd(self,text,meta,tr,link,p1=None,p2=None):'''Removes keyword substitutions when adding to filelog.'''ifself.kwt:text=self.kwt.shrink(text)returnsuper(kwfilelog,self).add(text,meta,tr,link,p1=p1,p2=p2)defcmp(self,node,text):'''Removes keyword substitutions for comparison.'''ifself.kwt:text=self.kwt.shrink(text)returnsuper(kwfilelog,self).cmp(node,text)filelog.filelog=kwfilelogrepo.__class__=kwrepo