hgext/obsolete.py
changeset 311 5eecfda0a5c7
parent 310 2d0dc5c18489
child 320 63f267bd2176
--- a/hgext/obsolete.py	Tue Jun 26 12:24:04 2012 +0200
+++ b/hgext/obsolete.py	Tue Jun 26 14:35:09 2012 +0200
@@ -318,9 +318,8 @@
     return newrev
 
 def cmdrebase(orig, ui, repo, *args, **kwargs):
-    if kwargs.get('keep', False):
-        raise util.Abort(_('rebase --keep option is unsupported with obsolete '
-                           'extension'), hint=_("see 'hg help obsolete'"))
+
+    reallykeep = kwargs.get('keep', False)
     kwargs = dict(kwargs)
     kwargs['keep'] = True
 
@@ -335,38 +334,39 @@
     repo._rebasetarget = None
     try:
         res = orig(ui, repo, *args, **kwargs)
-        # Filter nullmerge or unrebased entries
-        repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
-                                 if p[1] >= 0)
-        if not res and not kwargs.get('abort') and repo._rebasestate:
-            # Rebased revisions are assumed to be descendants of
-            # targetrev. If a source revision is mapped to targetrev
-            # or to another rebased revision, it must have been
-            # removed.
-            targetrev = repo[repo._rebasetarget].rev()
-            newrevs = set([targetrev])
-            replacements = {}
-            for rev, newrev in sorted(repo._rebasestate.items()):
-                oldnode = repo[rev].node()
-                if newrev not in newrevs:
-                    newnode = repo[newrev].node()
-                    newrevs.add(newrev)
+        if not reallykeep:
+            # Filter nullmerge or unrebased entries
+            repo._rebasestate = dict(p for p in repo._rebasestate.iteritems()
+                                     if p[1] >= 0)
+            if not res and not kwargs.get('abort') and repo._rebasestate:
+                # Rebased revisions are assumed to be descendants of
+                # targetrev. If a source revision is mapped to targetrev
+                # or to another rebased revision, it must have been
+                # removed.
+                targetrev = repo[repo._rebasetarget].rev()
+                newrevs = set([targetrev])
+                replacements = {}
+                for rev, newrev in sorted(repo._rebasestate.items()):
+                    oldnode = repo[rev].node()
+                    if newrev not in newrevs:
+                        newnode = repo[newrev].node()
+                        newrevs.add(newrev)
+                    else:
+                        newnode = nullid
+                    replacements[oldnode] = newnode
+
+                if kwargs.get('collapse'):
+                    newnodes = set(n for n in replacements.values() if n != nullid)
+                    if newnodes:
+                        # Collapsing into more than one revision?
+                        assert len(newnodes) == 1, newnodes
+                        newnode = newnodes.pop()
+                    else:
+                        newnode = nullid
+                    repo.addcollapsedobsolete(replacements, newnode)
                 else:
-                    newnode = nullid
-                replacements[oldnode] = newnode
-
-            if kwargs.get('collapse'):
-                newnodes = set(n for n in replacements.values() if n != nullid)
-                if newnodes:
-                    # Collapsing into more than one revision?
-                    assert len(newnodes) == 1, newnodes
-                    newnode = newnodes.pop()
-                else:
-                    newnode = nullid
-                repo.addcollapsedobsolete(replacements, newnode)
-            else:
-                for oldnode, newnode in replacements.iteritems():
-                    repo.addobsolete(newnode, oldnode)
+                    for oldnode, newnode in replacements.iteritems():
+                        repo.addobsolete(newnode, oldnode)
         return res
     finally:
         delattr(repo, '_rebasestate')