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