77 lines
2.0 KiB
Diff
77 lines
2.0 KiB
Diff
From 292dfedd1d02b2ac4a926a5e32658562a92bd9be Mon Sep 17 00:00:00 2001
|
|
From: chenjiayi <chenjiayi22@huawei.com>
|
|
Date: Wed, 21 Jun 2023 21:25:56 +0800
|
|
Subject: [PATCH] feature(libbasic): add path_simplify
|
|
|
|
path_simplify is used to remove redundant inner and trailing slashes
|
|
and unnecessary dots in path.
|
|
---
|
|
libs/basic/src/path_util.rs | 44 ++++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 43 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/libs/basic/src/path_util.rs b/libs/basic/src/path_util.rs
|
|
index 4ac9de9..7391615 100644
|
|
--- a/libs/basic/src/path_util.rs
|
|
+++ b/libs/basic/src/path_util.rs
|
|
@@ -21,9 +21,44 @@ pub fn path_equal(a: &str, b: &str) -> bool {
|
|
p_a == p_b
|
|
}
|
|
|
|
+/// Remove redundant inner and trailing slashes and unnecessary dots to simplify path.
|
|
+/// e.g., //foo//.//bar/ becomes /foo/bar
|
|
+/// .//foo//.//bar/ becomes foo/bar
|
|
+pub fn path_simplify(s: &str) -> String {
|
|
+ let mut ret = String::new();
|
|
+
|
|
+ let mut pre = "";
|
|
+
|
|
+ for com in s.split('/') {
|
|
+ match com {
|
|
+ "" => {
|
|
+ if ret.is_empty() && pre.is_empty() {
|
|
+ ret.push('/');
|
|
+ }
|
|
+ }
|
|
+ "." => {
|
|
+ if pre.is_empty() {
|
|
+ pre = ".";
|
|
+ }
|
|
+ }
|
|
+ _ => {
|
|
+ ret.push_str(com);
|
|
+ ret.push('/');
|
|
+ pre = com;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ /* drop the trailing slash */
|
|
+ if ret.ends_with('/') {
|
|
+ let _ = ret.pop();
|
|
+ }
|
|
+
|
|
+ ret
|
|
+}
|
|
+
|
|
#[cfg(test)]
|
|
mod tests {
|
|
- use crate::path_util::path_equal;
|
|
+ use super::*;
|
|
|
|
#[test]
|
|
fn test_path_equal() {
|
|
@@ -35,4 +70,11 @@ mod tests {
|
|
assert!(path_equal("/x/././y", "/x/y/./."));
|
|
assert!(!path_equal("/etc", "/var"));
|
|
}
|
|
+
|
|
+ #[test]
|
|
+ fn test_path_simplify() {
|
|
+ assert_eq!(path_simplify("//foo//.//bar/"), "/foo/bar");
|
|
+ assert_eq!(path_simplify(".//foo//.//bar/"), "foo/bar");
|
|
+ assert_eq!(path_simplify("foo//.//bar/"), "foo/bar");
|
|
+ }
|
|
}
|
|
--
|
|
2.33.0
|
|
|