#!/usr/bin/python3
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Wrapper around xcrun adding support for --developer-dir parameter to set
the DEVELOPER_DIR environment variable, and for converting paths relative
to absolute (since this is required by most of the tool run via xcrun).
"""

import argparse
import os
import subprocess
import sys


def xcrun(command, developer_dir):
  environ = dict(os.environ)
  if developer_dir:
    environ['DEVELOPER_DIR'] = os.path.abspath(developer_dir)

  processed_args = ['/usr/bin/xcrun']
  for arg in command:
    if os.path.exists(arg):
      arg = os.path.abspath(arg)
    processed_args.append(arg)

  process = subprocess.Popen(processed_args,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             universal_newlines=True,
                             env=environ)

  stdout, stderr = process.communicate()
  sys.stdout.write(stdout)
  if process.returncode:
    sys.stderr.write(stderr)
    sys.exit(process.returncode)


def main(args):
  parser = argparse.ArgumentParser(add_help=False)
  parser.add_argument(
      '--developer-dir',
      help='path to developer dir to use for the invocation of xcrun')

  parsed, remaining_args = parser.parse_known_args(args)
  xcrun(remaining_args, parsed.developer_dir)


if __name__ == '__main__':
  main(sys.argv[1:])
