Skip to content

Commit

Permalink
fix(path): make find_upwards() search root (#506)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
shreve authored Feb 11, 2025
1 parent f031bef commit d3bc384
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
5 changes: 4 additions & 1 deletion lua/plenary/path.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions tests/plenary/path_spec.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit d3bc384

Please sign in to comment.