From 2e5a561bce263fee8f1703c5eb821703f8500a2a Mon Sep 17 00:00:00 2001
From: Jerome Reybert <jreybert@gmail.com>
Date: Tue, 10 Nov 2015 14:08:06 +0100
Subject: [PATCH] autoload/magit/state.vim: rework g:magit_warning_max_lines
 (at least it does something useful now)

---
 autoload/magit/state.vim | 40 ++++++++++++++++++++++++++++++++++++----
 plugin/magit.vim         | 12 +-----------
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/autoload/magit/state.vim b/autoload/magit/state.vim
index b65276a..1be452b 100644
--- a/autoload/magit/state.vim
+++ b/autoload/magit/state.vim
@@ -75,6 +75,7 @@ let s:hunk_template = {
 " s:diff_template: template for diff object (nested in s:file_template)
 " WARNING: this variable must be deepcopy()'ied
 let s:diff_template = {
+\	'len': 0,
 \	'header': [],
 \	'hunks': [s:hunk_template],
 \}
@@ -139,6 +140,23 @@ function! magit#state#file_get_filename_header() dict
 	endif
 endfunction
 
+function! magit#state#check_max_lines(file) dict
+	let total_lines = self.nb_diff_lines + a:file.diff.len
+	if ( total_lines > g:magit_warning_max_lines && b:magit_warning_max_lines_answered == 0 )
+		echohl WarningMsg
+		let ret = input("There are " . total_lines . " diff lines to display. Do you want to display all diffs? y(es) / N(o) : ", "")
+		echohl None
+		let b:magit_warning_max_lines_answered = 1
+		if ( ret !~? '^y\%(e\%(s\)\?\)\?$' )
+			call a:file.set_visible(0)
+			let a:file.diff.len = 0
+			let b:magit_default_show_all_files = 0
+			return 1
+		endif
+	endif
+	return 0
+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
@@ -166,9 +184,15 @@ function! magit#state#add_file(mode, status, filename, depth) dict
 		endif
 		let diff_list=magit#git#git_sub_summary(magit#utils#add_quotes(a:filename),
 					\ a:mode)
+		let file.diff.len = len(diff_list)
+
+		if ( self.check_max_lines(file) != 0 )
+			return
+		endif
+
 		let file.diff.hunks[0].header = ''
 		let file.diff.hunks[0].lines = diff_list
-		let self.nb_diff_lines += len(diff_list)
+		let self.nb_diff_lines += file.diff.len
 	elseif ( a:status == '?' && isdirectory(a:filename) == 1 )
 		let file.status = 'N'
 		let file.dir = 1
@@ -193,12 +217,18 @@ function! magit#state#add_file(mode, status, filename, depth) dict
 		" match(
 		let diff_list=magit#git#git_diff(magit#utils#add_quotes(a:filename),
 					\ a:status, a:mode)
-		while ( line < len(diff_list) && diff_list[line] !~ "^@.*" )
+		let file.diff.len = len(diff_list)
+
+		if ( self.check_max_lines(file) != 0 )
+			return
+		endif
+
+		while ( line < file.diff.len && diff_list[line] !~ "^@.*" )
 			call add(file.diff.header, diff_list[line])
 			let line += 1
 		endwhile
 
-		if ( line < len(diff_list) )
+		if ( line < file.diff.len )
 			let hunk = file.diff.hunks[0]
 			let hunk.header = diff_list[line]
 
@@ -212,8 +242,9 @@ function! magit#state#add_file(mode, status, filename, depth) dict
 				call add(hunk.lines, diff_line)
 			endfor
 		endif
-		let self.nb_diff_lines += len(diff_list)
+		let self.nb_diff_lines += file.diff.len
 	endif
+
 endfunction
 
 " magit#state#update: update self.dict
@@ -301,6 +332,7 @@ let magit#state#state = {
 			\ 'get_files': function("magit#state#get_files"),
 			\ 'add_file': function("magit#state#add_file"),
 			\ 'set_files_visible': function("magit#state#set_files_visible"),
+			\ 'check_max_lines': function("magit#state#check_max_lines"),
 			\ 'update': function("magit#state#update"),
 			\ 'dict': { 'staged': {}, 'unstaged': {}},
 			\ }
diff --git a/plugin/magit.vim b/plugin/magit.vim
index b4b8f48..3a28cd7 100644
--- a/plugin/magit.vim
+++ b/plugin/magit.vim
@@ -542,16 +542,6 @@ function! magit#update_buffer()
 	
 	call s:state.update()
 
-	if ( s:state.nb_diff_lines > g:magit_warning_max_lines && b:magit_warning_answered_yes == 0 )
-		let ret = input("There are " . s:state.nb_diff_lines . " diff lines to display. Do you want to display all diffs? y(es) / N(o) : ", "")
-		if ( ret !~? '^y\%(e\%(s\)\?\)\?$' )
-			let b:magit_default_show_all_files = 0
-			call s:state.set_files_visible(0)
-		else
-			let b:magit_warning_answered_yes = 1
-		endif
-	endif
-
 	for section in g:magit_default_sections
 		try
 			let func = s:mg_display_functions[section]
@@ -605,7 +595,7 @@ function! magit#show_magit(display, ...)
 
 	let b:magit_default_show_all_files = g:magit_default_show_all_files
 	let b:magit_default_fold_level = g:magit_default_fold_level
-	let b:magit_warning_answered_yes = 0
+	let b:magit_warning_max_lines_answered = 0
 
 	if ( a:0 > 0 )
 		let b:magit_default_show_all_files = a:1
-- 
GitLab