Mercurial > evolve
changeset 482:d2531a747ff5
evolve: fold command
First crude version of a fold command
author | Pierre-Yves David <pierre-yves.david@ens-lyon.org> |
---|---|
date | Thu, 23 Aug 2012 12:51:06 +0200 |
parents | 4e0f1aae8d24 |
children | b12ff7ef35b1 |
files | README hgext/evolve.py tests/test-evolve.t |
diffstat | 3 files changed, 77 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/README Thu Aug 23 12:51:34 2012 +0200 +++ b/README Thu Aug 23 12:51:06 2012 +0200 @@ -52,6 +52,8 @@ - merge and update ignore extinct changeset in most case. - new "troubled()" revset - summary now reports troubles changesets +- new touch command +- new fold command - rebase refuse to work on public changeset again - rebase explicitly state that there is nothing to rebase because everything is
--- a/hgext/evolve.py Thu Aug 23 12:51:34 2012 +0200 +++ b/hgext/evolve.py Thu Aug 23 12:51:06 2012 +0200 @@ -843,6 +843,57 @@ finally: wlock.release() +@command('^fold', + [('r', 'rev', [], 'revision to fold'),], + # allow to choose the seed ? + _('[-r] revs')) +def fold(ui, repo, *revs, **opts): + """Fold multiple revision into a single one""" + revs = list(revs) + revs.extend(opts['rev']) + if not revs: + revs = ['.'] + revs = scmutil.revrange(repo, revs) + if not revs: + ui.write_err('no revision to fold\n') + return 1 + roots = repo.revs('roots(%ld)', revs) + if len(roots) > 1: + raise util.Abort("set have multiple roots") + root = repo[roots[0]] + if root.phase() <= phases.public: + raise util.Abort("can't touch public revision") + heads = repo.revs('heads(%ld)', revs) + if len(heads) > 1: + raise util.Abort("set have multiple heads") + head = repo[heads[0]] + obsolete = extensions.find('obsolete') + wlock = repo.wlock() + try: + lock = repo.lock() + try: + tr = repo.transaction('touch') + try: + allctx = [repo[r] for r in revs] + targetphase = max(c.phase() for c in allctx) + msg = '\n\n***\n\n'.join(c.description() for c in allctx) + newid, _ = rewrite(repo, root, allctx, head, + [root.p1().node(), root.p2().node()], + commitopts={'message': msg}) + phases.retractboundary(repo, targetphase, [newid]) + obsolete.createmarkers(repo, [(ctx, (repo[newid],)) + for ctx in allctx]) + tr.close() + finally: + tr.release() + finally: + lock.release() + ui.status('%i changesets folded\n' % len(revs)) + if repo.revs('. and %ld', revs): + repo.dirstate.setparents(newid, node.nullid) + finally: + wlock.release() + def graftwrapper(orig, ui, repo, *revs, **kwargs): kwargs = dict(kwargs)
--- a/tests/test-evolve.t Thu Aug 23 12:51:34 2012 +0200 +++ b/tests/test-evolve.t Thu Aug 23 12:51:06 2012 +0200 @@ -526,7 +526,7 @@ $ hg touch $ glog - @ 9:7a2f49fdcf11@default(draft) conflict + @ 9:*@default(draft) conflict (glob) | o 6:acb28cd497b7@default(draft) add 1 | @@ -540,7 +540,7 @@ $ hg touch . $ glog - @ 10:ce7e3d9b3afe@default(draft) conflict + @ 10:*@default(draft) conflict (glob) | o 6:acb28cd497b7@default(draft) add 1 | @@ -552,4 +552,25 @@ |/ o 0:8685c6d34325@default(draft) add 0 - + +Test fold + + $ hg fold 6::10 + 2 changesets folded + $ glog + @ 11:*@default(draft) add 1 (glob) + | + o 5:0b9e50c35132@default(draft) add 3 + | + o 4:ce341209337f@default(draft) add 4 + | + | o 1:73d38bb17fd7@default(draft) add 1 + |/ + o 0:8685c6d34325@default(draft) add 0 + + $ hg log -r 11 --template '{desc}\n' + add 1 + + *** + + conflict