Skip to content

Commit

Permalink
Add a test for git.index.util.TemporaryFileSwap
Browse files Browse the repository at this point in the history
This is a general test for TemporaryFileSwap, but by being
parametrized by the type of file_path, it reveals a regression
introduced in 9e86053 (gitpython-developers#1770). TemporaryFileSwap still works when
file_path is a string, but is now broken when it is a Path. That
worked before, and the type annotations document that it should
be able to work. This is at least a bug because TemporaryFileSwap
is public. (I am unsure whether, in practice, GitPython itself uses
it in a way that sometimes passes a Path object as file_path. But
code that uses GitPython may call it directly and pass Path.)
  • Loading branch information
EliahKagan committed Dec 21, 2023
1 parent 4023f28 commit 487a4fd
Showing 1 changed file with 24 additions and 1 deletion.
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 487a4fd

Please sign in to comment.