|
4 | 4 | from typing import Union, cast, Optional |
5 | 5 |
|
6 | 6 | from commit0.harness.constants import ( |
| 7 | + ABSOLUTE_REPO_DIR, |
| 8 | + RELATIVE_REPO_DIR, |
7 | 9 | RepoInstance, |
8 | 10 | SimpleInstance, |
9 | 11 | ) |
|
17 | 19 | class Spec(ABC): |
18 | 20 | """A dataclass that represents a test specification for a single instance of SWE-bench.""" |
19 | 21 |
|
| 22 | + absolute: bool |
20 | 23 | repo: str |
21 | 24 | # repo dir on docker |
22 | 25 | repo_directory: str |
@@ -164,11 +167,12 @@ def make_repo_script_list(self) -> list[str]: |
164 | 167 |
|
165 | 168 | def make_eval_script_list(self) -> list[str]: |
166 | 169 | """Run the tests.""" |
| 170 | + diff_path = "/patch.diff" if self.absolute else "../patch.diff" |
167 | 171 | eval_script_list = [ |
168 | 172 | f"cd {self.repo_directory}", |
169 | 173 | "source .venv/bin/activate", |
170 | 174 | f"git reset --hard {self.instance['base_commit']}", |
171 | | - "git apply --allow-empty -v /patch.diff", |
| 175 | + f"git apply --allow-empty -v {diff_path}", |
172 | 176 | "git status", |
173 | 177 | f"{self.instance['test']['test_cmd']} --json-report --json-report-file=report.json --continue-on-collection-errors{{coverage}} {{test_ids}} > test_output.txt 2>&1", |
174 | 178 | "echo $? > pytest_exit_code.txt", |
@@ -306,39 +310,45 @@ def make_eval_script_list(self) -> list[str]: |
306 | 310 | def get_specs_from_dataset( |
307 | 311 | dataset: Union[list[Union[RepoInstance, SimpleInstance]], list[Spec]], |
308 | 312 | dataset_type: str, |
| 313 | + absolute: bool, |
309 | 314 | ) -> list[Spec]: |
310 | 315 | """Idempotent function that converts a list of RepoInstance objects to a list of Spec objects.""" |
311 | 316 | if isinstance(dataset[0], Spec): |
312 | 317 | return cast(list[Spec], dataset) |
313 | 318 | return list( |
314 | 319 | map( |
315 | | - lambda instance: make_spec(instance, dataset_type), |
| 320 | + lambda instance: make_spec(instance, dataset_type, absolute), |
316 | 321 | cast(list["RepoInstance"], dataset), |
317 | 322 | ) |
318 | 323 | ) |
319 | 324 |
|
320 | 325 |
|
321 | | -def make_spec(instance: Union[RepoInstance, SimpleInstance], dataset_type: str) -> Spec: |
| 326 | +def make_spec( |
| 327 | + instance: Union[RepoInstance, SimpleInstance], dataset_type: str, absolute: bool |
| 328 | +) -> Spec: |
| 329 | + repo_directory = ABSOLUTE_REPO_DIR if absolute else RELATIVE_REPO_DIR |
322 | 330 | if isinstance(instance, Spec): |
323 | 331 | return instance |
324 | | - repo_directory = "/testbed" |
325 | 332 | if dataset_type == "commit0": |
326 | 333 | return Commit0Spec( |
327 | 334 | repo=instance["instance_id"], |
328 | 335 | repo_directory=repo_directory, |
329 | 336 | instance=instance, |
| 337 | + absolute=absolute, |
330 | 338 | ) |
331 | 339 | elif dataset_type == "swebench": |
332 | 340 | return SWEBenchSpec( |
333 | 341 | repo=instance["instance_id"], |
334 | 342 | repo_directory=repo_directory, |
335 | 343 | instance=instance, |
| 344 | + absolute=absolute, |
336 | 345 | ) |
337 | 346 | elif dataset_type == "simple": |
338 | 347 | return SimpleSpec( |
339 | 348 | repo="simple", # all benchmarks with mere function writing will share the simple docker image |
340 | 349 | repo_directory=repo_directory, |
341 | 350 | instance=instance, |
| 351 | + absolute=absolute, |
342 | 352 | ) |
343 | 353 | else: |
344 | 354 | raise NotImplementedError( |
|
0 commit comments