# HG changeset patch
# User Antonio Muci <
a....@inwind.it>
# Date 1777673658 -7200
# Sat May 02 00:14:18 2026 +0200
# Branch stable
# Node ID 24465524d7419b499692d754b04cf7a3e3ce5a29
# Parent c92cd00dbfe34302c6ea6824a2636b28c92adcbc
compat: start the work to implement compatibility with mercurial 7.2
This commit adds a util.compat module, in order to centralize - where possible -
the backward compatibility hacks.
This first commit adapts the code base to parse_config_opts and early_parse_opts
being moved in a new main_script module.
In order to keep compatibility with mercurial <= 7.1.2, the old imports are kept
as a fallback. They are however renamed according to the new API.
The API incompatibility was introduced on 2025-06-18 in mercurial changeset
aa0ff1214f489a804a6a924df699bf72d890390d ("cycle-breaking: move some of
`dispatch.py` in a new `main_script` module") and subsequent changes.
diff --git a/tests/helpers.py b/tests/helpers.py
--- a/tests/helpers.py
+++ b/tests/helpers.py
@@ -17,6 +17,8 @@ except ImportError:
# a lot of stuff.
QTextCodec = None
+from tortoisehg.util import compat as compatmod
+
from mercurial import (
dispatch,
encoding as encodingmod,
@@ -168,9 +170,9 @@ class HgClient:
ui.ferr = util.bytesio()
args = list(args)
req = dispatch.request(args, ui=ui)
- options = dispatch._earlyparseopts(ui, args)
+ options = compatmod.early_parse_opts(ui, args)
req.earlyoptions.update(options)
- dispatch._parseconfig(ui, req.earlyoptions[b'config'])
+ compatmod.parse_config_opts(ui, req.earlyoptions[b'config'])
try:
result = dispatch._dispatch(req) or 0
return result, ui.fout.getvalue(), ui.ferr.getvalue()
diff --git a/tortoisehg/util/compat.py b/tortoisehg/util/compat.py
new file mode 100644
--- /dev/null
+++ b/tortoisehg/util/compat.py
@@ -0,0 +1,18 @@
+# compat.py - TortoiseHg backward compatibility stubs
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import annotations
+
+try:
+ # mercurial >= 7.2
+ from mercurial.main_script.options import parse_config_opts
+except ModuleNotFoundError:
+ from mercurial.dispatch import _parseconfig as parse_config_opts
+
+try:
+ # mercurial >= 7.2
+ from mercurial.main_script.options import early_parse_opts
+except ModuleNotFoundError:
+ from mercurial.dispatch import _earlyparseopts as early_parse_opts
diff --git a/tortoisehg/util/hglib.py b/tortoisehg/util/hglib.py
--- a/tortoisehg/util/hglib.py
+++ b/tortoisehg/util/hglib.py
@@ -28,7 +28,6 @@ from mercurial import (
cmdutil,
config,
context,
- dispatch as dispatchmod,
encoding,
error,
extensions,
@@ -56,6 +55,7 @@ from mercurial.utils import (
from mercurial.node import nullrev
from . import (
+ compat as compatmod,
hgversion as hgversionmod,
paths,
)
@@ -1054,11 +1054,11 @@ def parseconfigopts(ui: uimod.ui,
>>> u.config(b'extensions', b'mq')
b'!'
"""
- config = dispatchmod._earlyparseopts(ui, args)[b'config']
+ config = compatmod.early_parse_opts(ui, args)[b'config']
# drop --config from args
args[:] = fancyopts.earlygetopt(args, b'', [b'config='],
gnu=True, keepsep=True)[1]
- return dispatchmod._parseconfig(ui, config)
+ return compatmod.parse_config_opts(ui, config)
# (unicode, QString) -> unicode, otherwise -> str