summaryrefslogtreecommitdiffstats
path: root/src/handlers/diff_header_diff.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/diff_header_diff.rs')
-rw-r--r--src/handlers/diff_header_diff.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/handlers/diff_header_diff.rs b/src/handlers/diff_header_diff.rs
index a79f6e1c..f8a007e2 100644
--- a/src/handlers/diff_header_diff.rs
+++ b/src/handlers/diff_header_diff.rs
@@ -1,4 +1,5 @@
use crate::delta::{DiffType, InMergeConflict, MergeParents, State, StateMachine};
+use crate::handlers::diff_header::{get_repeated_file_path_from_diff_line, FileEvent};
impl<'a> StateMachine<'a> {
#[inline]
@@ -25,6 +26,19 @@ impl<'a> StateMachine<'a> {
self.handle_pending_line_with_diff_name()?;
self.handled_diff_header_header_line_file_pair = None;
self.diff_line = self.line.clone();
+
+ // Pre-fill header fields from the diff line. For added, removed or renamed files
+ // these are updated precisely on actual header minus and header plus lines.
+ // But for modified binary files which are not added, removed or renamed, there
+ // are no minus and plus lines. Without the code below, in such cases the file names
+ // would remain unchanged from the previous diff, or empty for the very first diff.
+ let name = get_repeated_file_path_from_diff_line(&self.line).unwrap_or_default();
+ self.minus_file = name.clone();
+ self.plus_file = name.clone();
+ self.minus_file_event = FileEvent::Change;
+ self.plus_file_event = FileEvent::Change;
+ self.current_file_pair = Some((self.minus_file.clone(), self.plus_file.clone()));
+
if !self.should_skip_line() {
self.emit_line_unchanged()?;
}