# HG changeset patch # User Pierre-Yves David # Date 1360363483 0 # Node ID b5a85a8909d33edf6d1f6e88076813b2c0861571 # Parent f752089479ce4bf0882831e43dc38bb0139ef8db touch: properly handle touching multiple changeset diff -r f752089479ce -r b5a85a8909d3 README --- a/README Fri Feb 08 22:12:46 2013 +0000 +++ b/README Fri Feb 08 22:44:43 2013 +0000 @@ -50,6 +50,7 @@ - amend: drop deprecated --change option for amend - alias: add a grab aliast to be used instead of graft -O - touch: add a --duplicate option to *not* obsolete the old version +- touch: fix touching multiple revision at the same time 3.0.0 -- 2013-02-02 diff -r f752089479ce -r b5a85a8909d3 hgext/evolve.py --- a/hgext/evolve.py Fri Feb 08 22:12:46 2013 +0000 +++ b/hgext/evolve.py Fri Feb 08 22:44:43 2013 +0000 @@ -1594,14 +1594,23 @@ wlock = repo.wlock() lock = repo.lock() tr = repo.transaction('touch') + revs.sort() # ensure parent are run first + newmapping = {} try: for r in revs: ctx = repo[r] extra = ctx.extra().copy() extra['__touch-noise__'] = random.randint(0, 0xffffffff) + # search for touched parent + p1 = ctx.p1().node() + p2 = ctx.p2().node() + p1 = newmapping.get(p1, p1) + p2 = newmapping.get(p2, p2) new, _ = rewrite(repo, ctx, [], ctx, - [ctx.p1().node(), ctx.p2().node()], + [p1, p2], commitopts={'extra': extra}) + # store touched version to help potential children + newmapping[ctx.node()] = new if not duplicate: createmarkers(repo, [(ctx, (repo[new],))]) phases.retractboundary(repo, ctx.phase(), [new]) @@ -1614,16 +1623,29 @@ lockmod.release(lock, wlock) @command('^fold', - [('r', 'rev', [], _("revisions to fold")), + [('r', 'rev', [], _("explicitly specify the full set of revision to fold")), ], # allow to choose the seed ? - _('[-r] revs')) + _('rev')) def fold(ui, repo, *revs, **opts): - """Fold multiple revisions into a single one""" + """Fold multiple revisions into a single one + + Revision from your current working directory to the specified one are fold + as a new one replacing the other + + you can alternatively use --rev to explicitly specify revision to be fold + ignoring the current working directory parent. + """ revs = list(revs) - revs.extend(opts['rev']) if revs: - revs = scmutil.revrange(repo, revs) + if opts.get('rev', ()): + raise util.Abort("cannot specify both --rev and a target revision") + targets = scmutil.revrange(repo, revs) + revs = repo.revs('(%ld::.) or (.::%ld)', targets, targets) + elif 'rev' in opts: + revs = scmutil.revrange(repo, opts['rev']) + else: + revs = () if not revs: ui.write_err('no revision to fold\n') return 1 diff -r f752089479ce -r b5a85a8909d3 tests/test-evolve.t --- a/tests/test-evolve.t Fri Feb 08 22:12:46 2013 +0000 +++ b/tests/test-evolve.t Fri Feb 08 22:44:43 2013 +0000 @@ -558,7 +558,10 @@ $ hg fold no revision to fold [1] - $ hg fold 6::10 + $ hg fold 6 --rev 10 + abort: cannot specify both --rev and a target revision + [255] + $ hg fold 6 # want to run hg fold 6 2 changesets folded 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ glog @@ -584,7 +587,7 @@ $ hg up 4 0 files updated, 0 files merged, 2 files removed, 0 files unresolved - $ hg fold 4::11 + $ hg fold --rev 4::11 3 changesets folded 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ glog diff -r f752089479ce -r b5a85a8909d3 tests/test-touch.t --- a/tests/test-touch.t Fri Feb 08 22:12:46 2013 +0000 +++ b/tests/test-touch.t Fri Feb 08 22:44:43 2013 +0000 @@ -57,3 +57,32 @@ o 4:[0-9a-f]{12} a (re) + +Multiple touch + + $ echo C > c + $ hg add c + $ hg commit -m c + $ echo D > d + $ hg add d + $ hg commit -m d + $ hg log -G + @ 7:[0-9a-f]{12} d (re) + | + o 6:[0-9a-f]{12} c (re) + | + o 5:[0-9a-f]{12} a (re) + + o 4:[0-9a-f]{12} a (re) + + $ hg touch 6:7 + $ hg log -G + @ 9:[0-9a-f]{12} d (re) + | + o 8:[0-9a-f]{12} c (re) + | + o 5:[0-9a-f]{12} a (re) + + o 4:[0-9a-f]{12} a (re) + +