diff options
Diffstat (limited to 'core/normalize_path.rs')
-rw-r--r-- | core/normalize_path.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/core/normalize_path.rs b/core/normalize_path.rs new file mode 100644 index 000000000..6a0e44896 --- /dev/null +++ b/core/normalize_path.rs @@ -0,0 +1,36 @@ +use std::path::Component; +use std::path::Path; +use std::path::PathBuf; + +/// Normalize all itermediate components of the path (ie. remove "./" and "../" components). +/// Similar to `fs::canonicalize()` but doesn't resolve symlinks. +/// +/// Taken from Cargo +/// https://github.com/rust-lang/cargo/blob/af307a38c20a753ec60f0ad18be5abed3db3c9ac/src/cargo/util/paths.rs#L60-L85 +pub fn normalize_path(path: &Path) -> PathBuf { + let mut components = path.components().peekable(); + let mut ret = + if let Some(c @ Component::Prefix(..)) = components.peek().cloned() { + components.next(); + PathBuf::from(c.as_os_str()) + } else { + PathBuf::new() + }; + + for component in components { + match component { + Component::Prefix(..) => unreachable!(), + Component::RootDir => { + ret.push(component.as_os_str()); + } + Component::CurDir => {} + Component::ParentDir => { + ret.pop(); + } + Component::Normal(c) => { + ret.push(c); + } + } + } + ret +} |