#!/usr/bin/env python
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
""" Script to list all files in a directory filtering by pattern.

Do NOT use this script to pull in sources for GN targets. Globbing inputs is
a bad idea, as it plays very badly with git leaving untracked files around. This
script should be used only for cases where false positives won't affect the
output of the build but just cause spurious re-runs (e.g. as input section of
an "action" target).
"""
from __future__ import print_function
import argparse
import fnmatch
import os
import sys


def make_parent_dirs(file_path):
  directory = os.path.dirname(file_path)
  if not os.path.exists(directory):
    os.makedirs(directory)


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument('--filter', default=[], action='append')
  parser.add_argument('--exclude', default=[], action='append')
  parser.add_argument('--deps', default=None)
  parser.add_argument('--output', default=None)
  parser.add_argument('--root', required=True)
  args = parser.parse_args()

  if args.output:
    make_parent_dirs(args.output)
    fout = open(args.output, 'w')
  else:
    fout = sys.stdout

  def writepath(path):
    if args.deps:
      path = '\t' + path
    print(path, file=fout)

  root = args.root
  if not root.endswith('/'):
    root += '/'
  if not os.path.exists(root):
    return 0

  if args.deps:
    print(args.deps + ':', file=fout)
  for pardir, dirs, files in os.walk(root, topdown=True):
    assert pardir.startswith(root)
    relpar = pardir[len(root):]
    dirs[:] = [d for d in dirs if os.path.join(relpar, d) not in args.exclude]
    for fname in files:
      fpath = os.path.join(pardir, fname)
      match = len(args.filter) == 0
      for filter in args.filter:
        if fnmatch.fnmatch(fpath, filter):
          match = True
          break
      if match:
        writepath(fpath)


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