branching: merge with stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 31 Jan 2023 11:41:59 +0100
changeset 49972 1bd33932713d
parent 49967 5698c5eee12b (current diff)
parent 49971 ac93876ea2df (diff)
child 49974 90f047edab4f
branching: merge with stable
contrib/heptapod-ci.yml
hgext/convert/bzr.py
hgext/histedit.py
mercurial/bundlerepo.py
mercurial/revset.py
mercurial/scmutil.py
setup.py
tests/test-demandimport.py
tests/test-extension.t
tests/test-lfs-serve-access.t
--- a/contrib/heptapod-ci.yml	Thu Apr 29 22:01:04 2021 +0200
+++ b/contrib/heptapod-ci.yml	Tue Jan 31 11:41:59 2023 +0100
@@ -34,6 +34,7 @@
     variables:
         RUNTEST_ARGS: "--time --test-list /tmp/check-tests.txt"
         PYTHON: python3
+        CI_CLEVER_CLOUD_FLAVOR: S
 
 rust-cargo-test:
     <<: *all
@@ -44,6 +45,7 @@
         - make cargo-clippy
     variables:
         PYTHON: python3
+        CI_CLEVER_CLOUD_FLAVOR: S
 
 test-c:
     <<: *runtests
--- a/hgext/convert/bzr.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/hgext/convert/bzr.py	Tue Jan 31 11:41:59 2023 +0100
@@ -44,6 +44,12 @@
     revision = breezy.revision
     revisionspec = breezy.revisionspec
     revisionspec.RevisionSpec
+
+    try:
+        # brz 3.3.0 (revno: 7614.2.2)
+        from breezy.transport import NoSuchFile
+    except ImportError:
+        from breezy.errors import NoSuchFile
 except ImportError:
     pass
 
@@ -153,7 +159,7 @@
 
         try:
             kind = revtree.kind(name)
-        except breezy.errors.NoSuchFile:
+        except NoSuchFile:
             return None, None
         if kind not in supportedkinds:
             # the file is not available anymore - was deleted
--- a/hgext/convert/cvs.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/hgext/convert/cvs.py	Tue Jan 31 11:41:59 2023 +0100
@@ -142,7 +142,9 @@
 
         if root.startswith(b":pserver:"):
             root = root[9:]
-            m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:/]*)(?::(\d*))?(.*)', root)
+            m = re.match(
+                br'(?:(.*?)(?::(.*?))?@)?([^:/]*)(?::(\d*))?(.*)', root
+            )
             if m:
                 conntype = b"pserver"
                 user, passw, serv, port, root = m.groups()
@@ -197,7 +199,7 @@
                 if sck.recv(128) != b"I LOVE YOU\n":
                     raise error.Abort(_(b"CVS pserver authentication failed"))
 
-                self.writep = self.readp = sck.makefile(b'r+')
+                self.writep = self.readp = sck.makefile('rwb')
 
         if not conntype and root.startswith(b":local:"):
             conntype = b"local"
--- a/hgext/convert/cvsps.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/hgext/convert/cvsps.py	Tue Jan 31 11:41:59 2023 +0100
@@ -686,7 +686,10 @@
 
             files = set()
             if len(changesets) % 100 == 0:
-                t = b'%d %s' % (len(changesets), repr(e.comment)[1:-1])
+                t = b'%d %s' % (
+                    len(changesets),
+                    pycompat.byterepr(e.comment)[2:-1],
+                )
                 ui.status(stringutil.ellipsis(t, 80) + b'\n')
 
         c.entries.append(e)
--- a/mercurial/bundlerepo.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/mercurial/bundlerepo.py	Tue Jan 31 11:41:59 2023 +0100
@@ -533,6 +533,8 @@
     try:
         repo = localrepo.instance(ui, repopath, create=False)
         tempparent = None
+    except error.RequirementError:
+        raise  # no fallback if the backing repo is unsupported
     except error.RepoError:
         tempparent = pycompat.mkdtemp()
         try:
--- a/mercurial/revset.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/mercurial/revset.py	Tue Jan 31 11:41:59 2023 +0100
@@ -10,7 +10,6 @@
 import functools
 import random
 import re
-import sys
 
 from .i18n import _
 from .pycompat import getattr
@@ -2352,7 +2351,7 @@
     return subset & s.filter(filter, condrepr=b'<roots>')
 
 
-MAXINT = sys.maxsize
+MAXINT = (1 << 31) - 1
 MININT = -MAXINT - 1
 
 
--- a/mercurial/scmutil.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/mercurial/scmutil.py	Tue Jan 31 11:41:59 2023 +0100
@@ -278,6 +278,11 @@
             )
     try:
         int(lbl)
+        if b'_' in lbl:
+            # If label contains underscores, Python might consider it an
+            # integer (with "_" as visual separators), but we do not.
+            # See PEP 515 - Underscores in Numeric Literals.
+            raise ValueError
         raise error.InputError(_(b"cannot use an integer as a name"))
     except ValueError:
         pass
--- a/mercurial/utils/resourceutil.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/mercurial/utils/resourceutil.py	Tue Jan 31 11:41:59 2023 +0100
@@ -59,7 +59,10 @@
     from importlib import resources  # pytype: disable=import-error
 
     # Force loading of the resources module
-    resources.open_binary  # pytype: disable=module-attr
+    if pycompat.safehasattr(resources, 'files'):
+        resources.files  # pytype: disable=module-attr
+    else:
+        resources.open_binary  # pytype: disable=module-attr
 
     # py2exe raises an AssertionError if uses importlib.resources
     if getattr(sys, "frozen", None) in ("console_exe", "windows_exe"):
@@ -92,9 +95,18 @@
     from .. import encoding
 
     def open_resource(package, name):
-        return resources.open_binary(  # pytype: disable=module-attr
-            pycompat.sysstr(package), pycompat.sysstr(name)
-        )
+        if pycompat.safehasattr(resources, 'files'):
+            return (
+                resources.files(  # pytype: disable=module-attr
+                    pycompat.sysstr(package)
+                )
+                .joinpath(pycompat.sysstr(name))
+                .open('rb')
+            )
+        else:
+            return resources.open_binary(  # pytype: disable=module-attr
+                pycompat.sysstr(package), pycompat.sysstr(name)
+            )
 
     def is_resource(package, name):
         return resources.is_resource(  # pytype: disable=module-attr
--- a/setup.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/setup.py	Tue Jan 31 11:41:59 2023 +0100
@@ -217,9 +217,10 @@
         cmd = self.cmd + args
         returncode, out, err = runcmd(cmd, self.env)
         err = filterhgerr(err)
-        if err or returncode != 0:
+        if err:
             print("stderr from '%s':" % (' '.join(cmd)), file=sys.stderr)
             print(err, file=sys.stderr)
+        if returncode != 0:
             return b''
         return out
 
@@ -333,8 +334,12 @@
     else:  # no tag found
         ltagcmd = ['parents', '--template', '{latesttag}']
         ltag = sysstr(hg.run(ltagcmd))
+        if not ltag:
+            ltag = 'null'
         changessincecmd = ['log', '-T', 'x\n', '-r', "only(.,'%s')" % ltag]
         changessince = len(hg.run(changessincecmd).splitlines())
+        if ltag == 'null':
+            ltag = '0.0'
         version = '%s+hg%s.%s' % (ltag, changessince, hgid)
     if version.endswith('+'):
         version = version[:-1] + 'local' + time.strftime('%Y%m%d')
--- a/tests/filtertraceback.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/filtertraceback.py	Tue Jan 31 11:41:59 2023 +0100
@@ -31,6 +31,11 @@
         elif not line.startswith(' '):
             state = 'none'
 
+        elif not line.replace('^', '').replace('~', '').strip():
+            # PEP 657: Fine-grained error locations in tracebacks
+            #                       ~~~~~~^^^^^^^^^
+            continue
+
     elif state == 'file':
         # Ignore lines after "  File "
         state = 'tb'
--- a/tests/hghave.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/hghave.py	Tue Jan 31 11:41:59 2023 +0100
@@ -206,7 +206,7 @@
     "pyoxidizer-in-memory",
     "running with pyoxidizer build as 'hg' with embedded resources",
 )
-def has_pyoxidizer():
+def has_pyoxidizer_mem():
     return 'PYOXIDIZED_IN_MEMORY_RSRC' in os.environ
 
 
@@ -214,7 +214,7 @@
     "pyoxidizer-in-filesystem",
     "running with pyoxidizer build as 'hg' with external resources",
 )
-def has_pyoxidizer():
+def has_pyoxidizer_fs():
     return 'PYOXIDIZED_FILESYSTEM_RSRC' in os.environ
 
 
@@ -661,36 +661,22 @@
         return False
 
 
-@check("pygments25", "Pygments version >= 2.5")
-def pygments25():
+def getpygmentsversion():
     try:
         import pygments
 
         v = pygments.__version__
+
+        parts = v.split(".")
+        return (int(parts[0]), int(parts[1]))
     except ImportError:
-        return False
-
-    parts = v.split(".")
-    major = int(parts[0])
-    minor = int(parts[1])
-
-    return (major, minor) >= (2, 5)
+        return (0, 0)
 
 
-@check("pygments211", "Pygments version >= 2.11")
-def pygments211():
-    try:
-        import pygments
-
-        v = pygments.__version__
-    except ImportError:
-        return False
-
-    parts = v.split(".")
-    major = int(parts[0])
-    minor = int(parts[1])
-
-    return (major, minor) >= (2, 11)
+@checkvers("pygments", "Pygments version >= %s", (2.5, 2.11, 2.14))
+def has_pygments_range(v):
+    major, minor = v.split('.')[0:2]
+    return getpygmentsversion() >= (int(major), int(minor))
 
 
 @check("outer-repo", "outer repo")
--- a/tests/test-branches.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-branches.t	Tue Jan 31 11:41:59 2023 +0100
@@ -82,6 +82,11 @@
   (use 'hg update' to switch to it)
   [10]
 
+underscores in numeric branch names (issue6737)
+
+  $ hg branch 2700_210
+  marked working directory as branch 2700_210
+
 verify update will accept invalid legacy branch names
 
   $ hg init test-invalid-branch-name
--- a/tests/test-check-shbang.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-check-shbang.t	Tue Jan 31 11:41:59 2023 +0100
@@ -14,7 +14,8 @@
   > -X tests/test-check-format.t \
   > -X tests/test-check-module-imports.t \
   > -X tests/test-check-pyflakes.t \
-  > -X tests/test-check-shbang.t
+  > -X tests/test-check-shbang.t \
+  > -X tests/test-highlight.t
   [1]
 
 The above exclusions are because they're looking for files that
--- a/tests/test-demandimport.py	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-demandimport.py	Tue Jan 31 11:41:59 2023 +0100
@@ -8,6 +8,7 @@
 import types
 
 # Don't import pycompat because it has too many side-effects.
+ispy311 = (sys.version_info.major, sys.version_info.minor) >= (3, 11)
 
 # Only run if demandimport is allowed
 if subprocess.call(
@@ -73,8 +74,7 @@
 assert 'mercurial.error' not in sys.modules
 from mercurial import error as errorproxy
 
-# unsure why this isn't lazy.
-assert not isinstance(f, _LazyModule)
+assert isinstance(errorproxy, _LazyModule)
 assert f(errorproxy) == "<module 'mercurial.error' from '?'>", f(errorproxy)
 
 doc = ' '.join(errorproxy.__doc__.split()[:3])
@@ -92,10 +92,16 @@
 import os
 
 assert not isinstance(os, _LazyModule)
-assert f(os) == "<module 'os' from '?'>", f(os)
+if ispy311:
+    assert f(os) == "<module 'os' (frozen)>", f(os)
+else:
+    assert f(os) == "<module 'os' from '?'>", f(os)
 
 assert f(os.system) == '<built-in function system>', f(os.system)
-assert f(os) == "<module 'os' from '?'>", f(os)
+if ispy311:
+    assert f(os) == "<module 'os' (frozen)>", f(os)
+else:
+    assert f(os) == "<module 'os' from '?'>", f(os)
 
 assert 'mercurial.utils.procutil' not in sys.modules
 from mercurial.utils import procutil
--- a/tests/test-extension.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-extension.t	Tue Jan 31 11:41:59 2023 +0100
@@ -598,6 +598,7 @@
       uisetup(ui)
     File "$TESTTMP/baduisetup.py", line 2, in uisetup
       1 / 0
+      ~~^~~ (py311 !)
   ZeroDivisionError: * by zero (glob)
   *** failed to set up extension baduisetup: * by zero (glob)
   Mercurial Distributed SCM (version *) (glob)
--- a/tests/test-highlight.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-highlight.t	Tue Jan 31 11:41:59 2023 +0100
@@ -163,7 +163,8 @@
   <span id="l7"><span class="kn">import</span> <span class="nn">itertools</span></span><a href="#l7"></a>
   <span id="l8"></span><a href="#l8"></a>
   <span id="l9"><span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></span><a href="#l9"></a>
-  <span id="l10">    <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></span><a href="#l10"></a>
+  <span id="l10"><span class="w">    </span><span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></span><a href="#l10"></a> (pygments214 !)
+  <span id="l10">    <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></span><a href="#l10"></a> (no-pygments214 !)
   <span id="l11">    <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></span><a href="#l11"></a>
   <span id="l12">        <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></span><a href="#l12"></a>
   <span id="l13">        <span class="c"># It is important to yield *here* in order to stop the</span></span><a href="#l13"></a>
@@ -489,7 +490,8 @@
   <a href="/rev/687f2d169546">changeset</a>
   </div>
   </td>
-  <td class="source followlines-btn-parent"><a href="#l10">    10</a>     <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td>
+  <td class="source followlines-btn-parent"><a href="#l10">    10</a> <span class="w">    </span><span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td> (pygments214 !)
+  <td class="source followlines-btn-parent"><a href="#l10">    10</a>     <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td> (no-pygments214 !)
   </tr>
   <tr id="l11" class="thisrev">
   <td class="annotate parity0">
@@ -1008,7 +1010,7 @@
   > EOF
 
   $ cat > unknownfile << EOF
-  > #!$PYTHON
+  > #!/this/helps/pygments/detect/python
   > def foo():
   >    pass
   > EOF
--- a/tests/test-lfs-serve-access.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-lfs-serve-access.t	Tue Jan 31 11:41:59 2023 +0100
@@ -340,12 +340,14 @@
   $LOCALIP - - [$ERRDATE$] HG error:  Exception happened while processing request '/.git/info/lfs/objects/batch': (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  Traceback (most recent call last): (glob)
   $LOCALIP - - [$ERRDATE$] HG error:      verifies = store.verify(oid) (glob)
+  $LOCALIP - - [$ERRDATE$] HG error:                 ^^^^^^^^^^^^^^^^^ (glob) (py311 !)
   $LOCALIP - - [$ERRDATE$] HG error:      raise IOError(errno.EIO, r'%s: I/O error' % oid.decode("utf-8")) (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  *Error: [Errno *] f03217a32529a28a42d03b1244fe09b6e0f9fd06d7b966d4d50567be2abe6c0e: I/O error (glob)
   $LOCALIP - - [$ERRDATE$] HG error:   (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  Exception happened while processing request '/.git/info/lfs/objects/batch': (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  Traceback (most recent call last): (glob)
   $LOCALIP - - [$ERRDATE$] HG error:      verifies = store.verify(oid) (glob)
+  $LOCALIP - - [$ERRDATE$] HG error:                 ^^^^^^^^^^^^^^^^^ (glob) (py311 !)
   $LOCALIP - - [$ERRDATE$] HG error:      raise IOError(errno.EIO, r'%s: I/O error' % oid.decode("utf-8")) (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  *Error: [Errno *] b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c: I/O error (glob)
   $LOCALIP - - [$ERRDATE$] HG error:   (glob)
@@ -363,19 +365,26 @@
       self.do_hgweb()
       for chunk in self.server.application(env, self._start_response):
       for r in self._runwsgi(req, res, repo):
+               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (py311 !)
       handled = wireprotoserver.handlewsgirequest( (py38 !)
+                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (py311 !)
       return _processbasictransfer( (py38 !)
+             ^^^^^^^^^^^^^^^^^^^^^^ (py311 !)
       rctx, req, res, self.check_perm (no-py38 !)
       rctx.repo, req, res, lambda perm: checkperm(rctx, req, perm) (no-py38 !)
       res.setbodybytes(localstore.read(oid))
+                       ^^^^^^^^^^^^^^^^^^^^ (py311 !)
       blob = self._read(self.vfs, oid, verify)
+             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (py311 !)
       raise IOError(errno.EIO, r'%s: I/O error' % oid.decode("utf-8"))
   *Error: [Errno *] 276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d: I/O error (glob)
   
   $LOCALIP - - [$ERRDATE$] HG error:  Exception happened while processing request '/.hg/lfs/objects/276f73cfd75f9fb519810df5f5d96d6594ca2521abd86cbcd92122f7d51a1f3d': (glob)
   $LOCALIP - - [$ERRDATE$] HG error:  Traceback (most recent call last): (glob)
   $LOCALIP - - [$ERRDATE$] HG error:      res.setbodybytes(localstore.read(oid)) (glob)
+  $LOCALIP - - [$ERRDATE$] HG error:                       ^^^^^^^^^^^^^^^^^^^^ (glob) (py311 !)
   $LOCALIP - - [$ERRDATE$] HG error:      blob = self._read(self.vfs, oid, verify) (glob)
+  $LOCALIP - - [$ERRDATE$] HG error:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (glob) (py311 !)
   $LOCALIP - - [$ERRDATE$] HG error:      blobstore._verify(oid, b'dummy content') (glob)
   $LOCALIP - - [$ERRDATE$] HG error:      raise LfsCorruptionError( (glob) (py38 !)
   $LOCALIP - - [$ERRDATE$] HG error:      hint=_(b'run hg verify'), (glob) (no-py38 !)
--- a/tests/test-requires.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-requires.t	Tue Jan 31 11:41:59 2023 +0100
@@ -81,4 +81,14 @@
   abort: required features are not supported in the destination: featuresetup-test
   [255]
 
+Bundlerepo also enforces the underlying repo requirements
+
+  $ hg --cwd supported bundle --all ../bundle.hg
+  1 changesets found
+  $ echo outdoor-pool > push-dst/.hg/requires
+  $ hg --cwd push-dst log -R ../bundle.hg -T phases
+  abort: repository requires features unknown to this Mercurial: outdoor-pool
+  (see https://mercurial-scm.org/wiki/MissingRequirement for more information)
+  [255]
+
   $ cd ..
--- a/tests/test-revset.t	Thu Apr 29 22:01:04 2021 +0200
+++ b/tests/test-revset.t	Tue Jan 31 11:41:59 2023 +0100
@@ -2981,16 +2981,16 @@
   $ hg log --rev 'sort(all(), "-random")' | wc -l
   \s*8 (re)
   $ hg log --rev 'sort(all(), "random", random.seed=celeste)'
+  0 b12  m111 u112 111 10800
+  4 b111 m112 u111 110 14400
+  2 b111 m11  u12  111 3600
   6 b111 t2   tu   130 0
+  1 b11  m12  u111 112 7200
   7 b111 t3   tu   130 0
-  4 b111 m112 u111 110 14400
-  3 b112 m111 u11  120 0
   5 b111 t1   tu   130 0
+  3 b112 m111 u11  120 0
+  $ hg log --rev 'first(sort(all(), "random", random.seed=celeste))'
   0 b12  m111 u112 111 10800
-  1 b11  m12  u111 112 7200
-  2 b111 m11  u12  111 3600
-  $ hg log --rev 'first(sort(all(), "random", random.seed=celeste))'
-  6 b111 t2   tu   130 0
 
 
 topographical sorting can't be combined with other sort keys, and you can't