aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_vfs
diff options
context:
space:
mode:
authorFelix S. Klock II <[email protected]>2019-02-13 16:16:28 +0000
committerFelix S. Klock II <[email protected]>2019-02-13 16:16:28 +0000
commitcfed7c59f49d4a4dd5ac001f520278583c883559 (patch)
tree80bb5890c434c13697b2aa9bfacb9387d5c3924c /crates/ra_vfs
parenta36e310229f13d6959d6ce95c99b659700cefc9a (diff)
In `RootConfig::contains`, check against canonicalized version of root
path since OS may hand us data that uses that rather than the root as specified by the user.
Diffstat (limited to 'crates/ra_vfs')
-rw-r--r--crates/ra_vfs/src/lib.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/crates/ra_vfs/src/lib.rs b/crates/ra_vfs/src/lib.rs
index 5d98d905c..2c3c35f28 100644
--- a/crates/ra_vfs/src/lib.rs
+++ b/crates/ra_vfs/src/lib.rs
@@ -42,6 +42,8 @@ impl_arena_id!(VfsRoot);
42/// returns `true` iff path belongs to the source root 42/// returns `true` iff path belongs to the source root
43pub(crate) struct RootConfig { 43pub(crate) struct RootConfig {
44 root: PathBuf, 44 root: PathBuf,
45 // result of `root.canonicalize()` if that differs from `root`; `None` otherwise.
46 canonical_root: Option<PathBuf>,
45 excluded_dirs: Vec<PathBuf>, 47 excluded_dirs: Vec<PathBuf>,
46} 48}
47 49
@@ -58,7 +60,11 @@ impl std::ops::Deref for Roots {
58 60
59impl RootConfig { 61impl RootConfig {
60 fn new(root: PathBuf, excluded_dirs: Vec<PathBuf>) -> RootConfig { 62 fn new(root: PathBuf, excluded_dirs: Vec<PathBuf>) -> RootConfig {
61 RootConfig { root, excluded_dirs } 63 let mut canonical_root = root.canonicalize().ok();
64 if Some(&root) == canonical_root.as_ref() {
65 canonical_root = None;
66 }
67 RootConfig { root, canonical_root, excluded_dirs }
62 } 68 }
63 /// Checks if root contains a path and returns a root-relative path. 69 /// Checks if root contains a path and returns a root-relative path.
64 pub(crate) fn contains(&self, path: &Path) -> Option<RelativePathBuf> { 70 pub(crate) fn contains(&self, path: &Path) -> Option<RelativePathBuf> {
@@ -66,7 +72,14 @@ impl RootConfig {
66 if self.excluded_dirs.iter().any(|it| path.starts_with(it)) { 72 if self.excluded_dirs.iter().any(|it| path.starts_with(it)) {
67 return None; 73 return None;
68 } 74 }
69 let rel_path = path.strip_prefix(&self.root).ok()?; 75 let rel_path = path.strip_prefix(&self.root)
76 .or_else(|err_payload| {
77 self.canonical_root
78 .as_ref()
79 .map_or(Err(err_payload),
80 |canonical_root| path.strip_prefix(canonical_root))
81 })
82 .ok()?;
70 let rel_path = RelativePathBuf::from_path(rel_path).ok()?; 83 let rel_path = RelativePathBuf::from_path(rel_path).ok()?;
71 84
72 // Ignore some common directories. 85 // Ignore some common directories.