mirror of
https://github.com/dandavison/delta.git
synced 2024-10-05 20:38:47 +03:00
parent
54f363db05
commit
f52464c1af
15
src/delta.rs
15
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)
|
||||
|
83
src/parse.rs
83
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)
|
||||
);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user