Show More
@@ -92,8 +92,7 b" 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 copy export grep incoming init' | |
95 |
' log outgoing push rename |
|
95 | ' log outgoing push rename tip verify convert email glog') | |
96 | ' convert email glog') |
|
|||
97 |
|
96 | |||
98 | # hg commands that trigger expansion only when writing to working dir, |
|
97 | # hg commands that trigger expansion only when writing to working dir, | |
99 | # not when reading filelog, and unexpand when reading from working dir |
|
98 | # not when reading filelog, and unexpand when reading from working dir | |
@@ -192,19 +191,20 b' class kwtemplater(object):' | |||||
192 | Caveat: localrepository._link fails on Windows.''' |
|
191 | Caveat: localrepository._link fails on Windows.''' | |
193 | return self.match(path) and not 'l' in flagfunc(path) |
|
192 | return self.match(path) and not 'l' in flagfunc(path) | |
194 |
|
193 | |||
195 | def overwrite(self, ctx, candidates, iswctx, expand): |
|
194 | def overwrite(self, ctx, candidates, iswctx, expand, cfiles): | |
196 | '''Overwrites selected files expanding/shrinking keywords.''' |
|
195 | '''Overwrites selected files expanding/shrinking keywords.''' | |
197 | if self.record: |
|
196 | if cfiles is not None: | |
198 |
candidates = [f for f in ct |
|
197 | candidates = [f for f in candidates if f in cfiles] | |
199 | candidates = [f for f in candidates if self.iskwfile(f, ctx.flags)] |
|
198 | candidates = [f for f in candidates if self.iskwfile(f, ctx.flags)] | |
200 | if candidates: |
|
199 | if candidates: | |
201 | restrict = self.restrict |
|
200 | restrict = self.restrict | |
202 | self.restrict = True # do not expand when reading |
|
201 | self.restrict = True # do not expand when reading | |
|
202 | rollback = kwtools['hgcmd'] == 'rollback' | |||
203 | mf = ctx.manifest() |
|
203 | mf = ctx.manifest() | |
204 | msg = (expand and _('overwriting %s expanding keywords\n') |
|
204 | msg = (expand and _('overwriting %s expanding keywords\n') | |
205 | or _('overwriting %s shrinking keywords\n')) |
|
205 | or _('overwriting %s shrinking keywords\n')) | |
206 | for f in candidates: |
|
206 | for f in candidates: | |
207 | if not self.record: |
|
207 | if not self.record and not rollback: | |
208 | data = self.repo.file(f).read(mf[f]) |
|
208 | data = self.repo.file(f).read(mf[f]) | |
209 | else: |
|
209 | else: | |
210 | data = self.repo.wread(f) |
|
210 | data = self.repo.wread(f) | |
@@ -220,7 +220,7 b' class kwtemplater(object):' | |||||
220 | if found: |
|
220 | if found: | |
221 | self.ui.note(msg % f) |
|
221 | self.ui.note(msg % f) | |
222 | self.repo.wwrite(f, data, mf.flags(f)) |
|
222 | self.repo.wwrite(f, data, mf.flags(f)) | |
223 | if iswctx: |
|
223 | if iswctx and not rollback: | |
224 | self.repo.dirstate.normal(f) |
|
224 | self.repo.dirstate.normal(f) | |
225 | elif self.record: |
|
225 | elif self.record: | |
226 | self.repo.dirstate.normallookup(f) |
|
226 | self.repo.dirstate.normallookup(f) | |
@@ -299,7 +299,7 b' def _kwfwrite(ui, repo, expand, *pats, *' | |||||
299 | modified, added, removed, deleted, unknown, ignored, clean = status |
|
299 | modified, added, removed, deleted, unknown, ignored, clean = status | |
300 | if modified or added or removed or deleted: |
|
300 | if modified or added or removed or deleted: | |
301 | raise util.Abort(_('outstanding uncommitted changes')) |
|
301 | raise util.Abort(_('outstanding uncommitted changes')) | |
302 | kwt.overwrite(wctx, clean, True, expand) |
|
302 | kwt.overwrite(wctx, clean, True, expand, None) | |
303 | finally: |
|
303 | finally: | |
304 | wlock.release() |
|
304 | wlock.release() | |
305 |
|
305 | |||
@@ -503,9 +503,24 b' def reposetup(ui, repo):' | |||||
503 | # no lock needed, only called from repo.commit() which already locks |
|
503 | # no lock needed, only called from repo.commit() which already locks | |
504 | if not kwt.record: |
|
504 | if not kwt.record: | |
505 | kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()), |
|
505 | kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()), | |
506 | False, True) |
|
506 | False, True, None) | |
507 | return n |
|
507 | return n | |
508 |
|
508 | |||
|
509 | def rollback(self, dryrun=False): | |||
|
510 | wlock = repo.wlock() | |||
|
511 | try: | |||
|
512 | if not dryrun: | |||
|
513 | cfiles = self['.'].files() | |||
|
514 | ret = super(kwrepo, self).rollback(dryrun) | |||
|
515 | if not dryrun: | |||
|
516 | ctx = self['.'] | |||
|
517 | modified, added = super(kwrepo, self).status()[:2] | |||
|
518 | kwt.overwrite(ctx, added, True, False, cfiles) | |||
|
519 | kwt.overwrite(ctx, modified, True, True, cfiles) | |||
|
520 | return ret | |||
|
521 | finally: | |||
|
522 | wlock.release() | |||
|
523 | ||||
509 | # monkeypatches |
|
524 | # monkeypatches | |
510 | def kwpatchfile_init(orig, self, ui, fname, opener, |
|
525 | def kwpatchfile_init(orig, self, ui, fname, opener, | |
511 | missing=False, eolmode=None): |
|
526 | missing=False, eolmode=None): | |
@@ -536,7 +551,8 b' def reposetup(ui, repo):' | |||||
536 | ret = orig(ui, repo, commitfunc, *pats, **opts) |
|
551 | ret = orig(ui, repo, commitfunc, *pats, **opts) | |
537 | recordctx = repo['.'] |
|
552 | recordctx = repo['.'] | |
538 | if ctx != recordctx: |
|
553 | if ctx != recordctx: | |
539 |
kwt.overwrite(recordctx, |
|
554 | kwt.overwrite(recordctx, recordctx.files(), | |
|
555 | False, True, recordctx) | |||
540 | return ret |
|
556 | return ret | |
541 | finally: |
|
557 | finally: | |
542 | wlock.release() |
|
558 | wlock.release() |
@@ -375,10 +375,48 b' File a should be clean' | |||||
375 |
|
375 | |||
376 | $ hg status -A a |
|
376 | $ hg status -A a | |
377 | C a |
|
377 | C a | |
|
378 | $ rm msg | |||
378 |
|
379 | |||
379 | $ rm msg |
|
380 | rollback and revert expansion | |
380 | $ hg rollback |
|
381 | ||
|
382 | $ cat a | |||
|
383 | expand $Id: a,v 59f969a3b52c 1970/01/01 00:00:01 test $ | |||
|
384 | foo | |||
|
385 | do not process $Id: | |||
|
386 | xxx $ | |||
|
387 | bar | |||
|
388 | $ hg --verbose rollback | |||
381 | rolling back to revision 2 (undo commit) |
|
389 | rolling back to revision 2 (undo commit) | |
|
390 | overwriting a expanding keywords | |||
|
391 | $ hg status a | |||
|
392 | M a | |||
|
393 | $ cat a | |||
|
394 | expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $ | |||
|
395 | foo | |||
|
396 | do not process $Id: | |||
|
397 | xxx $ | |||
|
398 | bar | |||
|
399 | $ echo '$Id$' > y | |||
|
400 | $ echo '$Id$' > z | |||
|
401 | $ hg add y | |||
|
402 | $ hg commit -Am "rollback only" z | |||
|
403 | $ cat z | |||
|
404 | $Id: z,v 45a5d3adce53 1970/01/01 00:00:00 test $ | |||
|
405 | $ hg --verbose rollback | |||
|
406 | rolling back to revision 2 (undo commit) | |||
|
407 | overwriting z shrinking keywords | |||
|
408 | ||||
|
409 | Only z should be overwritten | |||
|
410 | ||||
|
411 | $ hg status a y z | |||
|
412 | M a | |||
|
413 | A y | |||
|
414 | A z | |||
|
415 | $ cat z | |||
|
416 | $Id$ | |||
|
417 | $ hg forget y z | |||
|
418 | $ rm y z | |||
|
419 | ||||
382 |
|
|
420 | $ hg update -C | |
383 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
|
421 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |
384 |
|
422 |
General Comments 0
You need to be logged in to leave comments.
Login now