# HG changeset patch # User Mads Kiilerich <m...@kiilerich.com> # Date 1687897904 -7200 # Tue Jun 27 22:31:44 2023 +0200 # Branch stable # Node ID 85a1bdb7d945c647670761676c97ce716fe3796d # Parent b6633799949e428d27f7704636da0da31a599e6b extensions: address ast deprecations introduced in Python 3.12
Tests would fail with: .../mercurial/extensions.py:910: DeprecationWarning: ast.Str is deprecated and will be removed in Python 3.14; use ast.Constant instead if isinstance(a, ast.Str): .../mercurial/extensions.py:912: DeprecationWarning: ast.Bytes is deprecated and will be removed in Python 3.14; use ast.Constant instead elif isinstance(a, ast.Bytes): .../mercurial/extensions.py:913: DeprecationWarning: Attribute s is deprecated and will be removed in Python 3.14; use value instead name = a.s diff --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -885,16 +885,31 @@ def _disabledcmdtable(path): with open(path, b'rb') as src: root = ast.parse(src.read(), path) cmdtable = {} + + # Python 3.12 started removing Bytes and Str and deprecate harder + use_constant = 'Bytes' not in vars(ast) + for node in _walkcommand(root): if not node.args: continue a = node.args[0] - if isinstance(a, ast.Str): - name = pycompat.sysbytes(a.s) - elif isinstance(a, ast.Bytes): - name = a.s - else: - continue + if use_constant: # Valid since Python 3.8 + if isinstance(a, ast.Constant): + if isinstance(a.value, str): + name = pycompat.sysbytes(a.value) + elif isinstance(a.value, bytes): + name = a.value + else: + continue + else: + continue + else: # Valid until 3.11 + if isinstance(a, ast.Str): + name = pycompat.sysbytes(a.s) + elif isinstance(a, ast.Bytes): + name = a.s + else: + continue cmdtable[name] = (None, [], b'') return cmdtable _______________________________________________ Mercurial-devel mailing list Mercurial-devel@lists.mercurial-scm.org https://lists.mercurial-scm.org/mailman/listinfo/mercurial-devel