mercurial/admin_commands.py
changeset 50986 752c5a5b73c6
parent 50984 727428c7e1fc
child 51500 d4095f7b000a
--- a/mercurial/admin_commands.py	Wed Sep 13 12:25:51 2023 +0200
+++ b/mercurial/admin_commands.py	Wed Jan 25 15:34:27 2023 +0100
@@ -5,7 +5,45 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
-from . import registrar
+from .i18n import _
+from .admin import verify
+from . import error, registrar, transaction
+
 
 table = {}
 command = registrar.command(table)
+
+
+@command(
+    b'admin::verify',
+    [
+        (b'c', b'check', [], _(b'add a check'), _(b'CHECK')),
+        (b'o', b'option', [], _(b'pass an option to a check'), _(b'OPTION')),
+    ],
+    helpcategory=command.CATEGORY_MAINTENANCE,
+)
+def admin_verify(ui, repo, **opts):
+    """verify the integrity of the repository
+
+    Alternative UI to `hg verify` with a lot more control over the
+    verification process and better error reporting.
+    """
+
+    if not repo.url().startswith(b'file:'):
+        raise error.Abort(_(b"cannot verify bundle or remote repos"))
+
+    if transaction.has_abandoned_transaction(repo):
+        ui.warn(_(b"abandoned transaction found - run hg recover\n"))
+
+    checks = opts.get("check", [])
+    options = opts.get("option", [])
+
+    funcs = verify.get_checks(repo, ui, names=checks, options=options)
+
+    ui.status(_(b"running %d checks\n") % len(funcs))
+    # Done in two times so the execution is separated from the resolving step
+    for name, func in sorted(funcs.items(), key=lambda x: x[0]):
+        ui.status(_(b"running %s\n") % name)
+        errors = func()
+        if errors:
+            ui.warn(_(b"found %d errors\n") % len(errors))