Skip to content

Commit 953eb0c

Browse files
authored
Ban porcelain/cli in lower level tests (#2060)
2 parents 269771b + 08b1971 commit 953eb0c

29 files changed

+1429
-945
lines changed

dulwich/client.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,12 +1478,7 @@ def archive(
14781478

14791479
@staticmethod
14801480
def _warn_filter_objects() -> None:
1481-
import warnings
1482-
1483-
warnings.warn(
1484-
"object filtering not recognized by server, ignoring",
1485-
UserWarning,
1486-
)
1481+
logging.warning("object filtering not recognized by server, ignoring")
14871482

14881483

14891484
def check_wants(wants: Set[bytes], refs: Mapping[bytes, bytes]) -> None:

dulwich/signature.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,12 +1293,13 @@ def verify(self, data: bytes, signature: bytes) -> None:
12931293
args.extend(["-r", self.revocation_file])
12941294

12951295
try:
1296-
subprocess.run(
1297-
args,
1298-
stdin=open(data_filename, "rb"),
1299-
capture_output=True,
1300-
check=True,
1301-
)
1296+
with open(data_filename, "rb") as data_file:
1297+
subprocess.run(
1298+
args,
1299+
stdin=data_file,
1300+
capture_output=True,
1301+
check=True,
1302+
)
13021303
except subprocess.CalledProcessError as e:
13031304
raise BadSignature(
13041305
f"SSH signature verification failed: {e.stderr.decode('utf-8', errors='replace')}"

tests/__init__.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,6 @@ def self_test_suite() -> unittest.TestSuite:
132132
"bitmap",
133133
"blackbox",
134134
"bundle",
135-
"cli",
136-
"cli_cherry_pick",
137-
"cli_merge",
138135
"client",
139136
"cloud_gcs",
140137
"commit_graph",
@@ -197,12 +194,24 @@ def self_test_suite() -> unittest.TestSuite:
197194
"worktree",
198195
]
199196
module_names = ["tests.test_" + name for name in names]
197+
cli_names = [
198+
"cherry_pick",
199+
"cli",
200+
"merge",
201+
]
202+
module_names += ["tests.cli.test_" + name for name in cli_names]
200203
porcelain_names = [
204+
"annotate",
205+
"bisect",
201206
"cherry_pick",
202207
"filters",
208+
"ignore",
203209
"lfs",
210+
"maintenance",
211+
"mbox",
204212
"merge",
205213
"notes",
214+
"rebase",
206215
]
207216
module_names += ["tests.porcelain"] + [
208217
"tests.porcelain.test_" + name for name in porcelain_names

tests/cli/__init__.py

Whitespace-only changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from dulwich import porcelain
2828
from dulwich.cli import cmd_cherry_pick
2929

30-
from . import TestCase
30+
from .. import TestCase
3131

3232

3333
class CherryPickCommandTests(TestCase):
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"""Tests for dulwich.cli."""
2525

2626
import io
27+
import logging
2728
import os
2829
import shutil
2930
import sys
@@ -47,14 +48,25 @@
4748
build_commit_graph,
4849
)
4950

50-
from . import TestCase
51+
from .. import TestCase
5152

5253

5354
class DulwichCliTestCase(TestCase):
5455
"""Base class for CLI tests."""
5556

5657
def setUp(self) -> None:
5758
super().setUp()
59+
# Suppress expected error logging during CLI tests
60+
cli_logger = logging.getLogger("dulwich.cli")
61+
original_cli_level = cli_logger.level
62+
cli_logger.setLevel(logging.CRITICAL)
63+
self.addCleanup(cli_logger.setLevel, original_cli_level)
64+
65+
root_logger = logging.getLogger()
66+
original_root_level = root_logger.level
67+
root_logger.setLevel(logging.CRITICAL)
68+
self.addCleanup(root_logger.setLevel, original_root_level)
69+
5870
self.test_dir = tempfile.mkdtemp()
5971
self.addCleanup(shutil.rmtree, self.test_dir)
6072
self.repo_path = os.path.join(self.test_dir, "repo")
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from dulwich import porcelain
3030
from dulwich.cli import main
3131

32-
from . import DependencyMissing, TestCase
32+
from .. import DependencyMissing, TestCase
3333

3434

3535
class CLIMergeTests(TestCase):

tests/compat/test_partial_clone.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -390,14 +390,15 @@ def determine_wants(refs, depth=None):
390390
# Get all refs
391391
return list(refs.values())
392392

393-
# Fetch with filter
394-
result = client.fetch(
395-
path,
396-
dest_repo,
397-
determine_wants=determine_wants,
398-
progress=None,
399-
filter_spec=b"blob:none",
400-
)
393+
# Fetch with filter (may warn if server doesn't support filtering)
394+
with self.assertLogs(level="WARNING"):
395+
result = client.fetch(
396+
path,
397+
dest_repo,
398+
determine_wants=determine_wants,
399+
progress=None,
400+
filter_spec=b"blob:none",
401+
)
401402

402403
# The fetch should succeed with partial clone
403404
self.assertIsNotNone(result)
@@ -430,13 +431,14 @@ def test_clone_with_filter(self) -> None:
430431

431432
client, path = get_transport_and_path(f"git://localhost:{daemon_port}/")
432433

433-
# Clone with blob:limit filter
434-
cloned_repo = client.clone(
435-
path,
436-
dest_path,
437-
mkdir=False,
438-
filter_spec=b"blob:limit=100",
439-
)
434+
# Clone with blob:limit filter (may warn if server doesn't support filtering)
435+
with self.assertLogs(level="WARNING"):
436+
cloned_repo = client.clone(
437+
path,
438+
dest_path,
439+
mkdir=False,
440+
filter_spec=b"blob:limit=100",
441+
)
440442
self.addCleanup(cloned_repo.close)
441443

442444
# Verify clone succeeded
@@ -483,6 +485,11 @@ def _start_git_daemon(self, repo_path):
483485
def cleanup_daemon():
484486
daemon_process.terminate()
485487
daemon_process.wait(timeout=2)
488+
# Close pipes to avoid ResourceWarning
489+
if daemon_process.stdout:
490+
daemon_process.stdout.close()
491+
if daemon_process.stderr:
492+
daemon_process.stderr.close()
486493

487494
self.addCleanup(cleanup_daemon)
488495

0 commit comments

Comments
 (0)