Mercurial > hg-stable
comparison hgext/keyword.py @ 8996:23e941d7f507
keyword: make repo.commit use a custom commitctx wrapper
This avoids forcing the dirstate of overwritten files to normal
during a commit.
Thanks to Dan Villiom Podlaski Christiansen for the idea of a
"double wrapper", so other extensions can still wrap
repo.commitctx safely.
author | Christian Ebert <blacktrash@gmx.net> |
---|---|
date | Tue, 30 Jun 2009 11:30:03 +0200 |
parents | 7672d8e13d0d |
children | 21b29f4c7c9f 47bc92755b95 |
comparison
equal
deleted
inserted
replaced
8995:7b19cda0fa10 | 8996:23e941d7f507 |
---|---|
187 else: | 187 else: |
188 found = self.re_kw.search(data) | 188 found = self.re_kw.search(data) |
189 if found: | 189 if found: |
190 notify(msg % f) | 190 notify(msg % f) |
191 self.repo.wwrite(f, data, mf.flags(f)) | 191 self.repo.wwrite(f, data, mf.flags(f)) |
192 self.repo.dirstate.normal(f) | 192 if node is None: |
193 self.repo.dirstate.normal(f) | |
193 self.restrict = False | 194 self.restrict = False |
194 | 195 |
195 def shrinktext(self, text): | 196 def shrinktext(self, text): |
196 '''Unconditionally removes all keyword substitutions from text.''' | 197 '''Unconditionally removes all keyword substitutions from text.''' |
197 return self.re_kw.sub(r'$\1$', text) | 198 return self.re_kw.sub(r'$\1$', text) |
458 data = super(kwrepo, self).wread(filename) | 459 data = super(kwrepo, self).wread(filename) |
459 return kwt.wread(filename, data) | 460 return kwt.wread(filename, data) |
460 | 461 |
461 def commit(self, text='', user=None, date=None, match=None, | 462 def commit(self, text='', user=None, date=None, match=None, |
462 force=False, editor=None, extra={}): | 463 force=False, editor=None, extra={}): |
464 # use custom commitctx for user commands | |
465 # other extensions can still wrap repo.commitctx directly | |
466 repo.commitctx = self.kwcommitctx | |
467 return super(kwrepo, self).commit(text, user, date, match, force, | |
468 editor, extra) | |
469 | |
470 def kwcommitctx(self, ctx, error=False): | |
463 wlock = lock = None | 471 wlock = lock = None |
464 _p1 = _p2 = None | |
465 try: | 472 try: |
466 wlock = self.wlock() | 473 wlock = self.wlock() |
467 lock = self.lock() | 474 lock = self.lock() |
468 # store and postpone commit hooks | 475 # store and postpone commit hooks |
469 commithooks = {} | 476 commithooks = {} |
470 for name, cmd in ui.configitems('hooks'): | 477 for name, cmd in ui.configitems('hooks'): |
471 if name.split('.', 1)[0] == 'commit': | 478 if name.split('.', 1)[0] == 'commit': |
472 commithooks[name] = cmd | 479 commithooks[name] = cmd |
473 ui.setconfig('hooks', name, None) | 480 ui.setconfig('hooks', name, None) |
474 if commithooks: | 481 if commithooks: |
475 # store parents for commit hook environment | 482 # store parents for commit hooks |
476 _p1, _p2 = repo.dirstate.parents() | 483 p1, p2 = ctx.p1(), ctx.p2() |
477 _p1 = hex(_p1) | 484 xp1, xp2 = p1.hex(), p2 and p2.hex() or '' |
478 if _p2 == nullid: | 485 |
479 _p2 = '' | 486 n = super(kwrepo, self).commitctx(ctx, error) |
480 else: | 487 |
481 _p2 = hex(_p2) | 488 kwt.overwrite(n, True, None) |
482 | 489 if commithooks: |
483 n = super(kwrepo, self).commit(text, user, date, match, force, | 490 for name, cmd in commithooks.iteritems(): |
484 editor, extra) | 491 ui.setconfig('hooks', name, cmd) |
485 | 492 repo.hook('commit', node=n, parent1=xp1, parent2=xp2) |
486 # restore commit hooks | |
487 for name, cmd in commithooks.iteritems(): | |
488 ui.setconfig('hooks', name, cmd) | |
489 if n is not None: | |
490 kwt.overwrite(n, True, None) | |
491 repo.hook('commit', node=n, parent1=_p1, parent2=_p2) | |
492 return n | 493 return n |
493 finally: | 494 finally: |
494 release(lock, wlock) | 495 release(lock, wlock) |
495 | 496 |
496 # monkeypatches | 497 # monkeypatches |