190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#!/usr/bin/env python
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# found in the LICENSE file.
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)"""Logic to generate lists of DEPS used by various parts of
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)the android_webview continuous integration (buildbot) infrastructure.
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Note: The root Chromium project (which is not explicitly listed here)
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)has a couple of third_party libraries checked in directly into it. This means
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)that the list of third parties present in this file is not a comprehensive
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)list of third party android_webview dependencies.
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)"""
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import argparse
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import json
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import logging
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import os
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import sys
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# Add android_webview/tools to path to get at known_issues.
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'tools'))
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)import known_issues
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DepsWhitelist(object):
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def __init__(self):
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # If a new DEPS entry is needed for the AOSP bot to compile please add it
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # here first.
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # This is a staging area for deps that are accepted by the android_webview
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # team and are in the process of having the required branches being created
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # in the Android tree.
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    self._compile_but_not_snapshot_dependencies = [
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ]
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # Dependencies that need to be merged into the Android tree.
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    self._snapshot_into_android_dependencies = [
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'sdch/open-vcdiff',
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'testing/gtest',
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/WebKit',
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      'third_party/angle',
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'third_party/boringssl/src',
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/brotli/src',
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ('third_party/eyesfree/src/android/java/src/com/googlecode/eyesfree/'
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)       'braille'),
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/freetype',
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/icu',
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/leveldatabase/src',
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'third_party/libaddressinput/src',
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      'third_party/libjingle/source/talk',
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'third_party/libjpeg_turbo',
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/libphonenumber/src/phonenumbers',
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/libphonenumber/src/resources',
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/libsrtp',
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/libvpx',
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/libyuv',
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/mesa/src',
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      'third_party/openmax_dl',
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/opus/src',
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/ots',
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      'third_party/sfntly/cpp/src',
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'third_party/skia',
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/smhasher/src',
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      'third_party/usrsctp/usrsctplib',
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/webrtc',
6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'third_party/yasm/source/patched-yasm',
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'tools/grit',
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'tools/gyp',
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'v8',
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ]
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # We can save some time by not rsyncing code we don't use.
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    self._prune_from_rsync_build = [
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        'third_party/WebKit/LayoutTests',
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ]
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # Dependencies required to build android_webview.
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    self._compile_dependencies = (self._snapshot_into_android_dependencies +
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                  self._compile_but_not_snapshot_dependencies)
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # Dependencies required to run android_webview tests but not required to
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # compile.
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    self._test_data_dependencies = [
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'chrome/test/data/perf/third_party/octane',
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ]
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  @staticmethod
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def _read_deps_file(deps_file_path):
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    class FileImplStub(object):
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      """Stub for the File syntax."""
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def __init__(self, file_location):
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        pass
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      @staticmethod
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def GetPath():
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return ''
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      @staticmethod
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def GetFilename():
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return ''
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      @staticmethod
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def GetRevision():
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return None
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    def from_stub(__, _=None):
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      """Stub for the From syntax."""
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return ''
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    class VarImpl(object):
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def __init__(self, custom_vars, local_scope):
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        self._custom_vars = custom_vars
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        self._local_scope = local_scope
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      def Lookup(self, var_name):
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        """Implements the Var syntax."""
11790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if var_name in self._custom_vars:
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return self._custom_vars[var_name]
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        elif var_name in self._local_scope.get("vars", {}):
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return self._local_scope["vars"][var_name]
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        raise Exception("Var is not defined: %s" % var_name)
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    local_scope = {}
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    var = VarImpl({}, local_scope)
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    global_scope = {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'File': FileImplStub,
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'From': from_stub,
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'Var': var.Lookup,
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'deps_os': {},
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    execfile(deps_file_path, global_scope, local_scope)
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    deps = local_scope.get('deps', {})
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    deps_os = local_scope.get('deps_os', {})
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for os_specific_deps in deps_os.itervalues():
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      deps.update(os_specific_deps)
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return deps.keys()
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def _get_known_issues(self):
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    issues = []
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for root, paths in known_issues.KNOWN_INCOMPATIBLE.items():
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      for path in paths:
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        issues.append(os.path.normpath(os.path.join(root, path)))
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return issues
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def _make_gclient_blacklist(self, deps_file_path, whitelisted_deps):
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """Calculates the list of deps that need to be excluded from the deps_file
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    so that the only deps left are the one in the whitelist."""
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    all_deps = self._read_deps_file(deps_file_path)
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # The list of deps read from the DEPS file are prefixed with the source
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # tree root, which is 'src' for Chromium.
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    def prepend_root(path):
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return os.path.join('src', path)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    whitelisted_deps = map(prepend_root, whitelisted_deps)
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    deps_blacklist = set(all_deps).difference(set(whitelisted_deps))
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return dict(map(lambda(x): (x, None), deps_blacklist))
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def _make_blacklist(self, deps_file_path, whitelisted_deps):
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Calculates the list of paths we should exclude """
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    all_deps = self._read_deps_file(deps_file_path)
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    def remove_src_prefix(path):
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return path.replace('src/', '', 1)
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    all_deps = map(remove_src_prefix, all_deps)
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # Ignore all deps except those whitelisted.
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    blacklist = set(all_deps).difference(whitelisted_deps)
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # Ignore the 'known issues'. Typically these are the licence incompatible
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # things checked directly into Chromium.
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    blacklist = blacklist.union(self._get_known_issues())
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # Ignore any other non-deps, non-licence paths we don't like.
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    blacklist = blacklist.union(self._prune_from_rsync_build)
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return list(blacklist)
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def get_deps_for_android_build(self, deps_file_path):
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """This is used to calculate the custom_deps list for the Android bot.
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if not deps_file_path:
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      raise Exception('You need to specify a DEPS file path.')
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return self._make_gclient_blacklist(deps_file_path,
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        self._compile_dependencies)
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def get_deps_for_android_build_and_test(self, deps_file_path):
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """This is used to calculate the custom_deps list for the Android perf bot.
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if not deps_file_path:
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      raise Exception('You need to specify a DEPS file path.')
18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return self._make_gclient_blacklist(deps_file_path,
18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        self._compile_dependencies +
18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                        self._test_data_dependencies)
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def get_blacklist_for_android_rsync_build(self, deps_file_path):
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Calculates the list of paths we should exclude when building Android
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    either because of license compatibility or because they are large and
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uneeded.
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if not deps_file_path:
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      raise Exception('You need to specify a DEPS file path.')
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return self._make_blacklist(deps_file_path, self._compile_dependencies)
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def get_deps_for_android_merge(self, _):
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """Calculates the list of deps that need to be merged into the Android tree
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    in order to build the C++ and Java android_webview code."""
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return self._snapshot_into_android_dependencies
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def get_deps_for_license_check(self, _):
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    """Calculates the list of deps that need to be checked for Android license
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    compatibility"""
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return self._compile_dependencies
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  def execute_method(self, method_name, deps_file_path):
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    methods = {
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'android_build': self.get_deps_for_android_build,
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'android_build_and_test':
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        self.get_deps_for_android_build_and_test,
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      'android_merge': self.get_deps_for_android_merge,
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      'license_check': self.get_deps_for_license_check,
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      'android_rsync_build': self.get_blacklist_for_android_rsync_build,
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if not method_name in methods:
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      raise Exception('Method name %s is not valid. Valid choices are %s' %
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      (method_name, methods.keys()))
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return methods[method_name](deps_file_path)
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)def main():
22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser = argparse.ArgumentParser()
22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_argument('--method', help='Method to use to fetch from whitelist.',
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                      required=True)
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_argument('--path-to-deps', help='Path to DEPS file.')
22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_argument('--output-json', help='Name of file to write output to.')
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_argument('verbose', action='store_true', default=False)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  opts = parser.parse_args()
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  logging.getLogger().setLevel(logging.DEBUG if opts.verbose else logging.WARN)
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  deps_whitelist = DepsWhitelist()
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  blacklist = deps_whitelist.execute_method(opts.method, opts.path_to_deps)
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (opts.output_json):
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    output_dict = {
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        'blacklist' : blacklist
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    with open(opts.output_json, 'w') as output_json_file:
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      json.dump(output_dict, output_json_file)
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  else:
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    print blacklist
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return 0
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)if __name__ == '__main__':
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sys.exit(main())
251