From 0c2abf8316b3e56f33b3f70264897151cf9cd36c Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 27 Jul 2023 09:38:51 -0400 Subject: [PATCH] Avoid walking past root when resolving imports (#6126) ## Summary Noticed in #5954: we walk _past_ the root rather than stopping _at_ the root when attempting to traverse along the parent path. It's effectively an off-by-one bug. --- crates/ruff_python_resolver/src/resolver.rs | 51 +++++++++------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/crates/ruff_python_resolver/src/resolver.rs b/crates/ruff_python_resolver/src/resolver.rs index 86b2d5e5b8..2ea16acca4 100644 --- a/crates/ruff_python_resolver/src/resolver.rs +++ b/crates/ruff_python_resolver/src/resolver.rs @@ -715,37 +715,28 @@ pub(crate) fn resolve_import( // importing file's directory, then the parent directory, and so on, until the // import root is reached. let root = execution_environment.root.as_path(); - if source_file.starts_with(root) { - let mut current = source_file; - while let Some(parent) = current.parent() { - if parent == root { - break; - } - - debug!("Resolving absolute import in parent: {}", parent.display()); - - let mut result = resolve_absolute_import( - parent, - module_descriptor, - false, - false, - false, - true, - false, - ); - - if result.is_import_found { - if let Some(implicit_imports) = result - .implicit_imports - .filter(&module_descriptor.imported_symbols) - { - result.implicit_imports = implicit_imports; - } - return result; - } - - current = parent; + let mut current = source_file; + while let Some(parent) = current.parent() { + if !parent.starts_with(root) { + break; } + + debug!("Resolving absolute import in parent: {}", parent.display()); + + let mut result = + resolve_absolute_import(parent, module_descriptor, false, false, false, true, false); + + if result.is_import_found { + if let Some(implicit_imports) = result + .implicit_imports + .filter(&module_descriptor.imported_symbols) + { + result.implicit_imports = implicit_imports; + } + return result; + } + + current = parent; } ImportResult::not_found()