# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1548436896 18000
#      Fri Jan 25 12:21:36 2019 -0500
# Node ID 9462b14569817f095344e8013a838333f5ab5e10
# Parent  00f612a8a849d0b6082d47de19b2ce661a37dce7
Run debugupgraderepo if format mismatch between repo and config

Detect if the repository format is different from the default one in current
Mercurial version and if so, run `debugupgraderepo` to make it match.

diff --git a/lib/scmperf_lib/__init__.py b/lib/scmperf_lib/__init__.py
--- a/lib/scmperf_lib/__init__.py
+++ b/lib/scmperf_lib/__init__.py
@@ -2,6 +2,31 @@
 import subprocess
 
 
+def check_format_data(repo):
+    """ Return the list of mismatched format values between default and repo
+
+    Read the output of `debugformat` against the repo and the list of
+    mismatched values
+    """
+    # Format information
+    raw_format_data = json.loads(
+        shell_exec(["hg", "-R", repo, "debugformat", "-T", "json"])
+    )
+
+    mismatch = []
+
+    for format_value in raw_format_data:
+        format_name = format_value["name"]
+        repo_value = format_value["repo"]
+
+        if format_value["config"] != repo_value:
+            mismatch.append(
+                (format_name, repo_value, format_value["config"])
+            )
+
+    return mismatch
+
+
 def gather_repo_stats(repo, repo_id, repo_source):
     """gather repo related stats and returns a json-encodable dict
 
diff --git a/repo-scripts/make-reference b/repo-scripts/make-reference
--- a/repo-scripts/make-reference
+++ b/repo-scripts/make-reference
@@ -14,7 +14,11 @@
 parent_dir = abspath(join(dirname(abspath(__file__)), ".."))
 sys.path.insert(0, join(parent_dir, "lib"))
 
-from scmperf_lib import gather_repo_stats, shell_exec  # isort:skip
+from scmperf_lib import (
+    gather_repo_stats,
+    shell_exec,
+    check_format_data,
+)  # isort:skip
 
 
 def main(args):
@@ -51,6 +55,21 @@
     shell_exec(["hg", "-R", repo_main, "debugupdatecache"])
 
     ### Compute stats
+    mismatch = check_format_data(repo_main)
+
+    ### Run upgraderepo if needed
+    if len(mismatch) > 0:
+        print("Running debugupgraderepo because of format mismatch:")
+        for format_name, repo_value, config_value in mismatch:
+            msg = "\t{0}: {1!r} != {2!r} (repo/config)"
+            print(msg.format(format_name, repo_value, config_value))
+
+        shell_exec(["hg", "-R", repo_main, "debugupgraderepo", "--run"])
+
+        # We need to remove the upgradebackup
+        for backup_dir in glob(join(repo_main, ".hg", "upgradebackup*")):
+            shutil.rmtree(backup_dir, ignore_errors=True)
+
     data = gather_repo_stats(repo_main, repo_id, repo_source)
 
     # Write data to the benchrepo file
diff --git a/tests/test-make-reference.t b/tests/test-make-reference.t
--- a/tests/test-make-reference.t
+++ b/tests/test-make-reference.t
@@ -7,7 +7,7 @@
   $ export PATH=$TESTDIR/../repo-scripts/:${PATH}
 
   $ mkdir some-dir
-  $ hg init some-dir/my-source-repo
+  $ hg init some-dir/my-source-repo --config format.usegeneraldelta=False
   $ hg -R some-dir/my-source-repo debugbuilddag  --new-file '.+5:brancha$.+11:branchb$.+30:branchc<brancha+2<branchb+2'
 
 Wrong call
@@ -30,7 +30,12 @@
 -----------------
 
   $ make-reference some-dir/my-source-repo my-reference
+  copy of old repository backed up at $TESTTMP/my-reference-reference/.hg/upgradebackup.* (glob)
+  the old repository will not be deleted; remove it to free up disk space once the upgraded repository is verified
   hg cloning repository from: some-dir/my-source-repo
+  Running debugupgraderepo because of format mismatch:
+  	generaldelta: False != True (repo/config)
+  	sparserevlog: False != True (repo/config)
   building a reference tarball
   result available at: my-reference-reference.tar
   $ ls -1
@@ -165,6 +170,9 @@
   my-reference-reference/.hg/store/data/nf8.i
   my-reference-reference/.hg/store/data/nf9.i
   my-reference-reference/.hg/store/fncache
+  my-reference-reference/.hg/store/undo
+  my-reference-reference/.hg/store/undo.backupfiles
+  my-reference-reference/.hg/store/undo.phaseroots
   my-reference.benchrepo
 
 update the reference