diff options
-rw-r--r-- | git/index/typ.py | 8 | ||||
-rw-r--r-- | test/test_blob_filter.py | 31 |
2 files changed, 37 insertions, 2 deletions
diff --git a/git/index/typ.py b/git/index/typ.py index ec7699e2..b2c6c371 100644 --- a/git/index/typ.py +++ b/git/index/typ.py @@ -9,7 +9,7 @@ from git.objects import Blob # typing ---------------------------------------------------------------------- -from typing import NamedTuple, Sequence, TYPE_CHECKING, Tuple, Union, cast +from typing import NamedTuple, Sequence, TYPE_CHECKING, Tuple, Union, cast, List from git.types import PathLike @@ -57,7 +57,11 @@ class BlobFilter(object): for pathlike in self.paths: path: Path = pathlike if isinstance(pathlike, Path) else Path(pathlike) # TODO: Change to use `PosixPath.is_relative_to` once Python 3.8 is no longer supported. - if all(i == j for i, j in zip(path.parts, blob_path.parts)): + filter_parts: List[str] = path.parts + blob_parts: List[str] = blob_path.parts + if len(filter_parts) > len(blob_parts): + continue + if all(i == j for i, j in zip(filter_parts, blob_parts)): return True return False diff --git a/test/test_blob_filter.py b/test/test_blob_filter.py new file mode 100644 index 00000000..a8cd0c9c --- /dev/null +++ b/test/test_blob_filter.py @@ -0,0 +1,31 @@ +"""Test the blob filter.""" +from pathlib import Path +from typing import Sequence, Tuple +from unittest.mock import MagicMock + +import pytest + +from git.index.typ import BlobFilter, StageType +from git.objects import Blob +from git.types import PathLike + + +# fmt: off +@pytest.mark.parametrize('paths, stage_type, path, expected_result', [ + ((Path("foo"),), 0, Path("foo"), True), + ((Path("foo"),), 0, Path("foo/bar"), True), + ((Path("foo/bar"),), 0, Path("foo"), False), + ((Path("foo"), Path("bar")), 0, Path("foo"), True), +]) +# fmt: on +def test_blob_filter(paths: Sequence[PathLike], stage_type: StageType, path: PathLike, expected_result: bool) -> None: + """Test the blob filter.""" + blob_filter = BlobFilter(paths) + + binsha = MagicMock(__len__=lambda self: 20) + blob: Blob = Blob(repo=MagicMock(), binsha=binsha, path=path) + stage_blob: Tuple[StageType, Blob] = (stage_type, blob) + + result = blob_filter(stage_blob) + + assert result == expected_result |