diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim index e8e9787e72c2c1a58868f88bc6e7b18e5fe0655c..62548074d7f97f267cec182f859a6b5892f58469 100644 --- a/autoload/magit/state.vim +++ b/autoload/magit/state.vim @@ -63,6 +63,7 @@ let s:diff_template = { " WARNING: this variable must be deepcopy()'ied let s:file_template = { \ 'exists': 0, +\ 'filename': '', \ 'status': '', \ 'empty': 0, \ 'dir': 0, @@ -78,6 +79,7 @@ let s:file_template = { \ 'get_header': function("magit#state#file_get_header"), \ 'get_hunks' : function("magit#state#file_get_hunks"), \ 'get_flat_hunks' : function("magit#state#file_get_flat_hunks"), +\ 'get_filename_header' : function("magit#state#file_get_filename_header"), \} " magit#state#get_file: function accessor for file @@ -92,6 +94,7 @@ function! magit#state#get_file(mode, filename, ...) dict if ( file_exists == 0 && create == 1 ) let self.dict[a:mode][a:filename] = deepcopy(s:file_template) let self.dict[a:mode][a:filename].visible = b:magit_default_show_all_files + let self.dict[a:mode][a:filename].filename = a:filename elseif ( file_exists == 0 && create == 0 ) throw 'file_doesnt_exists' endif @@ -106,6 +109,14 @@ function! magit#state#file_get_header() dict return self.diff.header endfunction +function! magit#state#file_get_filename_header() dict + if ( self.status == 'L' ) + return g:magit_git_status_code.L . ': ' . self.filename . ' -> ' . self.symlink + else + return g:magit_git_status_code[self.status] . ': ' . self.filename + endif +endfunction + " magit#state#add_file: method to add a file with all its " properties (filename, exists, status, header and hunks) " param[in] mode: can be staged or unstaged @@ -123,12 +134,16 @@ function! magit#state#add_file(mode, status, filename, depth) dict endif let file = self.get_file(a:mode, a:filename, 1) let file.exists = 1 + let file.status = a:status let file.depth = a:depth + if ( a:status == '?' && getftype(a:filename) == 'link' ) + let file.status = 'L' let file.symlink = resolve(a:filename) let file.diff.hunks[0].header = 'New symbolic link file' elseif ( magit#utils#is_submodule(a:filename)) + let file.status = 'S' let file.submodule = 1 let file.diff.hunks[0].header = '' let file.diff.hunks[0].lines = diff_list @@ -136,11 +151,13 @@ function! magit#state#add_file(mode, status, filename, depth) dict let self.nb_diff_lines += len(diff_list) endif elseif ( a:status == '?' && isdirectory(a:filename) == 1 ) + let file.status = 'N' let file.dir = 1 for subfile in split(globpath(a:filename, '\(.[^.]*\|*\)'), '\n') call self.add_file(a:mode, a:status, subfile, a:depth + 1) endfor elseif ( a:status == '?' && getfsize(a:filename) == 0 ) + let file.status = 'E' let file.empty = 1 let file.diff.hunks[0].header = 'New empty file' elseif ( magit#utils#is_binary(magit#utils#add_quotes(a:filename))) @@ -154,18 +171,20 @@ function! magit#state#add_file(mode, status, filename, depth) dict let line += 1 endwhile - let hunk = file.diff.hunks[0] - let hunk.header = diff_list[line] + if ( line < len(diff_list) ) + let hunk = file.diff.hunks[0] + let hunk.header = diff_list[line] - for diff_line in diff_list[line+1 : -1] - if ( diff_line =~ "^@.*" ) - let hunk = deepcopy(s:hunk_template) - call add(file.diff.hunks, hunk) - let hunk.header = diff_line - continue - endif - call add(hunk.lines, diff_line) - endfor + for diff_line in diff_list[line+1 : -1] + if ( diff_line =~ "^@.*" ) + let hunk = deepcopy(s:hunk_template) + call add(file.diff.hunks, hunk) + let hunk.header = diff_line + continue + endif + call add(hunk.lines, diff_line) + endfor + endif if ( file.is_visible() ) let self.nb_diff_lines += len(diff_list) endif diff --git a/plugin/magit.vim b/plugin/magit.vim index 94e2a3a0ed9073710e6778f5c07e627ac482c2ad..4b5ee3880379bcb8dfbc385c22498348253caa11 100644 --- a/plugin/magit.vim +++ b/plugin/magit.vim @@ -152,21 +152,15 @@ function! s:mg_display_files(mode, curdir, depth) if ( file.depth != a:depth || filename !~ a:curdir . '.*' ) continue endif - if ( file.empty == 1 ) - 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 + put =file.get_filename_header() + + if ( file.dir != 0 ) if ( file.visible == 1 ) call s:mg_display_files(a:mode, filename, a:depth + 1) continue endif - else - put =g:magit_git_status_code[file.status] . ': ' . filename endif + if ( file.visible == 0 ) put ='' continue @@ -179,7 +173,9 @@ function! s:mg_display_files(mode, curdir, depth) if ( hunk.header != '' ) silent put =hunk.header endif - silent put =hunk.lines + if ( !empty(hunk.lines) ) + silent put =hunk.lines + endif endfor put ='' endfor