diff --git a/infra/base-images/base-builder/indexer/clang_wrapper.py b/infra/base-images/base-builder/indexer/clang_wrapper.py index 7f80b9786a8c..6b19a16ac0e3 100755 --- a/infra/base-images/base-builder/indexer/clang_wrapper.py +++ b/infra/base-images/base-builder/indexer/clang_wrapper.py @@ -540,6 +540,7 @@ def load_cdbs(directory: Path) -> Iterator[tuple[Path, dict[str, Any]]]: if output_path in existing_output_files: # Remove existing entry for the output file. os.unlink(existing_output_files[output_path]) + del existing_output_files[output_path] shutil.copy2(file, merged_cdb_path / file.name) diff --git a/infra/base-images/base-builder/indexer/clang_wrapper_test.py b/infra/base-images/base-builder/indexer/clang_wrapper_test.py index d38c00b75e7f..02e072d8756a 100644 --- a/infra/base-images/base-builder/indexer/clang_wrapper_test.py +++ b/infra/base-images/base-builder/indexer/clang_wrapper_test.py @@ -144,6 +144,38 @@ def test_merge_incremental_cdb(self): ], ) + def test_merge_incremental_cdb_duplicate_outputs(self): + """Tests that incremental cdb is merged correctly with duplicate outputs.""" + cdb_path = pathlib.Path(self.create_tempdir().full_path) + merged_cdb_path = pathlib.Path(self.create_tempdir().full_path) + + fragment1 = { + "directory": "/build", + "file": "test.c", + "output": "test.o", + } + (merged_cdb_path / "1.json").write_text(json.dumps(fragment1) + ",\n") + + fragment2 = { + "directory": "/build", + "file": "test.c", + "output": "test.o", + } + (cdb_path / "2.json").write_text(json.dumps(fragment2) + ",\n") + (cdb_path / "3.json").write_text(json.dumps(fragment2) + ",\n") + + clang_wrapper.merge_incremental_cdb(cdb_path, merged_cdb_path) + + self.assertCountEqual( + merged_cdb_path.iterdir(), + [ + merged_cdb_path / ".lock", + merged_cdb_path / "2.json", + merged_cdb_path / "3.json", + ], + ) + self.assertFalse((merged_cdb_path / "1.json").exists()) + if __name__ == "__main__": unittest.main()