Add options for file type in lister.py

Add option to filter files by their extension.
Add option to return a dict of list of files keyed by their file type.
This commit is contained in:
Eklavya Sharma
2016-03-23 01:20:20 +05:30
committed by Tim Abbott
parent 81aabb5831
commit 5063f16f82

View File

@@ -3,17 +3,32 @@ from __future__ import print_function
import os
import subprocess
from collections import defaultdict
def list_files(targets=[], modified_only=False, exclude=[]):
def get_ftype(fpath):
ext = os.path.splitext(fpath)[1]
if ext:
return ext[1:]
else:
return ''
def list_files(targets=[], ftypes=[], modified_only=False, exclude=[], group_by_ftype=False):
"""
List files tracked by git.
Returns a list of files which are either in targets or in directories in targets.
If targets is [], list of all tracked files in current directory is returned.
Other arguments:
ftypes - List of file types on which to filter the search.
If ftypes is [], all files are included.
modified_only - Only include files which have been modified.
exclude - List of paths to be excluded.
group_by_ftype - If True, returns a dict of lists keyed by file type.
If False, returns a flat list of files.
"""
ftypes = [x.strip('.') for x in ftypes]
ftypes_set = set(ftypes)
cmdline = ['git', 'ls-files'] + targets
if modified_only:
cmdline.append('-m')
@@ -22,7 +37,7 @@ def list_files(targets=[], modified_only=False, exclude=[]):
# throw away empty lines and non-files (like symlinks)
files = list(filter(os.path.isfile, files_gen))
result = []
result = defaultdict(list) if group_by_ftype else []
for fpath in files:
# this will take a long time if exclude is very large
@@ -34,6 +49,14 @@ def list_files(targets=[], modified_only=False, exclude=[]):
if in_exclude:
continue
result.append(fpath)
if ftypes or group_by_ftype:
filetype = get_ftype(fpath)
if ftypes and filetype not in ftypes_set:
continue
if group_by_ftype:
result['.' + filetype].append(fpath)
else:
result.append(fpath)
return result