Skip to content

sparse_paths and regex don't work after v3.5.2 #363

@filipopo

Description

@filipopo

Consider having the following gitman.yml file

location: .
sources:
  - repo: https://github.com/filipopo/gitman-issue-files
    rev: main
    sparse_paths:
      - a/
      - c

You'd expect that only a and c get cloned after running gitman install but that's not the case, d is also cloned (or even the entire repo)

The issue appeared in gitman v3.5.3 and v.3.5.2 no longer works because the regex package was not pinned to a specific version and eventually got some breaking changes. Now it gives this error when you try to run anything:

Traceback
Traceback (most recent call last):
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/sly/lex.py", line 311, in _build
    cpat = cls.regex_module.compile(part, cls.reflags)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/regex.py", line 353, in compile
    return _compile(pattern, flags, ignore_unused, kwargs, cache_pattern)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/regex.py", line 587, in _compile
    parsed = parsed.optimise(info, reverse)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3452, in optimise
    s = s.optimise(info, reverse)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3008, in optimise
    subpattern = self.subpattern.optimise(info, reverse)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3452, in optimise
    s = s.optimise(info, reverse)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3008, in optimise
    subpattern = self.subpattern.optimise(info, reverse)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3452, in optimise
    s = s.optimise(info, reverse)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 2886, in optimise
    subpattern = self.subpattern.optimise(info, reverse)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3008, in optimise
    subpattern = self.subpattern.optimise(info, reverse)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3452, in optimise
    s = s.optimise(info, reverse)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 3008, in optimise
    subpattern = self.subpattern.optimise(info, reverse)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 2089, in optimise
    prefix, branches = Branch._split_common_prefix(info, branches)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 2202, in _split_common_prefix
    while pos < end_pos and prefix[pos].can_be_affix() and all(a[pos] ==
                                                           ^^^^^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 2202, in <genexpr>
    while pos < end_pos and prefix[pos].can_be_affix() and all(a[pos] ==
                                                               ^^^^^^^^^
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/regex/_regex_core.py", line 1938, in __eq__
    return type(self) is type(other) and self._key == other._key
                                         ^^^^^^^^^
AttributeError: 'AnyAll' object has no attribute '_key'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/mrs/.cache/pipx/11199b33660c49d/bin/gitman", line 3, in <module>
    from gitman.cli import main
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/gitman/__init__.py", line 3, in <module>
    from .commands import delete as uninstall
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/gitman/commands.py", line 10, in <module>
    from .models import Config, Source, find_nested_configs, load_config
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/gitman/models/__init__.py", line 2, in <module>
    from .config import Config, find_nested_configs, load_config
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/gitman/models/config.py", line 6, in <module>
    from datafiles import datafile, field
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/__init__.py", line 6, in <module>
    from .decorators import auto, datafile, sync
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/decorators.py", line 9, in <module>
    from .model import Model, create_model
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/model.py", line 6, in <module>
    from . import config, hooks, settings
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/hooks.py", line 8, in <module>
    from .mapper import create_mapper
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/mapper.py", line 15, in <module>
    from . import config, formats, hooks
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/datafiles/formats.py", line 10, in <module>
    import json5
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/json5/__init__.py", line 1, in <module>
    from .dumper import dump
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/json5/dumper.py", line 11, in <module>
    from .loader import JsonIdentifier
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/json5/loader.py", line 10, in <module>
    from .model import BooleanLiteral
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/json5/model.py", line 10, in <module>
    from .tokenizer import JSON5Token
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/json5/tokenizer.py", line 61, in <module>
    class JSONLexer(Lexer):  # type: ignore[misc]
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/sly/lex.py", line 180, in __new__
    cls._build()
  File "/home/mrs/.cache/pipx/11199b33660c49d/lib/python3.12/site-packages/sly/lex.py", line 313, in _build
    raise PatternError(f'Invalid regex for token {tokname}') from e
sly.lex.PatternError: Invalid regex for token BLOCK_COMMENT

The problem can be mitigated by staying on v3.5.2 and injecting the older version of regex currently pinned

regex==2024.9.11 ; python_version >= "3.8" and python_version < "4.0"

pipx install gitman==3.5.2 --pip-args regex==2024.9.11

Ironically I'm also getting this traceback about regex in v3.5.3 even though the requirements.txt in the docs has a pinned version of it now, but I made a minimal example that demonstrates the problem here

https://github.com/filipopo/gitman-issue

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions