Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(path): make find_upwards() search root #506

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
shreve committed Nov 18, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit e77bf2f5bf8598428bad061b29ac48d13fe3c182
8 changes: 6 additions & 2 deletions lua/plenary/path.lua
Original file line number Diff line number Diff line change
@@ -931,14 +931,18 @@ function Path:find_upwards(filename)
local folder = Path:new(self)
local root = path.root(folder)

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 ""

return nil
shreve marked this conversation as resolved.
Show resolved Hide resolved
end

return Path
28 changes: 28 additions & 0 deletions tests/plenary/path_spec.lua
Original file line number Diff line number Diff line change
@@ -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()