comparison hgext/keyword.py @ 12626:41df968a54c9

keyword: support copy and rename copy/rename destinations being unversioned and possibly ignored by the extension should not contain expanded keywords. Files copied/renamed from an ignored source are not touched. Add tests covering both of the above cases, plus the corner case of cp symlink foo; hg cp -A symlink foo (where foo becomes a regular file).
author Christian Ebert <blacktrash@gmx.net>
date Fri, 08 Oct 2010 18:39:46 +0100
parents d87f3ff904ba
children 7d9162892899
comparison
equal deleted inserted replaced
12625:d87f3ff904ba 12626:41df968a54c9
89 import re, shutil, tempfile 89 import re, shutil, tempfile
90 90
91 commands.optionalrepo += ' kwdemo' 91 commands.optionalrepo += ' kwdemo'
92 92
93 # hg commands that do not act on keywords 93 # hg commands that do not act on keywords
94 nokwcommands = ('add addremove annotate bundle copy export grep incoming init' 94 nokwcommands = ('add addremove annotate bundle export grep incoming init log'
95 ' log outgoing push rename tip verify convert email glog') 95 ' outgoing push tip verify convert email glog')
96 96
97 # hg commands that trigger expansion only when writing to working dir, 97 # hg commands that trigger expansion only when writing to working dir,
98 # not when reading filelog, and unexpand when reading from working dir 98 # not when reading filelog, and unexpand when reading from working dir
99 restricted = 'merge kwexpand kwshrink record qrecord resolve transplant' 99 restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
100 100
197 Caveat: localrepository._link fails on Windows.''' 197 Caveat: localrepository._link fails on Windows.'''
198 return self.match(path) and not 'l' in flagfunc(path) 198 return self.match(path) and not 'l' in flagfunc(path)
199 199
200 def overwrite(self, ctx, candidates, lookup, expand): 200 def overwrite(self, ctx, candidates, lookup, expand):
201 '''Overwrites selected files expanding/shrinking keywords.''' 201 '''Overwrites selected files expanding/shrinking keywords.'''
202 candidates = [f for f in candidates if self.iskwfile(f, ctx.flags)] 202 if self.restrict or lookup: # exclude kw_copy
203 candidates = [f for f in candidates if self.iskwfile(f, ctx.flags)]
203 if not candidates: 204 if not candidates:
204 return 205 return
205 commit = self.restrict and not lookup 206 commit = self.restrict and not lookup
206 if self.restrict or expand and lookup: 207 if self.restrict or expand and lookup:
207 mf = ctx.manifest() 208 mf = ctx.manifest()
545 def kwweb_skip(orig, web, req, tmpl): 546 def kwweb_skip(orig, web, req, tmpl):
546 '''Wraps webcommands.x turning off keyword expansion.''' 547 '''Wraps webcommands.x turning off keyword expansion.'''
547 kwt.match = util.never 548 kwt.match = util.never
548 return orig(web, req, tmpl) 549 return orig(web, req, tmpl)
549 550
551 def kw_copy(orig, ui, repo, pats, opts, rename=False):
552 '''Wraps cmdutil.copy so that copy/rename destinations do not
553 contain expanded keywords.
554 Note that the source may also be a symlink as:
555 hg cp sym x -> x is symlink
556 cp sym x; hg cp -A sym x -> x is file (maybe expanded keywords)
557 '''
558 orig(ui, repo, pats, opts, rename)
559 if opts.get('dry_run'):
560 return
561 wctx = repo[None]
562 candidates = [f for f in repo.dirstate.copies() if
563 kwt.match(repo.dirstate.copied(f)) and
564 not 'l' in wctx.flags(f)]
565 kwt.overwrite(wctx, candidates, False, False)
566
550 def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts): 567 def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
551 '''Wraps record.dorecord expanding keywords after recording.''' 568 '''Wraps record.dorecord expanding keywords after recording.'''
552 wlock = repo.wlock() 569 wlock = repo.wlock()
553 try: 570 try:
554 # record returns 0 even when nothing has changed 571 # record returns 0 even when nothing has changed
567 584
568 repo.__class__ = kwrepo 585 repo.__class__ = kwrepo
569 586
570 extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init) 587 extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
571 extensions.wrapfunction(patch, 'diff', kw_diff) 588 extensions.wrapfunction(patch, 'diff', kw_diff)
589 extensions.wrapfunction(cmdutil, 'copy', kw_copy)
572 for c in 'annotate changeset rev filediff diff'.split(): 590 for c in 'annotate changeset rev filediff diff'.split():
573 extensions.wrapfunction(webcommands, c, kwweb_skip) 591 extensions.wrapfunction(webcommands, c, kwweb_skip)
574 for name in recordextensions.split(): 592 for name in recordextensions.split():
575 try: 593 try:
576 record = extensions.find(name) 594 record = extensions.find(name)