hgext/evolve.py
changeset 1067 5d063fed9e3d
parent 1063 742c1ce79a96
child 1068 9f87b103f7b5
child 1099 bac4e0bc9f6a
--- a/hgext/evolve.py	Wed Aug 20 21:14:49 2014 -0700
+++ b/hgext/evolve.py	Wed Aug 20 20:49:48 2014 -0700
@@ -70,6 +70,9 @@
 from mercurial.hgweb import hgweb_mod
 from mercurial import bundle2
 
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
 _pack = struct.pack
 
 if gboptsmap is not None:
@@ -357,52 +360,96 @@
     if not opts.get('user') and opts.get('current_user'):
         opts['user'] = ui.username()
 
-@eh.wrapfunction(mercurial.obsolete, 'createmarkers')
-def _createmarkers(orig, repo, relations, *args, **kwargs):
-    """register parent information at prune time"""
-    # every time this test is run, a kitten is slain.
-    # Change it as soon as possible
-    if '[,{metadata}]' in orig.__doc__:
-        relations = list(relations)
-        for idx, rel in enumerate(relations):
-            prec = rel[0]
-            sucs = rel[1]
-            if not sucs:
-                meta = {}
-                if 2 < len(rel):
-                    meta.update(rel[2])
-                for i, p in enumerate(prec.parents(), 1):
-                    meta['p%i' % i] = p.hex()
-                relations[idx] = (prec, sucs, meta)
-    return orig(repo, relations, *args, **kwargs)
-
-def createmarkers(*args, **kwargs):
-    return obsolete.createmarkers(*args, **kwargs)
-
-class pruneobsstore(obsolete.obsstore):
-
-    def __init__(self, *args, **kwargs):
-        self.prunedchildren = {}
-        return super(pruneobsstore, self).__init__(*args, **kwargs)
-
-    def _load(self, markers):
-        markers = self._prunedetectingmarkers(markers)
-        return super(pruneobsstore, self)._load(markers)
-
-
-    def _prunedetectingmarkers(self, markers):
-        for m in markers:
-            if not m[1]: # no successors
-                meta = obsolete.decodemeta(m[3])
-                if 'p1' in meta:
-                    p1 = node.bin(meta['p1'])
-                    self.prunedchildren.setdefault(p1, set()).add(m)
-                if 'p2' in meta:
-                    p2 = node.bin(meta['p2'])
-                    self.prunedchildren.setdefault(p2, set()).add(m)
-            yield m
-
-obsolete.obsstore = pruneobsstore
+
+createmarkers = obsolete.createmarkers
+if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
+
+    @eh.wrapfunction(mercurial.obsolete, 'createmarkers')
+    def _createmarkers(orig, repo, relations, *args, **kwargs):
+        """register parent information at prune time"""
+        # every time this test is run, a kitten is slain.
+        # Change it as soon as possible
+        if '[,{metadata}]' in orig.__doc__:
+            relations = list(relations)
+            for idx, rel in enumerate(relations):
+                prec = rel[0]
+                sucs = rel[1]
+                if not sucs:
+                    meta = {}
+                    if 2 < len(rel):
+                        meta.update(rel[2])
+                    for i, p in enumerate(prec.parents(), 1):
+                        meta['p%i' % i] = p.hex()
+                    relations[idx] = (prec, sucs, meta)
+        return orig(repo, relations, *args, **kwargs)
+
+    def createmarkers(*args, **kwargs):
+        return obsolete.createmarkers(*args, **kwargs)
+
+    class pruneobsstore(obsolete.obsstore):
+
+        def __init__(self, *args, **kwargs):
+            self.prunedchildren = {}
+            return super(pruneobsstore, self).__init__(*args, **kwargs)
+
+        def _load(self, markers):
+            markers = self._prunedetectingmarkers(markers)
+            return super(pruneobsstore, self)._load(markers)
+
+
+        def _prunedetectingmarkers(self, markers):
+            for m in markers:
+                if not m[1]: # no successors
+                    meta = obsolete.decodemeta(m[3])
+                    if 'p1' in meta:
+                        p1 = node.bin(meta['p1'])
+                        self.prunedchildren.setdefault(p1, set()).add(m)
+                    if 'p2' in meta:
+                        p2 = node.bin(meta['p2'])
+                        self.prunedchildren.setdefault(p2, set()).add(m)
+                yield m
+
+    obsolete.obsstore = pruneobsstore
+
+    @eh.addattr(obsolete.obsstore, 'relevantmarkers')
+    def relevantmarkers(self, nodes):
+        """return a set of all obsolescence marker relevant to a set of node.
+
+        "relevant" to a set of node mean:
+
+        - marker that use this changeset as successors
+        - prune marker of direct children on this changeset.
+        - recursive application of the two rules on precursors of these markers
+
+        It  a set so you cannot rely on order"""
+        seennodes = set(nodes)
+        seenmarkers = set()
+        pendingnodes = set(nodes)
+        precursorsmarkers = self.precursors
+        prunedchildren = self.prunedchildren
+        while pendingnodes:
+            direct = set()
+            for current in pendingnodes:
+                direct.update(precursorsmarkers.get(current, ()))
+                direct.update(prunedchildren.get(current, ()))
+            direct -= seenmarkers
+            pendingnodes = set([m[0] for m in direct])
+            seenmarkers |= direct
+            pendingnodes -= seennodes
+            seennodes |= pendingnodes
+        return seenmarkers
+
+@command('debugobsoleterelevant',
+         [],
+         'REVSET')
+def debugobsoleterelevant(ui, repo, *revsets):
+    """print allobsolescence marker relevant to a set of revision"""
+    nodes = [ctx.node() for ctx in repo.set('%lr', revsets)]
+    markers = repo.obsstore.relevantmarkers(nodes)
+    for rawmarker in sorted(markers):
+        marker = obsolete.marker(repo, rawmarker)
+        cmdutil.showmarker(ui, marker)
+
 
 #####################################################################
 ### Critical fix                                                  ###
@@ -913,8 +960,6 @@
 
 ### new command
 #############################
-cmdtable = {}
-command = cmdutil.command(cmdtable)
 metadataopts = [
     ('d', 'date', '',
      _('record the specified date in metadata'), _('DATE')),
@@ -2285,44 +2330,6 @@
     ui.progress(topic, *args, **kwargs)
 
 
-@command('debugobsoleterelevant',
-         [],
-         'REVSET')
-def debugobsoleterelevant(ui, repo, *revsets):
-    """print allobsolescence marker relevant to a set of revision"""
-    nodes = [ctx.node() for ctx in repo.set('%lr', revsets)]
-    markers = repo.obsstore.relevantmarkers(nodes)
-    for rawmarker in sorted(markers):
-        marker = obsolete.marker(repo, rawmarker)
-        cmdutil.showmarker(ui, marker)
-
-@eh.addattr(obsolete.obsstore, 'relevantmarkers')
-def relevantmarkers(self, nodes):
-    """return a set of all obsolescence marker relevant to a set of node.
-
-    "relevant" to a set of node mean:
-
-    - marker that use this changeset as successors
-    - prune marker of direct children on this changeset.
-    - recursive application of the two rules on precursors of these markers
-
-    It  a set so you cannot rely on order"""
-    seennodes = set(nodes)
-    seenmarkers = set()
-    pendingnodes = set(nodes)
-    precursorsmarkers = self.precursors
-    prunedchildren = self.prunedchildren
-    while pendingnodes:
-        direct = set()
-        for current in pendingnodes:
-            direct.update(precursorsmarkers.get(current, ()))
-            direct.update(prunedchildren.get(current, ()))
-        direct -= seenmarkers
-        pendingnodes = set([m[0] for m in direct])
-        seenmarkers |= direct
-        pendingnodes -= seennodes
-        seennodes |= pendingnodes
-    return seenmarkers
 
 
 _pushkeyescape = getattr(obsolete, '_pushkeyescape', None)