Skip to content

Commit

Permalink
Merge pull request #1776 from EliahKagan/temporary-file-swap
Browse files Browse the repository at this point in the history
Fix TemporaryFileSwap regression where file_path could not be Path
  • Loading branch information
Byron authored Dec 21, 2023
2 parents 4023f28 + 4e91a6c commit 22129a7
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 10 deletions.
3 changes: 2 additions & 1 deletion git/index/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ class TemporaryFileSwap:

def __init__(self, file_path: PathLike) -> None:
self.file_path = file_path
fd, self.tmp_file_path = tempfile.mkstemp(prefix=self.file_path, dir="")
dirname, basename = osp.split(file_path)
fd, self.tmp_file_path = tempfile.mkstemp(prefix=basename, dir=dirname)
os.close(fd)
with contextlib.suppress(OSError): # It may be that the source does not exist.
os.replace(self.file_path, self.tmp_file_path)
Expand Down
17 changes: 9 additions & 8 deletions test/test_blob_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@
from git.types import PathLike


# fmt: off
@pytest.mark.parametrize('paths, path, expected_result', [
((Path("foo"),), Path("foo"), True),
((Path("foo"),), Path("foo/bar"), True),
((Path("foo/bar"),), Path("foo"), False),
((Path("foo"), Path("bar")), Path("foo"), True),
])
# fmt: on
@pytest.mark.parametrize(
"paths, path, expected_result",
[
((Path("foo"),), Path("foo"), True),
((Path("foo"),), Path("foo/bar"), True),
((Path("foo/bar"),), Path("foo"), False),
((Path("foo"), Path("bar")), Path("foo"), True),
],
)
def test_blob_filter(paths: Sequence[PathLike], path: PathLike, expected_result: bool) -> None:
"""Test the blob filter."""
blob_filter = BlobFilter(paths)
Expand Down
25 changes: 24 additions & 1 deletion test/test_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,11 @@
)
from git.index.fun import hook_path
from git.index.typ import BaseIndexEntry, IndexEntry
from git.index.util import TemporaryFileSwap
from git.objects import Blob
from test.lib import TestBase, fixture, fixture_path, with_rw_directory, with_rw_repo
from git.util import Actor, hex_to_bin, rmtree
from gitdb.base import IStream
from test.lib import TestBase, fixture, fixture_path, with_rw_directory, with_rw_repo

HOOKS_SHEBANG = "#!/usr/bin/env sh\n"

Expand Down Expand Up @@ -1087,3 +1088,25 @@ def test_index_add_pathlike(self, rw_repo):
file.touch()

rw_repo.index.add(file)


class TestIndexUtils:
@pytest.mark.parametrize("file_path_type", [str, Path])
def test_temporary_file_swap(self, tmp_path, file_path_type):
file_path = tmp_path / "foo"
file_path.write_bytes(b"some data")

with TemporaryFileSwap(file_path_type(file_path)) as ctx:
assert Path(ctx.file_path) == file_path
assert not file_path.exists()

# Recreate it with new data, so we can observe that they're really separate.
file_path.write_bytes(b"other data")

temp_file_path = Path(ctx.tmp_file_path)
assert temp_file_path.parent == file_path.parent
assert temp_file_path.name.startswith(file_path.name)
assert temp_file_path.read_bytes() == b"some data"

assert not temp_file_path.exists()
assert file_path.read_bytes() == b"some data" # Not b"other data".

0 comments on commit 22129a7

Please sign in to comment.