|
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