|
1 | 1 | """Module with additional types used by the index"""
|
2 | 2 |
|
3 | 3 | from binascii import b2a_hex
|
| 4 | +from pathlib import Path |
4 | 5 |
|
5 | 6 | from .util import pack, unpack
|
6 | 7 | from git.objects import Blob
|
7 | 8 |
|
8 | 9 |
|
9 | 10 | # typing ----------------------------------------------------------------------
|
10 | 11 |
|
11 |
| -from typing import NamedTuple, Sequence, TYPE_CHECKING, Tuple, Union, cast |
| 12 | +from typing import NamedTuple, Sequence, TYPE_CHECKING, Tuple, Union, cast, List |
12 | 13 |
|
13 | 14 | from git.types import PathLike
|
14 | 15 |
|
15 | 16 | if TYPE_CHECKING:
|
16 | 17 | from git.repo import Repo
|
17 | 18 |
|
| 19 | +StageType = int |
| 20 | + |
18 | 21 | # ---------------------------------------------------------------------------------
|
19 | 22 |
|
20 |
| -__all__ = ("BlobFilter", "BaseIndexEntry", "IndexEntry") |
| 23 | +__all__ = ("BlobFilter", "BaseIndexEntry", "IndexEntry", "StageType") |
21 | 24 |
|
22 | 25 | # { Invariants
|
23 | 26 | CE_NAMEMASK = 0x0FFF
|
@@ -48,12 +51,18 @@ def __init__(self, paths: Sequence[PathLike]) -> None:
|
48 | 51 | """
|
49 | 52 | self.paths = paths
|
50 | 53 |
|
51 |
| - def __call__(self, stage_blob: Blob) -> bool: |
52 |
| - path = stage_blob[1].path |
53 |
| - for p in self.paths: |
54 |
| - if path.startswith(p): |
| 54 | + def __call__(self, stage_blob: Tuple[StageType, Blob]) -> bool: |
| 55 | + blob_pathlike: PathLike = stage_blob[1].path |
| 56 | + blob_path: Path = blob_pathlike if isinstance(blob_pathlike, Path) else Path(blob_pathlike) |
| 57 | + for pathlike in self.paths: |
| 58 | + path: Path = pathlike if isinstance(pathlike, Path) else Path(pathlike) |
| 59 | + # TODO: Change to use `PosixPath.is_relative_to` once Python 3.8 is no longer supported. |
| 60 | + filter_parts: List[str] = path.parts |
| 61 | + blob_parts: List[str] = blob_path.parts |
| 62 | + if len(filter_parts) > len(blob_parts): |
| 63 | + continue |
| 64 | + if all(i == j for i, j in zip(filter_parts, blob_parts)): |
55 | 65 | return True
|
56 |
| - # END for each path in filter paths |
57 | 66 | return False
|
58 | 67 |
|
59 | 68 |
|
|
0 commit comments