Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c09a71e

Browse filesBrowse files
authored
Merge pull request #1606 from r-darwish/no-del
Don't rely on __del__
2 parents 741edb5 + a3859ee commit c09a71e
Copy full SHA for c09a71e

File tree

Expand file treeCollapse file tree

2 files changed

+28
-23
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+28
-23
lines changed

‎git/index/base.py

Copy file name to clipboardExpand all lines: git/index/base.py
+15-20Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# This module is part of GitPython and is released under
55
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
66

7+
from contextlib import ExitStack
78
import datetime
89
import glob
910
from io import BytesIO
@@ -352,27 +353,22 @@ def from_tree(cls, repo: "Repo", *treeish: Treeish, **kwargs: Any) -> "IndexFile
352353

353354
# tmp file created in git home directory to be sure renaming
354355
# works - /tmp/ dirs could be on another device
355-
tmp_index = tempfile.mktemp("", "", repo.git_dir)
356-
arg_list.append("--index-output=%s" % tmp_index)
357-
arg_list.extend(treeish)
358-
359-
# move current index out of the way - otherwise the merge may fail
360-
# as it considers existing entries. moving it essentially clears the index.
361-
# Unfortunately there is no 'soft' way to do it.
362-
# The TemporaryFileSwap assure the original file get put back
363-
if repo.git_dir:
364-
index_handler = TemporaryFileSwap(join_path_native(repo.git_dir, "index"))
365-
try:
356+
with ExitStack() as stack:
357+
tmp_index = stack.enter_context(tempfile.NamedTemporaryFile(dir=repo.git_dir))
358+
arg_list.append("--index-output=%s" % tmp_index.name)
359+
arg_list.extend(treeish)
360+
361+
# move current index out of the way - otherwise the merge may fail
362+
# as it considers existing entries. moving it essentially clears the index.
363+
# Unfortunately there is no 'soft' way to do it.
364+
# The TemporaryFileSwap assure the original file get put back
365+
366+
stack.enter_context(TemporaryFileSwap(join_path_native(repo.git_dir, "index")))
366367
repo.git.read_tree(*arg_list, **kwargs)
367-
index = cls(repo, tmp_index)
368+
index = cls(repo, tmp_index.name)
368369
index.entries # force it to read the file as we will delete the temp-file
369-
del index_handler # release as soon as possible
370-
finally:
371-
if osp.exists(tmp_index):
372-
os.remove(tmp_index)
373-
# END index merge handling
374-
375-
return index
370+
return index
371+
# END index merge handling
376372

377373
# UTILITIES
378374
@unbare_repo
@@ -1156,7 +1152,6 @@ def checkout(
11561152
unknown_lines = []
11571153

11581154
def handle_stderr(proc: "Popen[bytes]", iter_checked_out_files: Iterable[PathLike]) -> None:
1159-
11601155
stderr_IO = proc.stderr
11611156
if not stderr_IO:
11621157
return None # return early if stderr empty

‎git/index/util.py

Copy file name to clipboardExpand all lines: git/index/util.py
+13-3Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import struct
55
import tempfile
6+
from types import TracebackType
67

78
from git.compat import is_win
89

@@ -11,7 +12,7 @@
1112

1213
# typing ----------------------------------------------------------------------
1314

14-
from typing import Any, Callable, TYPE_CHECKING
15+
from typing import Any, Callable, TYPE_CHECKING, Optional, Type
1516

1617
from git.types import PathLike, _T
1718

@@ -47,12 +48,21 @@ def __init__(self, file_path: PathLike) -> None:
4748
except OSError:
4849
pass
4950

50-
def __del__(self) -> None:
51+
def __enter__(self) -> "TemporaryFileSwap":
52+
return self
53+
54+
def __exit__(
55+
self,
56+
exc_type: Optional[Type[BaseException]],
57+
exc_val: Optional[BaseException],
58+
exc_tb: Optional[TracebackType],
59+
) -> bool:
5160
if osp.isfile(self.tmp_file_path):
5261
if is_win and osp.exists(self.file_path):
5362
os.remove(self.file_path)
5463
os.rename(self.tmp_file_path, self.file_path)
55-
# END temp file exists
64+
65+
return False
5666

5767

5868
# { Decorators

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.