]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127146: Emscripten: Fix pathlib glob_dotdot test (#135624)
authorHood Chatham <roberthoodchatham@gmail.com>
Wed, 18 Jun 2025 03:20:43 +0000 (20:20 -0700)
committerGitHub <noreply@github.com>
Wed, 18 Jun 2025 03:20:43 +0000 (11:20 +0800)
The Emscripten path resolver uses the same mechanism for resolving `..`
at a file system root as for resolving symlinks. This is because
roots don't store their mountpoints. If the parent of a node is itself,
it is a root but it might be a mountpoint in some other file system.

If a path has enough `..`'s at the root, it will return ELOOP.
Enough turns out to be 49.

Lib/test/test_pathlib/test_pathlib.py

index 13356b4cfe082b939d3a7a6f624c3bf6bd8dc7af..b2e2cdb3338beb464a7bddef22f517a40849d17d 100644 (file)
@@ -2954,7 +2954,13 @@ class PathTest(PurePathTest):
         else:
             # ".." segments are normalized first on Windows, so this path is stat()able.
             self.assertEqual(set(p.glob("xyzzy/..")), { P(self.base, "xyzzy", "..") })
-        self.assertEqual(set(p.glob("/".join([".."] * 50))), { P(self.base, *[".."] * 50)})
+        if sys.platform == "emscripten":
+            # Emscripten will return ELOOP if there are 49 or more ..'s.
+            # Can remove when https://github.com/emscripten-core/emscripten/pull/24591 is merged.
+            NDOTDOTS = 48
+        else:
+            NDOTDOTS = 50
+        self.assertEqual(set(p.glob("/".join([".."] * NDOTDOTS))), { P(self.base, *[".."] * NDOTDOTS)})
 
     def test_glob_inaccessible(self):
         P = self.cls