Merge pull request #1606 from r-darwish/no-del · gitpython-developers/GitPython@c09a71e
@@ -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
667+from contextlib import ExitStack
78import datetime
89import glob
910from io import BytesIO
@@ -352,27 +353,22 @@ def from_tree(cls, repo: "Repo", *treeish: Treeish, **kwargs: Any) -> "IndexFile
352353353354# 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")))
366367repo.git.read_tree(*arg_list, **kwargs)
367-index = cls(repo, tmp_index)
368+index = cls(repo, tmp_index.name)
368369index.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
376372377373# UTILITIES
378374@unbare_repo
@@ -1156,7 +1152,6 @@ def checkout(
11561152unknown_lines = []
1157115311581154def handle_stderr(proc: "Popen[bytes]", iter_checked_out_files: Iterable[PathLike]) -> None:
1159-11601155stderr_IO = proc.stderr
11611156if not stderr_IO:
11621157return None # return early if stderr empty