summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Davison <dandavison7@gmail.com>2020-11-22 19:59:15 -0500
committerDan Davison <dandavison7@gmail.com>2020-11-22 20:17:55 -0500
commitf52464c1af557a5759566a988d2478ccb6e86d3e (patch)
tree70fc38ca7c8de1764db29279fc07f32d7116e92d
parent54f363db05f91dc83737bb45244ec00f0c2bbcf3 (diff)
Refactor: parse file meta line
In preparation for #392
-rw-r--r--src/delta.rs15
-rw-r--r--src/parse.rs83
2 files changed, 61 insertions, 37 deletions
diff --git a/src/delta.rs b/src/delta.rs
index eb783e18..180a3893 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 9be8df51..05b0ceb5 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)
);
}