From da083bba2a093ea2ff4558e59c48bd6672b75480 Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Mon, 6 Dec 2021 22:34:53 -0500 Subject: Store raw_line in HunkZero, as HunkMinus and HunkPlus ref #829 --- src/delta.rs | 4 ++-- src/features/line_numbers.rs | 2 +- src/features/side_by_side.rs | 4 ++-- src/handlers/hunk.rs | 19 ++++++++++--------- src/handlers/hunk_header.rs | 2 +- src/handlers/merge_conflict.rs | 6 +++--- src/paint.rs | 16 ++++++++++------ src/subcommands/show_colors.rs | 4 ++-- src/tests/test_example_diffs.rs | 2 +- 9 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/delta.rs b/src/delta.rs index 8ad33b1b..7fbcdf48 100644 --- a/src/delta.rs +++ b/src/delta.rs @@ -19,9 +19,9 @@ pub enum State { CommitMeta, // In commit metadata section DiffHeader(DiffType), // In diff metadata section, between (possible) commit metadata and first hunk HunkHeader(DiffType, ParsedHunkHeader, String, String), // In hunk metadata line (diff_type, parsed, line, raw_line) - HunkZero(DiffType), // In hunk; unchanged line (prefix) + HunkZero(DiffType, Option), // In hunk; unchanged line (prefix, raw_line) HunkMinus(DiffType, Option), // In hunk; removed line (diff_type, raw_line) - HunkPlus(DiffType, Option), // In hunk; added line (diff_type, raw_line) + HunkPlus(DiffType, Option), // In hunk; added line (diff_type, raw_line) MergeConflict(MergeParents, merge_conflict::MergeConflictCommit), SubmoduleLog, // In a submodule section, with gitconfig diff.submodule = log SubmoduleShort(String), // In a submodule section, with gitconfig diff.submodule = short diff --git a/src/features/line_numbers.rs b/src/features/line_numbers.rs index 35674f99..fd2232f4 100644 --- a/src/features/line_numbers.rs +++ b/src/features/line_numbers.rs @@ -81,7 +81,7 @@ pub fn linenumbers_and_styles<'a>( ((Some(nr_left), None), (minus_style, plus_style)) } State::HunkMinusWrapped => ((None, None), (minus_style, plus_style)), - State::HunkZero(_) => { + State::HunkZero(_, _) => { line_numbers_data.line_number[Left] += increment as usize; line_numbers_data.line_number[Right] += increment as usize; ((Some(nr_left), Some(nr_right)), (zero_style, zero_style)) diff --git a/src/features/side_by_side.rs b/src/features/side_by_side.rs index e92be3b8..44f17a67 100644 --- a/src/features/side_by_side.rs +++ b/src/features/side_by_side.rs @@ -234,7 +234,7 @@ pub fn paint_zero_lines_side_by_side<'a>( painted_prefix: Option, background_color_extends_to_terminal_width: BgShouldFill, ) { - let states = vec![State::HunkZero(DiffType::Unified)]; + let states = vec![State::HunkZero(DiffType::Unified, None)]; let (states, syntax_style_sections, diff_style_sections) = wrap_zero_block( config, @@ -496,7 +496,7 @@ fn pad_panel_line_to_width<'a>( panel_line, Some(" "), ), - State::HunkZero(_) => {} + State::HunkZero(_, _) => {} _ => unreachable!(), }; }; diff --git a/src/handlers/hunk.rs b/src/handlers/hunk.rs index 9f9097da..bd6f6366 100644 --- a/src/handlers/hunk.rs +++ b/src/handlers/hunk.rs @@ -30,7 +30,7 @@ impl<'a> StateMachine<'a> { matches!( self.state, State::HunkHeader(_, _, _, _) - | State::HunkZero(_) + | State::HunkZero(_, _) | State::HunkMinus(_, _) | State::HunkPlus(_, _) ) && !&*IS_WORD_DIFF @@ -90,14 +90,15 @@ impl<'a> StateMachine<'a> { self.painter.plus_lines.push((line, state.clone())); state } - Some(HunkZero(diff_type)) => { + Some(HunkZero(diff_type, _)) => { // We are in a zero (unchanged) line, therefore we have just exited a subhunk (a // sequence of consecutive minus (removed) and/or plus (added) lines). Process that // subhunk and flush the line buffers. self.painter.paint_buffered_minus_and_plus_lines(); let n_parents = diff_type.n_parents(); let line = self.painter.prepare(&self.line, n_parents); - let state = State::HunkZero(diff_type); + let raw_line = self.maybe_raw_line(n_parents, &[]); + let state = State::HunkZero(diff_type, raw_line); self.painter.paint_zero_line(&line, state.clone()); state } @@ -110,7 +111,7 @@ impl<'a> StateMachine<'a> { .output_buffer .push_str(&self.painter.expand_tabs(self.raw_line.graphemes(true))); self.painter.output_buffer.push('\n'); - State::HunkZero(Unified) + State::HunkZero(Unified, None) } }; self.painter.emit()?; @@ -137,7 +138,7 @@ fn new_line_state(new_line: &str, prev_state: &State) -> Option { let diff_type = match prev_state { HunkMinus(Unified, _) - | HunkZero(Unified) + | HunkZero(Unified, _) | HunkPlus(Unified, _) | HunkHeader(Unified, _, _, _) => Unified, HunkHeader(Combined(Number(n), InMergeConflict::No), _, _, _) => { @@ -149,12 +150,12 @@ fn new_line_state(new_line: &str, prev_state: &State) -> Option { Combined(Number(prefix.len()), InMergeConflict::No) } HunkMinus(Combined(Prefix(prefix), in_merge_conflict), _) - | HunkZero(Combined(Prefix(prefix), in_merge_conflict)) + | HunkZero(Combined(Prefix(prefix), in_merge_conflict), _) | HunkPlus(Combined(Prefix(prefix), in_merge_conflict), _) => { Combined(Number(prefix.len()), in_merge_conflict.clone()) } HunkMinus(Combined(Number(n), in_merge_conflict), _) - | HunkZero(Combined(Number(n), in_merge_conflict)) + | HunkZero(Combined(Number(n), in_merge_conflict), _) | HunkPlus(Combined(Number(n), in_merge_conflict), _) => { Combined(Number(*n), in_merge_conflict.clone()) } @@ -186,13 +187,13 @@ fn new_line_state(new_line: &str, prev_state: &State) -> Option { match (prefix_char, prefix, in_merge_conflict) { (Some('-'), None, None) => Some(HunkMinus(Unified, None)), - (Some(' '), None, None) => Some(HunkZero(Unified)), + (Some(' '), None, None) => Some(HunkZero(Unified, None)), (Some('+'), None, None) => Some(HunkPlus(Unified, None)), (Some('-'), Some(prefix), Some(in_merge_conflict)) => { Some(HunkMinus(Combined(Prefix(prefix), in_merge_conflict), None)) } (Some(' '), Some(prefix), Some(in_merge_conflict)) => { - Some(HunkZero(Combined(Prefix(prefix), in_merge_conflict))) + Some(HunkZero(Combined(Prefix(prefix), in_merge_conflict), None)) } (Some('+'), Some(prefix), Some(in_merge_conflict)) => { Some(HunkPlus(Combined(Prefix(prefix), in_merge_conflict), None)) diff --git a/src/handlers/hunk_header.rs b/src/handlers/hunk_header.rs index ee109f68..833bfc81 100644 --- a/src/handlers/hunk_header.rs +++ b/src/handlers/hunk_header.rs @@ -61,7 +61,7 @@ impl<'a> StateMachine<'a> { } DiffHeader(diff_type) | HunkMinus(diff_type, _) - | HunkZero(diff_type) + | HunkZero(diff_type, _) | HunkPlus(diff_type, _) => diff_type.clone(), _ => Unified, }; diff --git a/src/handlers/merge_conflict.rs b/src/handlers/merge_conflict.rs index 1ff06fc3..d73060c9 100644 --- a/src/handlers/merge_conflict.rs +++ b/src/handlers/merge_conflict.rs @@ -42,7 +42,7 @@ impl<'a> StateMachine<'a> { match self.state.clone() { HunkHeader(Combined(merge_parents, InMergeConflict::No), _, _, _) | HunkMinus(Combined(merge_parents, InMergeConflict::No), _) - | HunkZero(Combined(merge_parents, InMergeConflict::No)) + | HunkZero(Combined(merge_parents, InMergeConflict::No), _) | HunkPlus(Combined(merge_parents, InMergeConflict::No), _) => { handled_line = self.enter_merge_conflict(&merge_parents) } @@ -120,7 +120,7 @@ impl<'a> StateMachine<'a> { fn store_line(&mut self, commit: MergeConflictCommit, state: State) -> bool { use State::*; - if let HunkMinus(diff_type, _) | HunkZero(diff_type) | HunkPlus(diff_type, _) = &state { + if let HunkMinus(diff_type, _) | HunkZero(diff_type, _) | HunkPlus(diff_type, _) = &state { let line = self.painter.prepare(&self.line, diff_type.n_parents()); self.painter.merge_conflict_lines[commit].push((line, state)); true @@ -172,7 +172,7 @@ impl<'a> StateMachine<'a> { self.config, )?; self.painter.merge_conflict_lines.clear(); - self.state = HunkZero(Combined(merge_parents.clone(), InMergeConflict::No)); + self.state = HunkZero(Combined(merge_parents.clone(), InMergeConflict::No), None); Ok(()) } } diff --git a/src/paint.rs b/src/paint.rs index 3a904206..59dd38a9 100644 --- a/src/paint.rs +++ b/src/paint.rs @@ -326,7 +326,7 @@ impl<'p> Painter<'p> { config.minus_style } } - State::HunkZero(_) | State::HunkZeroWrapped => config.zero_style, + State::HunkZero(_, None) | State::HunkZeroWrapped => config.zero_style, State::HunkPlus(_, None) | State::HunkPlusWrapped => { if let Some(true) = line_has_homolog { config.plus_non_emph_style @@ -334,7 +334,9 @@ impl<'p> Painter<'p> { config.plus_style } } - State::HunkMinus(_, Some(_)) | State::HunkPlus(_, Some(_)) => { + State::HunkMinus(_, Some(_)) + | State::HunkZero(_, Some(_)) + | State::HunkPlus(_, Some(_)) => { // Consider the following raw line, from git colorMoved: // ␛[1;36m+␛[m␛[1;36mclass·X:·pass␛[m␊ The last style section returned by // parse_style_sections will be a default style associated with the terminal newline @@ -470,14 +472,16 @@ impl<'p> Painter<'p> { || config.minus_emph_style.is_syntax_highlighted || config.minus_non_emph_style.is_syntax_highlighted } - State::HunkZero(_) => config.zero_style.is_syntax_highlighted, + State::HunkZero(_, None) => config.zero_style.is_syntax_highlighted, State::HunkPlus(_, None) => { config.plus_style.is_syntax_highlighted || config.plus_emph_style.is_syntax_highlighted || config.plus_non_emph_style.is_syntax_highlighted } State::HunkHeader(_, _, _, _) => true, - State::HunkMinus(_, Some(_raw_line)) | State::HunkPlus(_, Some(_raw_line)) => { + State::HunkMinus(_, Some(_raw_line)) + | State::HunkZero(_, Some(_raw_line)) + | State::HunkPlus(_, Some(_raw_line)) => { // It is possible that the captured raw line contains an ANSI // style that has been mapped (via map-styles) to a delta Style // with syntax-highlighting. @@ -728,7 +732,7 @@ fn painted_prefix(state: State, config: &config::Config) -> Option { (HunkMinus(Combined(MergeParents::Prefix(prefix), InMergeConflict::No), _), _) => { Some(config.minus_style.paint(prefix)) } - (HunkZero(Combined(MergeParents::Prefix(prefix), InMergeConflict::No)), _) => { + (HunkZero(Combined(MergeParents::Prefix(prefix), InMergeConflict::No), _), _) => { Some(config.zero_style.paint(prefix)) } (HunkPlus(Combined(MergeParents::Prefix(prefix), InMergeConflict::No), _), _) => { @@ -736,7 +740,7 @@ fn painted_prefix(state: State, config: &config::Config) -> Option { } // But otherwise we honor keep_plus_minus_markers (HunkMinus(_, _), true) => Some(config.minus_style.paint("-".to_string())), - (HunkZero(_), true) => Some(config.zero_style.paint(" ".to_string())), + (HunkZero(_, _), true) => Some(config.zero_style.paint(" ".to_string())), (HunkPlus(_, _), true) => Some(config.plus_style.paint("+".to_string())), _ => None, } diff --git a/src/subcommands/show_colors.rs b/src/subcommands/show_colors.rs index b51dd8a0..1c939700 100644 --- a/src/subcommands/show_colors.rs +++ b/src/subcommands/show_colors.rs @@ -45,7 +45,7 @@ pub fn show_colors() -> std::io::Result<()> { painter.syntax_highlight_and_paint_line( line, paint::StyleSectionSpecifier::Style(style), - delta::State::HunkZero(DiffType::Unified), + delta::State::HunkZero(DiffType::Unified, None), BgShouldFill::default(), ) } @@ -64,7 +64,7 @@ pub fn show_colors() -> std::io::Result<()> { painter.syntax_highlight_and_paint_line( line, paint::StyleSectionSpecifier::Style(style), - delta::State::HunkZero(DiffType::Unified), + delta::State::HunkZero(DiffType::Unified, None), BgShouldFill::default(), ) } diff --git a/src/tests/test_example_diffs.rs b/src/tests/test_example_diffs.rs index 0244ef80..ce917c36 100644 --- a/src/tests/test_example_diffs.rs +++ b/src/tests/test_example_diffs.rs @@ -1543,7 +1543,7 @@ src/align.rs:71: impl<'a> Alignment<'a> { │ 1, " for (i, x_i) in self.x.iter().enumerate() {", "rs", - State::HunkZero(DiffType::Unified), + State::HunkZero(DiffType::Unified, None), &config, ); } -- cgit v1.2.3