From cbc70ac8172ff039973228e35efaa3be3daa7f60 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Thu, 19 Mar 2026 09:10:47 -0400 Subject: [PATCH 1/2] refactor: new download-source api --- bin/compile_target | 1 - oss-crs/crs.yaml | 1 - patcher.py | 3 ++- tests/test_setup_source.py | 25 +++++++++++-------------- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/bin/compile_target b/bin/compile_target index 6ff3b89..d88c5a0 100755 --- a/bin/compile_target +++ b/bin/compile_target @@ -12,6 +12,5 @@ compile # Submit build outputs libCRS submit-build-output "$OUT" build -libCRS submit-build-output "$SRC" src log "Build completed successfully." diff --git a/oss-crs/crs.yaml b/oss-crs/crs.yaml index 4039e86..b3756f1 100644 --- a/oss-crs/crs.yaml +++ b/oss-crs/crs.yaml @@ -12,7 +12,6 @@ target_build_phase: dockerfile: oss-crs/builder.Dockerfile outputs: - build - - src - name: inc-builder # sanitizer-neutral; actual sanitizer is overridable via compose additional_env snapshot: true dockerfile: oss-crs-infra:default-builder diff --git a/patcher.py b/patcher.py index 45f65b5..8d9ba0b 100644 --- a/patcher.py +++ b/patcher.py @@ -282,7 +282,8 @@ def setup_source() -> Path | None: download_root.mkdir(parents=True, exist_ok=True) try: - worktree_dir = Path(crs.download_source(SourceType.REPO, download_root)) + crs.download_source(SourceType.TARGET_SOURCE, download_root) + worktree_dir = download_root except Exception as repo_error: logger.error("Failed to download repo source via libCRS: %s", repo_error) return None diff --git a/tests/test_setup_source.py b/tests/test_setup_source.py index 609b787..bcf252b 100644 --- a/tests/test_setup_source.py +++ b/tests/test_setup_source.py @@ -4,21 +4,19 @@ import patcher -def test_setup_source_uses_repo_hint_instead_of_scanning_nested_git_repos( +def test_setup_source_returns_download_root( monkeypatch, tmp_path: Path ) -> None: + """After the mount-based API change, worktree_dir is always download_root.""" work_dir = tmp_path / "work" source_dir = work_dir / "src" - project_dir = source_dir / "mock-c" - other_repo_dir = source_dir / "vendored" - (project_dir / ".git").mkdir(parents=True) - (other_repo_dir / ".git").mkdir(parents=True) + (source_dir / ".git").mkdir(parents=True) monkeypatch.setattr(patcher, "WORK_DIR", work_dir) monkeypatch.setattr( patcher, "crs", - SimpleNamespace(download_source=lambda source_type, dst: project_dir), + SimpleNamespace(download_source=lambda source_type, dst: None), ) calls: list[tuple[list[str], Path | None]] = [] @@ -31,23 +29,23 @@ def fake_run(cmd, cwd=None, capture_output=None, timeout=None): resolved = patcher.setup_source() - assert resolved == project_dir + assert resolved == source_dir.resolve() + # .git already exists, so git init should NOT be called assert ["git", "init"] not in [cmd for cmd, _ in calls] -def test_setup_source_initializes_git_only_in_returned_project_dir( +def test_setup_source_initializes_git_when_no_dotgit( monkeypatch, tmp_path: Path ) -> None: work_dir = tmp_path / "work" source_dir = work_dir / "src" - project_dir = source_dir / "mock-c" - project_dir.mkdir(parents=True) + source_dir.mkdir(parents=True) monkeypatch.setattr(patcher, "WORK_DIR", work_dir) monkeypatch.setattr( patcher, "crs", - SimpleNamespace(download_source=lambda source_type, dst: project_dir), + SimpleNamespace(download_source=lambda source_type, dst: None), ) calls: list[tuple[list[str], Path | None]] = [] @@ -60,6 +58,5 @@ def fake_run(cmd, cwd=None, capture_output=None, timeout=None): resolved = patcher.setup_source() - assert resolved == project_dir - assert (["git", "init"], project_dir) in calls - assert (["git", "init"], source_dir) not in calls + assert resolved == source_dir.resolve() + assert (["git", "init"], source_dir.resolve()) in calls From a44c46240b04c934d793effd4285ffc9d19835ff Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Mon, 23 Mar 2026 17:32:17 -0400 Subject: [PATCH 2/2] test: update setup_source tests for mount-based download-source API --- tests/conftest.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/conftest.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..dd24fdf --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,17 @@ +"""Stub libCRS so patcher can be imported outside Docker.""" +import sys +from types import ModuleType, SimpleNamespace + +# Create minimal libCRS stub before patcher is imported. +libCRS = ModuleType("libCRS") +libCRS.base = ModuleType("libCRS.base") +libCRS.base.DataType = SimpleNamespace(PATCH="patch", POV="pov", DIFF="diff", SEED="seed", BUG_CANDIDATE="bug_candidate") +libCRS.base.SourceType = SimpleNamespace(REPO="repo", TARGET_SOURCE="target_source") +libCRS.cli = ModuleType("libCRS.cli") +libCRS.cli.main = ModuleType("libCRS.cli.main") +libCRS.cli.main.init_crs_utils = lambda: None + +sys.modules["libCRS"] = libCRS +sys.modules["libCRS.base"] = libCRS.base +sys.modules["libCRS.cli"] = libCRS.cli +sys.modules["libCRS.cli.main"] = libCRS.cli.main