#!/usr/bin/env python3

# Copyright 2016 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.

"""
Prints "1" if Chrome targets should be built with hermetic Xcode.
Prints "2" if Chrome targets should be built with hermetic Xcode, but the OS
version does not meet the minimum requirements of the hermetic version of Xcode.
Prints "3" if FORCE_MAC_TOOLCHAIN is set for an iOS target_os
Otherwise prints "0".

Usage:
  python should_use_hermetic_xcode.py <target_os>
"""

from __future__ import print_function

import argparse
import os
import sys

_THIS_DIR_PATH = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
_BUILD_PATH = os.path.join(_THIS_DIR_PATH, os.pardir)
sys.path.insert(0, _BUILD_PATH)

import mac_toolchain


def _IsCorpMachine():
  if sys.platform == 'darwin':
    return os.path.isdir('/Library/GoogleCorpSupport/')
  if sys.platform.startswith('linux'):
    import subprocess
    try:
      return subprocess.check_output(['lsb_release',
                                      '-sc']).rstrip() == b'rodete'
    except:
      return False
  return False


def main():
  parser = argparse.ArgumentParser(description='Download hermetic Xcode.')
  parser.add_argument('platform')
  args = parser.parse_args()

  force_toolchain = os.environ.get('FORCE_MAC_TOOLCHAIN')
  if force_toolchain and args.platform == 'ios':
    return "3"
  allow_corp = args.platform == 'mac' and _IsCorpMachine()
  if force_toolchain or allow_corp:
    if not mac_toolchain.PlatformMeetsHermeticXcodeRequirements():
      return "2"
    return "1"
  else:
    return "0"


if __name__ == '__main__':
  print(main())
  sys.exit(0)
