#!/usr/bin/env 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.

import os
import subprocess
import sys


def main():
  args = sys.argv[1:]
  inputfiles = [a for a in args if not a.startswith('-')]

  contents = ''
  if '-' in args or not inputfiles:
    contents = sys.stdin.read()

  # Tarball builds may or may not have depot_tools in $PATH. In the former case,
  # running 'clang-format' will call back into this script infinitely. Strip off
  # directories from $PATH one-by-one until either the system clang-format is
  # used or there's no usable clang-format.
  env = os.environ.copy()
  if 'TARBALL_CLANG_FORMAT_WRAPPER' in env:
    env['PATH'] = os.pathsep.join(env['PATH'].split(os.pathsep)[1:])
  env['TARBALL_CLANG_FORMAT_WRAPPER'] = ''

  # Try formatting with the system clang-format.
  try:
    proc = subprocess.Popen(
        ['clang-format'] + args,
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        env=env,
        universal_newlines=True)
    stdout, stderr = proc.communicate(input=contents)
    # Ignore if clang-format fails. Eg: it may be too old to support C++14.
    if proc.returncode == 0:
      sys.stdout.write(stdout)
      sys.stderr.write(stderr)
      return 0
  except OSError:
    # Ignore if clang-format is not installed.
    pass

  # If any failure happens, continue with unformatted files.
  sys.stdout.write(contents)
  for inputfile in inputfiles:
    sys.stdout.write(open(inputfile).read())

  return 0


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