#!/usr/bin/env python
# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

"""Tool for listing Dart source files.

If the first argument is 'relative', the script produces paths relative to the
current working directory. If the first argument is 'absolute', the script
produces absolute paths.

Usage:
  python tools/list_dart_files.py {absolute, relative} <directory> <pattern>
"""

import os
import re
import sys


def main(argv):
  mode = argv[1]
  if mode not in ['absolute', 'relative']:
    raise Exception("First argument must be 'absolute' or 'relative'")
  directory = argv[2]
  if mode in 'absolute' and not os.path.isabs(directory):
    directory = os.path.realpath(directory)

  pattern = None
  if len(argv) > 3:
    pattern = re.compile(argv[3])

  for root, directories, files in os.walk(directory):
    # We only care about actual source files, not generated code or tests.
    for skip_dir in ['.git', 'gen', 'test']:
      if skip_dir in directories:
        directories.remove(skip_dir)

    # If we are looking at the root directory, filter the immediate
    # subdirectories by the given pattern.
    if pattern and root == directory:
      directories[:] = filter(pattern.match, directories)

    for filename in files:
      if filename.endswith('.dart') and not filename.endswith('_test.dart'):
        if mode in 'absolute':
          fullname = os.path.join(directory, root, filename)
        else:
          fullname = os.path.relpath(os.path.join(root, filename))
        fullname = fullname.replace(os.sep, '/')
        print fullname


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