From 421ecc942781fc55e170f312c51541f6f4e8b9d0 Mon Sep 17 00:00:00 2001 From: Jerome Reybert <jreybert@gmail.com> Date: Tue, 22 Jun 2021 11:39:29 +0200 Subject: [PATCH] Fix very slow update when large submodule Until now, vimagit relied on `git submodule status` to get the list of submodule. As we just want a list of the submodule, and not their status, this is oversized. Having linux as a submodule, `git submodule status` can take more than 10 seconds. This new method is very fast. --- autoload/magit/git.vim | 10 ++++++---- autoload/magit/utils.vim | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/autoload/magit/git.vim b/autoload/magit/git.vim index 27cd507..b8055b6 100644 --- a/autoload/magit/git.vim +++ b/autoload/magit/git.vim @@ -271,10 +271,12 @@ function! magit#git#git_unapply(header, selection, mode) endtry endfunction -" magit#git#submodule_status: helper function to return the submodule status -" return submodule status -function! magit#git#submodule_status() - return magit#sys#system(g:magit_git_cmd . " submodule status") +" magit#git#submodule_list: helper function to return the submodule list +" return array of submodule names +function! magit#git#submodule_list() + return map(split(magit#sys#system( + \ g:magit_git_cmd . " ls-files --stage | \grep 160000 || true"), + \ "\n"), 'split(v:val)[3]') endfunction " magit#git#get_branch_name: get the branch name given a reference diff --git a/autoload/magit/utils.vim b/autoload/magit/utils.vim index 223d7da..237a5fc 100644 --- a/autoload/magit/utils.vim +++ b/autoload/magit/utils.vim @@ -10,7 +10,7 @@ let s:submodule_list = [] " magit#utils#refresh_submodule_list: this function refresh the List s:submodule_list " magit#utils#is_submodule() is using s:submodule_list function! magit#utils#refresh_submodule_list() - let s:submodule_list = map(split(magit#git#submodule_status(), "\n"), 'split(v:val)[1]') + let s:submodule_list = magit#git#submodule_list() endfunction " magit#utils#is_submodule search if dirname is in s:submodule_list -- GitLab