From 92bd470f0da0c4d97888bd257e7066f5d05a942a Mon Sep 17 00:00:00 2001 From: Violet Shreve Date: Mon, 3 Jul 2023 17:56:31 -0400 Subject: [PATCH] fix(path): make find_upwards() search root The previous implementation of `Path:find_upwards()` used the loop condition `folder ~= root` to bound the search which meant the root directory would never be searched. This commit instead breaks the `while true` loop after searching the root directory. The function now also returns `nil` rather than a blank string to indicate that the search has failed. Finally, this commit adds specs for the function. --- lua/plenary/path.lua | 5 ++++- tests/plenary/path_spec.lua | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lua/plenary/path.lua b/lua/plenary/path.lua index 701679e6..0865f2e3 100644 --- a/lua/plenary/path.lua +++ b/lua/plenary/path.lua @@ -931,11 +931,14 @@ function Path:find_upwards(filename) local folder = Path:new(self) local root = path.root(folder:absolute()) - while folder:absolute() ~= root do + while true do local p = folder:joinpath(filename) if p:exists() then return p end + if folder:absolute() == root then + break + end folder = folder:parent() end return nil diff --git a/tests/plenary/path_spec.lua b/tests/plenary/path_spec.lua index 8f916a30..0f02db04 100644 --- a/tests/plenary/path_spec.lua +++ b/tests/plenary/path_spec.lua @@ -721,6 +721,34 @@ SOFTWARE.]] assert.are.same(should, data) end) end) + + describe(":find_upwards", function() + it("finds files that exist", function() + local p = Path:new(debug.getinfo(1, "S").source:sub(2)) + local found = p:find_upwards "README.md" + assert.are.same(found:absolute(), Path:new("README.md"):absolute()) + end) + + it("finds files that exist at the root", function() + local p = Path:new(debug.getinfo(1, "S").source:sub(2)) + + -- Temporarily set path.root to the root of this repository + local root = p.path.root + p.path.root = function(_) + return p:parent():parent():parent().filename + end + + local found = p:find_upwards "README.md" + assert.are.same(found:absolute(), Path:new("README.md"):absolute()) + p.path.root = root + end) + + it("returns nil if no file is found", function() + local p = Path:new(debug.getinfo(1, "S").source:sub(2)) + local found = p:find_upwards "MISSINGNO.md" + assert.are.same(found, nil) + end) + end) end) -- function TestPath:testIsDir()