changeset 1117:98f4e356a431

merge with stable
author Pierre-Yves David <pierre-yves.david@fb.com>
date Thu, 02 Oct 2014 14:16:32 -0500
parents d4977b04ef98 (diff) cc19b6400dae (current diff)
children fbc400c1b022
files hgext/evolve.py
diffstat 34 files changed, 431 insertions(+), 922 deletions(-) [+]
line wrap: on
line diff
--- a/README	Tue Sep 30 10:27:54 2014 -0500
+++ b/README	Thu Oct 02 14:16:32 2014 -0500
@@ -57,6 +57,10 @@
 Changelog
 =========
 
+5.0.0 --
+
+- drop compat with Mercurial pre 3.2
+
 4.2.0 --
 
 - uncommit: add a --rev argument
--- a/hgext/evolve.py	Tue Sep 30 10:27:54 2014 -0500
+++ b/hgext/evolve.py	Thu Oct 02 14:16:32 2014 -0500
@@ -19,7 +19,7 @@
     - improves some aspect of the early implementation in Mercurial core
 '''
 
-testedwith = '3.0.1 3.1'
+testedwith = ''
 buglink = 'http://bz.selenic.com/'
 
 import sys, os
@@ -97,19 +97,6 @@
 
 
 #####################################################################
-### Compatibility with core                                       ###
-#####################################################################
-
-
-def retractboundary(repo, tr, targetphase, nodes):
-    """Older mercurial version does not move phase within a transaction"""
-    try:
-        return phases.retractboundary(repo, tr, targetphase, nodes)
-    except TypeError:
-        return phases.retractboundary(repo, targetphase, nodes)
-
-
-#####################################################################
 ### Extension helper                                              ###
 #####################################################################
 
@@ -362,120 +349,6 @@
     if not opts.get('user') and opts.get('current_user'):
         opts['user'] = ui.username()
 
-
-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                                                  ###
-#####################################################################
-
-@eh.wrapfunction(mercurial.obsolete, '_readmarkers')
-def safereadmarkers(orig, data):
-    """safe maker wrapper to remove nullid succesors
-
-    Nullid successors was created by older version of evolve.
-    """
-    nb = 0
-    for marker in orig(data):
-        if nullid in marker[1]:
-            marker = (marker[0],
-                      tuple(s for s in marker[1] if s != nullid),
-                      marker[2],
-                      marker[3])
-            nb += 1
-        yield marker
-    if nb:
-        e = sys.stderr
-        print >> e, 'repo contains %i invalid obsolescence markers' % nb
-
 getrevs = obsolete.getrevs
 
 #####################################################################
@@ -859,7 +732,7 @@
                               isexec='x' in flags,
                               copied=copied.get(path))
             return mctx
-        raise IOError()
+        return None
 
     message = cmdutil.logmessage(repo.ui, commitopts)
     if not message:
@@ -906,7 +779,7 @@
     if not orig.p2().rev() == node.nullrev:
         raise util.Abort(
             'no support for evolving merge changesets yet',
-            hint="Redo the merge and use `hg prune` to obsolete the old one")
+            hint="Redo the merge and use `hg prune <old> --succ <new>` to obsolete the old one")
     destbookmarks = repo.nodebookmarks(dest.node())
     nodesrc = orig.node()
     destphase = repo[nodesrc].phase()
@@ -954,12 +827,12 @@
             raise
         oldbookmarks = repo.nodebookmarks(nodesrc)
         if nodenew is not None:
-            retractboundary(repo, tr, destphase, [nodenew])
-            createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
+            phases.retractboundary(repo, tr, destphase, [nodenew])
+            obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
             for book in oldbookmarks:
                 repo._bookmarks[book] = nodenew
         else:
-            createmarkers(repo, [(repo[nodesrc], ())])
+            obsolete.createmarkers(repo, [(repo[nodesrc], ())])
             # Behave like rebase, move bookmarks to dest
             for book in oldbookmarks:
                 repo._bookmarks[book] = dest.node()
@@ -1524,7 +1397,7 @@
                 tmpid = relocate(repo, bumped, prec.p1())
                 if tmpid is not None:
                     tmpctx = repo[tmpid]
-                    createmarkers(repo, [(bumped, (tmpctx,))])
+                    obsolete.createmarkers(repo, [(bumped, (tmpctx,))])
             except MergeFailure:
                 repo.opener.write('graftstate', bumped.hex() + '\n')
                 repo.ui.write_err(_('evolution failed!\n'))
@@ -1551,7 +1424,7 @@
                                       isexec='x' in flags,
                                       copied=copied.get(path))
                     return mctx
-                raise IOError()
+                return None
             text = 'bumped update to %s:\n\n' % prec
             text += bumped.description()
 
@@ -1566,11 +1439,11 @@
 
             newid = repo.commitctx(new)
         if newid is None:
-            createmarkers(repo, [(tmpctx, ())])
+            obsolete.createmarkers(repo, [(tmpctx, ())])
             newid = prec.node()
         else:
-            retractboundary(repo, tr, bumped.phase(), [newid])
-            createmarkers(repo, [(tmpctx, (repo[newid],))],
+            phases.retractboundary(repo, tr, bumped.phase(), [newid])
+            obsolete.createmarkers(repo, [(tmpctx, (repo[newid],))],
                                    flag=obsolete.bumpedfix)
         bmupdate(newid)
         tr.close()
@@ -1578,7 +1451,9 @@
     finally:
         tr.release()
     # reroute the working copy parent to the new changeset
+    repo.dirstate.beginparentchange()
     repo.dirstate.setparents(newid, node.nullid)
+    repo.dirstate.endparentchange()
 
 def _solvedivergent(ui, repo, divergent, dryrun=False, confirm=False,
                     progresscb=None):
@@ -1666,7 +1541,9 @@
     if progresscb: progresscb()
     tr = repo.transaction('stabilize-divergent')
     try:
+        repo.dirstate.beginparentchange()
         repo.dirstate.setparents(divergent.node(), node.nullid)
+        repo.dirstate.endparentchange()
         oldlen = len(repo)
         amend(ui, repo, message='', logfile='')
         if oldlen == len(repo):
@@ -1674,8 +1551,8 @@
             # no changes
         else:
             new = repo['.']
-        createmarkers(repo, [(other, (new,))])
-        retractboundary(repo, tr, other.phase(), [new.node()])
+        obsolete.createmarkers(repo, [(other, (new,))])
+        phases.retractboundary(repo, tr, other.phase(), [new.node()])
         tr.close()
     finally:
         tr.release()
@@ -1879,7 +1756,7 @@
             relations = [(p, (s,)) for p, s in zip(precs, sucs)]
 
         # create markers
-        createmarkers(repo, relations, metadata=metadata)
+        obsolete.createmarkers(repo, relations, metadata=metadata)
 
         # informs that changeset have been pruned
         ui.status(_('%i changesets pruned\n') % len(precs))
@@ -1992,7 +1869,7 @@
         if path in redirect:
             return filectxfn(repo, memctx, path, contentctx=target, redirect=())
         if path not in contentctx:
-            raise IOError()
+            return None
         fctx = contentctx[path]
         flags = fctx.flags()
         mctx = memfilectx(repo, fctx.path(), fctx.data(),
@@ -2113,10 +1990,12 @@
             raise util.Abort(_('nothing to uncommit'),
                              hint=_("use --all to uncommit all files"))
         # Move local changes on filtered changeset
-        createmarkers(repo, [(old, (repo[newid],))])
-        retractboundary(repo, tr, oldphase, [newid])
+        obsolete.createmarkers(repo, [(old, (repo[newid],))])
+        phases.retractboundary(repo, tr, oldphase, [newid])
+        repo.dirstate.beginparentchange()
         repo.dirstate.setparents(newid, node.nullid)
         _uncommitdirstate(repo, old, match)
+        repo.dirstate.endparentchange()
         updatebookmarks(newid)
         if not repo[newid].files():
             ui.warn(_("new changeset is empty\n"))
@@ -2144,7 +2023,7 @@
                 oldbookmarks.extend(repo.nodebookmarks(old.node()))
                 markers.append((old, (new,)))
             if markers:
-                createmarkers(repo, markers)
+                obsolete.createmarkers(repo, markers)
             for book in oldbookmarks:
                 repo._bookmarks[book] = new.node()
             if oldbookmarks:
@@ -2199,10 +2078,12 @@
                 # store touched version to help potential children
                 newmapping[ctx.node()] = new
                 if not duplicate:
-                    createmarkers(repo, [(ctx, (repo[new],))])
-                retractboundary(repo, tr, ctx.phase(), [new])
+                    obsolete.createmarkers(repo, [(ctx, (repo[new],))])
+                phases.retractboundary(repo, tr, ctx.phase(), [new])
                 if ctx in repo[None].parents():
+                    repo.dirstate.beginparentchange()
                     repo.dirstate.setparents(new, node.nullid)
+                    repo.dirstate.endparentchange()
             tr.close()
         finally:
             tr.release()
@@ -2303,8 +2184,8 @@
             newid, unusedvariable = rewrite(repo, root, allctx, head,
                                             [root.p1().node(), root.p2().node()],
                                             commitopts=commitopts)
-            retractboundary(repo, tr, targetphase, [newid])
-            createmarkers(repo, [(ctx, (repo[newid],))
+            phases.retractboundary(repo, tr, targetphase, [newid])
+            obsolete.createmarkers(repo, [(ctx, (repo[newid],))
                                  for ctx in allctx])
             tr.close()
         finally:
@@ -2380,37 +2261,146 @@
         topic = 'OBSEXC'
     ui.progress(topic, *args, **kwargs)
 
+if getattr(exchange, '_pushdiscoveryobsmarkers', None) is not None:
+    @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers')
+    def _pushdiscoveryobsmarkers(orig, pushop):
+        if (obsolete._enabled
+            and pushop.repo.obsstore
+            and 'obsolete' in pushop.remote.listkeys('namespaces')):
+            repo = pushop.repo
+            obsexcmsg(repo.ui, "computing relevant nodes\n")
+            revs = list(repo.revs('::%ln', pushop.futureheads))
+            unfi = repo.unfiltered()
+            cl = unfi.changelog
+            if not pushop.remote.capable('_evoext_obshash_0'):
+                # do not trust core yet
+                # return orig(pushop)
+                nodes = [cl.node(r) for r in revs]
+                if nodes:
+                    obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
+                                       % len(nodes))
+                    pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+                else:
+                    obsexcmsg(repo.ui, "markers already in sync\n")
+                    pushop.outobsmarkers = []
+                    pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+                return
 
+            common = []
+            obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
+                               % len(revs))
+            commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads))
+            common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, commonrevs)
+
+            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
+            nodes = [cl.node(r) for r in revs]
+            if nodes:
+                obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
+                                   % len(nodes))
+                pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes)
+            else:
+                obsexcmsg(repo.ui, "markers already in sync\n")
+                pushop.outobsmarkers = []
+
+@eh.wrapfunction(wireproto, 'capabilities')
+def discocapabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    if obsolete._enabled:
+        caps += ' _evoext_obshash_0'
+    return caps
+
+@eh.extsetup
+def _installobsmarkersdiscovery(ui):
+    hgweb_mod.perms['evoext_obshash'] = 'pull'
+    # wrap command content
+    oldcap, args = wireproto.commands['capabilities']
+    def newcap(repo, proto):
+        return discocapabilities(oldcap, repo, proto)
+    wireproto.commands['capabilities'] = (newcap, args)
+    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
+    if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None:
+        ui.warn('evolve: your mercurial version is too old\n'
+                'evolve: (running in degraded mode, push will includes all markers)\n')
+    else:
+        olddisco = exchange.pushdiscoverymapping['obsmarker']
+        def newdisco(pushop):
+            _pushdiscoveryobsmarkers(olddisco, pushop)
+        exchange.pushdiscoverymapping['obsmarker'] = newdisco
+
+### Set discovery START
+
+from mercurial import dagutil
+from mercurial import setdiscovery
+
+def _obshash(repo, nodes):
+    hashs = _obsrelsethashtree(repo)
+    nm = repo.changelog.nodemap
+    revs = [nm.get(n) for n in nodes]
+    return [r is None and nullid or hashs[r][1] for r in revs]
+
+def srv_obshash(repo, proto, nodes):
+    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
+
+@eh.addattr(localrepo.localpeer, 'evoext_obshash')
+def local_obshash(peer, nodes):
+    return _obshash(peer._repo, nodes)
+
+@eh.addattr(wireproto.wirepeer, 'evoext_obshash')
+def peer_obshash(self, nodes):
+    d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
+    try:
+        return wireproto.decodelist(d)
+    except ValueError:
+        self._abort(error.ResponseError(_("unexpected response:"), d))
+
+def findcommonobsmarkers(ui, local, remote, probeset,
+                         initialsamplesize=100,
+                         fullsamplesize=200):
+    # from discovery
+    roundtrips = 0
+    cl = local.changelog
+    dag = dagutil.revlogdag(cl)
+    localhash = _obsrelsethashtree(local)
+    missing = set()
+    common = set()
+    undecided = set(probeset)
+    _takefullsample = setdiscovery._takefullsample
+
+    while undecided:
+
+        ui.note(_("sampling from both directions\n"))
+        sample = _takefullsample(dag, undecided, size=fullsamplesize)
+
+        roundtrips += 1
+        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
+                 % (roundtrips, len(undecided), len(sample)))
+        # indices between sample and externalized version must match
+        sample = list(sample)
+        remotehash = remote.evoext_obshash(dag.externalizeall(sample))
+
+        yesno = [localhash[ix][1] == remotehash[si]
+                 for si, ix in enumerate(sample)]
+
+        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
+        common.update(dag.ancestorset(commoninsample, common))
+
+        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
+        missing.update(dag.descendantset(missinginsample, missing))
+
+        undecided.difference_update(missing)
+        undecided.difference_update(common)
+
+
+    result = dag.headsetofconnecteds(common)
+    ui.debug("%d total queries\n" % roundtrips)
+
+    if not result:
+        return set([nullid])
+    return dag.externalizeall(result)
 
 
 _pushkeyescape = getattr(obsolete, '_pushkeyescape', None)
-if _pushkeyescape is None:
-    _maxpayload = 5300
-    def _pushkeyescape(markers):
-        """encode markers into a dict suitable for pushkey exchange
-
-        - binary data are base86 encoded
-        - splited in chunk less than 5300 bytes"""
-        parts = []
-        currentlen = _maxpayload * 2  # ensure we create a new part
-        for marker in markers:
-            nextdata = obsolete._encodeonemarker(marker)
-            if (len(nextdata) + currentlen > _maxpayload):
-                currentpart = []
-                currentlen = 0
-                parts.append(currentpart)
-            currentpart.append(nextdata)
-            currentlen += len(nextdata)
-        keys = {}
-        for idx, part in enumerate(reversed(parts)):
-            data = ''.join([_pack('>B', 0)] + part)
-            keys['dump%i' % idx] = base85.b85encode(data)
-        return keys
-
-def _encodemarkersstream(fp, markers):
-    fp.write(_pack('>B', 0))
-    for mark in markers:
-        fp.write(obsolete._encodeonemarker(mark))
 
 class pushobsmarkerStringIO(StringIO):
     """hacky string io for progress"""
@@ -2419,7 +2409,7 @@
     def length(self):
         return len(self.getvalue())
 
-    def read(self, size):
+    def read(self, size=None):
         obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
         return StringIO.read(self, size)
 
@@ -2429,137 +2419,6 @@
             yield d
             d = self.read(4096)
 
-bundle2partsgenerators = getattr(exchange, 'bundle2partsgenerators', None)
-
-
-if bundle2partsgenerators is not None:
-
-    def _pushb2phases(pushop, bundler):
-        """adds phases update to the main bundle2 push"""
-        outgoing = pushop.outgoing
-        unfi = pushop.repo.unfiltered()
-        remotephases = pushop.remote.listkeys('phases')
-        publishing = remotephases.get('publishing', False)
-        ana = phases.analyzeremotephases(pushop.repo,
-                                         outgoing.commonheads,
-                                         remotephases)
-        pheads, droots = ana
-        revset = 'heads((%ln::%ln))'
-        if not publishing:
-            revset += ' and public()'
-        # Get the list of all revs draft on remote by public here.
-        # XXX Beware that revset break if droots is not strictly
-        # XXX root we may want to ensure it is but it is costly
-        fallback = list(unfi.set(revset, droots, outgoing.commonheads))
-        if not outgoing.missing:
-            future = fallback
-        else:
-            # adds changeset we are going to push as draft
-            #
-            # should not be necessary for pushblishing server, but because of
-            # an issue fixed in xxxxx we have to do it anyway.
-            fdroots = list(unfi.set('roots(%ln  + %ln::)', outgoing.missing, droots))
-            fdroots = [f.node() for f in fdroots]
-            future = list(unfi.set(revset, fdroots, outgoing.missingheads))
-
-        b2caps = bundle2.bundle2caps(pushop.remote)
-        if 'b2x:pushkey' not in b2caps:
-            return
-        pushop.stepsdone.add('phases')
-        part2node = []
-        enc = pushkey.encode
-        for newremotehead in future:
-            part = bundler.newpart('b2x:pushkey')
-            part.addparam('namespace', enc('phases'))
-            part.addparam('key', enc(newremotehead.hex()))
-            part.addparam('old', enc(str(phases.draft)))
-            part.addparam('new', enc(str(phases.public)))
-            part2node.append((part.id, newremotehead))
-        def handlereply(op):
-            for partid, pnode in part2node:
-                partrep = op.records.getreplies(partid)
-                results = partrep['pushkey']
-                assert len(results) <= 1
-                msg = None
-                if not results:
-                    msg = _('server ignored update of %s to public!\n') % pnode
-                elif not int(results[0]['return']):
-                    msg = _('updating %s to public failed!\n') % pnode
-                if msg is not None:
-                    pushop.ui.warn(msg)
-        return handlereply
-
-    def _pushb2obsmarker(pushop, bundler):
-        """adds obsmarker to the main bundle2 push"""
-        repo = pushop.repo
-        remote = pushop.remote
-        if ('obsmarkers' not in pushop.stepsdone
-            and (obsolete._enabled and repo.obsstore and
-                 'obsolete' in remote.listkeys('namespaces'))
-            and remote.capable('_evoext_b2x_obsmarkers_0')):
-            #
-            pushop.stepsdone.add('obsmarkers')
-            markers = _obsmarkersdiscovery(pushop)
-            if not markers:
-                obsexcmsg(repo.ui, "no marker to push\n")
-                obsexcmsg(repo.ui, "DONE\n")
-                return
-            obsdata = pushobsmarkerStringIO()
-            _encodemarkersstream(obsdata, markers)
-            obsdata.seek(0)
-            obsdata.ui = repo.ui
-            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
-                               % (len(markers), len(obsdata.getvalue())),
-                      True)
-            bundler.newpart('EVOLVE:B2X:OBSMARKERV1', data=obsdata)
-            def callback(op):
-                obsexcprg(repo.ui, None)
-                obsexcmsg(repo.ui, "DONE\n")
-            return callback
-    bundle2partsgenerators.append(_pushb2phases)
-    bundle2partsgenerators.append(_pushb2obsmarker)
-
-
-def _obsmarkersdiscovery(pushop):
-    """return the list of marker that needs to be pushed to the server
-
-    When used before (or at the same time) the changegroup have been pushed, it
-    returns the value as if the planned changegroup was succesful. Othewise it
-    use te actual common heads to decide whats needs to be pushed.
-    """
-    repo = pushop.repo
-    remote = pushop.remote
-    unfi = repo.unfiltered()
-    cl = unfi.changelog
-    commonheads = pushop.commonheads
-    if commonheads is None:
-        if pushop.revs is None:
-            commonheads = pushop.outgoing.commonheads
-            sch = set(commonheads)
-            commonheads.extend(h for h in pushop.outgoing.missingheads
-                               if h not in sch)
-        else:
-            commonheads = pushop.outgoing.missingheads
-    if (obsolete._enabled and repo.obsstore and
-        'obsolete' in remote.listkeys('namespaces')):
-        obsexcmsg(repo.ui, "computing relevant nodes\n")
-        revs = unfi.revs('::%ln', commonheads)
-        common = []
-        if remote.capable('_evoext_obshash_0'):
-            obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
-                               % len(revs))
-            common = findcommonobsmarkers(pushop.ui, unfi, remote, revs)
-            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
-        nodes = [cl.node(r) for r in revs]
-        if nodes:
-            obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
-                               % len(nodes))
-            markers = repo.obsstore.relevantmarkers(nodes)
-        else:
-            obsexcmsg(repo.ui, "markers already in sync\n")
-            markers = []
-        return markers
-
 @eh.wrapfunction(exchange, '_pushobsolete')
 def _pushobsolete(orig, pushop):
     """utility function to push obsolete markers to a remote"""
@@ -2568,6 +2427,8 @@
         if 'obsmarkers' in stepsdone:
             return
         stepsdone.add('obsmarkers')
+    if pushop.ret == 0:
+        return
     pushop.ui.debug('try to push obsolete markers to remote\n')
     repo = pushop.repo
     remote = pushop.remote
@@ -2575,35 +2436,13 @@
     cl = unfi.changelog
     if (obsolete._enabled and repo.obsstore and
         'obsolete' in remote.listkeys('namespaces')):
-        markers = _obsmarkersdiscovery(pushop)
+        markers = pushop.outobsmarkers
         if not markers:
             obsexcmsg(repo.ui, "no marker to push\n")
-        elif remote.capable('_evoext_b2x_obsmarkers_0'):
-            obsdata = pushobsmarkerStringIO()
-            _encodemarkersstream(obsdata, markers)
-            obsdata.seek(0)
-            obsdata.ui = repo.ui
-            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
-                               % (len(markers), len(obsdata.getvalue())),
-                      True)
-            bundler = bundle2.bundle20(pushop.ui, {})
-            capsblob = bundle2.encodecaps(pushop.repo.bundle2caps)
-            bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsblob))
-            cgpart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1', data=obsdata)
-            bundler.addpart(cgpart)
-            stream = util.chunkbuffer(bundler.getchunks())
-            try:
-                reply = pushop.remote.unbundle(stream, ['force'], 'push')
-            except bundle2.UnknownPartError, exc:
-                raise util.Abort('missing support for %s' % exc)
-            try:
-                op = bundle2.processbundle(pushop.repo, reply)
-            except bundle2.UnknownPartError, exc:
-                raise util.Abort('missing support for %s' % exc)
-            obsexcprg(repo.ui, None)
         elif remote.capable('_evoext_pushobsmarkers_0'):
             obsdata = pushobsmarkerStringIO()
-            _encodemarkersstream(obsdata, markers)
+            for chunk in obsolete.encodemarkers(markers, True):
+                obsdata.write(chunk)
             obsdata.seek(0)
             obsdata.ui = repo.ui
             obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
@@ -2655,6 +2494,28 @@
             self.ui.status(_('remote: '), l)
     return ret
 
+@eh.wrapfunction(localrepo.localrepository, '_restrictcapabilities')
+def local_pushobsmarker_capabilities(orig, repo, caps):
+    caps = orig(repo, caps)
+    caps.add('_evoext_pushobsmarkers_0')
+    return caps
+
+@eh.addattr(localrepo.localpeer, 'evoext_pushobsmarkers_0')
+def local_pushobsmarkers(peer, obsfile):
+    data = obsfile.read()
+    lock = peer._repo.lock()
+    try:
+        tr = peer._repo.transaction('pushkey: obsolete markers')
+        try:
+            new = peer._repo.obsstore.mergemarkers(tr, data)
+            if new is not None:
+                obsexcmsg(peer._repo.ui, "%i obsolescence markers added\n" % new, True)
+            tr.close()
+        finally:
+            tr.release()
+    finally:
+        lock.release()
+    peer._repo.hook('evolve_pushobsmarkers')
 
 def srv_pushobsmarkers(repo, proto):
     """wireprotocol command"""
@@ -2667,7 +2528,9 @@
     try:
         tr = repo.transaction('pushkey: obsolete markers')
         try:
-            repo.obsstore.mergemarkers(tr, data)
+            new = repo.obsstore.mergemarkers(tr, data)
+            if new is not None:
+                obsexcmsg(repo.ui, "%i obsolescence markers added\n" % new, True)
             tr.close()
         finally:
             tr.release()
@@ -2676,34 +2539,7 @@
     repo.hook('evolve_pushobsmarkers')
     return wireproto.pushres(0)
 
-@bundle2.parthandler('evolve:b2x:obsmarkerv1')
-def handleobsmarkerv1(op, inpart):
-    """add a stream of obsmarker to the repo"""
-    tr = op.gettransaction()
-    advparams = dict(inpart.advisoryparams)
-    length = advparams.get('totalbytes')
-    if length is None:
-        obsdata = inpart.read()
-    else:
-        length = int(length)
-        data = StringIO()
-        current = 0
-        obsexcprg(op.repo.ui, current, unit="bytes", total=length)
-        while current < length:
-            readsize = min(length-current, 4096)
-            data.write(inpart.read(readsize))
-            current += readsize
-            obsexcprg(op.repo.ui, current, unit="bytes", total=length)
-        obsexcprg(op.repo.ui, None)
-        obsdata = data.getvalue()
-    totalsize = len(obsdata)
-    old = len(op.repo.obsstore._all)
-    op.repo.obsstore.mergemarkers(tr, obsdata)
-    new = len(op.repo.obsstore._all) - old
-    op.records.add('evo_obsmarkers', {'new': new, 'bytes': totalsize})
-    tr.hookargs['evolve_new_obsmarkers'] = str(new)
-
-def _buildpullobsmerkersboundaries(pullop):
+def _buildpullobsmarkersboundaries(pullop):
     """small funtion returning the argument for pull markers call
     may to contains 'heads' and 'common'. skip the key for None.
 
@@ -2712,7 +2548,7 @@
     cl = pullop.repo.changelog
     remote = pullop.remote
     unfi = repo.unfiltered()
-    revs = unfi.revs('::%ln', pullop.pulledsubset)
+    revs = unfi.revs('::%ln', pullop.common)
     common = [nullid]
     if remote.capable('_evoext_obshash_0'):
         obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
@@ -2722,46 +2558,49 @@
 
 @eh.uisetup
 def addgetbundleargs(self):
-    if gboptsmap is not None:
-        gboptsmap['evo_obsmarker'] = 'plain'
-        gboptsmap['evo_obscommon'] = 'plain'
-        gboptsmap['evo_obsheads'] = 'plain'
-    else:
-        gboptslist.append('evo_obsheads')
-        gboptslist.append('evo_obscommon')
-        gboptslist.append('evo_obsmarker')
+    gboptsmap['evo_obscommon'] = 'nodes'
 
-
+@eh.wrapfunction(exchange, '_pullbundle2extraprepare')
+def _addobscommontob2pull(orig, pullop, kwargs):
+    ret = orig(pullop, kwargs)
+    if 'obsmarkers' in kwargs and pullop.remote.capable('_evoext_getbundle_obscommon'):
+        boundaries = _buildpullobsmarkersboundaries(pullop)
+        common = boundaries['common']
+        if common != [nullid]:
+            kwargs['evo_obscommon'] = common
+    return ret
 
-@eh.wrapfunction(exchange, '_getbundleextrapart')
-def _getbundleextrapart(orig, bundler, repo, source, **kwargs):
-    if int(kwargs.pop('evo_obsmarker', False)):
-        common = kwargs.pop('evo_obscommon')
-        common = wireproto.decodelist(common)
-        heads = kwargs.pop('evo_obsheads')
-        heads = wireproto.decodelist(heads)
-        obsdata = _getobsmarkersstream(repo, common=common, heads=heads)
-        if len(obsdata.getvalue()) > 5:
-            advparams = [('totalbytes', str(len(obsdata.getvalue())))]
-            obspart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1',
-                                         advisoryparams=advparams,
-                                         data=obsdata)
-            bundler.addpart(obspart)
-    orig(bundler, repo, source)
+if getattr(exchange, '_getbundleobsmarkerpart', None) is not None:
+    @eh.wrapfunction(exchange, '_getbundleobsmarkerpart')
+    def _getbundleobsmarkerpart(orig, bundler, repo, source, heads=None, common=None,
+                                bundlecaps=None, **kwargs):
+        if 'evo_obscommon' not in kwargs:
+            return orig(bundler, repo, source, heads, common, bundlecaps, **kwargs)
+
+        if kwargs.get('obsmarkers', False):
+            if heads is None:
+                heads = repo.heads()
+            obscommon = kwargs.get('evo_obscommon', ())
+            obsset = repo.set('::%ln - ::%ln', heads, obscommon)
+            subset = [c.node() for c in obsset]
+            markers = repo.obsstore.relevantmarkers(subset)
+            exchange.buildobsmarkerspart(bundler, markers)
+
 
 @eh.wrapfunction(exchange, '_pullobsolete')
 def _pullobsolete(orig, pullop):
     if not obsolete._enabled:
         return None
-    b2xpull = pullop.remote.capable('_evoext_b2x_obsmarkers_0')
+    if 'obsmarkers' not in pullop.todosteps:
+        return None
     wirepull = pullop.remote.capable('_evoext_pullobsmarkers_0')
-    if not (b2xpull or wirepull):
+    if not wirepull:
         return orig(pullop)
     if 'obsolete' not in pullop.remote.listkeys('namespaces'):
         return None # remote opted out of obsolescence marker exchange
     tr = None
     ui = pullop.repo.ui
-    boundaries = _buildpullobsmerkersboundaries(pullop)
+    boundaries = _buildpullobsmarkersboundaries(pullop)
     if not set(boundaries['heads']) - set(boundaries['common']):
         obsexcmsg(ui, "nothing to pull\n")
         return None
@@ -2769,33 +2608,7 @@
     obsexcmsg(ui, "pull obsolescence markers\n", True)
     new = 0
 
-    if b2xpull:
-        kwargs = {'bundlecaps': set(['HG2X'])}
-        capsblob = bundle2.encodecaps(pullop.repo.bundle2caps)
-        kwargs['bundlecaps'].add('bundle2=' + urllib.quote(capsblob))
-        kwargs['heads'] = [nullid]
-        kwargs['common'] = [nullid]
-        kwargs['evo_obsmarker'] = '1'
-        kwargs['evo_obscommon'] = wireproto.encodelist(boundaries['common'])
-        kwargs['evo_obsheads'] = wireproto.encodelist(boundaries['heads'])
-        bundle = pullop.remote.getbundle('pull', **kwargs)
-        try:
-            op = bundle2.processbundle(pullop.repo, bundle, pullop.gettransaction)
-        except bundle2.UnknownPartError, exc:
-            raise util.Abort('missing support for %s' % exc)
-        bytes = new = 0
-        for entry in op.records['evo_obsmarkers']:
-            bytes += entry.get('bytes', 0)
-            new += entry.get('new', 0)
-        if 5 < bytes:
-            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
-                      % bytes)
-            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
-            tr = op.gettransaction()
-        else:
-            obsexcmsg(ui, "no unknown remote markers\n")
-        obsexcmsg(ui, "DONE\n")
-    elif wirepull:
+    if wirepull:
         obsdata = pullop.remote.evoext_pullobsmarkers_0(**boundaries)
         obsdata = obsdata.read()
         if len(obsdata) > 5:
@@ -2830,7 +2643,8 @@
     nodes = [c.node() for c in repo.set(revset, *args)]
     markers = repo.obsstore.relevantmarkers(nodes)
     obsdata = StringIO()
-    _encodemarkersstream(obsdata, markers)
+    for chunk in obsolete.encodemarkers(markers, True):
+        obsdata.write(chunk)
     obsdata.seek(0)
     return obsdata
 
@@ -2898,7 +2712,7 @@
                 sha.update(p)
         tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
         if tmarkers:
-            bmarkers = [obsolete._encodeonemarker(m) for m in tmarkers]
+            bmarkers = [obsolete._fm0encodeonemarker(m) for m in tmarkers]
             bmarkers.sort()
             for m in bmarkers:
                 entry += 1
@@ -2921,77 +2735,6 @@
         ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
 
 
-### Set discovery START
-
-import random
-from mercurial import dagutil
-from mercurial import setdiscovery
-
-def _obshash(repo, nodes):
-    hashs = _obsrelsethashtree(repo)
-    nm = repo.changelog.nodemap
-    return  [hashs[nm.get(n)][1] for n in nodes]
-
-def srv_obshash(repo, proto, nodes):
-    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
-
-@eh.addattr(localrepo.localpeer, 'evoext_obshash')
-def local_obshash(peer, nodes):
-    return _obshash(peer._repo, nodes)
-
-@eh.addattr(wireproto.wirepeer, 'evoext_obshash')
-def peer_obshash(self, nodes):
-    d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
-    try:
-        return wireproto.decodelist(d)
-    except ValueError:
-        self._abort(error.ResponseError(_("unexpected response:"), d))
-
-def findcommonobsmarkers(ui, local, remote, probeset,
-                    initialsamplesize=100,
-                    fullsamplesize=200):
-    # from discovery
-    roundtrips = 0
-    cl = local.changelog
-    dag = dagutil.revlogdag(cl)
-    localhash = _obsrelsethashtree(local)
-    missing = set()
-    common = set()
-    undecided = set(probeset)
-    _takefullsample = setdiscovery._takefullsample
-
-    while undecided:
-
-        ui.note(_("sampling from both directions\n"))
-        sample = _takefullsample(dag, undecided, size=fullsamplesize)
-
-        roundtrips += 1
-        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
-                 % (roundtrips, len(undecided), len(sample)))
-        # indices between sample and externalized version must match
-        sample = list(sample)
-        remotehash = remote.evoext_obshash(dag.externalizeall(sample))
-
-        yesno = [localhash[ix][1] == remotehash[si]
-                 for si, ix in enumerate(sample)]
-
-        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
-        common.update(dag.ancestorset(commoninsample, common))
-
-        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
-        missing.update(dag.descendantset(missinginsample, missing))
-
-        undecided.difference_update(missing)
-        undecided.difference_update(common)
-
-
-    result = dag.headsetofconnecteds(common)
-    ui.debug("%d total queries\n" % roundtrips)
-
-    if not result:
-        return set([nullid])
-    return dag.externalizeall(result)
-
 @eh.wrapfunction(wireproto, 'capabilities')
 def capabilities(orig, repo, proto):
     """wrapper to advertise new capability"""
@@ -3000,17 +2743,15 @@
         caps += ' _evoext_pushobsmarkers_0'
         caps += ' _evoext_pullobsmarkers_0'
         caps += ' _evoext_obshash_0'
-        caps += ' _evoext_b2x_obsmarkers_0'
+        caps += ' _evoext_getbundle_obscommon'
     return caps
 
 
 @eh.extsetup
 def _installwireprotocol(ui):
     localrepo.moderncaps.add('_evoext_pullobsmarkers_0')
-    localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0')
     hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
     hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
-    hgweb_mod.perms['evoext_obshash'] = 'pull'
     wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
     wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
     # wrap command content
@@ -3018,4 +2759,3 @@
     def newcap(repo, proto):
         return capabilities(oldcap, repo, proto)
     wireproto.commands['capabilities'] = (newcap, args)
-    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')
--- a/hgext/simple4server.py	Tue Sep 30 10:27:54 2014 -0500
+++ b/hgext/simple4server.py	Thu Oct 02 14:16:32 2014 -0500
@@ -75,15 +75,6 @@
     repo.hook('evolve_pushobsmarkers')
     return wireproto.pushres(0)
 
-# from mercurial.obsolete: 19e9478c1a22
-def _encodemarkersstream(fp, markers):
-    """write a binary version of a set of markers
-
-    Includes the initial version number"""
-    fp.write(_pack('>B', 0))
-    for mark in markers:
-        fp.write(obsolete._encodeonemarker(mark))
-
 # from evolve extension: 1a23c7c52a43
 def _getobsmarkersstream(repo, heads=None, common=None):
     """Get a binary stream for all markers relevant to `::<heads> - ::<common>`
@@ -104,7 +95,8 @@
     nodes = [c.node() for c in repo.set(revset, *args)]
     markers = repo.obsstore.relevantmarkers(nodes)
     obsdata = StringIO()
-    _encodemarkersstream(obsdata, markers)
+    for chunk in obsolete.encodemarkers(markers, True):
+        obsdata.write(chunk)
     obsdata.seek(0)
     return obsdata
 
@@ -208,7 +200,7 @@
                 sha.update(p)
         tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
         if tmarkers:
-            bmarkers = [obsolete._encodeonemarker(m) for m in tmarkers]
+            bmarkers = [obsolete._fm0encodeonemarker(m) for m in tmarkers]
             bmarkers.sort()
             for m in bmarkers:
                 entry += 1
@@ -226,7 +218,8 @@
     (special case so that all empty are hashed as nullid)"""
     hashs = _obsrelsethashtree(repo)
     nm = repo.changelog.nodemap
-    return  [hashs[nm.get(n)][1] for n in nodes]
+    revs = [nm.get(n) for n in nodes]
+    return [r is None and node.nullid or hashs[r][1] for r in revs]
 
 # from evolve extension: 1a23c7c52a43
 def srv_obshash(repo, proto, nodes):
@@ -244,22 +237,28 @@
         caps += ' _evoext_pushobsmarkers_0'
         caps += ' _evoext_pullobsmarkers_0'
         caps += ' _evoext_obshash_0'
-        caps += ' _evoext_b2x_obsmarkers_0'
+        caps += ' _evoext_getbundle_obscommon'
     return caps
 
+def _getbundleobsmarkerpart(orig, bundler, repo, source, heads=None, common=None,
+                            bundlecaps=None, **kwargs):
+    if 'evo_obscommon' not in kwargs:
+        return orig(bundler, repo, source, heads, common, bundlecaps, **kwargs)
+
+    if kwargs.get('obsmarkers', False):
+        if heads is None:
+            heads = repo.heads()
+        obscommon = kwargs.get('evo_obscommon', ())
+        obsset = repo.set('::%ln - ::%ln', heads, obscommon)
+        subset = [c.node() for c in obsset]
+        markers = repo.obsstore.relevantmarkers(subset)
+        exchange.buildobsmarkerspart(bundler, markers)
 
 # from evolve extension: 10867a8e27c6
 # heavily modified
 def extsetup(ui):
     localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0')
-    if gboptsmap is not None:
-        gboptsmap['evo_obsmarker'] = 'plain'
-        gboptsmap['evo_obscommon'] = 'plain'
-        gboptsmap['evo_obsheads'] = 'plain'
-    else:
-        gboptslist.append('evo_obsheads')
-        gboptslist.append('evo_obscommon')
-        gboptslist.append('evo_obsmarker')
+    gboptsmap['evo_obscommon'] = 'nodes'
     if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
         obsolete.obsstore = pruneobsstore
         obsolete.obsstore.relevantmarkers = relevantmarkers
@@ -269,7 +268,7 @@
     wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
     wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
     # wrap module content
-    extensions.wrapfunction(exchange, '_getbundleextrapart', _getbundleextrapart)
+    extensions.wrapfunction(exchange, '_pullbundle2extraprepare', _getbundleobsmarkerpart)
     extensions.wrapfunction(wireproto, 'capabilities', capabilities)
     # wrap command content
     oldcap, args = wireproto.commands['capabilities']
@@ -281,47 +280,3 @@
     extensions.wrapfunction(pushkey, '_nslist', _nslist)
     pushkey._namespaces['namespaces'] = (lambda *x: False, pushkey._nslist)
 
-
-#from evolve extension
-@bundle2.parthandler('evolve:b2x:obsmarkerv1')
-def handleobsmarkerv1(op, inpart):
-    """add a stream of obsmarker to the repo"""
-    tr = op.gettransaction()
-    advparams = dict(inpart.advisoryparams)
-    length = advparams.get('totalbytes')
-    if length is None:
-        obsdata = inpart.read()
-    else:
-        length = int(length)
-        data = StringIO()
-        current = 0
-        op.ui.progress('OBSEXC', current, unit="bytes", total=length)
-        while current < length:
-            readsize = min(length-current, 4096)
-            data.write(inpart.read(readsize))
-            current += readsize
-            op.ui.progress('OBSEXC', current, unit="bytes", total=length)
-        op.ui.progress('OBSEXC', None)
-        obsdata = data.getvalue()
-    totalsize = len(obsdata)
-    old = len(op.repo.obsstore._all)
-    op.repo.obsstore.mergemarkers(tr, obsdata)
-    new = len(op.repo.obsstore._all) - old
-    op.records.add('evo_obsmarkers', {'new': new, 'bytes': totalsize})
-    tr.hookargs['evolve_new_obsmarkers'] = str(new)
-
-#from evolve extension
-def _getbundleextrapart(orig, bundler, repo, source, **kwargs):
-    if int(kwargs.pop('evo_obsmarker', False)):
-        common = kwargs.pop('evo_obscommon')
-        common = wireproto.decodelist(common)
-        heads = kwargs.pop('evo_obsheads')
-        heads = wireproto.decodelist(heads)
-        obsdata = _getobsmarkersstream(repo, common=common, heads=heads)
-        if len(obsdata.getvalue()) > 5:
-            advparams = [('totalbytes', str(len(obsdata.getvalue())))]
-            obspart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1',
-                                         advisoryparams=advparams,
-                                         data=obsdata)
-            bundler.addpart(obspart)
-    orig(bundler, repo, source)
--- a/tests/_exc-util.sh	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/_exc-util.sh	Thu Oct 02 14:16:32 2014 -0500
@@ -12,7 +12,8 @@
 publish=False
 
 [experimental]
-verbose-obsolescence-exchange=true
+verbose-obsolescence-exchange=false
+bundle2-exp=true
 
 [alias]
 debugobsolete=debugobsolete -d '0 0'
--- a/tests/test-corrupt.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-corrupt.t	Thu Oct 02 14:16:32 2014 -0500
@@ -112,6 +112,7 @@
   adding file changes
   added 1 changesets with 2 changes to 2 files
   pushing 2 obsolescence markers (147 bytes)
+  2 obsolescence markers added
   $ hg -R ../other verify
   checking changesets
   checking manifests
--- a/tests/test-evolve.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-evolve.t	Thu Oct 02 14:16:32 2014 -0500
@@ -697,9 +697,8 @@
                 1 successors:        10
                 2 successors:         0
       more than 2 successors:         0
-  average meta length:               27
+  average meta length:                9
       available  keys:
-                 date:               10
                  user:               10
   disconnected clusters:              1
           any known node:             1
--- a/tests/test-exchange-A1.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A1.t	Thu Oct 02 14:16:32 2014 -0500
@@ -68,14 +68,11 @@
   ## pushing "A" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -89,10 +86,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -118,14 +112,11 @@
   ## pushing from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -139,10 +130,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -227,14 +215,11 @@
   ## pushing "B" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -248,10 +233,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -274,14 +256,11 @@
   ## pushing from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -295,10 +274,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-A2.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A2.t	Thu Oct 02 14:16:32 2014 -0500
@@ -76,14 +76,11 @@
   ## pushing "A" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -98,10 +95,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-A3.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A3.t	Thu Oct 02 14:16:32 2014 -0500
@@ -88,14 +88,11 @@
   ## pushing "A1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -110,10 +107,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -192,14 +186,11 @@
   ## pushing "A1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files (+1 heads)
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files (+1 heads)
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -214,10 +205,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 2 files (+1 heads)
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg heads' to see heads, 'hg merge' to merge)
   1 new unstable changesets
   ## post pull state
--- a/tests/test-exchange-A4.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A4.t	Thu Oct 02 14:16:32 2014 -0500
@@ -81,14 +81,11 @@
   ## pushing "B" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -103,10 +100,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-A5.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A5.t	Thu Oct 02 14:16:32 2014 -0500
@@ -88,14 +88,11 @@
   ## pushing "B1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f 8c0a98c8372212c6efde4bfdcef006f27ff759d3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -111,10 +108,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-A6.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A6.t	Thu Oct 02 14:16:32 2014 -0500
@@ -80,10 +80,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -93,10 +90,7 @@
   ## pulling "e5ea8f9c7314" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -119,10 +113,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 obsolescence markers (65 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -133,10 +124,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (65 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-A7.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-A7.t	Thu Oct 02 14:16:32 2014 -0500
@@ -60,10 +60,6 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: no marker to push
-  OBSEXC: DONE
   ## post push state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -72,9 +68,6 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   ## post pull state
   # obstore: main
   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-B1.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B1.t	Thu Oct 02 14:16:32 2014 -0500
@@ -67,14 +67,11 @@
   ## pushing "A" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -88,10 +85,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -114,14 +108,11 @@
   ## pushing from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -135,10 +126,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B2.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B2.t	Thu Oct 02 14:16:32 2014 -0500
@@ -63,10 +63,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -76,10 +73,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -102,10 +96,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -116,10 +107,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-B3.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B3.t	Thu Oct 02 14:16:32 2014 -0500
@@ -75,14 +75,10 @@
   ## pushing "A" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: no marker to push
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
   ## post push state
   # obstore: main
   e56289ab6378dc752fd7965f8bf66b58bda740bd 0 {35b1839966785d5703a01607229eea932db42f87} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -95,9 +91,6 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-B4.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B4.t	Thu Oct 02 14:16:32 2014 -0500
@@ -41,17 +41,17 @@
   $ hg push ../pushdest
   pushing to ../pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
   $ hg push ../pulldest
   pushing to ../pulldest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
   $ hg update -q 0
   $ mkcommit C
   created new head
@@ -89,10 +89,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -102,10 +99,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -128,10 +122,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 1 obsolescence markers (89 bytes)
-  OBSEXC: DONE
+  remote: 1 new obsolescence markers
   ## post push state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -142,10 +133,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (89 bytes)
-  OBSEXC: 1 obsolescence markers added
-  OBSEXC: DONE
+  1 new obsolescence markers
   ## post pull state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-B5.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B5.t	Thu Oct 02 14:16:32 2014 -0500
@@ -87,14 +87,11 @@
   ## pushing "B" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -110,10 +107,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   1 new unstable changesets
   ## post pull state
@@ -142,14 +136,11 @@
   ## pushing "B" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 2 changesets with 2 changes to 2 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 3 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 2 changesets with 2 changes to 2 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -165,10 +156,7 @@
   adding manifests
   adding file changes
   added 2 changesets with 2 changes to 2 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   1 new unstable changesets
   ## post pull state
--- a/tests/test-exchange-B6.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B6.t	Thu Oct 02 14:16:32 2014 -0500
@@ -75,10 +75,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -90,10 +87,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   ## post pull state
   # obstore: main
   962ecf6b1afc94e15c7e48fdfb76ef8abd11372b f6298a8ac3a4b78bbeae5f1d3dc5bc3c3812f0f3 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-B7.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-B7.t	Thu Oct 02 14:16:32 2014 -0500
@@ -67,10 +67,6 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: no marker to push
-  OBSEXC: DONE
   ## post push state
   # obstore: main
   f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -79,9 +75,6 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   ## post pull state
   # obstore: main
   f6fbb35d8ac958bbe70035e4c789c18471cdc0af 0 {f5bc6836db60e308a17ba08bf050154ba9c4fad7} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-C1.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-C1.t	Thu Oct 02 14:16:32 2014 -0500
@@ -70,10 +70,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 obsolescence markers (177 bytes)
-  OBSEXC: DONE
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -85,10 +82,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (177 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   ## post pull state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -115,10 +109,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 obsolescence markers (177 bytes)
-  OBSEXC: DONE
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -131,10 +122,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (177 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   ## post pull state
   # obstore: main
   f5bc6836db60e308a17ba08bf050154ba9c4fad7 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-C2.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-C2.t	Thu Oct 02 14:16:32 2014 -0500
@@ -76,14 +76,11 @@
   ## pushing "A1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -99,10 +96,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
@@ -129,14 +123,11 @@
   ## pushing from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -152,10 +143,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-C3.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-C3.t	Thu Oct 02 14:16:32 2014 -0500
@@ -83,10 +83,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 obsolescence markers (241 bytes)
-  OBSEXC: DONE
+  remote: 3 new obsolescence markers
   ## post push state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -100,10 +97,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (241 bytes)
-  OBSEXC: 3 obsolescence markers added
-  OBSEXC: DONE
+  3 new obsolescence markers
   ## post pull state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -134,10 +128,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 3 obsolescence markers (241 bytes)
-  OBSEXC: DONE
+  remote: 3 new obsolescence markers
   ## post push state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -152,10 +143,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (241 bytes)
-  OBSEXC: 3 obsolescence markers added
-  OBSEXC: DONE
+  3 new obsolescence markers
   ## post pull state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-C4.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-C4.t	Thu Oct 02 14:16:32 2014 -0500
@@ -90,10 +90,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -106,10 +103,7 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   ## post pull state
   # obstore: main
   7f7f229b13a629a5b20581c6cb723f4e2ca54bed 0 {a9bdc8b26820b1b87d585b82eb0ceb4a2ecdbc04} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-D1.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-D1.t	Thu Oct 02 14:16:32 2014 -0500
@@ -70,14 +70,11 @@
   ## pushing "A1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   06055a7959d4128e6e3bccfd01482e83a2db8a3a 0 {28b51eb45704506b5c603decd6bf7ac5e0f6a52f} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -93,10 +90,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-exchange-D2.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-D2.t	Thu Oct 02 14:16:32 2014 -0500
@@ -67,10 +67,7 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: pushing 2 obsolescence markers (153 bytes)
-  OBSEXC: DONE
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -83,10 +80,7 @@
   pulling from main
   searching for changes
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (153 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   ## post pull state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f e5ea8f9c73143125d36658e90ef70c6d2027a5b7 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-D3.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-D3.t	Thu Oct 02 14:16:32 2014 -0500
@@ -72,10 +72,6 @@
   pushing to pushdest
   searching for changes
   no changes found
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 1 nodes
-  OBSEXC: no marker to push
-  OBSEXC: DONE
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -85,9 +81,6 @@
   ## pulling "a9bdc8b26820" from main into pulldest
   pulling from main
   no changes found
-  OBSEXC: pull obsolescence markers
-  OBSEXC: no unknown remote markers
-  OBSEXC: DONE
   ## post pull state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f 6aa67a7b4baa6fb41b06aed38d5b1201436546e2 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-exchange-D4.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-exchange-D4.t	Thu Oct 02 14:16:32 2014 -0500
@@ -85,14 +85,11 @@
   ## pushing "A1" from main to pushdest
   pushing to pushdest
   searching for changes
-  adding changesets
-  adding manifests
-  adding file changes
-  added 1 changesets with 1 changes to 1 files
-  OBSEXC: computing relevant nodes
-  OBSEXC: computing markers relevant to 2 nodes
-  OBSEXC: pushing 2 obsolescence markers (129 bytes)
-  OBSEXC: DONE
+  remote: adding changesets
+  remote: adding manifests
+  remote: adding file changes
+  remote: added 1 changesets with 1 changes to 1 files
+  remote: 2 new obsolescence markers
   ## post push state
   # obstore: main
   28b51eb45704506b5c603decd6bf7ac5e0f6a52f aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
@@ -110,10 +107,7 @@
   adding manifests
   adding file changes
   added 1 changesets with 1 changes to 1 files
-  OBSEXC: pull obsolescence markers
-  OBSEXC: merging obsolescence markers (129 bytes)
-  OBSEXC: 2 obsolescence markers added
-  OBSEXC: DONE
+  2 new obsolescence markers
   (run 'hg update' to get a working copy)
   ## post pull state
   # obstore: main
--- a/tests/test-obsolete.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-obsolete.t	Thu Oct 02 14:16:32 2014 -0500
@@ -184,6 +184,7 @@
   adding file changes
   added 5 changesets with 5 changes to 5 files (+1 heads)
   pushing 2 obsolescence markers (129 bytes)
+  2 obsolescence markers added
   $ hg -R ../other-new verify
   checking changesets
   checking manifests
@@ -238,6 +239,7 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
   pushing 3 obsolescence markers (193 bytes)
+  1 obsolescence markers added
   $ qlog -R ../other-new
   5
   - 95de7fc6918d
@@ -260,6 +262,7 @@
   searching for changes
   no changes found
   pushing 3 obsolescence markers (193 bytes)
+  0 obsolescence markers added
   [1]
 
   $ hg up --hidden -q .^ # 3
@@ -539,6 +542,7 @@
   adding file changes
   added 2 changesets with 1 changes to [12] files (re)
   pushing 7 obsolescence markers (467 bytes)
+  3 obsolescence markers added
   $ hg up -q 10
   $ mkcommit "obsol_d'''"
   created new head
@@ -551,6 +555,7 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files (+1 heads)
   pushing 8 obsolescence markers (531 bytes)
+  1 obsolescence markers added
   $ cd ..
 
 check bumped detection
@@ -814,18 +819,18 @@
 
 Simple rewrite
 
-  $ hg  --hidden debugobsoleterelevant 3
+  $ hg  --hidden debugobsolete --rev 3
   4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
 
 simple rewrite with a prune attached to it
 
-  $ hg debugobsoleterelevant 15
+  $ hg debugobsolete --rev 15
   0b1b6dd009c037985363e2290a0b579819f659db 705ab2a6b72e2cd86edb799ebe15f2695f86143e 0 (*) {'user': 'test'} (glob)
   33d458d86621f3186c40bfccd77652f4a122743e 0 {0b1b6dd009c037985363e2290a0b579819f659db} (*) {'user': 'test'} (glob)
 
 Transitive rewrite
 
-  $ hg --hidden debugobsoleterelevant 8
+  $ hg --hidden debugobsolete --rev 8
   909a0fb57e5d909f353d89e394ffd7e0890fec88 159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   95de7fc6918dea4c9c8d5382f50649794b474c4a 909a0fb57e5d909f353d89e394ffd7e0890fec88 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
   a7a6f2b5d8a54b81bc7aa2fba2934ad6d700a79e 95de7fc6918dea4c9c8d5382f50649794b474c4a 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
--- a/tests/test-prune.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-prune.t	Thu Oct 02 14:16:32 2014 -0500
@@ -273,9 +273,8 @@
                 1 successors:         0
                 2 successors:         0
       more than 2 successors:         0
-  average meta length:               (27|71) (re)
+  average meta length:                9
       available  keys:
-                 date:                4
                  user:                4
   disconnected clusters:              4
           any known node:             4
--- a/tests/test-sharing.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-sharing.t	Thu Oct 02 14:16:32 2014 -0500
@@ -113,6 +113,7 @@
   adding file changes
   added 1 changesets with 1 changes to 1 files
   pushing 4 obsolescence markers (341 bytes)
+  4 obsolescence markers added
 
 Figure SG05
   $ hg -R ../public shortlog -G
--- a/tests/test-simple4server.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-simple4server.t	Thu Oct 02 14:16:32 2014 -0500
@@ -29,6 +29,7 @@
   no changes found
   updating to branch default
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ cat ./errors.log
   $ echo "[extensions]" >> ./client/.hg/hgrc
   $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> ./client/.hg/hgrc
   $ cp -r client other
@@ -50,6 +51,7 @@
   pulling from http://localhost:$HGPORT/
   searching for changes
   no changes found
+  $ cat ../errors.log
   $ hg pull -R ../other
   pulling from http://localhost:$HGPORT/
   requesting all changes
@@ -59,19 +61,21 @@
   added 2 changesets with 2 changes to 2 files
   pull obsolescence markers
   (run 'hg update' to get a working copy)
+  $ cat ../errors.log
   $ hg push -R ../other
   pushing to http://localhost:$HGPORT/
   searching for changes
   no changes found
   [1]
+  $ cat ../errors.log
 
 Capacity testing
 ===================
 
   $ curl --silent http://localhost:$HGPORT/?cmd=hello
-  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon
   $ curl --silent http://localhost:$HGPORT/?cmd=capabilities
-  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0 (no-eol)
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon (no-eol)
 
   $ curl --silent "http://localhost:$HGPORT/?cmd=listkeys&namespace=namespaces" | sort
   bookmarks	
@@ -92,11 +96,13 @@
   remote: adding file changes
   remote: added 1 changesets with 1 changes to 1 files (+1 heads)
   pushing 2 obsolescence markers (171 bytes)
+  $ cat ../errors.log
   $ hg push
   pushing to http://localhost:$HGPORT/
   searching for changes
   no changes found
   [1]
+  $ cat ../errors.log
 
 Pull
 =============
@@ -111,10 +117,12 @@
   pull obsolescence markers
   2 obsolescence markers added
   (run 'hg heads' to see heads)
+  $ cat ../errors.log
   $ hg -R ../other pull
   pulling from http://localhost:$HGPORT/
   searching for changes
   no changes found
+  $ cat ../errors.log
 
   $ cd ..
 
@@ -128,9 +136,9 @@
   obsolete	
   phases	
   $ curl --silent http://localhost:$HGPORT/?cmd=hello
-  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon
   $ curl --silent http://localhost:$HGPORT/?cmd=capabilities
-  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0 (no-eol)
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon (no-eol)
 
   $ echo '[__temporary__]' >> server/.hg/hgrc
   $ echo 'advertiseobsolete=False' >> server/.hg/hgrc
@@ -158,6 +166,6 @@
   obsolete	
   phases	
   $ curl --silent http://localhost:$HGPORT/?cmd=hello
-  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0
+  capabilities: lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon
   $ curl --silent http://localhost:$HGPORT/?cmd=capabilities
-  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_b2x_obsmarkers_0 (no-eol)
+  lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024 _evoext_pushobsmarkers_0 _evoext_pullobsmarkers_0 _evoext_obshash_0 _evoext_getbundle_obscommon (no-eol)
--- a/tests/test-tutorial.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-tutorial.t	Thu Oct 02 14:16:32 2014 -0500
@@ -404,6 +404,7 @@
   adding file changes
   added 3 changesets with 3 changes to 1 files
   pushing 6 obsolescence markers (487 bytes)
+  6 obsolescence markers added
 
 for simplicity sake we get the bathroom change in line again
 
@@ -511,6 +512,7 @@
 
   $ cd ../remote
   $ hg -R ../local/ showconfig phases
+  [1]
 
 the localrepo does not have any specific configuration for `phases.publish`. It
 is ``true`` by default.
@@ -733,6 +735,7 @@
   adding file changes
   added 2 changesets with 2 changes to 1 files (+1 heads)
   pushing 10 obsolescence markers (803 bytes)
+  3 obsolescence markers added
 
 remote get a warning that current working directory is based on an obsolete changeset
 
--- a/tests/test-wireproto.t	Tue Sep 30 10:27:54 2014 -0500
+++ b/tests/test-wireproto.t	Thu Oct 02 14:16:32 2014 -0500
@@ -72,6 +72,7 @@
   remote: adding file changes
   remote: added 1 changesets with 1 changes to 1 files (+1 heads)
   pushing 2 obsolescence markers (171 bytes)
+  remote: 2 obsolescence markers added
   $ hg push
   pushing to ssh://user@dummy/server
   searching for changes