diff --git a/lib/luvit/path.lua b/lib/luvit/path.lua index 8f0ee405e..367e8e02e 100644 --- a/lib/luvit/path.lua +++ b/lib/luvit/path.lua @@ -90,7 +90,23 @@ function Path:normalize(filepath) end function Path:join(...) - return table.concat({...}, self.sep) + local parts = {...} + for i, part in ipairs(parts) do + -- Strip leading slashes on all but first item + if i > 1 then + while part:sub(1, 1) == self.sep do + part = part:sub(2) + end + end + -- Strip trailing slashes on all but last item + if i < #parts then + while part:sub(#part) == self.sep do + part = part:sub(1, #part - 1) + end + end + parts[i] = part + end + return table.concat(parts, self.sep) end function Path:resolve(root, filepath) diff --git a/tests/test-path.lua b/tests/test-path.lua index 98a883939..f6859f06e 100644 --- a/tests/test-path.lua +++ b/tests/test-path.lua @@ -39,3 +39,16 @@ assert(path.posix:dirname('/usr/bin') == '/usr') assert(path.nt:dirname('C:\\Users\\philips\\vim.exe') == 'C:\\Users\\philips') assert(path.nt:dirname('C:\\Users\\philips\\') == 'C:\\Users') assert(path.nt:dirname('C:\\Users\\philips\\') == 'C:\\Users') + +assert(path.posix:join('foo', '/bar') == "foo/bar") +assert(path.posix:join('foo', 'bar') == "foo/bar") +assert(path.posix:join('foo/', 'bar') == "foo/bar") +assert(path.posix:join('foo/', '/bar') == "foo/bar") +assert(path.posix:join('/foo', '/bar') == "/foo/bar") +assert(path.posix:join('/foo', 'bar') == "/foo/bar") +assert(path.posix:join('/foo/', 'bar') == "/foo/bar") +assert(path.posix:join('/foo/', '/bar') == "/foo/bar") +assert(path.posix:join('foo', '/bar/') == "foo/bar/") +assert(path.posix:join('foo', 'bar/') == "foo/bar/") +assert(path.posix:join('foo/', 'bar/') == "foo/bar/") +assert(path.posix:join('foo/', '/bar/') == "foo/bar/")