diff --git a/repo-scripts/update-benchrepo b/repo-scripts/update-benchrepo new file mode 100755 index 0000000000000000000000000000000000000000..00f612a8a849d0b6082d47de19b2ce661a37dce7_cmVwby1zY3JpcHRzL3VwZGF0ZS1iZW5jaHJlcG8= --- /dev/null +++ b/repo-scripts/update-benchrepo @@ -0,0 +1,92 @@ +#!/usr/bin/env python +"""Update a benchrepo reference tar with the repo format data + +Accept a tar archive containing a benchrepo and the repository, untar the +repository, recompute the stats and update the benchrepo file in the tar +archive in-place +""" + +import argparse +import os +import os.path +import shutil +import sys +import tarfile +import tempfile +from os.path import abspath, basename, dirname, join + +import yaml + +parent_dir = abspath(join(dirname(abspath(__file__)), "..")) +sys.path.insert(0, join(parent_dir, "lib")) + +from scmperf_lib import gather_repo_stats # isort:skip + + +def _main(reference_archive_path, tmp_directory): + # Extract the files + print("Extracting the tar.") + with tarfile.open(reference_archive_path, "r") as reference_archive: + reference_archive.extractall(tmp_directory) + + # Find the benchrepo file + topdir_file = os.listdir(tmp_directory) + assert len(topdir_file) == 2 + + benchrepo = [x for x in topdir_file if x.endswith(".benchrepo")] + assert len(benchrepo) == 1 + benchrepo = benchrepo[0] + benchrepo_path = join(tmp_directory, benchrepo) + + topdir_file.remove(benchrepo) + repository = topdir_file[0] + repository_path = join(tmp_directory, repository) + + # Read the benchrepo file + print("Reading the original benchrepo file.") + with open(benchrepo_path) as benchrepo_file: + benchrepo_data = yaml.load(benchrepo_file.read()) + + # Compute the new stats + print("Gathering the new benchrepo data.") + new_benchrepo_data = gather_repo_stats( + repository_path, + benchrepo_data["reference-repo"]["id"], + benchrepo_data["reference-repo"]["source"], + ) + + # And write it + with open(benchrepo_path, "w") as new_benchrepo_file: + new_benchrepo_file.write( + yaml.dump(new_benchrepo_data, default_flow_style=False) + ) + + # Write the new stats in the tar + print("Archiving the new benchrepo file.") + with tarfile.open(join(tmp_directory, "tmp.tar"), "w") as new_tar_file: + new_tar_file.add(benchrepo_path, arcname=benchrepo) + new_tar_file.add(repository_path, arcname=repository) + + # And finally overwrite the original tar in place + print("Overwriting the original archive") + shutil.move(join(tmp_directory, "tmp.tar"), reference_archive_path) + + +def main(args): + parser = argparse.ArgumentParser(description=__doc__.splitlines(1)[0]) + parser.add_argument("reference_archive.tar") + args = parser.parse_args(args) + + reference_archive_path = getattr(args, "reference_archive.tar") + + tmp_directory = tempfile.mkdtemp() + + try: + _main(reference_archive_path, tmp_directory) + finally: + print("Removing the temporary directory.") + shutil.rmtree(tmp_directory) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/test-update-benchrepo.t b/tests/test-update-benchrepo.t new file mode 100644 index 0000000000000000000000000000000000000000..00f612a8a849d0b6082d47de19b2ce661a37dce7_dGVzdHMvdGVzdC11cGRhdGUtYmVuY2hyZXBvLnQ= --- /dev/null +++ b/tests/test-update-benchrepo.t @@ -0,0 +1,165 @@ +====================================== +Test for the `update benchrepo` script +====================================== + +Setup + + $ export PATH=$TESTDIR/../repo-scripts/:${PATH} + + $ mkdir some-dir + $ hg init some-dir/my-source-repo + $ cd some-dir/ + $ hg -R my-source-repo debugbuilddag --new-file '.+5:brancha$.+11:branchb$.+30:branchc<brancha+2<branchb+2' + $ cat << EOF > my-source-repo.benchrepo + > reference-repo: + > id: my-reference + > source: some-dir/my-source-repo + > EOF + $ cat my-source-repo.benchrepo + reference-repo: + id: my-reference + source: some-dir/my-source-repo + + $ tar cf "my-reference.tar" "my-source-repo.benchrepo" "my-source-repo" + +Wrong call +---------- + + $ update-benchrepo --help + usage: update-benchrepo [-h] reference_archive.tar + + Update a benchrepo reference tar with the repo format data + + positional arguments: + reference_archive.tar + + optional arguments: + -h, --help show this help message and exit + + $ update-benchrepo + usage: update-benchrepo [-h] reference_archive.tar + update-benchrepo: error: too few arguments + [2] + +Actual call +----------- + + $ update-benchrepo my-reference.tar + Extracting the tar. + Reading the original benchrepo file. + Gathering the new benchrepo data. + Archiving the new benchrepo file. + Overwriting the original archive + Removing the temporary directory. + + $ cd .. + + $ cat my-source-repo.benchrepo + cat: my-source-repo.benchrepo: No such file or directory + [1] + + $ tar tf some-dir/my-reference.tar | sort + my-source-repo.benchrepo + my-source-repo/ + my-source-repo/.hg/ + my-source-repo/.hg/00changelog.i + my-source-repo/.hg/cache/ + my-source-repo/.hg/cache/branch2-served + my-source-repo/.hg/cache/manifestfulltextcache + my-source-repo/.hg/cache/rbc-names-v1 + my-source-repo/.hg/cache/rbc-revs-v1 + my-source-repo/.hg/dirstate + my-source-repo/.hg/localtags + my-source-repo/.hg/requires + my-source-repo/.hg/store/ + my-source-repo/.hg/store/00changelog.i + my-source-repo/.hg/store/00manifest.i + my-source-repo/.hg/store/data/ + my-source-repo/.hg/store/data/nf0.i + my-source-repo/.hg/store/data/nf1.i + my-source-repo/.hg/store/data/nf10.i + my-source-repo/.hg/store/data/nf11.i + my-source-repo/.hg/store/data/nf12.i + my-source-repo/.hg/store/data/nf13.i + my-source-repo/.hg/store/data/nf14.i + my-source-repo/.hg/store/data/nf15.i + my-source-repo/.hg/store/data/nf16.i + my-source-repo/.hg/store/data/nf17.i + my-source-repo/.hg/store/data/nf18.i + my-source-repo/.hg/store/data/nf19.i + my-source-repo/.hg/store/data/nf2.i + my-source-repo/.hg/store/data/nf20.i + my-source-repo/.hg/store/data/nf21.i + my-source-repo/.hg/store/data/nf22.i + my-source-repo/.hg/store/data/nf23.i + my-source-repo/.hg/store/data/nf24.i + my-source-repo/.hg/store/data/nf25.i + my-source-repo/.hg/store/data/nf26.i + my-source-repo/.hg/store/data/nf27.i + my-source-repo/.hg/store/data/nf28.i + my-source-repo/.hg/store/data/nf29.i + my-source-repo/.hg/store/data/nf3.i + my-source-repo/.hg/store/data/nf30.i + my-source-repo/.hg/store/data/nf31.i + my-source-repo/.hg/store/data/nf32.i + my-source-repo/.hg/store/data/nf33.i + my-source-repo/.hg/store/data/nf34.i + my-source-repo/.hg/store/data/nf35.i + my-source-repo/.hg/store/data/nf36.i + my-source-repo/.hg/store/data/nf37.i + my-source-repo/.hg/store/data/nf38.i + my-source-repo/.hg/store/data/nf39.i + my-source-repo/.hg/store/data/nf4.i + my-source-repo/.hg/store/data/nf40.i + my-source-repo/.hg/store/data/nf41.i + my-source-repo/.hg/store/data/nf42.i + my-source-repo/.hg/store/data/nf43.i + my-source-repo/.hg/store/data/nf44.i + my-source-repo/.hg/store/data/nf45.i + my-source-repo/.hg/store/data/nf46.i + my-source-repo/.hg/store/data/nf47.i + my-source-repo/.hg/store/data/nf48.i + my-source-repo/.hg/store/data/nf49.i + my-source-repo/.hg/store/data/nf5.i + my-source-repo/.hg/store/data/nf50.i + my-source-repo/.hg/store/data/nf51.i + my-source-repo/.hg/store/data/nf52.i + my-source-repo/.hg/store/data/nf6.i + my-source-repo/.hg/store/data/nf7.i + my-source-repo/.hg/store/data/nf8.i + my-source-repo/.hg/store/data/nf9.i + my-source-repo/.hg/store/fncache + my-source-repo/.hg/store/phaseroots + my-source-repo/.hg/store/undo + my-source-repo/.hg/store/undo.backupfiles + my-source-repo/.hg/store/undo.phaseroots + my-source-repo/.hg/undo.bookmarks + my-source-repo/.hg/undo.branch + my-source-repo/.hg/undo.desc + my-source-repo/.hg/undo.dirstate + my-source-repo/.hg/wcache/ + + $ tar -xf some-dir/my-reference.tar my-source-repo.benchrepo + + $ cat my-source-repo.benchrepo + reference-repo: + enabled: true + format-info: + compression: zlib + dotencode: true + fncache: true + generaldelta: true + plain-cl-delta: true + sparserevlog: true + hg-version: * (glob) + id: my-reference + number-heads: + all: 3 + visible: 3 + number-named-branch: + all: 1 + visible: 1 + number-revisions: + all: 53 + visible: 53 + source: some-dir/my-source-repo