completion: improve untracked directory filtering for filename completion
Similar to Bash's default filename completion, our git-aware filename completion stops at directory boundaries, i.e. it doesn't offer the full 'path/to/file' at first, but only 'path/'. To achieve that the completion script runs 'git ls-files' with specific command line options to get the list of relevant paths under the current directory, and then processes each path to strip all but the base directory or filename (see __git_index_files()). To offer only modified and untracked files for 'git add' the completion script runs 'git ls-files --exclude-standard --others --modified'. This command lists all non-ignored files in untracked directories, which leads to a noticeable delay caused by the processing mentioned above if there are a lot of such files (__git_index_files() specifies '--exclude-standard' internally): $ mkdir untracked-dir $ for i in {1..10000} ; do >untracked-dir/$i ; done $ time __git_index_files "--others --modified" untracked-dir real 0m0.537s user 0m0.452s sys 0m0.160s Eliminate this delay by additionally passing the '--directory --no-empty-directory' options to 'git ls-files' to show only the directory name of non-empty untracked directories instead their whole content: $ time __git_index_files "--others --modified --directory --no-empty-directory" untracked-dir real 0m0.029s user 0m0.020s sys 0m0.004s Filename completion for 'git clean' suffers from the same delay, as it offers untracked files, too. The fix could be the same, but since it actually makes sense to 'git clean' empty directories, in this case we only pass the '--directory' option to 'git ls-files'. Reported-by: Isaac Levy <ilevy@google.com> Signed-off-by: SZEDER Gábor <szeder@ira.uka.de> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
8d8387116a
commit
ea95c7b8f5
@ -901,7 +901,7 @@ _git_add ()
|
||||
esac
|
||||
|
||||
# XXX should we check for --update and --all options ?
|
||||
__git_complete_index_file "--others --modified"
|
||||
__git_complete_index_file "--others --modified --directory --no-empty-directory"
|
||||
}
|
||||
|
||||
_git_archive ()
|
||||
@ -1063,7 +1063,7 @@ _git_clean ()
|
||||
esac
|
||||
|
||||
# XXX should we check for -x option ?
|
||||
__git_complete_index_file "--others"
|
||||
__git_complete_index_file "--others --directory"
|
||||
}
|
||||
|
||||
_git_clone ()
|
||||
|
Loading…
Reference in New Issue
Block a user