| """Contains utils for processing coverage files.""" |
| import pathlib |
| |
| _RBE_PREFIX = pathlib.Path('/b/f/w') |
| |
| |
| def rewrite_file_paths_in_lcov(input_path, output_path, workspace_path): |
| """Copy the input lcov file to the output, after fixing the paths in it.""" |
| with open(output_path, 'w') as out_file: |
| with open(input_path, 'r') as in_file: |
| for line in in_file: |
| if line.startswith('SF:'): |
| path = pathlib.Path(line.removeprefix('SF:').strip()) |
| path = _convert_to_workspace_relative_path(path, workspace_path) |
| out_file.write(f'SF:{path}\n') |
| else: |
| out_file.write(line) |
| |
| |
| def _convert_to_workspace_relative_path(path, workspace_path): |
| if not path.is_absolute(): |
| raise ValueError(f'Expected absolute paths in lcov file, got {path}') |
| absolute_workspace_path_or_symlink = _fix_rbe_prefix(path, workspace_path) |
| absolute_workspace_path = absolute_workspace_path_or_symlink.resolve() |
| return absolute_workspace_path.relative_to(workspace_path) |
| |
| |
| def _fix_rbe_prefix(path, workspace_path): |
| if path.is_relative_to(_RBE_PREFIX): |
| return workspace_path / path.relative_to(_RBE_PREFIX) |
| return path |