summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git/index/typ.py8
-rw-r--r--test/test_blob_filter.py31
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