hgext/obsolete.py
changeset 443 3f8c11865ed2
parent 442 48d18ba05480
child 444 aedb6b8ace86
--- a/hgext/obsolete.py	Tue Aug 07 18:17:13 2012 +0200
+++ b/hgext/obsolete.py	Tue Aug 07 18:05:41 2012 +0200
@@ -609,15 +609,6 @@
             finally:
                 lock.release()
 
-        # XXX kill me
-        def addcollapsedobsolete(self, oldnodes, newnode):
-            """Mark oldnodes as collapsed into newnode."""
-            # Assume oldnodes are all descendants of a single rev
-            rootrevs = self.revs('roots(%ln)', oldnodes)
-            assert len(rootrevs) == 1, rootrevs
-            #rootnode = self[rootrevs[0]].node()
-            for n in oldnodes:
-                self.addobsolete(newnode, n)
     repo.__class__ = obsoletingrepo
 
 #####################################################################
@@ -873,41 +864,49 @@
     repo._rebasestate = {}
     repo._rebasetarget = None
     try:
-        res = orig(ui, repo, *args, **kwargs)
-        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)
+        l = repo.lock()
+        try:
+            res = orig(ui, repo, *args, **kwargs)
+            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()
+                            markers = [(repo[r], (repo[newnode],))
+                                       for r in replacements]
+                        else:
+                            newnode = nullid
+                            markers = [(repo[r], ())
+                                       for r in replacements]
+                        createmarkers(repo, markers)
                     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)
-        return res
+                        for oldnode, newnode in replacements.iteritems():
+                            repo.addobsolete(newnode, oldnode)
+            return res
+        finally:
+            l.release()
     finally:
         delattr(repo, '_rebasestate')
         delattr(repo, '_rebasetarget')