@@ -27,77 +27,70 @@ function! s:DisplayBuffer()
2727 nnoremap <script> <buffer> <silent> <cr> :call g:DiffStatOpenFile()<cr>
2828endfunction
2929
30- function ! DiffStatShortenPath (path , max_path_length)
31- let path = strlen (a: path ) < a: max_path_length ? a: path : pathshorten (a: path )
30+ function ! s: DiffStatShortenPath (path , max_path_length)
31+ " Hardcode some googly patterns for now
32+ let path = substitute (a: path , ' java/com/google' , ' j/c/g' , ' ' )
33+ let path = substitute (a: path , ' javatests/com/google' , ' jt/c/g' , ' ' )
34+
35+ let path = strlen (path ) < a: max_path_length ? path : pathshorten (a: path )
3236 if a: max_path_length < strlen (path )
3337 return ' ...' . matchstr (path , ' \v.{0,' . (a: max_path_length - 3 ) . ' }$' )
3438 endif
3539 return path
3640endfunction
3741
38- function ! s: DiffStatPaddedString (string , num, before)
39- if a: before
40- return a: string . repeat (' ' , a: num - len (a: string ))
41- else
42- return repeat (' ' , a: num - len (a: string )) . a: string
43- end
44- endfunction
45-
4642function ! s: DiffStatCommand (command )
47- let max_path_length = 54
48- let max_deltas_length = 18
43+ let max_path_length = 56
44+ let max_deltas_length = 16
4945
50- let toplevel = split (system (g: diff_stat_git_command . " rev-parse --show-toplevel" ), " \n " )[0 ]
51- let command_result =
46+ let toplevel = split (system (
47+ \ g: diff_stat_git_command . " rev-parse --show-toplevel" ), " \n " )[0 ]
48+ let command_result =
5249 \ system (g: diff_stat_git_command . " diff " . a: command . " --numstat" )
5350
5451 let files_list = {}
55- let deltas = []
52+ let max_delta = 0
5653 let file_name_lengths = []
5754
5855 for diff_line in split (command_result, " \n " )
5956 let [inserts, deletes, name] =
60- \ matchlist (diff_line, ' \v\s*([0-9\-]+)\s+([0-9-]+)\s+(.+)' )[1 :3 ]
57+ \ matchlist (diff_line, ' \v\s*([0-9\-]+)\s+([0-9-]+)\s+(.+)' )[1 :3 ]
6158 let absolute_path = toplevel . ' /' . name
6259 let relative_path = fnamemodify (absolute_path, ' :.' )
63- let display_path_name = DiffStatShortenPath (relative_path, max_path_length)
60+ let display_path_name = s: DiffStatShortenPath (relative_path, max_path_length)
6461 let files_list[display_path_name] =
65- \ {' inserts' : inserts, ' deletes' : deletes, ' name' : relative_path}
66- call add (deltas , inserts + deletes)
62+ \ {' inserts' : inserts, ' deletes' : deletes, ' name' : relative_path}
63+ let max_delta = max ([max_delta , inserts + deletes] )
6764 let s: diff_files_list [display_path_name] = relative_path
6865 call add (file_name_lengths, strlen (display_path_name))
6966 endfor
7067
71- let max_delta = max (deltas)
7268 let max_deltas_length = min ([max_delta, max_deltas_length])
7369 let longest_filename = max (file_name_lengths)
74- unlet deltas
7570 unlet file_name_lengths
7671
7772 for [key , value] in items (files_list)
73+ let deltas_string = ' '
7874 if value[' inserts' ] == # ' -' || value[' deletes' ] == # ' -'
7975 let total = ' Bin'
80- let files_list[key ][' deltas' ] = ' '
8176 else
8277 let total = value[' inserts' ] + value[' deletes' ]
8378 let inserts_count = max ([value[' inserts' ] * max_deltas_length / max_delta,
84- \ value[' inserts' ] + 0 > 0 ? 1 : 0 ])
79+ \ value[' inserts' ] + 0 > 0 ? 1 : 0 ])
8580 let deletes_count = max ([value[' deletes' ] * max_deltas_length / max_delta,
86- \ value[' deletes' ] + 0 > 0 ? 1 : 0 ])
87- let files_list[ key ][ ' deltas ' ] =
88- \ repeat (' +' , inserts_count) . repeat (' -' , deletes_count)
81+ \ value[' deletes' ] + 0 > 0 ? 1 : 0 ])
82+ let deltas_string =
83+ \ ' ' . repeat (' +' , inserts_count) . repeat (' -' , deletes_count)
8984 endif
90- let files_list[key ][' string' ] = s: DiffStatPaddedString (key , max_path_length, 1 )
91- \ . ' | ' . s: DiffStatPaddedString (total, 3 , 0 ) . ' ' . files_list[key ][' deltas' ]
85+
9286 let files_list[key ][' string' ] =
93- \ substitute (files_list[key ][' string' ], ' \v\s+$' , ' ' , ' ' )
87+ \ printf (' % -' . max_path_length . ' s | % 4s%s' ,
88+ \ key , total, deltas_string)
9489 endfor
9590 return files_list
9691endfunction
9792
98-
9993function DiffStatCallSystem (commit)
100- " TODO(mpetrov): consider using diff-tree or --numstat
10194 let text = " # git diff " . a: commit . " \n "
10295 let result = s: DiffStatCommand (a: commit )
10396 for [key , value] in items (result)
@@ -107,7 +100,7 @@ function DiffStatCallSystem(commit)
107100endfunction
108101
109102let s: DiffStatRegex = ' \v^\s*(\S+)\s*\|\s*\d+\s*[+-]+\s*$'
110- function ! s: DiffStatFileNameForLine (lnum)
103+ function ! s: DiffStatFileNameForLine (lnum)
111104 if getline (a: lnum ) = ~? s: DiffStatRegex
112105 return matchlist (getline (a: lnum ), s: DiffStatRegex )[1 ]
113106 endif
0 commit comments