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

"""
Removes bundled libraries to make sure they are not used.

See README for more details.
"""

from __future__ import print_function

import optparse
import os.path
import sys


def DoMain(argv):
  my_dirname = os.path.abspath(os.path.dirname(__file__))
  source_tree_root = os.path.abspath(
    os.path.join(my_dirname, '..', '..', '..'))

  if os.path.join(source_tree_root, 'build', 'linux', 'unbundle') != my_dirname:
    print('Sanity check failed: please run this script from '
          'build/linux/unbundle directory.')
    return 1

  parser = optparse.OptionParser()
  parser.add_option('--do-remove', action='store_true')

  options, args = parser.parse_args(argv)

  exclusion_used = {}
  for exclusion in args:
    exclusion_used[exclusion] = False

  for root, dirs, files in os.walk(source_tree_root, topdown=False):
    # Only look at paths which contain a "third_party" component
    # (note that e.g. third_party.png doesn't count).
    root_relpath = os.path.relpath(root, source_tree_root)
    if 'third_party' not in root_relpath.split(os.sep):
      continue

    for f in files:
      path = os.path.join(root, f)
      relpath = os.path.relpath(path, source_tree_root)

      excluded = False
      for exclusion in args:
        # Require precise exclusions. Find the right-most third_party
        # in the relative path, and if there is more than one ignore
        # the exclusion if it's completely contained within the part
        # before right-most third_party path component.
        split = relpath.rsplit(os.sep + 'third_party' + os.sep, 1)
        if len(split) > 1 and split[0].startswith(exclusion):
          continue

        if relpath.startswith(exclusion):
          # Multiple exclusions can match the same path. Go through all of them
          # and mark each one as used.
          exclusion_used[exclusion] = True
          excluded = True
      if excluded:
        continue

      # Deleting gyp files almost always leads to gyp failures.
      # These files come from Chromium project, and can be replaced if needed.
      if f.endswith('.gyp') or f.endswith('.gypi'):
        continue

      # Same about GN files.
      if f.endswith('.gn') or f.endswith('.gni'):
        continue

      # Deleting .isolate files leads to gyp failures. They are usually
      # not used by a distro build anyway.
      # See http://www.chromium.org/developers/testing/isolated-testing
      # for more info.
      if f.endswith('.isolate'):
        continue

      if options.do_remove:
        # Delete the file - best way to ensure it's not used during build.
        os.remove(path)
      else:
        # By default just print paths that would be removed.
        print(path)

  exit_code = 0

  # Fail if exclusion list contains stale entries - this helps keep it
  # up to date.
  for exclusion, used in exclusion_used.items():
    if not used:
      print('%s does not exist' % exclusion)
      exit_code = 1

  if not options.do_remove:
    print('To actually remove files printed above, please pass '
          '--do-remove flag.')

  return exit_code


if __name__ == '__main__':
  sys.exit(DoMain(sys.argv[1:]))
