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

"""Recursively list files of the target directory. Ignores dot files."""

import argparse
import os
import sys

def main(target_directory, file_extension):
  for root, dirs, files in os.walk(target_directory):
    files = [f for f in files if not f[0] == '.']
    dirs[:] = [d for d in dirs if not d[0] == '.']
    for f in files:
      if file_extension is None or os.path.splitext(f)[-1] == file_extension:
        path = os.path.join(root, f)
        print path

if __name__ == '__main__':
  parser = argparse.ArgumentParser(
      description="Recursively list files of the target directory")
  parser.add_argument("--target-directory",
                      dest="target_directory",
                      metavar="<target-directory>",
                      type=str,
                      required=True,
                      help="The target directory")
  parser.add_argument("--file-extension",
                      dest="file_extension",
                      metavar="<file-extension>",
                      type=str,
                      required=False,
                      help="File extension to filter")

  args = parser.parse_args()
  sys.exit(main(args.target_directory, args.file_extension))
