sysmaster/backport-feature-libbasic-add-path_simplify.patch
huyubiao 8936fa02c5 sync patches from upstream,change the path of the unit,modify permissions for some directories and files
(cherry picked from commit ce9ff469b57f60130621bc293783bd3ac1fc92f2)
2023-08-05 18:15:53 +08:00

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