##// END OF EJS Templates
keyword: support rollback by restoring expansion to previous values...
Christian Ebert -
r12498:4846e8cd default
parent child Browse files
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 rollback tip verify'
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 ctx.files() if f in ctx]
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, None, False, True)
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 $ hg update -C
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