| # Copyright 2026 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Utility for recursive in-place response file expansion.""" |
| |
| import os |
| import shlex |
| |
| |
| def expand_response_files(args, visited=None): |
| """Expands any @response_file arguments in-place recursively.""" |
| if visited is None: |
| visited = set() |
| expanded = [] |
| for arg in args: |
| if arg.startswith('@'): |
| rsp_path = os.path.abspath(arg[1:]) |
| if rsp_path in visited: |
| raise ValueError( |
| f"Circular response file reference detected: {arg[1:]}") |
| visited.add(rsp_path) |
| with open(rsp_path, 'r', encoding='utf-8') as f: |
| nested_args = shlex.split(f.read()) |
| expanded.extend(expand_response_files(nested_args, visited)) |
| visited.remove(rsp_path) |
| else: |
| expanded.append(arg) |
| return expanded |