Mercurial > public > mercurial-scm > evolve
diff hgext/evolve.py @ 139:9b9500175ae5
evolve that does something \o/
author | Pierre-Yves David <pierre-yves.david@logilab.fr> |
---|---|
date | Fri, 17 Feb 2012 19:54:42 +0100 |
parents | bbc653876876 |
children | 462d52ae7fb7 |
line wrap: on
line diff
--- a/hgext/evolve.py Fri Feb 17 19:08:36 2012 +0100 +++ b/hgext/evolve.py Fri Feb 17 19:54:42 2012 +0100 @@ -120,29 +120,36 @@ for u in updates: repo.addobsolete(u.node(), old.node()) repo.addobsolete(new.node(), u.node()) + oldbookmarks = repo.nodebookmarks(old.node()) + for book in oldbookmarks: + repo._bookmarks[book] = new.node() + if oldbookmarks: + bookmarks.write(repo) finally: wlock.release() return newid -def relocate(repo, rev, dest): +def relocate(repo, orig, dest): """rewrite <rev> on dest""" try: rebase = extensions.find('rebase') # dummy state to trick rebase node - assert repo[rev].p2().rev() == node.nullrev, 'no support yet' - cmdutil.duplicatecopies(repo, rev, repo[dest].node(), - repo[rev].p2().node()) - rebase.rebasenode(repo, rev, dest, {node.nullrev: node.nullrev}) - nodenew = rebase.concludenode(repo, rev, dest, node.nullid) - nodesrc = repo.changelog.node(rev) + assert orig.p2().rev() == node.nullrev, 'no support yet' + destbookmarks = repo.nodebookmarks(dest.node()) + cmdutil.duplicatecopies(repo, orig.node(), dest.node()) + rebase.rebasenode(repo, orig.node(), dest.node(), {node.nullrev: node.nullrev}) + nodenew = rebase.concludenode(repo, orig.node(), dest.node(), node.nullid) + nodesrc = orig.node() repo.addobsolete(nodenew, nodesrc) phases.retractboundary(repo, repo[nodesrc].phase(), [nodenew]) oldbookmarks = repo.nodebookmarks(nodesrc) for book in oldbookmarks: repo._bookmarks[book] = nodenew - if oldbookmarks: + for book in destbookmarks: # restore bookmark that rebase move + repo._bookmarks[book] = dest.node() + if oldbookmarks or destbookmarks: bookmarks.write(repo) except util.Abort: # Invalidate the previous setparents @@ -157,19 +164,21 @@ command = cmdutil.command(cmdtable) @command('^stabilize', - [], + [ + ('n', 'dry-run', False, 'Do nothing but printing what should be done') + ], '') -def stabilize(ui, repo): - """suggest the next evolution step""" +def stabilize(ui, repo, **opts): + """move changeset out of they unstable state""" obsolete = extensions.find('obsolete') - unstable = repo.revs('unstable()') + unstable = list(repo.set('unstable()')) if not unstable: ui.write_err(_('no unstable changeset\n')) return 1 - next = unstable[0] - obs = repo[next].parents()[0] + node = unstable[0] + obs = node.parents()[0] if not obs.obsolete(): - obs = next.parents()[1] + obs = node.parents()[1] assert obs.obsolete() newer = obsolete.newerversion(repo, obs.node()) if len(newer) > 1: @@ -183,7 +192,22 @@ ui.write_err(_("does not handle splitted parent yet\n")) return 2 target = targets[0] - repo.ui.status('hg rebase -Dr %s -d %s\n' % (repo[next], repo[target])) + displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate}) + target = repo[target] + repo.ui.status(_('move:')) + displayer.show(node) + repo.ui.status(_('atop:')) + displayer.show(target) + todo= 'hg rebase -Dr %s -d %s\n' % (node, target) + if opts['dry_run']: + repo.ui.status(todo) + else: + repo.ui.note(todo) + lock = repo.lock() + try: + relocate(repo, node, target) + finally: + lock.release() shorttemplate = '[{rev}] {desc|firstline}\n'