Skip to content

Commit 62e6df0

Browse files
committed
Show some context around a diff
1 parent 511f6ba commit 62e6df0

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

ui_test/src/diff.rs

+30-12
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,43 @@ use diff::{chars, lines, Result, Result::*};
33

44
#[derive(Default)]
55
struct 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+
1617
impl<'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

Comments
 (0)