diff hgext/evolution.py @ 81:5cec25ce019c

Basic kill command
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 14 Sep 2011 22:29:19 +0200
parents
children 8108d566a8b5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/evolution.py	Wed Sep 14 22:29:19 2011 +0200
@@ -0,0 +1,70 @@
+# states.py - introduce the state concept for mercurial changeset
+#
+# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
+#                Logilab SA        <contact@logilab.fr>
+#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''A set of command to make changeset evolve.'''
+
+from mercurial import cmdutil
+from mercurial import scmutil
+from mercurial import node
+from mercurial import error
+from mercurial import extensions
+from mercurial import commands
+from mercurial.i18n import _
+
+### util function
+#############################
+def noderange(repo, revsets):
+    """The same as revrange but return node"""
+    return map(repo.changelog.node,
+               scmutil.revrange(repo, revsets))
+
+### extension check
+#############################
+
+def extsetup(ui):
+    try:
+        rebase = extensions.find('obsolete')
+    except KeyError:
+        raise error.Abort(_('evolution extension require obsolete extension.'))
+
+### new command
+#############################
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
+@command('^kill',
+    [],
+    '<revs>')
+def kill(ui, repo, *revs):
+    """mark a changeset as obsolete
+
+    This update the parent directory to a not-killed parent if the current
+    working directory parent are killed.
+
+    XXX bookmark support
+    XXX handle merge
+    XXX check immutable first
+    """
+    wlock = repo.wlock()
+    try:
+        targetnodes = set(noderange(repo, revs))
+        for n in targetnodes:
+            repo.addobsolete(node.nullid, n)
+        # update to an unkilled parent
+        wdp = repo['.']
+        newnode = wdp
+        while newnode.obsolete():
+            newnode = newnode.parents()[0]
+        if newnode.node() != wdp.node():
+            commands.update(ui, repo, newnode.rev())
+            ui.status(_('working directory now at %s\n') % newnode)
+
+    finally:
+        wlock.release()
+