2296 |
2296 |
2297 $ update for change coming with a new branch |
2297 $ update for change coming with a new branch |
2298 $ hg perfbranchmapupdate --base 'stable' --target 'default' |
2298 $ hg perfbranchmapupdate --base 'stable' --target 'default' |
2299 """ |
2299 """ |
2300 from mercurial import branchmap |
2300 from mercurial import branchmap |
2301 opts = _byteskwargs(opts) |
2301 from mercurial import repoview |
2302 timer, fm = gettimer(ui, opts) |
2302 opts = _byteskwargs(opts) |
|
2303 timer, fm = gettimer(ui, opts) |
|
2304 unfi = repo.unfiltered() |
2303 x = [None] # used to pass data between closure |
2305 x = [None] # used to pass data between closure |
2304 |
2306 |
2305 # we use a `list` here to avoid possible side effect from smartset |
2307 # we use a `list` here to avoid possible side effect from smartset |
2306 baserevs = list(scmutil.revrange(repo, base)) |
2308 baserevs = list(scmutil.revrange(repo, base)) |
2307 targetrevs = list(scmutil.revrange(repo, target)) |
2309 targetrevs = list(scmutil.revrange(repo, target)) |
2320 alltargetrevs = frozenset(cl.ancestors(targetrevs, inclusive=True)) |
2322 alltargetrevs = frozenset(cl.ancestors(targetrevs, inclusive=True)) |
2321 |
2323 |
2322 newrevs = list(alltargetrevs.difference(allbaserevs)) |
2324 newrevs = list(alltargetrevs.difference(allbaserevs)) |
2323 newrevs.sort() |
2325 newrevs.sort() |
2324 |
2326 |
|
2327 allrevs = frozenset(unfi.changelog.revs()) |
|
2328 basefilterrevs = frozenset(allrevs.difference(allbaserevs)) |
|
2329 targetfilterrevs = frozenset(allrevs.difference(alltargetrevs)) |
|
2330 |
|
2331 def basefilter(repo, visibilityexceptions=None): |
|
2332 return basefilterrevs |
|
2333 |
|
2334 def targetfilter(repo, visibilityexceptions=None): |
|
2335 return targetfilterrevs |
|
2336 |
2325 msg = b'benchmark of branchmap with %d revisions with %d new ones\n' |
2337 msg = b'benchmark of branchmap with %d revisions with %d new ones\n' |
2326 ui.status(msg % (len(allbaserevs), len(newrevs))) |
2338 ui.status(msg % (len(allbaserevs), len(newrevs))) |
2327 |
2339 if targetfilterrevs: |
2328 if True: |
2340 msg = b'(%d revisions still filtered)\n' |
|
2341 ui.status(msg % len(targetfilterrevs)) |
|
2342 |
|
2343 try: |
|
2344 repoview.filtertable[b'__perf_branchmap_update_base'] = basefilter |
|
2345 repoview.filtertable[b'__perf_branchmap_update_target'] = targetfilter |
|
2346 |
|
2347 baserepo = repo.filtered(b'__perf_branchmap_update_base') |
|
2348 targetrepo = repo.filtered(b'__perf_branchmap_update_target') |
|
2349 |
2329 base = branchmap.branchcache() |
2350 base = branchmap.branchcache() |
2330 base.update(repo, allbaserevs) |
2351 base.update(baserepo, allbaserevs) |
2331 |
2352 |
2332 def setup(): |
2353 def setup(): |
2333 x[0] = base.copy() |
2354 x[0] = base.copy() |
2334 |
2355 |
2335 def bench(): |
2356 def bench(): |
2336 x[0].update(repo, newrevs) |
2357 x[0].update(targetrepo, newrevs) |
2337 |
2358 |
2338 timer(bench, setup=setup) |
2359 timer(bench, setup=setup) |
2339 fm.end() |
2360 fm.end() |
|
2361 finally: |
|
2362 repoview.filtertable.pop(b'__perf_branchmap_update_base', None) |
|
2363 repoview.filtertable.pop(b'__perf_branchmap_update_target', None) |
2340 |
2364 |
2341 @command(b'perfbranchmapload', [ |
2365 @command(b'perfbranchmapload', [ |
2342 (b'f', b'filter', b'', b'Specify repoview filter'), |
2366 (b'f', b'filter', b'', b'Specify repoview filter'), |
2343 (b'', b'list', False, b'List brachmap filter caches'), |
2367 (b'', b'list', False, b'List brachmap filter caches'), |
2344 (b'', b'clear-revlogs', False, b'refresh changelog and manifest'), |
2368 (b'', b'clear-revlogs', False, b'refresh changelog and manifest'), |