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

"""Redirects to the version of clang-format checked into the Chrome tree.

clang-format binaries are pulled down from Google Cloud Storage whenever you
sync Chrome, to platform-specific locations. This script knows how to locate
those tools, assuming the script is invoked from inside a Chromium checkout."""

import gclient_utils
import os
import subprocess
import sys


class NotFoundError(Exception):
  """A file could not be found."""
  def __init__(self, e):
    Exception.__init__(self,
        'Problem while looking for clang-format in Chromium source tree:\n'
        '  %s' % e)


def _FindChromiumTree():
  """Return the root of the current chromium checkout, or die trying."""
  source_root = gclient_utils.FindFileUpwards('.gclient')
  if not source_root:
    raise NotFoundError(
        '.gclient file not found in any parent of the current path.')
  return source_root


def FindClangFormatToolInChromiumTree():
  """Return a path to the clang-format executable, or die trying."""
  # The binaries in platform-specific subdirectories in src/tools/gn/bin.
  tool_path = os.path.join(_FindChromiumTree(), 'src', 'third_party',
                           'clang_format', 'bin',
                           gclient_utils.GetMacWinOrLinux(),
                           'clang-format' + gclient_utils.GetExeSuffix())
  if not os.path.exists(tool_path):
    # TODO(nick): After March 2014, eliminate the following advisory.
    error_text = '''\n  GIT CL FORMAT - WINTER WEATHER ADVISORY

    clang-format binaries now come with every Chrome checkout!

    Unfortunately, your depot_tools scripts tried to find clang-format binaries
    in your Chrome checkout, but failed. This is expected if you haven't synced
    since the binaries were added.

    'git cl format' will probably not work until you sync your Chrome tree.
    Sorry about that.

    Contact nick@chromium.org if you have any additional questions.\n\n'''

    error_text += 'File does not exist: %s' % tool_path

    raise NotFoundError(error_text)
  return tool_path


def FindClangFormatScriptInChromiumTree(script_name):
  """Return a path to a clang-format helper script, or die trying."""
  # The binaries in platform-specific subdirectories in src/tools/gn/bin.
  script_path = os.path.join(_FindChromiumTree(), 'src', 'third_party',
                             'clang_format', 'scripts', script_name)
  if not os.path.exists(script_path):
    raise NotFoundError('File does not exist: %s' % script_path)
  return script_path


def main(args):
  try:
    tool = FindClangFormatToolInChromiumTree()
  except NotFoundError, e:
    print >> sys.stderr, e
    sys.exit(1)

  # Add some visibility to --help showing where the tool lives, since this
  # redirection can be a little opaque.
  help_syntax = ('-h', '--help', '-help', '-help-list', '--help-list')
  if any(match in args for match in help_syntax):
    print '\nDepot tools redirects you to the clang-format at:\n    %s\n' % tool

  return subprocess.call([tool] + sys.argv[1:])


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