From fd7fab77b20fdf09180cabdd660d8c3b7fe7ca1a Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sat, 24 Dec 2022 10:33:45 +0900 Subject: [PATCH] [GFiles] Use ls-files --deduplicate only on git 2.31 or above Close #1446 --- autoload/fzf/vim.vim | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/autoload/fzf/vim.vim b/autoload/fzf/vim.vim index 99bea8a..afe2f2f 100644 --- a/autoload/fzf/vim.vim +++ b/autoload/fzf/vim.vim @@ -609,6 +609,23 @@ function! s:get_git_root(dir) return v:shell_error ? '' : (len(a:dir) ? fnamemodify(a:dir, ':p') : root) endfunction +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(system('git --version'))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + function! fzf#vim#gitfiles(args, ...) let dir = get(get(a:, 1, {}), 'dir', '') let root = s:get_git_root(dir) @@ -617,8 +634,12 @@ function! fzf#vim#gitfiles(args, ...) endif let prefix = 'git -C ' . fzf#shellescape(root) . ' ' if a:args != '?' + let source = prefix . 'ls-files -z' + if s:git_version_requirement(2, 31) + let source .= ' --deduplicate' + endif return s:fzf('gfiles', { - \ 'source': prefix . 'ls-files -z --deduplicate', + \ 'source': source, \ 'dir': root, \ 'options': '-m --read0 --prompt "GitFiles> "' \}, a:000)