Skip to content

Commit 22129a7

Browse files
authored
Merge pull request #1776 from EliahKagan/temporary-file-swap
Fix TemporaryFileSwap regression where file_path could not be Path
2 parents 4023f28 + 4e91a6c commit 22129a7

File tree

3 files changed

+35
-10
lines changed

3 files changed

+35
-10
lines changed

Diff for: git/index/util.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ class TemporaryFileSwap:
4141

4242
def __init__(self, file_path: PathLike) -> None:
4343
self.file_path = file_path
44-
fd, self.tmp_file_path = tempfile.mkstemp(prefix=self.file_path, dir="")
44+
dirname, basename = osp.split(file_path)
45+
fd, self.tmp_file_path = tempfile.mkstemp(prefix=basename, dir=dirname)
4546
os.close(fd)
4647
with contextlib.suppress(OSError): # It may be that the source does not exist.
4748
os.replace(self.file_path, self.tmp_file_path)

Diff for: test/test_blob_filter.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
from git.types import PathLike
1515

1616

17-
# fmt: off
18-
@pytest.mark.parametrize('paths, path, expected_result', [
19-
((Path("foo"),), Path("foo"), True),
20-
((Path("foo"),), Path("foo/bar"), True),
21-
((Path("foo/bar"),), Path("foo"), False),
22-
((Path("foo"), Path("bar")), Path("foo"), True),
23-
])
24-
# fmt: on
17+
@pytest.mark.parametrize(
18+
"paths, path, expected_result",
19+
[
20+
((Path("foo"),), Path("foo"), True),
21+
((Path("foo"),), Path("foo/bar"), True),
22+
((Path("foo/bar"),), Path("foo"), False),
23+
((Path("foo"), Path("bar")), Path("foo"), True),
24+
],
25+
)
2526
def test_blob_filter(paths: Sequence[PathLike], path: PathLike, expected_result: bool) -> None:
2627
"""Test the blob filter."""
2728
blob_filter = BlobFilter(paths)

Diff for: 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)