# HG changeset patch # User Pierre-Yves David # Date 1496142071 -7200 # Node ID cd8aa99d4f2091826e1bcf7bcaa6f8a8db69dc36 # Parent b9f03002f214c345f193aad6e1f823c02311e9cf obsdiscovery: automatically pick protocol in a list This makes the code cleaner, clearer and more flexible. This also prepare the ability to disable obsmarkers discover entirely. diff -r b9f03002f214 -r cd8aa99d4f20 hgext3rd/evolve/obsdiscovery.py --- a/hgext3rd/evolve/obsdiscovery.py Tue May 30 14:35:40 2017 +0200 +++ b/hgext3rd/evolve/obsdiscovery.py Tue May 30 13:01:11 2017 +0200 @@ -865,23 +865,39 @@ revs = list(repo.revs('only(%ln, %ln)', pushop.futureheads, common)) return [node(r) for r in revs] +# available discovery method, first valid is used +# tuple (canuse, perform discovery)) +obsdiscoveries = [ + (_canobshashrange, _pushobshashrange), + (_canobshashtree, _pushobshashtree), +] + @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers') def _pushdiscoveryobsmarkers(orig, pushop): if _dopushmarkers(pushop): repo = pushop.repo + remote = pushop.remote obsexcmsg(repo.ui, "computing relevant nodes\n") revs = list(repo.revs('::%ln', pushop.futureheads)) unfi = repo.unfiltered() - if not _canobshashtree(repo, pushop.remote): + + # look for an obs-discovery protocol we can use + discovery = None + for candidate in obsdiscoveries: + if candidate[0](repo, remote): + discovery = candidate[1] + break + + if discovery is None: + # no discovery available, rely on core to push all relevants + # obs markers. return orig(pushop) obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" % len(revs)) commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads)) - if _canobshashrange(repo, pushop.remote): - nodes = _pushobshashrange(pushop, commonrevs) - else: - nodes = _pushobshashtree(pushop, commonrevs) + # find the nodes where the relevant obsmarkers mismatches + nodes = discovery(pushop, commonrevs) if nodes: obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"