#!/usr/bin/env vpython3
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

'''
Runs the pre-push githooks.
'''

import os
import subprocess
import sys


SRC_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
FLUTTER_DIR = os.path.join(SRC_ROOT, 'flutter')
ENABLE_CLANG_TIDY = os.environ.get('PRE_PUSH_CLANG_TIDY')


def GetDartBin():
  dart_bin = os.path.join(SRC_ROOT, 'flutter', 'third_party', 'dart', 'tools', 'sdks', 'dart-sdk', 'bin')
  if not os.path.exists(dart_bin):
    dart_bin = os.path.join(SRC_ROOT, 'third_party', 'dart', 'tools', 'sdks', 'dart-sdk', 'bin')
  return dart_bin


def Main(argv):
  githook_args = [
    '--flutter',
    FLUTTER_DIR,
  ]

  if ENABLE_CLANG_TIDY is not None:
    githook_args += [
      '--enable-clang-tidy',
    ]

  result = subprocess.run([
    os.path.join(GetDartBin(), 'dart'),
    os.path.join(FLUTTER_DIR, 'tools', 'githooks', 'bin', 'main.dart'),
  ] + githook_args + [
    'pre-push',
  ] + argv[1:], cwd=SRC_ROOT)
  return result.returncode


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