Skip to content

Commit 20fe2d0

Browse files
committed
Optimize getting git status performance
1 parent 0010913 commit 20fe2d0

File tree

1 file changed

+39
-12
lines changed

1 file changed

+39
-12
lines changed

autoload/project/git.vim

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,10 @@ function! VimProjectAddChangeDetails(job, data, ...)
485485
if error
486486
return
487487
endif
488+
if &modifiable == 0
489+
set modifiable
490+
normal! ggdG
491+
endif
488492

489493
if has('nvim')
490494
call append(0, a:data)
@@ -1093,11 +1097,12 @@ endfunction
10931097

10941098
function! s:GetChangedFileDisplay(file, prefix = ' ')
10951099
let sign = s:GetFileChangeSign(a:file)
1100+
" sign_mark is used by s:HighlightFiles
10961101
let sign_mark = ''
1097-
if sign == 'D'
1098-
let sign_mark = '$'
1099-
elseif sign == 'A' || sign == 'U'
1100-
let sign_mark = '!'
1102+
if sign == 'D'
1103+
let sign_mark = '$' " $ Deleted - Comment
1104+
elseif sign == 'A' || sign == '?'
1105+
let sign_mark = '!' " ! Add or untrack - diffAdded
11011106
endif
11021107
let splitter = '|'
11031108

@@ -1129,21 +1134,43 @@ endfunction
11291134

11301135
function! s:UpdateChangelist(run_git = 0)
11311136
if a:run_git
1132-
let s:unmerged_files = project#RunShellCmd('git diff --name-status --diff-filter=U')
1133-
let s:changed_files = project#RunShellCmd('git diff --name-status --diff-filter=u')
1134-
let s:staged_files = project#RunShellCmd('git diff --staged --name-status --diff-filter=u')
1135-
if !empty(s:changed_files) && s:changed_files[0] =~ 'Not a git repository'
1136-
return 0
1137-
endif
1138-
let s:untracked_files = s:AddUntrackedPrefix(
1139-
\project#RunShellCmd('git ls-files --exclude-standard --others'))
1137+
call s:ParseGitStatus()
11401138
endif
11411139

11421140
call s:UpdatePresetChangelist()
11431141
call s:UpdateChangelistDisplay()
11441142
return 1
11451143
endfunction
11461144

1145+
function! s:ParseGitStatus()
1146+
let output = project#RunShellCmd('git status --porcelain')
1147+
let s:staged_files = []
1148+
let s:changed_files = []
1149+
let s:untracked_files = []
1150+
let s:unmerged_files = []
1151+
1152+
for line in output
1153+
let status = strpart(line, 0, 2)
1154+
let filepath = strpart(line, 3)
1155+
1156+
if status[0] != ' ' && status[0] != '?' && status[0] != 'U' " Staged files
1157+
call add(s:staged_files, status[0].' '.filepath)
1158+
endif
1159+
1160+
if status[0] == ' ' && status[1] != ' ' " Changed but unstaged files
1161+
call add(s:changed_files, status[1].' '.filepath)
1162+
endif
1163+
1164+
if status == '??' " Untracked files
1165+
call add(s:untracked_files, '? '.filepath)
1166+
endif
1167+
1168+
if status == 'UU' " Merge conflicts
1169+
call add(s:unmerged_files, 'U '.filepath)
1170+
endif
1171+
endfor
1172+
endfunction
1173+
11471174
function! s:IsSpecialFolder(folder)
11481175
return s:IsStagedFolder(a:folder)
11491176
\ || s:IsUntrackedFolder(a:folder)

0 commit comments

Comments
 (0)