Skip to content

Commit 487a4fd

Browse files
committed
Add a test for git.index.util.TemporaryFileSwap
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.)
1 parent 4023f28 commit 487a4fd

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

test/test_index.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@
3434
)
3535
from git.index.fun import hook_path
3636
from git.index.typ import BaseIndexEntry, IndexEntry
37+
from git.index.util import TemporaryFileSwap
3738
from git.objects import Blob
38-
from test.lib import TestBase, fixture, fixture_path, with_rw_directory, with_rw_repo
3939
from git.util import Actor, hex_to_bin, rmtree
4040
from gitdb.base import IStream
41+
from test.lib import TestBase, fixture, fixture_path, with_rw_directory, with_rw_repo
4142

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

@@ -1087,3 +1088,25 @@ def test_index_add_pathlike(self, rw_repo):
10871088
file.touch()
10881089

10891090
rw_repo.index.add(file)
1091+
1092+
1093+
class TestIndexUtils:
1094+
@pytest.mark.parametrize("file_path_type", [str, Path])
1095+
def test_temporary_file_swap(self, tmp_path, file_path_type):
1096+
file_path = tmp_path / "foo"
1097+
file_path.write_bytes(b"some data")
1098+
1099+
with TemporaryFileSwap(file_path_type(file_path)) as ctx:
1100+
assert Path(ctx.file_path) == file_path
1101+
assert not file_path.exists()
1102+
1103+
# Recreate it with new data, so we can observe that they're really separate.
1104+
file_path.write_bytes(b"other data")
1105+
1106+
temp_file_path = Path(ctx.tmp_file_path)
1107+
assert temp_file_path.parent == file_path.parent
1108+
assert temp_file_path.name.startswith(file_path.name)
1109+
assert temp_file_path.read_bytes() == b"some data"
1110+
1111+
assert not temp_file_path.exists()
1112+
assert file_path.read_bytes() == b"some data" # Not b"other data".

0 commit comments

Comments
 (0)