| #!/usr/bin/env python |
| # |
| #===- pipeline_helper.py - Remote Index pipeline Helper *- python -------*--===# |
| # |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| # |
| #===------------------------------------------------------------------------===# |
| |
| import argparse |
| import os |
| import subprocess |
| from socket import socket |
| import sys |
| import time |
| import threading |
| |
| |
| def kill_process_after_delay(server_process): |
| time.sleep(10) |
| if server_process.poll() is None: |
| server_process.kill() |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--input-file-name', required=True) |
| parser.add_argument('--project-root', required=True) |
| parser.add_argument('--index-file', required=True) |
| parser.add_argument('--server-arg', action='append', default=[]) |
| parser.add_argument('--server-log', nargs='?', type=argparse.FileType('wb'), default=os.devnull) |
| |
| args = parser.parse_args() |
| |
| # Grab an available port. |
| with socket() as s: |
| s.bind(('localhost', 0)) |
| server_address = 'localhost:' + str(s.getsockname()[1]) |
| |
| print('Initializing clangd-index-server...', file=sys.stderr) |
| index_server_process = subprocess.Popen([ |
| 'clangd-index-server', '--server-address=' + server_address, |
| args.index_file, args.project_root |
| ] + args.server_arg, |
| stderr=subprocess.PIPE) |
| |
| # This will kill index_server_process if it hangs without printing init |
| # message. |
| shutdown_thread = threading.Thread( |
| target=kill_process_after_delay, args=(index_server_process,)) |
| shutdown_thread.daemon = True |
| shutdown_thread.start() |
| |
| # Wait for the server to warm-up. |
| found_init_message = False |
| while index_server_process.poll() is None: |
| line = index_server_process.stderr.readline() |
| args.server_log.write(line) |
| args.server_log.flush() |
| if b'Server listening' in line: |
| print('Server initialization complete.', file=sys.stderr) |
| found_init_message = True |
| break |
| |
| if not found_init_message: |
| print('Server initialization failed. Shutting down.', file=sys.stderr) |
| sys.exit(1) |
| |
| print('Running clangd-index-server-monitor...', file=sys.stderr) |
| index_server_monitor_process = subprocess.Popen([ |
| 'clangd-index-server-monitor', server_address, |
| ], stderr=subprocess.PIPE) |
| |
| index_server_monitor_process.wait() |
| |
| in_file = open(args.input_file_name) |
| |
| print('Staring clangd...', file=sys.stderr) |
| clangd_process = subprocess.Popen([ |
| 'clangd', '--remote-index-address=' + server_address, |
| '--project-root=' + args.project_root, '--lit-test', '--sync' |
| ], |
| stdin=in_file) |
| clangd_process.wait() |
| print( |
| 'Clangd executed successfully, shutting down child processes.', |
| file=sys.stderr) |
| index_server_process.kill() |
| for line in index_server_process.stderr: |
| args.server_log.write(line) |
| args.server_log.flush() |
| |
| for line in index_server_monitor_process.stderr: |
| args.server_log.write(line) |
| args.server_log.flush() |
| |
| |
| if __name__ == '__main__': |
| main() |