diff -r 492de5c0ecdd -r 42dd6ec73c28 contrib/perf.py --- a/contrib/perf.py Fri Nov 29 22:21:18 2024 +0100 +++ b/contrib/perf.py Sat Nov 30 03:25:22 2024 +0100 @@ -2182,6 +2182,12 @@ [ ( b'', + b'in-memory-bundle', + False, + b'load the full bundle in userspace memory before proceeding', + ), + ( + b'', b'unbundle-progress', False, b"compute and display progress during stream processing", @@ -2225,7 +2231,7 @@ if not (os.path.isfile(filename) and os.access(filename, os.R_OK)): raise error.Abort("not a readable file: %s" % filename) - run_variables = [None, None] + run_variables = [None, None, None] # we create the new repository next to the other one for two reasons: # - this way we use the same file system, which are relevant for benchmark @@ -2235,20 +2241,29 @@ @contextlib.contextmanager def context(): with open(filename, mode='rb') as bundle: + bundle_name = bundle.name + if opts.get(b'in_memory_bundle'): + # you hate memory, don't you? + import io + + bundle = io.BytesIO(bundle.read()) with tempfile.TemporaryDirectory( prefix=b'hg-perf-stream-consume-', dir=source_repo_dir, ) as tmp_dir: tmp_dir = fsencode(tmp_dir) run_variables[0] = bundle - run_variables[1] = tmp_dir + run_variables[1] = bundle_name + run_variables[2] = tmp_dir yield run_variables[0] = None run_variables[1] = None + run_variables[2] = None def runone(): bundle = run_variables[0] - tmp_dir = run_variables[1] + bundle_name = run_variables[1] + tmp_dir = run_variables[2] # we actually wants to copy all config to ensure the repo config is # taken in account during the benchmark @@ -2263,7 +2278,7 @@ # benchmark. show_progress = bool(opts.get("show_progress")) target.ui.setconfig(b"progress", b"disable", not show_progress) - gen = exchange.readbundle(target.ui, bundle, bundle.name) + gen = exchange.readbundle(target.ui, bundle, bundle_name) # stream v1 if util.safehasattr(gen, 'apply'): gen.apply(target)