Просмотр исходного кода

Fix ResourceWarnings for unclosed MemoryRepo objects in tests

Add proper cleanup for MemoryRepo instances in test files to prevent
resource leaks.
Jelmer Vernooij 3 недель назад
Родитель
Сommit
801beeefc3

+ 1 - 0
tests/test_bundle.py

@@ -330,6 +330,7 @@ class BundleTests(TestCase):
         """Test creating a bundle from a repository."""
         # Create a simple repository
         repo = MemoryRepo()
+        self.addCleanup(repo.close)
 
         # Create a blob
         blob = Blob.from_string(b"Hello world")

+ 1 - 0
tests/test_fastexport.py

@@ -89,6 +89,7 @@ class GitImportProcessorTests(TestCase):
     def setUp(self) -> None:
         super().setUp()
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
         try:
             from dulwich.fastexport import GitImportProcessor
         except ImportError as exc:

+ 6 - 0
tests/test_gc.py

@@ -447,6 +447,7 @@ class AutoGCTestCase(TestCase):
     def test_should_run_gc_disabled(self):
         """Test that auto GC doesn't run when gc.auto is 0."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
         config.set(b"gc", b"auto", b"0")
 
@@ -455,6 +456,7 @@ class AutoGCTestCase(TestCase):
     def test_should_run_gc_disabled_by_env_var(self):
         """Test that auto GC doesn't run when GIT_AUTO_GC environment variable is 0."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
         config.set(b"gc", b"auto", b"10")  # Should normally run
 
@@ -464,6 +466,7 @@ class AutoGCTestCase(TestCase):
     def test_should_run_gc_disabled_programmatically(self):
         """Test that auto GC doesn't run when disabled via _autogc_disabled attribute."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
         config.set(b"gc", b"auto", b"10")  # Should normally run
 
@@ -479,6 +482,7 @@ class AutoGCTestCase(TestCase):
     def test_should_run_gc_default_values(self):
         """Test auto GC with default configuration values."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
 
         # Should not run with empty repo
@@ -579,6 +583,7 @@ class AutoGCTestCase(TestCase):
     def test_maybe_auto_gc_skips_when_not_needed(self):
         """Test that auto GC doesn't run when thresholds are not exceeded."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
 
         with patch("dulwich.gc.garbage_collect") as mock_gc:
@@ -735,6 +740,7 @@ class AutoGCTestCase(TestCase):
     def test_maybe_auto_gc_non_disk_repo(self):
         """Test auto GC on non-disk repository (MemoryRepo)."""
         r = MemoryRepo()
+        self.addCleanup(r.close)
         config = ConfigDict()
         config.set(b"gc", b"auto", b"1")  # Would trigger if it were disk-based
 

+ 1 - 0
tests/test_grafts.py

@@ -193,6 +193,7 @@ class GraftsInMemoryRepoTests(GraftsInRepositoryBase, TestCase):
     def setUp(self) -> None:
         super().setUp()
         r = self._repo = MemoryRepo()
+        self.addCleanup(r.close)
 
         self._shas = []
 

+ 19 - 0
tests/test_graph.py

@@ -178,11 +178,13 @@ class FindMergeBaseTests(TestCase):
 class FindMergeBaseFunctionTests(TestCase):
     def test_find_merge_base_empty(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Empty list of commits
         self.assertEqual([], find_merge_base(r, []))
 
     def test_find_merge_base_single(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         r.object_store.add_objects([(base, None)])
         # Single commit returns itself
@@ -190,6 +192,7 @@ class FindMergeBaseFunctionTests(TestCase):
 
     def test_find_merge_base_identical(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         r.object_store.add_objects([(base, None)])
         # When the same commit is in both positions
@@ -197,6 +200,7 @@ class FindMergeBaseFunctionTests(TestCase):
 
     def test_find_merge_base_linear(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2 = make_commit(parents=[c1.id])
@@ -208,6 +212,7 @@ class FindMergeBaseFunctionTests(TestCase):
 
     def test_find_merge_base_diverged(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2a = make_commit(parents=[c1.id], message=b"2a")
@@ -218,6 +223,7 @@ class FindMergeBaseFunctionTests(TestCase):
 
     def test_find_merge_base_with_min_stamp(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit(commit_time=100)
         c1 = make_commit(parents=[base.id], commit_time=200)
         c2 = make_commit(parents=[c1.id], commit_time=300)
@@ -228,6 +234,7 @@ class FindMergeBaseFunctionTests(TestCase):
 
     def test_find_merge_base_multiple_common_ancestors(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit(commit_time=100)
         c1a = make_commit(parents=[base.id], commit_time=200, message=b"c1a")
         c1b = make_commit(parents=[base.id], commit_time=201, message=b"c1b")
@@ -247,11 +254,13 @@ class FindMergeBaseFunctionTests(TestCase):
 class FindOctopusBaseTests(TestCase):
     def test_find_octopus_base_empty(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Empty list of commits
         self.assertEqual([], find_octopus_base(r, []))
 
     def test_find_octopus_base_single(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         r.object_store.add_objects([(base, None)])
         # Single commit returns itself
@@ -259,6 +268,7 @@ class FindOctopusBaseTests(TestCase):
 
     def test_find_octopus_base_two_commits(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2 = make_commit(parents=[c1.id])
@@ -268,6 +278,7 @@ class FindOctopusBaseTests(TestCase):
 
     def test_find_octopus_base_multiple(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2a = make_commit(parents=[c1.id], message=b"2a")
@@ -283,6 +294,7 @@ class FindOctopusBaseTests(TestCase):
 class CanFastForwardTests(TestCase):
     def test_ff(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2 = make_commit(parents=[c1.id])
@@ -294,6 +306,7 @@ class CanFastForwardTests(TestCase):
 
     def test_diverged(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2a = make_commit(parents=[c1.id], message=b"2a")
@@ -306,6 +319,7 @@ class CanFastForwardTests(TestCase):
 
     def test_shallow_repository(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Create a shallow repository structure:
         # base (missing) -> c1 -> c2
         # We only have c1 and c2, base is missing (shallow boundary at c1)
@@ -552,11 +566,13 @@ class WorkListTest(TestCase):
 class IndependentTests(TestCase):
     def test_independent_empty(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Empty list of commits
         self.assertEqual([], independent(r, []))
 
     def test_independent_single(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         r.object_store.add_objects([(base, None)])
         # Single commit is independent
@@ -564,6 +580,7 @@ class IndependentTests(TestCase):
 
     def test_independent_linear(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2 = make_commit(parents=[c1.id])
@@ -573,6 +590,7 @@ class IndependentTests(TestCase):
 
     def test_independent_diverged(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2a = make_commit(parents=[c1.id], message=b"2a")
@@ -586,6 +604,7 @@ class IndependentTests(TestCase):
 
     def test_independent_mixed(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         base = make_commit()
         c1 = make_commit(parents=[base.id])
         c2a = make_commit(parents=[c1.id], message=b"2a")

+ 3 - 0
tests/test_merge.py

@@ -16,6 +16,7 @@ class MergeTests(unittest.TestCase):
 
     def setUp(self):
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
         # Check if merge3 module is available
         if importlib.util.find_spec("merge3") is None:
             raise DependencyMissing("merge3")
@@ -300,6 +301,7 @@ class RecursiveMergeTests(unittest.TestCase):
 
     def setUp(self):
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
         # Check if merge3 module is available
         if importlib.util.find_spec("merge3") is None:
             raise DependencyMissing("merge3")
@@ -738,6 +740,7 @@ class OctopusMergeTests(unittest.TestCase):
 
     def setUp(self):
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
         # Check if merge3 module is available
         if importlib.util.find_spec("merge3") is None:
             raise DependencyMissing("merge3")

+ 30 - 0
tests/test_objectspec.py

@@ -45,16 +45,19 @@ class ParseObjectTests(TestCase):
 
     def test_nonexistent(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         self.assertRaises(KeyError, parse_object, r, "thisdoesnotexist")
 
     def test_blob_by_sha(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         b = Blob.from_string(b"Blah")
         r.object_store.add_object(b)
         self.assertEqual(b, parse_object(r, b.id))
 
     def test_parent_caret(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
         # c3's parents are [c1, c2]
         self.assertEqual(c1, parse_object(r, c3.id + b"^1"))
@@ -63,6 +66,7 @@ class ParseObjectTests(TestCase):
 
     def test_parent_tilde(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 2]])
         self.assertEqual(c2, parse_object(r, c3.id + b"~"))
         self.assertEqual(c2, parse_object(r, c3.id + b"~1"))
@@ -70,6 +74,7 @@ class ParseObjectTests(TestCase):
 
     def test_combined_operators(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2, _c3, c4 = build_commit_graph(
             r.object_store, [[1], [2, 1], [3, 1, 2], [4, 3]]
         )
@@ -80,6 +85,7 @@ class ParseObjectTests(TestCase):
 
     def test_with_ref(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2, c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 2]])
         r.refs[b"refs/heads/master"] = c3.id
         self.assertEqual(c2, parse_object(r, b"master~"))
@@ -87,6 +93,7 @@ class ParseObjectTests(TestCase):
 
     def test_caret_zero(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2 = build_commit_graph(r.object_store, [[1], [2, 1]])
         # ^0 means the commit itself
         self.assertEqual(c2, parse_object(r, c2.id + b"^0"))
@@ -94,6 +101,7 @@ class ParseObjectTests(TestCase):
 
     def test_missing_parent(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2 = build_commit_graph(r.object_store, [[1], [2, 1]])
         # c2 only has 1 parent, so ^2 should fail
         self.assertRaises(ValueError, parse_object, r, c2.id + b"^2")
@@ -102,11 +110,13 @@ class ParseObjectTests(TestCase):
 
     def test_empty_base(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         self.assertRaises(ValueError, parse_object, r, b"~1")
         self.assertRaises(ValueError, parse_object, r, b"^1")
 
     def test_non_commit_with_operators(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         b = Blob.from_string(b"Blah")
         r.object_store.add_object(b)
         # Can't apply ~ or ^ to a blob
@@ -114,6 +124,7 @@ class ParseObjectTests(TestCase):
 
     def test_tag_dereference(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Create an annotated tag
         tag = Tag()
@@ -129,6 +140,7 @@ class ParseObjectTests(TestCase):
 
     def test_nested_tag_dereference(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Create a tag pointing to a commit
         tag1 = Tag()
@@ -155,6 +167,7 @@ class ParseObjectTests(TestCase):
 
     def test_path_in_tree(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Create a blob
         b = Blob.from_string(b"Test content")
 
@@ -168,6 +181,7 @@ class ParseObjectTests(TestCase):
 
     def test_path_in_tree_nested(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Create blobs
         b1 = Blob.from_string(b"Content 1")
         b2 = Blob.from_string(b"Content 2")
@@ -423,15 +437,18 @@ class ParseCommitRangeTests(TestCase):
 
     def test_nonexistent(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         self.assertRaises(KeyError, parse_commit_range, r, "thisdoesnotexist..HEAD")
 
     def test_commit_by_sha(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, _c2, _c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
         self.assertIsNone(parse_commit_range(r, c1.id))
 
     def test_commit_range(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, c2, _c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
         result = parse_commit_range(r, f"{c1.id.decode()}..{c2.id.decode()}")
         self.assertIsNotNone(result)
@@ -445,20 +462,24 @@ class ParseCommitTests(TestCase):
 
     def test_nonexistent(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         self.assertRaises(KeyError, parse_commit, r, "thisdoesnotexist")
 
     def test_commit_by_sha(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         self.assertEqual(c1, parse_commit(r, c1.id))
 
     def test_commit_by_short_sha(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         self.assertEqual(c1, parse_commit(r, c1.id[:10]))
 
     def test_annotated_tag(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Create an annotated tag pointing to the commit
         tag = Tag()
@@ -474,6 +495,7 @@ class ParseCommitTests(TestCase):
 
     def test_nested_tags(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Create an annotated tag pointing to the commit
         tag1 = Tag()
@@ -516,6 +538,7 @@ class ParseCommitTests(TestCase):
 
     def test_tag_to_blob(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         # Create a blob
         blob = Blob.from_string(b"Test content")
         r.object_store.add_object(blob)
@@ -535,6 +558,7 @@ class ParseCommitTests(TestCase):
 
     def test_commit_object(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Test that passing a Commit object directly returns the same object
         self.assertEqual(c1, parse_commit(r, c1))
@@ -701,22 +725,26 @@ class ParseTreeTests(TestCase):
 
     def test_nonexistent(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         self.assertRaises(KeyError, parse_tree, r, "thisdoesnotexist")
 
     def test_from_commit(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, _c2, _c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
         self.assertEqual(r[c1.tree], parse_tree(r, c1.id))
         self.assertEqual(r[c1.tree], parse_tree(r, c1.tree))
 
     def test_from_ref(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         c1, _c2, _c3 = build_commit_graph(r.object_store, [[1], [2, 1], [3, 1, 2]])
         r.refs[b"refs/heads/foo"] = c1.id
         self.assertEqual(r[c1.tree], parse_tree(r, b"foo"))
 
     def test_tree_object(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         tree = r[c1.tree]
         # Test that passing a Tree object directly returns the same object
@@ -724,12 +752,14 @@ class ParseTreeTests(TestCase):
 
     def test_commit_object(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Test that passing a Commit object returns its tree
         self.assertEqual(r[c1.tree], parse_tree(r, c1))
 
     def test_tag_object(self) -> None:
         r = MemoryRepo()
+        self.addCleanup(r.close)
         [c1] = build_commit_graph(r.object_store, [[1]])
         # Create an annotated tag pointing to the commit
         tag = Tag()

+ 2 - 0
tests/test_rebase.py

@@ -49,6 +49,7 @@ class RebaserTestCase(TestCase):
         """Set up test repository."""
         super().setUp()
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
 
     def _setup_initial_commit(self):
         """Set up initial commit for tests."""
@@ -478,6 +479,7 @@ class InteractiveRebaseTestCase(TestCase):
         """Set up test repository."""
         super().setUp()
         self.repo = MemoryRepo()
+        self.addCleanup(self.repo.close)
         self._setup_initial_commit()
 
     def _setup_initial_commit(self):