2252 topic = 'obsmarkers exchange' |
2252 topic = 'obsmarkers exchange' |
2253 if ui.configbool('experimental', 'verbose-obsolescence-exchange', False): |
2253 if ui.configbool('experimental', 'verbose-obsolescence-exchange', False): |
2254 topic = 'OBSEXC' |
2254 topic = 'OBSEXC' |
2255 ui.progress(topic, *args, **kwargs) |
2255 ui.progress(topic, *args, **kwargs) |
2256 |
2256 |
2257 @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers') |
2257 if getattr(exchange, '_pushdiscoveryobsmarkers', None) is not None: |
2258 def _pushdiscoveryobsmarkers(orig, pushop): |
2258 @eh.wrapfunction(exchange, '_pushdiscoveryobsmarkers') |
2259 if (obsolete._enabled |
2259 def _pushdiscoveryobsmarkers(orig, pushop): |
2260 and pushop.repo.obsstore |
2260 if (obsolete._enabled |
2261 and 'obsolete' in pushop.remote.listkeys('namespaces')): |
2261 and pushop.repo.obsstore |
2262 repo = pushop.repo |
2262 and 'obsolete' in pushop.remote.listkeys('namespaces')): |
2263 obsexcmsg(repo.ui, "computing relevant nodes\n") |
2263 repo = pushop.repo |
2264 revs = list(repo.revs('::%ln', pushop.futureheads)) |
2264 obsexcmsg(repo.ui, "computing relevant nodes\n") |
2265 unfi = repo.unfiltered() |
2265 revs = list(repo.revs('::%ln', pushop.futureheads)) |
2266 cl = unfi.changelog |
2266 unfi = repo.unfiltered() |
2267 if not pushop.remote.capable('_evoext_obshash_0'): |
2267 cl = unfi.changelog |
2268 # do not trust core yet |
2268 if not pushop.remote.capable('_evoext_obshash_0'): |
2269 # return orig(pushop) |
2269 # do not trust core yet |
|
2270 # return orig(pushop) |
|
2271 nodes = [cl.node(r) for r in revs] |
|
2272 if nodes: |
|
2273 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
|
2274 % len(nodes)) |
|
2275 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
|
2276 else: |
|
2277 obsexcmsg(repo.ui, "markers already in sync\n") |
|
2278 pushop.outobsmarkers = [] |
|
2279 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
|
2280 return |
|
2281 |
|
2282 common = [] |
|
2283 obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" |
|
2284 % len(revs)) |
|
2285 commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads)) |
|
2286 common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, commonrevs) |
|
2287 |
|
2288 revs = list(unfi.revs('%ld - (::%ln)', revs, common)) |
2270 nodes = [cl.node(r) for r in revs] |
2289 nodes = [cl.node(r) for r in revs] |
2271 if nodes: |
2290 if nodes: |
2272 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
2291 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
2273 % len(nodes)) |
2292 % len(nodes)) |
2274 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
2293 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
2275 else: |
2294 else: |
2276 obsexcmsg(repo.ui, "markers already in sync\n") |
2295 obsexcmsg(repo.ui, "markers already in sync\n") |
2277 pushop.outobsmarkers = [] |
2296 pushop.outobsmarkers = [] |
2278 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
|
2279 return |
|
2280 |
|
2281 common = [] |
|
2282 obsexcmsg(repo.ui, "looking for common markers in %i nodes\n" |
|
2283 % len(revs)) |
|
2284 commonrevs = list(unfi.revs('::%ln', pushop.outgoing.commonheads)) |
|
2285 common = findcommonobsmarkers(pushop.ui, unfi, pushop.remote, commonrevs) |
|
2286 |
|
2287 revs = list(unfi.revs('%ld - (::%ln)', revs, common)) |
|
2288 nodes = [cl.node(r) for r in revs] |
|
2289 if nodes: |
|
2290 obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n" |
|
2291 % len(nodes)) |
|
2292 pushop.outobsmarkers = repo.obsstore.relevantmarkers(nodes) |
|
2293 else: |
|
2294 obsexcmsg(repo.ui, "markers already in sync\n") |
|
2295 pushop.outobsmarkers = [] |
|
2296 |
2297 |
2297 @eh.wrapfunction(wireproto, 'capabilities') |
2298 @eh.wrapfunction(wireproto, 'capabilities') |
2298 def discocapabilities(orig, repo, proto): |
2299 def discocapabilities(orig, repo, proto): |
2299 """wrapper to advertise new capability""" |
2300 """wrapper to advertise new capability""" |
2300 caps = orig(repo, proto) |
2301 caps = orig(repo, proto) |
2309 oldcap, args = wireproto.commands['capabilities'] |
2310 oldcap, args = wireproto.commands['capabilities'] |
2310 def newcap(repo, proto): |
2311 def newcap(repo, proto): |
2311 return discocapabilities(oldcap, repo, proto) |
2312 return discocapabilities(oldcap, repo, proto) |
2312 wireproto.commands['capabilities'] = (newcap, args) |
2313 wireproto.commands['capabilities'] = (newcap, args) |
2313 wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes') |
2314 wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes') |
2314 olddisco = exchange.pushdiscoverymapping['obsmarker'] |
2315 if getattr(exchange, '_pushdiscoveryobsmarkers', None) is None: |
2315 def newdisco(pushop): |
2316 ui.warn('evolve: your mercurial version is too old\n' |
2316 _pushdiscoveryobsmarkers(olddisco, pushop) |
2317 'evolve: (running in degraded mode, push will includes all markers)\n') |
2317 exchange.pushdiscoverymapping['obsmarker'] = newdisco |
2318 else: |
|
2319 olddisco = exchange.pushdiscoverymapping['obsmarker'] |
|
2320 def newdisco(pushop): |
|
2321 _pushdiscoveryobsmarkers(olddisco, pushop) |
|
2322 exchange.pushdiscoverymapping['obsmarker'] = newdisco |
2318 |
2323 |
2319 ### Set discovery START |
2324 ### Set discovery START |
2320 |
2325 |
2321 from mercurial import dagutil |
2326 from mercurial import dagutil |
2322 from mercurial import setdiscovery |
2327 from mercurial import setdiscovery |
2556 common = boundaries['common'] |
2561 common = boundaries['common'] |
2557 if common != [nullid]: |
2562 if common != [nullid]: |
2558 kwargs['evo_obscommon'] = common |
2563 kwargs['evo_obscommon'] = common |
2559 return ret |
2564 return ret |
2560 |
2565 |
2561 @eh.wrapfunction(exchange, '_getbundleobsmarkerpart') |
2566 if getattr(exchange, '_getbundleobsmarkerpart', None) is not None: |
2562 def _getbundleobsmarkerpart(orig, bundler, repo, source, heads=None, common=None, |
2567 @eh.wrapfunction(exchange, '_getbundleobsmarkerpart') |
2563 bundlecaps=None, **kwargs): |
2568 def _getbundleobsmarkerpart(orig, bundler, repo, source, heads=None, common=None, |
2564 if 'evo_obscommon' not in kwargs: |
2569 bundlecaps=None, **kwargs): |
2565 return orig(bundler, repo, source, heads, common, bundlecaps, **kwargs) |
2570 if 'evo_obscommon' not in kwargs: |
2566 |
2571 return orig(bundler, repo, source, heads, common, bundlecaps, **kwargs) |
2567 if kwargs.get('obsmarkers', False): |
2572 |
2568 if heads is None: |
2573 if kwargs.get('obsmarkers', False): |
2569 heads = repo.heads() |
2574 if heads is None: |
2570 obscommon = kwargs.get('evo_obscommon', ()) |
2575 heads = repo.heads() |
2571 obsset = repo.set('::%ln - ::%ln', heads, obscommon) |
2576 obscommon = kwargs.get('evo_obscommon', ()) |
2572 subset = [c.node() for c in obsset] |
2577 obsset = repo.set('::%ln - ::%ln', heads, obscommon) |
2573 markers = repo.obsstore.relevantmarkers(subset) |
2578 subset = [c.node() for c in obsset] |
2574 exchange.buildobsmarkerspart(bundler, markers) |
2579 markers = repo.obsstore.relevantmarkers(subset) |
|
2580 exchange.buildobsmarkerspart(bundler, markers) |
2575 |
2581 |
2576 |
2582 |
2577 @eh.wrapfunction(exchange, '_pullobsolete') |
2583 @eh.wrapfunction(exchange, '_pullobsolete') |
2578 def _pullobsolete(orig, pullop): |
2584 def _pullobsolete(orig, pullop): |
2579 if not obsolete._enabled: |
2585 if not obsolete._enabled: |