From 9f2c9f9137947a66faf4bdb12217f8bdae0135cc Mon Sep 17 00:00:00 2001 From: Paul Hovey Date: Sat, 27 Jun 2026 08:14:07 -0400 Subject: [PATCH] produce sparse_paths_type option for sparse checkouts to designate "cone" or "no-cone" --- CHANGELOG.md | 6 + docs/use-cases/sparse-checkouts.md | 33 ++++- gitman/git.py | 21 +-- gitman/models/source.py | 15 ++- gitman/tests/test_git.py | 73 +++++++++- gitman/tests/test_models_source.py | 8 +- poetry.lock | 205 ++++++++++++++++------------- tests/test_api.py | 83 ++++++++++++ 8 files changed, 340 insertions(+), 104 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f9f6c49..277d8fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# Unreleased + +- Added `sparse_paths_type` option to select between `"cone"` (default) and `"no-cone"` sparse-checkout modes, enabling file-level and regex patterns. (#360) +- Fixed sparse-path filtering that incorrectly included root-level files after v3.5.3 switched to cone mode. (#363) +- Updated `regex` dependency to resolve an import-time crash in the `sly` lexer. (#363) + # 3.8.1 (2025-03-20) - Fixed reapplication of sparse paths after install. (@fhamdi-bdai) diff --git a/docs/use-cases/sparse-checkouts.md b/docs/use-cases/sparse-checkouts.md index d05b89ce..d1ef1075 100644 --- a/docs/use-cases/sparse-checkouts.md +++ b/docs/use-cases/sparse-checkouts.md @@ -5,8 +5,14 @@ from the reference repository. It is important to note, that this influences onl checkout. The reference repository, maintained by gitman as a cache, will still be a full clone of the original repo. Using `sparse_paths` will use git's sparse checkout feature to just materialize the selected paths in the working tree. -As this is a [git feature](https://git-scm.com/docs/git-read-tree#_sparse_checkout), all syntax options are -available and passed unmodified to `$GIT_DIR/info/sparse-checkout`. +The `sparse_paths_type` option selects between git's two sparse-checkout modes: + +- `"cone"` (default): only directory paths are supported and git uses a faster hash-based algorithm. + Note that **all files at the repository root are always included** in cone mode; only subdirectories can be filtered. +- `"no-cone"`: patterns are treated as gitignore-style regular expressions and passed unmodified to git. + This enables file-level and glob patterns (e.g. `"*.c"`) that cone mode cannot match. + +## Cone mode (default) The following example configuration will clone the full font-awesome repo into the cache, but the project local clone will only contain the `fonts` directory and it's children. @@ -18,3 +24,26 @@ clone will only contain the `fonts` directory and it's children. sparse_paths: - "fonts/*" ``` + +Since cone mode only accepts directories, the trailing `/*` is stripped automatically so that `fonts` is passed to +`git sparse-checkout set`. + +## Non-cone mode + +When you need to match individual files or use regular-expression patterns, set `sparse_paths_type: no-cone`. +Patterns are passed unmodified to git's sparse checkout. For example, to check out only a single root-level file +and a specific subdirectory: + +```yaml +- repo: "https://github.com/example/repo" + name: example + rev: main + sparse_paths_type: no-cone + sparse_paths: + - "/c" + - "/a/" +``` + +See the [git sparse-checkout documentation][git-sparse] for the full pattern syntax available in non-cone mode. + +[git-sparse]: https://git-scm.com/docs/git-sparse-checkout diff --git a/gitman/git.py b/gitman/git.py index 46413080..1680294e 100644 --- a/gitman/git.py +++ b/gitman/git.py @@ -32,6 +32,7 @@ def clone( *, cache=settings.CACHE, sparse_paths=None, + sparse_paths_type="cone", rev=None, user_params=None ): @@ -61,6 +62,10 @@ def clone( git("clone", "--mirror", repo, reference, *user_params) if sparse_paths and sparse_paths[0]: + cone = sparse_paths_type != "no-cone" + mode_flag = "--cone" if cone else "--no-cone" + paths = sanitize_sparse_paths(sparse_paths) if cone else sparse_paths + os.makedirs(normpath) git("-C", normpath, "init") git("-C", normpath, "remote", "add", "origin", repo) @@ -73,14 +78,7 @@ def clone( ) as fd: fd.write("%s/objects" % sparse_paths_repo) - git("-C", normpath, "sparse-checkout", "init", "--cone") - git( - "-C", - normpath, - "sparse-checkout", - "set", - *sanitize_sparse_paths(sparse_paths) - ) + git("-C", normpath, "sparse-checkout", "set", mode_flag, *paths) git("-C", normpath, "fetch", "origin") git("-C", normpath, "checkout", rev) elif settings.CACHE_DISABLE: @@ -256,9 +254,12 @@ def am(patch, _skip=False): raise ShellError from e -def apply_sparse_checkout(sparse_paths): +def apply_sparse_checkout(sparse_paths, sparse_paths_type="cone"): """Re-apply sparse-checkout paths to an existing working tree.""" - git("sparse-checkout", "set", *sanitize_sparse_paths(sparse_paths)) + cone = sparse_paths_type != "no-cone" + mode_flag = "--cone" if cone else "--no-cone" + paths = sanitize_sparse_paths(sparse_paths) if cone else sparse_paths + git("sparse-checkout", "set", mode_flag, *paths) def update( diff --git a/gitman/models/source.py b/gitman/models/source.py index 3376b181..15ed6bf2 100644 --- a/gitman/models/source.py +++ b/gitman/models/source.py @@ -28,6 +28,7 @@ class Source: | `type` | `"git"` or `"git-svn"` | No | `"git"` | | `params` | Additional arguments for `clone` | No | `null` | | `sparse_paths` | Controls partial checkout | No | `[]` | + | `sparse_paths_type` | `"cone"` or `"no-cone"` sparse mode | No | `"cone"` | | `links` | Creates symlinks within a project | No | `[]` | | `scripts` | Shell commands to run after checkout | No | `[]` | | `patches` | patches to be applied after checkout | No | `[]` | @@ -50,6 +51,15 @@ class Source: See [using sparse checkouts][using-sparse-checkouts] for more information. + The `sparse_paths_type` option selects git's sparse-checkout mode: + + - `"cone"` (default): only directory patterns are supported; git uses a + faster hash-based algorithm. Note that all root-level files are always + included in cone mode. + - `"no-cone"`: patterns are treated as gitignore-style regular expressions + and passed unmodified. This enables file-level and glob patterns (e.g. + `"*.c"`) that cone mode cannot match. + ### Links See [using multiple links][using-multiple-links] for more information. @@ -85,6 +95,7 @@ class Source: type: str = "git" params: Optional[str] = None sparse_paths: List[str] = field(default_factory=list) + sparse_paths_type: str = "cone" links: List[Link] = field(default_factory=list) scripts: List[str] = field(default_factory=list) @@ -150,6 +161,7 @@ def update_files( self.repo, self.name, sparse_paths=self.sparse_paths, + sparse_paths_type=self.sparse_paths_type, rev=self.rev, user_params=self.clone_params_if_any(), ) @@ -206,7 +218,7 @@ def update_files( # Re-apply sparse-checkout paths in case they changed since initial clone if self.sparse_paths and self.sparse_paths[0]: - git.apply_sparse_checkout(self.sparse_paths) + git.apply_sparse_checkout(self.sparse_paths, self.sparse_paths_type) # Update the working tree to the desired revision git.update( @@ -379,6 +391,7 @@ def lock( scripts=self.scripts, patches=self.patches, sparse_paths=self.sparse_paths, + sparse_paths_type=self.sparse_paths_type, ) return source diff --git a/gitman/tests/test_git.py b/gitman/tests/test_git.py index 1f0af9dd..4a4cbfca 100644 --- a/gitman/tests/test_git.py +++ b/gitman/tests/test_git.py @@ -1,5 +1,5 @@ import os -from unittest.mock import Mock, patch +from unittest.mock import Mock, mock_open, patch from gitman import git, settings from gitman.exceptions import ShellError @@ -53,6 +53,77 @@ def test_clone_from_reference(self, mock_call): ], ) + @patch("builtins.open", mock_open()) + @patch("os.makedirs", Mock(return_value=None)) + @patch("os.path.isdir", Mock(return_value=False)) + def test_clone_sparse_cone(self, mock_call): + """Verify sparse checkout uses cone mode and sanitizes paths.""" + git.clone( + "git", + "mock.git", + "mock/path", + cache="cache", + sparse_paths=["src/*"], + rev="rev", + ) + check_calls( + mock_call, + [ + "git clone --mirror mock.git " + + os.path.normpath("cache/mock.reference"), + "git -C " + os.path.normpath("mock/path") + " init", + "git -C " + + os.path.normpath("mock/path") + + " remote add origin mock.git", + "git -C " + + os.path.normpath("mock/path") + + " sparse-checkout set --cone src", + "git -C " + os.path.normpath("mock/path") + " fetch origin", + "git -C " + os.path.normpath("mock/path") + " checkout rev", + ], + ) + + @patch("builtins.open", mock_open()) + @patch("os.makedirs", Mock(return_value=None)) + @patch("os.path.isdir", Mock(return_value=False)) + def test_clone_sparse_no_cone(self, mock_call): + """Verify sparse checkout passes patterns unmodified in no-cone mode.""" + git.clone( + "git", + "mock.git", + "mock/path", + cache="cache", + sparse_paths=["src/*"], + sparse_paths_type="no-cone", + rev="rev", + ) + check_calls( + mock_call, + [ + "git clone --mirror mock.git " + + os.path.normpath("cache/mock.reference"), + "git -C " + os.path.normpath("mock/path") + " init", + "git -C " + + os.path.normpath("mock/path") + + " remote add origin mock.git", + "git -C " + + os.path.normpath("mock/path") + + " sparse-checkout set --no-cone src/*", + "git -C " + os.path.normpath("mock/path") + " fetch origin", + "git -C " + os.path.normpath("mock/path") + " checkout rev", + ], + ) + + def test_apply_sparse_checkout_cone(self, mock_call): + """Verify re-applying sparse paths sanitizes globs in cone mode.""" + git.apply_sparse_checkout(["src/*"]) + check_calls(mock_call, ["git sparse-checkout set --cone src"]) + + def test_apply_sparse_checkout_no_cone(self, mock_call): + """Verify re-applying sparse paths keeps patterns raw in no-cone mode.""" + git.apply_sparse_checkout(["src/*"], "no-cone") + check_calls(mock_call, ["git sparse-checkout set --no-cone src/*"]) + def test_fetch(self, mock_call): """Verify the commands to fetch from a Git repository.""" git.fetch("git", "mock.git", "mock/path") diff --git a/gitman/tests/test_models_source.py b/gitman/tests/test_models_source.py index 4f0c4582..ec2010f6 100644 --- a/gitman/tests/test_models_source.py +++ b/gitman/tests/test_models_source.py @@ -74,7 +74,13 @@ def test_update_files( source.update_files() mock_clone.assert_called_once_with( - "git", "repo", "name", rev="rev", sparse_paths=[], user_params=None + "git", + "repo", + "name", + rev="rev", + sparse_paths=[], + sparse_paths_type="cone", + user_params=None, ) mock_is_fetch_required.assert_called_once_with("git", "rev") mock_fetch.assert_called_once_with("git", "repo", "name", rev="rev") diff --git a/poetry.lock b/poetry.lock index ef59b45e..e078a7c4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1474,99 +1474,126 @@ pyyaml = "*" [[package]] name = "regex" -version = "2025.9.1" +version = "2026.5.9" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5aa2a6a73bf218515484b36a0d20c6ad9dc63f6339ff6224147b0e2c095ee55"}, - {file = "regex-2025.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c2ff5c01d5e47ad5fc9d31bcd61e78c2fa0068ed00cab86b7320214446da766"}, - {file = "regex-2025.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d49dc84e796b666181de8a9973284cad6616335f01b52bf099643253094920fc"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9914fe1040874f83c15fcea86d94ea54091b0666eab330aaab69e30d106aabe"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e71bceb3947362ec5eabd2ca0870bb78eae4edfc60c6c21495133c01b6cd2df4"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67a74456f410fe5e869239ee7a5423510fe5121549af133809d9591a8075893f"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c3b96ed0223b32dbdc53a83149b6de7ca3acd5acd9c8e64b42a166228abe29c"}, - {file = "regex-2025.9.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:113d5aa950f428faf46fd77d452df62ebb4cc6531cb619f6cc30a369d326bfbd"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fcdeb38de4f7f3d69d798f4f371189061446792a84e7c92b50054c87aae9c07c"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4bcdff370509164b67a6c8ec23c9fb40797b72a014766fdc159bb809bd74f7d8"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7383efdf6e8e8c61d85e00cfb2e2e18da1a621b8bfb4b0f1c2747db57b942b8f"}, - {file = "regex-2025.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ec2bd3bdf0f73f7e9f48dca550ba7d973692d5e5e9a90ac42cc5f16c4432d8b"}, - {file = "regex-2025.9.1-cp310-cp310-win32.whl", hash = "sha256:9627e887116c4e9c0986d5c3b4f52bcfe3df09850b704f62ec3cbf177a0ae374"}, - {file = "regex-2025.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:94533e32dc0065eca43912ee6649c90ea0681d59f56d43c45b5bcda9a740b3dd"}, - {file = "regex-2025.9.1-cp310-cp310-win_arm64.whl", hash = "sha256:a874a61bb580d48642ffd338570ee24ab13fa023779190513fcacad104a6e251"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e5bcf112b09bfd3646e4db6bf2e598534a17d502b0c01ea6550ba4eca780c5e6"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:67a0295a3c31d675a9ee0238d20238ff10a9a2fdb7a1323c798fc7029578b15c"}, - {file = "regex-2025.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea8267fbadc7d4bd7c1301a50e85c2ff0de293ff9452a1a9f8d82c6cafe38179"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aeff21de7214d15e928fb5ce757f9495214367ba62875100d4c18d293750cc1"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d89f1bbbbbc0885e1c230f7770d5e98f4f00b0ee85688c871d10df8b184a6323"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca3affe8ddea498ba9d294ab05f5f2d3b5ad5d515bc0d4a9016dd592a03afe52"}, - {file = "regex-2025.9.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91892a7a9f0a980e4c2c85dd19bc14de2b219a3a8867c4b5664b9f972dcc0c78"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e1cb40406f4ae862710615f9f636c1e030fd6e6abe0e0f65f6a695a2721440c6"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:94f6cff6f7e2149c7e6499a6ecd4695379eeda8ccbccb9726e8149f2fe382e92"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6c0226fb322b82709e78c49cc33484206647f8a39954d7e9de1567f5399becd0"}, - {file = "regex-2025.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a12f59c7c380b4fcf7516e9cbb126f95b7a9518902bcf4a852423ff1dcd03e6a"}, - {file = "regex-2025.9.1-cp311-cp311-win32.whl", hash = "sha256:49865e78d147a7a4f143064488da5d549be6bfc3f2579e5044cac61f5c92edd4"}, - {file = "regex-2025.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:d34b901f6f2f02ef60f4ad3855d3a02378c65b094efc4b80388a3aeb700a5de7"}, - {file = "regex-2025.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:47d7c2dab7e0b95b95fd580087b6ae196039d62306a592fa4e162e49004b6299"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:84a25164bd8dcfa9f11c53f561ae9766e506e580b70279d05a7946510bdd6f6a"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:645e88a73861c64c1af558dd12294fb4e67b5c1eae0096a60d7d8a2143a611c7"}, - {file = "regex-2025.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10a450cba5cd5409526ee1d4449f42aad38dd83ac6948cbd6d7f71ca7018f7db"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9dc5991592933a4192c166eeb67b29d9234f9c86344481173d1bc52f73a7104"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a32291add816961aab472f4fad344c92871a2ee33c6c219b6598e98c1f0108f2"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:588c161a68a383478e27442a678e3b197b13c5ba51dbba40c1ccb8c4c7bee9e9"}, - {file = "regex-2025.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47829ffaf652f30d579534da9085fe30c171fa2a6744a93d52ef7195dc38218b"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e978e5a35b293ea43f140c92a3269b6ab13fe0a2bf8a881f7ac740f5a6ade85"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cf09903e72411f4bf3ac1eddd624ecfd423f14b2e4bf1c8b547b72f248b7bf7"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d016b0f77be63e49613c9e26aaf4a242f196cd3d7a4f15898f5f0ab55c9b24d2"}, - {file = "regex-2025.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:656563e620de6908cd1c9d4f7b9e0777e3341ca7db9d4383bcaa44709c90281e"}, - {file = "regex-2025.9.1-cp312-cp312-win32.whl", hash = "sha256:df33f4ef07b68f7ab637b1dbd70accbf42ef0021c201660656601e8a9835de45"}, - {file = "regex-2025.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:5aba22dfbc60cda7c0853516104724dc904caa2db55f2c3e6e984eb858d3edf3"}, - {file = "regex-2025.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:ec1efb4c25e1849c2685fa95da44bfde1b28c62d356f9c8d861d4dad89ed56e9"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bc6834727d1b98d710a63e6c823edf6ffbf5792eba35d3fa119531349d4142ef"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c3dc05b6d579875719bccc5f3037b4dc80433d64e94681a0061845bd8863c025"}, - {file = "regex-2025.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22213527df4c985ec4a729b055a8306272d41d2f45908d7bacb79be0fa7a75ad"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8e3f6e3c5a5a1adc3f7ea1b5aec89abfc2f4fbfba55dafb4343cd1d084f715b2"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bcb89c02a0d6c2bec9b0bb2d8c78782699afe8434493bfa6b4021cc51503f249"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0e2f95413eb0c651cd1516a670036315b91b71767af83bc8525350d4375ccba"}, - {file = "regex-2025.9.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a41dc039e1c97d3c2ed3e26523f748e58c4de3ea7a31f95e1cf9ff973fff5a"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b4258b161094f66857a26ee938d3fe7b8a5063861e44571215c44fbf0e5df"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bf70e18ac390e6977ea7e56f921768002cb0fa359c4199606c7219854ae332e0"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b84036511e1d2bb0a4ff1aec26951caa2dea8772b223c9e8a19ed8885b32dbac"}, - {file = "regex-2025.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2e05dcdfe224047f2a59e70408274c325d019aad96227ab959403ba7d58d2d7"}, - {file = "regex-2025.9.1-cp313-cp313-win32.whl", hash = "sha256:3b9a62107a7441b81ca98261808fed30ae36ba06c8b7ee435308806bd53c1ed8"}, - {file = "regex-2025.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:b38afecc10c177eb34cfae68d669d5161880849ba70c05cbfbe409f08cc939d7"}, - {file = "regex-2025.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:ec329890ad5e7ed9fc292858554d28d58d56bf62cf964faf0aa57964b21155a0"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:72fb7a016467d364546f22b5ae86c45680a4e0de6b2a6f67441d22172ff641f1"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c9527fa74eba53f98ad86be2ba003b3ebe97e94b6eb2b916b31b5f055622ef03"}, - {file = "regex-2025.9.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c905d925d194c83a63f92422af7544ec188301451b292c8b487f0543726107ca"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74df7c74a63adcad314426b1f4ea6054a5ab25d05b0244f0c07ff9ce640fa597"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4f6e935e98ea48c7a2e8be44494de337b57a204470e7f9c9c42f912c414cd6f5"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4a62d033cd9ebefc7c5e466731a508dfabee827d80b13f455de68a50d3c2543d"}, - {file = "regex-2025.9.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef971ebf2b93bdc88d8337238be4dfb851cc97ed6808eb04870ef67589415171"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d936a1db208bdca0eca1f2bb2c1ba1d8370b226785c1e6db76e32a228ffd0ad5"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:7e786d9e4469698fc63815b8de08a89165a0aa851720eb99f5e0ea9d51dd2b6a"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:6b81d7dbc5466ad2c57ce3a0ddb717858fe1a29535c8866f8514d785fdb9fc5b"}, - {file = "regex-2025.9.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cd4890e184a6feb0ef195338a6ce68906a8903a0f2eb7e0ab727dbc0a3156273"}, - {file = "regex-2025.9.1-cp314-cp314-win32.whl", hash = "sha256:34679a86230e46164c9e0396b56cab13c0505972343880b9e705083cc5b8ec86"}, - {file = "regex-2025.9.1-cp314-cp314-win_amd64.whl", hash = "sha256:a1196e530a6bfa5f4bde029ac5b0295a6ecfaaffbfffede4bbaf4061d9455b70"}, - {file = "regex-2025.9.1-cp314-cp314-win_arm64.whl", hash = "sha256:f46d525934871ea772930e997d577d48c6983e50f206ff7b66d4ac5f8941e993"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a13d20007dce3c4b00af5d84f6c191ed1c0f70928c6d9b6cd7b8d2f125df7f46"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d6b046b0a01cb713fd53ef36cb59db4b0062b343db28e83b52ac6aa01ee5b368"}, - {file = "regex-2025.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fa9a7477288717f42dbd02ff5d13057549e9a8cdb81f224c313154cc10bab52"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2b3ad150c6bc01a8cd5030040675060e2adbe6cbc50aadc4da42c6d32ec266e"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aa88d5a82dfe80deaf04e8c39c8b0ad166d5d527097eb9431cb932c44bf88715"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f1dae2cf6c2dbc6fd2526653692c144721b3cf3f769d2a3c3aa44d0f38b9a58"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff62a3022914fc19adaa76b65e03cf62bc67ea16326cbbeb170d280710a7d719"}, - {file = "regex-2025.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a34ef82216189d823bc82f614d1031cb0b919abef27cecfd7b07d1e9a8bdeeb4"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d40e6b49daae9ebbd7fa4e600697372cba85b826592408600068e83a3c47211"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:0aeb0fe80331059c152a002142699a89bf3e44352aee28261315df0c9874759b"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:a90014d29cb3098403d82a879105d1418edbbdf948540297435ea6e377023ea7"}, - {file = "regex-2025.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6ff623271e0b0cc5a95b802666bbd70f17ddd641582d65b10fb260cc0c003529"}, - {file = "regex-2025.9.1-cp39-cp39-win32.whl", hash = "sha256:d161bfdeabe236290adfd8c7588da7f835d67e9e7bf2945f1e9e120622839ba6"}, - {file = "regex-2025.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:43ebc77a7dfe36661192afd8d7df5e8be81ec32d2ad0c65b536f66ebfec3dece"}, - {file = "regex-2025.9.1-cp39-cp39-win_arm64.whl", hash = "sha256:5d74b557cf5554001a869cda60b9a619be307df4d10155894aeaad3ee67c9899"}, - {file = "regex-2025.9.1.tar.gz", hash = "sha256:88ac07b38d20b54d79e704e38aa3bd2c0f8027432164226bdee201a1c0c9c9ff"}, + {file = "regex-2026.5.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a9e1328e17c84c1a5d22ec9f785ecef4a967fab9a42b6a8dc3bcbebd0a0c9e44"}, + {file = "regex-2026.5.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfe1ce50cbfb569d74e1e4337da6468961f31dbea55fd85aa5de59c0947a805a"}, + {file = "regex-2026.5.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15ee42209947f4ca045412eae98416317238163618ace2a8e54f99586a466733"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb445ff3f725f59df8f6014edb547ee928ec7023a774f6a39a3f953038cbb2"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:446ddd671e43ab535810c4b21cff7104945c701d4a14d1e6d1cd6f4e445a8bea"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b92817338591505f282cf3864c145244b1edcf5381d237038df955001091538"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b8a143aca6c39b446ea8092cde25cc8fe9304d4f5fecfbc1a9dbb0282703c2"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0f03aa6898aaaac4592479821df16e68e8d0e29e903e65d8f2dfb2f19028a989"}, + {file = "regex-2026.5.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ed457d8e98ae812ed7732bef7bf78de78e834eae0372a74e23ca90ef21d910f9"}, + {file = "regex-2026.5.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71b61c5bfe1c806332defc42ad6c780b3c55f661986d7f40283a3a88274b4c00"}, + {file = "regex-2026.5.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3b1e39888c5e0c7d92cea4fc777396c4a90363b05de75d02eb459a4752200808"}, + {file = "regex-2026.5.9-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6ba42b2e7e7f46cf68cc6a5ca36fa07959f9bbd9c6bdcc47b6ee76549a590248"}, + {file = "regex-2026.5.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c010eb8caca74bdb40c07498d7ece26b4428fd3f04aa8a72c9ac6f79e8faaac6"}, + {file = "regex-2026.5.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a6a563446a41adc451393dc6b8e6ad87979efaee3c8738690a8d1b08ebead1b4"}, + {file = "regex-2026.5.9-cp310-cp310-win32.whl", hash = "sha256:954cc214c04663ee6d266fc61739cad83054683048de65c5bd1d640ad28098ac"}, + {file = "regex-2026.5.9-cp310-cp310-win_amd64.whl", hash = "sha256:b310768746dd314ea6e2ff4cc89ef215426813396ff4e94ee8e6f7096c8b6e03"}, + {file = "regex-2026.5.9-cp310-cp310-win_arm64.whl", hash = "sha256:19c16ceb4a267a8789e25733e583983eeab9f0f8664e66b0bd1c5d21f14c2d4b"}, + {file = "regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48"}, + {file = "regex-2026.5.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46f1326ca6e65b0879d23ca302c0f2415aad42ff0309b9c818e7949fe19a41d8"}, + {file = "regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555"}, + {file = "regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919"}, + {file = "regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451"}, + {file = "regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c"}, + {file = "regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc"}, + {file = "regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d"}, + {file = "regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9"}, + {file = "regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2"}, + {file = "regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf"}, + {file = "regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611"}, + {file = "regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c"}, + {file = "regex-2026.5.9-cp311-cp311-win32.whl", hash = "sha256:8676474c07469d6f33dd1085ca2cd45f65785f32518f2b20e36d9953ca07f994"}, + {file = "regex-2026.5.9-cp311-cp311-win_amd64.whl", hash = "sha256:246de9d60aa3f8538b519834dd95cbf276ea263d6a7bd5a3666dc3fa0230505b"}, + {file = "regex-2026.5.9-cp311-cp311-win_arm64.whl", hash = "sha256:d726ca3f0d76969bf1e8e477d160d3d666bbf999f6860bd314889e5345782046"}, + {file = "regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06"}, + {file = "regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6"}, + {file = "regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225"}, + {file = "regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0"}, + {file = "regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107"}, + {file = "regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309"}, + {file = "regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8"}, + {file = "regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66"}, + {file = "regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026"}, + {file = "regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962"}, + {file = "regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621"}, + {file = "regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d"}, + {file = "regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce"}, + {file = "regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e"}, + {file = "regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e"}, + {file = "regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070"}, + {file = "regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb"}, + {file = "regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f"}, + {file = "regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c"}, + {file = "regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed"}, + {file = "regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020"}, + {file = "regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2"}, + {file = "regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2"}, + {file = "regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04"}, + {file = "regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c"}, + {file = "regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f"}, + {file = "regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8"}, + {file = "regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6"}, + {file = "regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21"}, + {file = "regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127"}, + {file = "regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca"}, + {file = "regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6"}, + {file = "regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3"}, + {file = "regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6"}, + {file = "regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff"}, + {file = "regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88"}, + {file = "regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178"}, + {file = "regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100"}, + {file = "regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e"}, + {file = "regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2"}, + {file = "regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b"}, + {file = "regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e"}, + {file = "regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041"}, + {file = "regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0"}, + {file = "regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081"}, + {file = "regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5"}, + {file = "regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4"}, + {file = "regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de"}, + {file = "regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a"}, + {file = "regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4"}, + {file = "regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c"}, + {file = "regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9"}, + {file = "regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af"}, + {file = "regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0"}, + {file = "regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4"}, + {file = "regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf"}, + {file = "regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346"}, + {file = "regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676"}, + {file = "regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14"}, + {file = "regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd"}, + {file = "regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e"}, + {file = "regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad"}, + {file = "regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763"}, + {file = "regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372"}, + {file = "regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499"}, + {file = "regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1"}, + {file = "regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d"}, + {file = "regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c"}, + {file = "regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5"}, + {file = "regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20"}, + {file = "regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0"}, + {file = "regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d"}, + {file = "regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b"}, + {file = "regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a"}, + {file = "regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415"}, + {file = "regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2"}, + {file = "regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41"}, + {file = "regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58"}, + {file = "regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77"}, + {file = "regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa"}, + {file = "regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270"}, ] [[package]] diff --git a/tests/test_api.py b/tests/test_api.py index 38ff8b87..73f9c20e 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -30,6 +30,7 @@ params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -43,6 +44,7 @@ params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -56,6 +58,7 @@ params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -108,6 +111,7 @@ def it_creates_a_new_config_file(tmpdir): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -122,6 +126,7 @@ def it_creates_a_new_config_file(tmpdir): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -370,6 +375,7 @@ def config_with_scripts(config): repo: https://github.com/jacebrowning/gitman-demo sparse_paths: - src/* + sparse_paths_type: cone rev: ddbe17ef173538d1fda29bd99a14bab3c5d86e78 links: - @@ -401,6 +407,7 @@ def it_updates_sparse_paths_on_subsequent_install(config): repo: https://github.com/jacebrowning/gitman-demo sparse_paths: - src/* + sparse_paths_type: cone rev: ddbe17ef173538d1fda29bd99a14bab3c5d86e78 links: - @@ -422,6 +429,7 @@ def it_updates_sparse_paths_on_subsequent_install(config): repo: https://github.com/jacebrowning/gitman-demo sparse_paths: - nonexistent_dir/* + sparse_paths_type: cone rev: ddbe17ef173538d1fda29bd99a14bab3c5d86e78 links: - @@ -433,6 +441,40 @@ def it_updates_sparse_paths_on_subsequent_install(config): dir_listing = os.listdir(os.path.join(config.location, "gitman_1")) expect("src" not in dir_listing) + def describe_sparse_paths_no_cone(): + @pytest.fixture + def config_with_no_cone(config): + config.datafile.text = strip(""" + location: deps + sources: + - name: gitman_1 + type: git + params: + repo: https://github.com/filipopo/gitman-issue-files + sparse_paths_type: no-cone + sparse_paths: + - a/ + - c + rev: main + links: + - + scripts: + - + """) + config.datafile.load() + + return config + + def it_only_includes_listed_files_and_dirs(config_with_no_cone): + expect(gitman.install(depth=1, force=True)) == True + dir_listing = os.listdir( + os.path.join(config_with_no_cone.location, "gitman_1") + ) + expect(dir_listing).contains("a") + expect(dir_listing).contains("c") + expect("b" not in dir_listing) + expect("d" not in dir_listing) + def describe_mixed_names(): @pytest.fixture def config_with_group(config): @@ -445,6 +487,7 @@ def config_with_group(config): repo: https://github.com/jacebrowning/gitman-demo sparse_paths: - + sparse_paths_type: cone rev: example-branch links: - @@ -456,6 +499,7 @@ def config_with_group(config): repo: https://github.com/jacebrowning/gitman-demo sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -507,6 +551,7 @@ def config_with_default_group(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-branch links: - @@ -520,6 +565,7 @@ def config_with_default_group(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -551,6 +597,7 @@ def config_without_default_group(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-branch links: - @@ -564,6 +611,7 @@ def config_without_default_group(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -694,6 +742,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-branch links: - @@ -707,6 +756,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -721,6 +771,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone rev: (old revision) links: - @@ -746,6 +797,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -759,6 +811,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -773,6 +826,7 @@ def it_locks_previously_unlocked_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -795,6 +849,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -807,6 +862,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -822,6 +878,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -845,6 +902,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -858,6 +916,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -872,6 +931,7 @@ def it_should_not_lock_dependencies_when_disabled(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -918,6 +978,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-branch links: - @@ -931,6 +992,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -944,6 +1006,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -958,6 +1021,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone rev: (old revision) links: - @@ -971,6 +1035,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone rev: (old revision) links: - @@ -999,6 +1064,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1012,6 +1078,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1025,6 +1092,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1039,6 +1107,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1052,6 +1121,7 @@ def it_locks_previously_locked_dependencies_by_group_name(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1092,6 +1162,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -1106,6 +1177,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone rev: (old revision) links: - @@ -1130,6 +1202,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1144,6 +1217,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1188,6 +1262,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone rev: example-tag links: - @@ -1202,6 +1277,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone rev: (old revision) links: - @@ -1227,6 +1303,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1241,6 +1318,7 @@ def git_changes( params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1350,6 +1428,7 @@ def it_records_all_versions_when_no_arguments(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1363,6 +1442,7 @@ def it_records_all_versions_when_no_arguments(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1376,6 +1456,7 @@ def it_records_all_versions_when_no_arguments(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1398,6 +1479,7 @@ def it_records_specified_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: @@ -1411,6 +1493,7 @@ def it_records_specified_dependencies(config): params: sparse_paths: - + sparse_paths_type: cone links: - scripts: