summaryrefslogtreecommitdiff
path: root/ext/node/path.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/node/path.rs')
-rw-r--r--ext/node/path.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/ext/node/path.rs b/ext/node/path.rs
new file mode 100644
index 000000000..8477fe713
--- /dev/null
+++ b/ext/node/path.rs
@@ -0,0 +1,38 @@
+use std::path::Component;
+use std::path::PathBuf;
+
+/// Extenion to path_clean::PathClean
+pub trait PathClean<T> {
+ fn clean(&self) -> T;
+}
+
+impl PathClean<PathBuf> for PathBuf {
+ fn clean(&self) -> PathBuf {
+ let path = path_clean::PathClean::clean(self);
+ if cfg!(windows) && path.to_string_lossy().contains("..\\") {
+ // temporary workaround because path_clean::PathClean::clean is
+ // not good enough on windows
+ let mut components = Vec::new();
+
+ for component in path.components() {
+ match component {
+ Component::CurDir => {
+ // skip
+ }
+ Component::ParentDir => {
+ let poped_component = components.pop();
+ if !matches!(poped_component, Some(Component::Normal(_))) {
+ panic!("Error normalizing: {}", path.display());
+ }
+ }
+ Component::Normal(_) | Component::RootDir | Component::Prefix(_) => {
+ components.push(component);
+ }
+ }
+ }
+ components.into_iter().collect::<PathBuf>()
+ } else {
+ path
+ }
+ }
+}