summaryrefslogtreecommitdiffstats
path: root/src/handlers/diff_header.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/handlers/diff_header.rs')
-rw-r--r--src/handlers/diff_header.rs83
1 files changed, 38 insertions, 45 deletions
diff --git a/src/handlers/diff_header.rs b/src/handlers/diff_header.rs
index b07e04c7..24ecc9d5 100644
--- a/src/handlers/diff_header.rs
+++ b/src/handlers/diff_header.rs
@@ -95,10 +95,10 @@ impl<'a> StateMachine<'a> {
if self.source == Source::DiffUnified {
self.state = State::DiffHeader(DiffType::Unified);
self.painter
- .set_syntax(get_file_extension_from_marker_line(&self.line));
+ .set_syntax(get_filename_from_marker_line(&self.line));
} else {
self.painter
- .set_syntax(get_file_extension_from_diff_header_line_file_path(
+ .set_syntax(get_filename_from_diff_header_line_file_path(
&self.minus_file,
));
}
@@ -129,7 +129,7 @@ impl<'a> StateMachine<'a> {
.unwrap_or(path_or_mode);
self.plus_file_event = file_event;
self.painter
- .set_syntax(get_file_extension_from_diff_header_line_file_path(
+ .set_syntax(get_filename_from_diff_header_line_file_path(
&self.plus_file,
));
self.current_file_pair = Some((self.minus_file.clone(), self.plus_file.clone()));
@@ -142,7 +142,8 @@ impl<'a> StateMachine<'a> {
{
self.painter.emit()?;
self._handle_diff_header_header_line(self.source == Source::DiffUnified)?;
- self.handled_diff_header_header_line_file_pair = self.current_file_pair.clone();
+ self.handled_diff_header_header_line_file_pair
+ .clone_from(&self.current_file_pair);
}
Ok(handled_line)
}
@@ -255,7 +256,8 @@ impl<'a> StateMachine<'a> {
&& self.handled_diff_header_header_line_file_pair != self.current_file_pair
{
self._handle_diff_header_header_line(self.source == Source::DiffUnified)?;
- self.handled_diff_header_header_line_file_pair = self.current_file_pair.clone();
+ self.handled_diff_header_header_line_file_pair
+ .clone_from(&self.current_file_pair);
Ok(())
} else {
Ok(())
@@ -300,30 +302,23 @@ pub fn write_generic_diff_header_header_line(
#[allow(clippy::tabs_in_doc_comments)]
/// Given input like
-/// "--- one.rs 2019-11-20 06:16:08.000000000 +0100"
-/// Return "rs"
-fn get_file_extension_from_marker_line(line: &str) -> Option<&str> {
+/// "--- a/zero/one.rs 2019-11-20 06:16:08.000000000 +0100"
+/// Return "one.rs"
+fn get_filename_from_marker_line(line: &str) -> Option<&str> {
line.split('\t')
.next()
.and_then(|column| column.split(' ').nth(1))
- .and_then(|file| file.split('.').last())
+ .and_then(get_filename_from_diff_header_line_file_path)
}
-fn get_file_extension_from_diff_header_line_file_path(path: &str) -> Option<&str> {
- if path.is_empty() || path == "/dev/null" {
- None
- } else {
- get_extension(path).map(|ex| ex.trim())
- }
-}
-
-/// Attempt to parse input as a file path and return extension as a &str.
-pub fn get_extension(s: &str) -> Option<&str> {
- let path = Path::new(s);
- path.extension()
- .and_then(|e| e.to_str())
- // E.g. 'Makefile' is the file name and also the extension
- .or_else(|| path.file_name().and_then(|s| s.to_str()))
+fn get_filename_from_diff_header_line_file_path(path: &str) -> Option<&str> {
+ Path::new(path).file_name().and_then(|filename| {
+ if path != "/dev/null" {
+ filename.to_str()
+ } else {
+ None
+ }
+ })
}
fn parse_diff_header_line(line: &str, git_diff_name: bool) -> (String, FileEvent) {
@@ -357,7 +352,7 @@ fn parse_diff_header_line(line: &str, git_diff_name: bool) -> (String, FileEvent
/// Given input like "diff --git a/src/my file.rs b/src/my file.rs"
/// return Some("src/my file.rs")
-fn get_repeated_file_path_from_diff_line(line: &str) -> Option<String> {
+pub fn get_repeated_file_path_from_diff_line(line: &str) -> Option<String> {
if let Some(line) = line.strip_prefix("diff --git ") {
let line: Vec<&str> = line.graphemes(true).collect();
let midpoint = line.len() / 2;
@@ -390,7 +385,7 @@ fn _parse_file_path(s: &str, git_diff_name: bool) -> String {
// ---·a/a·b├──┤␊
// +++·b/c·d├──┤␊
let path = match s.strip_suffix('\t').unwrap_or(s) {
- path if path == "/dev/null" => "/dev/null",
+ "/dev/null" => "/dev/null",
path if git_diff_name && DIFF_PREFIXES.iter().any(|s| path.starts_with(s)) => &path[2..],
path if git_diff_name => path,
path => path.split('\t').next().unwrap_or(""),
@@ -477,51 +472,49 @@ mod tests {
use super::*;
#[test]
- fn test_get_file_extension_from_marker_line() {
+ fn test_get_filename_from_marker_line() {
assert_eq!(
- get_file_extension_from_marker_line(
- "--- src/one.rs 2019-11-20 06:47:56.000000000 +0100"
- ),
- Some("rs")
+ get_filename_from_marker_line("--- src/one.rs 2019-11-20 06:47:56.000000000 +0100"),
+ Some("one.rs")
);
}
#[test]
- fn test_get_file_extension_from_diff_header_line() {
+ fn test_get_filename_from_diff_header_line() {
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("a/src/parse.rs"),
- Some("rs")
+ get_filename_from_diff_header_line_file_path("a/src/parse.rs"),
+ Some("parse.rs")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("b/src/pa rse.rs"),
- Some("rs")
+ get_filename_from_diff_header_line_file_path("b/src/pa rse.rs"),
+ Some("pa rse.rs")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("src/pa rse.rs"),
- Some("rs")
+ get_filename_from_diff_header_line_file_path("src/pa rse.rs"),
+ Some("pa rse.rs")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("wat hello.rs"),
- Some("rs")
+ get_filename_from_diff_header_line_file_path("wat hello.rs"),
+ Some("wat hello.rs")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("/dev/null"),
+ get_filename_from_diff_header_line_file_path("/dev/null"),
None
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("Dockerfile"),
+ get_filename_from_diff_header_line_file_path("Dockerfile"),
Some("Dockerfile")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("Makefile"),
+ get_filename_from_diff_header_line_file_path("Makefile"),
Some("Makefile")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("a/src/Makefile"),
+ get_filename_from_diff_header_line_file_path("a/src/Makefile"),
Some("Makefile")
);
assert_eq!(
- get_file_extension_from_diff_header_line_file_path("src/Makefile"),
+ get_filename_from_diff_header_line_file_path("src/Makefile"),
Some("Makefile")
);
}