From 0114a997bf56eec86f217f99553c859613f1c9a4 Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Thu, 15 Feb 2024 11:22:24 -0500 Subject: [PATCH] Use more ligtweight approach to guarantee deletion This changes from `@with_rw_directory` back to TemporaryDirectory, but calls git.util.rmtree on the repsitory's .git directory where some read-only files otherwise cause TemporaryDirectory's cleanup to raise PermissionError on Windows in Python 3.7. This avoids the gc.collect that is known not to be necessary in this speciifc situation, as well as the problem that, if operating in the temporary directory did fail, then name of the helper would be logged as the name of the test where the failure occurred. But this has the disadvantage of making the helper more complex and harder to understand. So this may not be the best approach either. --- test/test_tree.py | 65 +++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/test/test_tree.py b/test/test_tree.py index 0c06b950c..371e3c625 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -7,10 +7,11 @@ import os.path as osp from pathlib import Path import subprocess +import tempfile from git.objects import Tree, Blob -from git.util import cwd -from test.lib import TestBase, with_rw_directory +from git.util import cwd, rmtree +from test.lib import TestBase class TestTree(TestBase): @@ -42,35 +43,39 @@ def test_serializable(self): testtree._deserialize(stream) # END for each item in tree - @with_rw_directory - def _get_git_ordered_files(self, rw_dir): + @staticmethod + def _get_git_ordered_files(): """Get files as git orders them, to compare in test_tree_modifier_ordering.""" - # Create directory contents. - Path(rw_dir, "file").mkdir() - for filename in ( - "bin", - "bin.d", - "file.to", - "file.toml", - "file.toml.bin", - "file0", - ): - Path(rw_dir, filename).touch() - Path(rw_dir, "file", "a").touch() - - with cwd(rw_dir): - # Prepare the repository. - subprocess.run(["git", "init", "-q"], check=True) - subprocess.run(["git", "add", "."], check=True) - subprocess.run(["git", "commit", "-m", "c1"], check=True) - - # Get git output from which an ordered file list can be parsed. - rev_parse_command = ["git", "rev-parse", "HEAD^{tree}"] - tree_hash = subprocess.check_output(rev_parse_command).decode().strip() - cat_file_command = ["git", "cat-file", "-p", tree_hash] - cat_file_output = subprocess.check_output(cat_file_command).decode() - - return [line.split()[-1] for line in cat_file_output.split("\n") if line] + with tempfile.TemporaryDirectory() as tdir: + # Create directory contents. + Path(tdir, "file").mkdir() + for filename in ( + "bin", + "bin.d", + "file.to", + "file.toml", + "file.toml.bin", + "file0", + ): + Path(tdir, filename).touch() + Path(tdir, "file", "a").touch() + + try: + with cwd(tdir): + # Prepare the repository. + subprocess.run(["git", "init", "-q"], check=True) + subprocess.run(["git", "add", "."], check=True) + subprocess.run(["git", "commit", "-m", "c1"], check=True) + + # Get git output from which an ordered file list can be parsed. + rev_parse_command = ["git", "rev-parse", "HEAD^{tree}"] + tree_hash = subprocess.check_output(rev_parse_command).decode().strip() + cat_file_command = ["git", "cat-file", "-p", tree_hash] + cat_file_output = subprocess.check_output(cat_file_command).decode() + finally: + rmtree(Path(tdir, ".git")) + + return [line.split()[-1] for line in cat_file_output.split("\n") if line] def test_tree_modifier_ordering(self): """TreeModifier.set_done() sorts files in the same order git does."""