From 0e7ddb6c27471b0cab0e7e7575e6704cbe0c710e Mon Sep 17 00:00:00 2001 From: Jerome Reybert <jreybert@gmail.com> Date: Fri, 23 Oct 2015 13:05:10 +0200 Subject: [PATCH] autoload/magit/state.vim: manage submodules (fix #12) --- autoload/magit/state.vim | 15 +++++++++++---- autoload/magit/utils.vim | 14 ++++++++++++++ common/magit_common.vim | 1 + plugin/magit.vim | 6 +++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim index ba57009..e8e9787 100644 --- a/autoload/magit/state.vim +++ b/autoload/magit/state.vim @@ -22,7 +22,8 @@ function! magit#state#must_be_added() dict return ( self.empty == 1 || \ self.symlink != '' || \ self.dir != 0 || - \ self.binary == 1 ) + \ self.binary == 1 || + \ self.submodule == 1 ) endfunction " magit#state#file_get_hunks: function accessor for hunks objects @@ -66,6 +67,7 @@ let s:file_template = { \ 'empty': 0, \ 'dir': 0, \ 'binary': 0, +\ 'submodule': 0, \ 'symlink': '', \ 'diff': s:diff_template, \ 'is_dir': function("magit#state#is_file_dir"), @@ -125,8 +127,14 @@ function! magit#state#add_file(mode, status, filename, depth) dict let file.depth = a:depth if ( a:status == '?' && getftype(a:filename) == 'link' ) let file.symlink = resolve(a:filename) - call add(file.diff.header, 'no header') let file.diff.hunks[0].header = 'New symbolic link file' + elseif ( magit#utils#is_submodule(a:filename)) + let file.submodule = 1 + let file.diff.hunks[0].header = '' + let file.diff.hunks[0].lines = diff_list + if ( file.is_visible() ) + let self.nb_diff_lines += len(diff_list) + endif elseif ( a:status == '?' && isdirectory(a:filename) == 1 ) let file.dir = 1 for subfile in split(globpath(a:filename, '\(.[^.]*\|*\)'), '\n') @@ -134,11 +142,9 @@ function! magit#state#add_file(mode, status, filename, depth) dict endfor elseif ( a:status == '?' && getfsize(a:filename) == 0 ) let file.empty = 1 - call add(file.diff.header, 'no header') let file.diff.hunks[0].header = 'New empty file' elseif ( magit#utils#is_binary(magit#utils#add_quotes(a:filename))) let file.binary = 1 - call add(file.diff.header, 'no header') let file.diff.hunks[0].header = 'Binary file' else let line = 0 @@ -184,6 +190,7 @@ function! magit#state#update() dict let dir = getcwd() try call magit#utils#lcd(magit#utils#top_dir()) + call magit#utils#refresh_submodule_list() for [mode, diff_dict_mode] in items(self.dict) let status_list = magit#git#get_status() for file_status in status_list diff --git a/autoload/magit/utils.vim b/autoload/magit/utils.vim index 17c6511..b9e4cde 100644 --- a/autoload/magit/utils.vim +++ b/autoload/magit/utils.vim @@ -40,6 +40,20 @@ function! magit#utils#is_binary(filename) \ a:filename . ".*charset=binary") != -1 ) endfunction +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(system("git submodule status"), "\n"), 'split(v:val)[1]') +endfunction + +" magit#utils#is_submodule search if dirname is in s:submodule_list +" param[in] dirname: must end with / +" INFO: must be called from top work tree +function! magit#utils#is_submodule(dirname) + return ( index(s:submodule_list, a:dirname) != -1 ) +endfunction + " s:magit_cd_cmd: plugin variable to choose lcd/cd command, 'lcd' if exists, " 'cd' otherwise let s:magit_cd_cmd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' diff --git a/common/magit_common.vim b/common/magit_common.vim index 9a18e91..47d488b 100644 --- a/common/magit_common.vim +++ b/common/magit_common.vim @@ -22,6 +22,7 @@ let g:magit_git_status_code = { \ 'E': 'empty', \ 'L': 'symlink', \ 'N': 'new dir', + \ 'S': 'submodule', \ } " Regular expressions used to select blocks diff --git a/plugin/magit.vim b/plugin/magit.vim index b17c837..94e2a3a 100644 --- a/plugin/magit.vim +++ b/plugin/magit.vim @@ -156,6 +156,8 @@ function! s:mg_display_files(mode, curdir, depth) put =g:magit_git_status_code.E . ': ' . filename elseif ( file.symlink != '' ) put =g:magit_git_status_code.L . ': ' . filename . ' -> ' . file.symlink + elseif ( file.submodule == 1 ) + put =g:magit_git_status_code.S . ': ' . filename elseif ( file.dir != 0 ) put =g:magit_git_status_code.N . ': ' . filename if ( file.visible == 1 ) @@ -174,7 +176,9 @@ function! s:mg_display_files(mode, curdir, depth) endif let hunks = file.get_hunks() for hunk in hunks - silent put =hunk.header + if ( hunk.header != '' ) + silent put =hunk.header + endif silent put =hunk.lines endfor put ='' -- GitLab