@@ -3,24 +3,43 @@ use diff::{chars, lines, Result, Result::*};
33
44#[ derive( Default ) ]
55struct DiffState < ' a > {
6- skipped_lines : usize ,
7- /// When we skip a line, remember it, in case
8- /// we end up only skipping one line. In that case we just
9- /// print the line instead of `... skipped one line ...`
10- last_skipped_line : Option < & ' a str > ,
6+ /// When we skip lines, remember the last `CONTEXT` ones to
7+ /// display after the "skipped N lines" message
8+ skipped_lines : Vec < & ' a str > ,
119 /// When we see a removed line, we don't print it, we
1210 /// keep it around to compare it with the next added line.
1311 prev_left : Option < & ' a str > ,
1412}
1513
14+ /// How many lines of context are displayed around the actual diffs
15+ const CONTEXT : usize = 2 ;
16+
1617impl < ' a > DiffState < ' a > {
1718 fn print_skip ( & mut self ) {
18- match self . skipped_lines {
19- 0 => { }
20- 1 => eprintln ! ( " {}" , self . last_skipped_line. unwrap( ) ) ,
21- _ => eprintln ! ( "... {} lines skipped ..." , self . skipped_lines) ,
19+ let half = self . skipped_lines . len ( ) / 2 ;
20+ if half < CONTEXT {
21+ for line in self . skipped_lines . drain ( ..) {
22+ eprintln ! ( " {line}" ) ;
23+ }
24+ } else {
25+ for line in self . skipped_lines . iter ( ) . take ( CONTEXT ) {
26+ eprintln ! ( " {line}" ) ;
27+ }
28+ let skipped = self . skipped_lines . len ( ) - CONTEXT * 2 ;
29+ match skipped {
30+ 0 => { }
31+ 1 => eprintln ! ( " {}" , self . skipped_lines[ CONTEXT ] ) ,
32+ _ => eprintln ! ( "... {skipped} lines skipped ..." ) ,
33+ }
34+ for line in self . skipped_lines . iter ( ) . rev ( ) . take ( CONTEXT ) . rev ( ) {
35+ eprintln ! ( " {line}" ) ;
36+ }
2237 }
23- self . skipped_lines = 0 ;
38+ self . skipped_lines . clear ( ) ;
39+ }
40+
41+ fn skip ( & mut self , line : & ' a str ) {
42+ self . skipped_lines . push ( line) ;
2443 }
2544
2645 fn print_prev ( & mut self ) {
@@ -46,8 +65,7 @@ impl<'a> DiffState<'a> {
4665 }
4766 Both ( l, _) => {
4867 self . print_prev ( ) ;
49- self . last_skipped_line = Some ( l) ;
50- self . skipped_lines += 1
68+ self . skip ( l) ;
5169 }
5270 Right ( r) => {
5371 if let Some ( l) = self . prev_left . take ( ) {
0 commit comments