#!/usr/bin/env python

# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import argparse
import logging
import os
import subprocess
import sys


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--isolated-script-test-perf-output')
  args, unrecognized_args = parser.parse_known_args()

  test_command = _ForcePythonInterpreter(unrecognized_args)
  if args.isolated_script_test_perf_output:
    # TODO(bugs.webrtc.org/11895): Move this code somewhere else because
    # flags_compatibility.py shouldn't create output directories.
    output_dirname = os.path.dirname(args.isolated_script_test_perf_output)
    if not os.path.exists(output_dirname):
      os.makedirs(output_dirname)
    test_command += ['--isolated_script_test_perf_output=' +
                     args.isolated_script_test_perf_output]
  logging.info('Running %r', test_command)

  return subprocess.call(test_command)


def _ForcePythonInterpreter(cmd):
  """Returns the fixed command line to call the right python executable."""
  out = cmd[:]
  if out[0] == 'python':
    out[0] = sys.executable
  elif out[0].endswith('.py'):
    out.insert(0, sys.executable)
  return out


if __name__ == '__main__':
  # pylint: disable=W0101
  logging.basicConfig(level=logging.INFO)
  sys.exit(main())
