From 590b0a87e71a0b5a56621d7549d0df9dd99ae69c Mon Sep 17 00:00:00 2001 From: "Daniel P. Clark" <6ftdan@gmail.com> Date: Tue, 13 Mar 2018 22:38:26 -0400 Subject: [PATCH] fix trailing sep edge case --- benches/basename_bench.rs | 2 +- src/basename.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/benches/basename_bench.rs b/benches/basename_bench.rs index 3376e1f..531eb1f 100644 --- a/benches/basename_bench.rs +++ b/benches/basename_bench.rs @@ -87,7 +87,7 @@ pub fn basename_version2<'a>(path: &'a str, ext: &str) -> &'a str { range = find_last_word(bytes); } else { let extension = ext.as_bytes(); - let mut end = bytes.len(); + let mut end = find_last_non_sep_pos(&bytes).map(|v| v+1).unwrap_or(bytes.len()); if extension == b".*" { let e = extname(&path[..end]); diff --git a/src/basename.rs b/src/basename.rs index 3d1d2a3..9636922 100644 --- a/src/basename.rs +++ b/src/basename.rs @@ -1,4 +1,4 @@ -use path_parsing::{find_last_sep_pos, find_last_word}; +use path_parsing::{find_last_sep_pos, find_last_non_sep_pos, find_last_word}; use std::ops::Range; use extname::extname; use memrnchr::memrnchr; @@ -12,7 +12,7 @@ pub fn basename<'a>(path: &'a str, ext: &str) -> &'a str { range = find_last_word(bytes); } else { let extension = ext.as_bytes(); - let mut end = bytes.len(); + let mut end = find_last_non_sep_pos(&bytes).map(|v| v+1).unwrap_or(bytes.len()); if extension == b".*" { let e = extname(&path[..end]); @@ -83,6 +83,14 @@ fn dots() { assert_eq!("..", basename("..", "...")); } +#[test] +fn some_ruby_spec_trailing_sep_cases() { + assert_eq!("base", basename("dir//base.c/", ".c")); + assert_eq!("foo", basename("foo.rb/", ".rb")); + assert_eq!("base", basename("dir//base.c/", ".*")); + assert_eq!("bar", basename("bar.rb///", ".*")); +} + #[test] fn absolute() { assert_eq!(basename("/a/b///c", ""), "c");