From f52464c1af557a5759566a988d2478ccb6e86d3e Mon Sep 17 00:00:00 2001 From: Dan Davison Date: Sun, 22 Nov 2020 19:59:15 -0500 Subject: [PATCH] Refactor: parse file meta line In preparation for #392 --- src/delta.rs | 15 ++++++++-- src/parse.rs | 83 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/src/delta.rs b/src/delta.rs index eb783e185..180a3893e 100644 --- a/src/delta.rs +++ b/src/delta.rs @@ -62,6 +62,7 @@ where let mut painter = Painter::new(writer, config); let mut minus_file = "".to_string(); let mut plus_file = "".to_string(); + let mut file_event = parse::FileEvent::NoEvent; let mut state = State::Unknown; let mut source = Source::Unknown; @@ -99,7 +100,11 @@ where } else if (state == State::FileMeta || source == Source::DiffUnified) && (line.starts_with("--- ") || line.starts_with("rename from ")) { - minus_file = parse::get_file_path_from_file_meta_line(&line, source == Source::GitDiff); + let parsed_file_meta_line = + parse::parse_file_meta_line(&line, source == Source::GitDiff); + minus_file = parsed_file_meta_line.0; + file_event = parsed_file_meta_line.1; + if source == Source::DiffUnified { state = State::FileMeta; painter.set_syntax(parse::get_file_extension_from_marker_line(&line)); @@ -111,7 +116,9 @@ where } else if (state == State::FileMeta || source == Source::DiffUnified) && (line.starts_with("+++ ") || line.starts_with("rename to ")) { - plus_file = parse::get_file_path_from_file_meta_line(&line, source == Source::GitDiff); + let parsed_file_meta_line = + parse::parse_file_meta_line(&line, source == Source::GitDiff); + plus_file = parsed_file_meta_line.0; painter.set_syntax(parse::get_file_extension_from_file_meta_line_file_path( &plus_file, )); @@ -125,6 +132,7 @@ where &minus_file, &plus_file, config, + &file_event, source == Source::DiffUnified, )?; handled_file_meta_header_line_file_pair = current_file_pair @@ -288,10 +296,11 @@ fn handle_file_meta_header_line( minus_file: &str, plus_file: &str, config: &Config, + file_event: &parse::FileEvent, comparing: bool, ) -> std::io::Result<()> { let line = parse::get_file_change_description_from_file_paths( - minus_file, plus_file, comparing, config, + minus_file, plus_file, comparing, file_event, config, ); // FIXME: no support for 'raw' handle_generic_file_meta_header_line(painter, &line, &line, config) diff --git a/src/parse.rs b/src/parse.rs index 9be8df518..05b0ceb56 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -19,11 +19,18 @@ pub fn get_file_extension_from_marker_line(line: &str) -> Option<&str> { .and_then(|file| file.split('.').last()) } -pub fn get_file_path_from_file_meta_line(line: &str, git_diff_name: bool) -> String { +#[derive(Debug, PartialEq)] +pub enum FileEvent { + Change, + Rename, + NoEvent, +} + +pub fn parse_file_meta_line(line: &str, git_diff_name: bool) -> (String, FileEvent) { match line { line if line.starts_with("--- ") || line.starts_with("+++ ") => { let offset = 4; - match &line[offset..] { + let file = match &line[offset..] { path if path == "/dev/null" => "/dev/null", path if git_diff_name && DIFF_PREFIXES.iter().any(|s| path.starts_with(s)) => { &path[2..] @@ -31,16 +38,17 @@ pub fn get_file_path_from_file_meta_line(line: &str, git_diff_name: bool) -> Str path if git_diff_name => &path, path => path.split('\t').next().unwrap_or(""), } + .to_string(); + (file, FileEvent::Change) } line if line.starts_with("rename from ") => { - &line[12..] // "rename from ".len() + (line[12..].to_string(), FileEvent::Rename) // "rename from ".len() } line if line.starts_with("rename to ") => { - &line[10..] // "rename to ".len() + (line[10..].to_string(), FileEvent::Rename) // "rename to ".len() } - _ => "", + _ => ("".to_string(), FileEvent::NoEvent), } - .to_string() } pub fn get_file_extension_from_file_meta_line_file_path(path: &str) -> Option<&str> { @@ -55,6 +63,7 @@ pub fn get_file_change_description_from_file_paths( minus_file: &str, plus_file: &str, comparing: bool, + file_event: &FileEvent, config: &Config, ) -> String { if comparing { @@ -92,7 +101,10 @@ pub fn get_file_change_description_from_file_paths( ), (minus_file, plus_file) => format!( "{}{} ⟶ {}", - format_label(&config.file_renamed_label), + format_label(match file_event { + FileEvent::Rename => &config.file_renamed_label, + _ => "", + }), format_file(minus_file), format_file(plus_file) ), @@ -224,74 +236,77 @@ mod tests { #[test] fn test_get_file_path_from_git_file_meta_line() { assert_eq!( - get_file_path_from_file_meta_line("--- /dev/null", true), - "/dev/null" + parse_file_meta_line("--- /dev/null", true), + ("/dev/null".to_string(), FileEvent::Change) ); for prefix in &DIFF_PREFIXES { assert_eq!( - get_file_path_from_file_meta_line(&format!("--- {}src/delta.rs", prefix), true), - "src/delta.rs" + parse_file_meta_line(&format!("--- {}src/delta.rs", prefix), true), + ("src/delta.rs".to_string(), FileEvent::Change) ); } assert_eq!( - get_file_path_from_file_meta_line("--- src/delta.rs", true), - "src/delta.rs" + parse_file_meta_line("--- src/delta.rs", true), + ("src/delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ src/delta.rs", true), - "src/delta.rs" + parse_file_meta_line("+++ src/delta.rs", true), + ("src/delta.rs".to_string(), FileEvent::Change) ); } #[test] fn test_get_file_path_from_git_file_meta_line_containing_spaces() { assert_eq!( - get_file_path_from_file_meta_line("+++ a/my src/delta.rs", true), - "my src/delta.rs" + parse_file_meta_line("+++ a/my src/delta.rs", true), + ("my src/delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ my src/delta.rs", true), - "my src/delta.rs" + parse_file_meta_line("+++ my src/delta.rs", true), + ("my src/delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ a/src/my delta.rs", true), - "src/my delta.rs" + parse_file_meta_line("+++ a/src/my delta.rs", true), + ("src/my delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ a/my src/my delta.rs", true), - "my src/my delta.rs" + parse_file_meta_line("+++ a/my src/my delta.rs", true), + ("my src/my delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ b/my src/my enough/my delta.rs", true), - "my src/my enough/my delta.rs" + parse_file_meta_line("+++ b/my src/my enough/my delta.rs", true), + ( + "my src/my enough/my delta.rs".to_string(), + FileEvent::Change + ) ); } #[test] fn test_get_file_path_from_git_file_meta_line_rename() { assert_eq!( - get_file_path_from_file_meta_line("rename from nospace/file2.el", true), - "nospace/file2.el" + parse_file_meta_line("rename from nospace/file2.el", true), + ("nospace/file2.el".to_string(), FileEvent::Rename) ); } #[test] fn test_get_file_path_from_git_file_meta_line_rename_containing_spaces() { assert_eq!( - get_file_path_from_file_meta_line("rename from with space/file1.el", true), - "with space/file1.el" + parse_file_meta_line("rename from with space/file1.el", true), + ("with space/file1.el".to_string(), FileEvent::Rename) ); } #[test] - fn test_get_file_path_from_file_meta_line() { + fn test_parse_file_meta_line() { assert_eq!( - get_file_path_from_file_meta_line("--- src/delta.rs", false), - "src/delta.rs" + parse_file_meta_line("--- src/delta.rs", false), + ("src/delta.rs".to_string(), FileEvent::Change) ); assert_eq!( - get_file_path_from_file_meta_line("+++ src/delta.rs", false), - "src/delta.rs" + parse_file_meta_line("+++ src/delta.rs", false), + ("src/delta.rs".to_string(), FileEvent::Change) ); }