summaryrefslogtreecommitdiffstats
path: root/src/delta.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/delta.rs')
-rw-r--r--src/delta.rs41
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'