diff options
Diffstat (limited to 'src/delta.rs')
-rw-r--r-- | src/delta.rs | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/delta.rs b/src/delta.rs index 56114f76..cfafe3dc 100644 --- a/src/delta.rs +++ b/src/delta.rs @@ -62,7 +62,9 @@ struct StateMachine<'a> { source: Source, minus_file: String, plus_file: String, - file_event: parse::FileEvent, + minus_file_event: parse::FileEvent, + plus_file_event: parse::FileEvent, + file_paths_from_diff_line: (Option<String>, Option<String>), painter: Painter<'a>, config: &'a Config, @@ -91,7 +93,9 @@ impl<'a> StateMachine<'a> { source: Source::Unknown, minus_file: "".to_string(), plus_file: "".to_string(), - file_event: parse::FileEvent::NoEvent, + minus_file_event: parse::FileEvent::NoEvent, + plus_file_event: parse::FileEvent::NoEvent, + file_paths_from_diff_line: (None, None), current_file_pair: None, handled_file_meta_header_line_file_pair: None, painter: Painter::new(writer, config), @@ -122,13 +126,15 @@ impl<'a> StateMachine<'a> { } else if (self.state == State::FileMeta || self.source == Source::DiffUnified) && (line.starts_with("--- ") || line.starts_with("rename from ") - || line.starts_with("copy from ")) + || line.starts_with("copy from ") + || line.starts_with("old mode ")) { self.handle_file_meta_minus_line()? } else if (self.state == State::FileMeta || self.source == Source::DiffUnified) && (line.starts_with("+++ ") || line.starts_with("rename to ") - || line.starts_with("copy to ")) + || line.starts_with("copy to ") + || line.starts_with("new mode ")) { self.handle_file_meta_plus_line()? } else if line.starts_with("@@") { @@ -253,13 +259,14 @@ impl<'a> StateMachine<'a> { self.painter.paint_buffered_minus_and_plus_lines(); self.state = State::FileMeta; self.handled_file_meta_header_line_file_pair = None; + self.file_paths_from_diff_line = parse::get_file_paths_from_diff_line(&self.line); Ok(false) } fn handle_file_meta_minus_line(&mut self) -> std::io::Result<bool> { let mut handled_line = false; - let parsed_file_meta_line = parse::parse_file_meta_line( + let (path_or_mode, file_event) = parse::parse_file_meta_line( &self.line, self.source == Source::GitDiff, if self.config.relative_paths { @@ -268,8 +275,14 @@ impl<'a> StateMachine<'a> { None }, ); - self.minus_file = parsed_file_meta_line.0; - self.file_event = parsed_file_meta_line.1; + // In the case of ModeChange only, the file path is taken from the diff + // --git line (since that is the only place the file path occurs); + // otherwise it is taken from the --- / +++ line. + self.minus_file = match (&file_event, &self.file_paths_from_diff_line) { + (parse::FileEvent::ModeChange(_), (Some(file), _)) => file.clone(), + _ => path_or_mode, + }; + self.minus_file_event = file_event; if self.source == Source::DiffUnified { self.state = State::FileMeta; @@ -300,7 +313,7 @@ impl<'a> StateMachine<'a> { fn handle_file_meta_plus_line(&mut self) -> std::io::Result<bool> { let mut handled_line = false; - let parsed_file_meta_line = parse::parse_file_meta_line( + let (path_or_mode, file_event) = parse::parse_file_meta_line( &self.line, self.source == Source::GitDiff, if self.config.relative_paths { @@ -309,7 +322,14 @@ impl<'a> StateMachine<'a> { None }, ); - self.plus_file = parsed_file_meta_line.0; + // In the case of ModeChange only, the file path is taken from the diff + // --git line (since that is the only place the file path occurs); + // otherwise it is taken from the --- / +++ line. + self.plus_file = match (&file_event, &self.file_paths_from_diff_line) { + (parse::FileEvent::ModeChange(_), (_, Some(file))) => file.clone(), + _ => path_or_mode, + }; + self.plus_file_event = file_event; self.painter .set_syntax(parse::get_file_extension_from_file_meta_line_file_path( &self.plus_file, @@ -344,7 +364,8 @@ impl<'a> StateMachine<'a> { &self.minus_file, &self.plus_file, comparing, - &self.file_event, + &self.minus_file_event, + &self.plus_file_event, self.config, ); // FIXME: no support for 'raw' |