mirror of
https://github.com/bjc/prosody.git
synced 2025-04-01 20:27:39 +03:00
A casual search suggests that the majority of paths.join() calls involve only two arguments. This saves the creation of a table for up to 3 arguments. Looks like 3x faster for 3 arguments or less, 5% slower when it uses the array to concatenate.
70 lines
2.1 KiB
Lua
70 lines
2.1 KiB
Lua
local t_concat = table.concat;
|
|
|
|
local path_sep = package.config:sub(1,1);
|
|
|
|
local path_util = {}
|
|
|
|
-- Helper function to resolve relative paths (needed by config)
|
|
function path_util.resolve_relative_path(parent_path, path)
|
|
if path then
|
|
-- Some normalization
|
|
parent_path = parent_path:gsub("%"..path_sep.."+$", "");
|
|
path = path:gsub("^%.%"..path_sep.."+", "");
|
|
|
|
local is_relative;
|
|
if path_sep == "/" and path:sub(1,1) ~= "/" then
|
|
is_relative = true;
|
|
elseif path_sep == "\\" and (path:sub(1,1) ~= "/" and (path:sub(2,3) ~= ":\\" and path:sub(2,3) ~= ":/")) then
|
|
is_relative = true;
|
|
end
|
|
if is_relative then
|
|
return parent_path..path_sep..path;
|
|
end
|
|
end
|
|
return path;
|
|
end
|
|
|
|
-- Helper function to convert a glob to a Lua pattern
|
|
function path_util.glob_to_pattern(glob)
|
|
return "^"..glob:gsub("[%p*?]", function (c)
|
|
if c == "*" then
|
|
return ".*";
|
|
elseif c == "?" then
|
|
return ".";
|
|
else
|
|
return "%"..c;
|
|
end
|
|
end).."$";
|
|
end
|
|
|
|
function path_util.join(a, b, c, ...) -- (... : string) --> string
|
|
-- Optimization: Avoid creating table for most uses
|
|
if b then
|
|
if c then
|
|
if ... then
|
|
return t_concat({a,b,c,...}, path_sep);
|
|
end
|
|
return a..path_sep..b..path_sep..c;
|
|
end
|
|
return a..path_sep..b;
|
|
end
|
|
return a;
|
|
end
|
|
|
|
function path_util.complement_lua_path(installer_plugin_path)
|
|
-- Checking for duplicates
|
|
-- The commands using luarocks need the path to the directory that has the /share and /lib folders.
|
|
local lua_version = _VERSION:match(" (.+)$");
|
|
local lua_path_sep = package.config:sub(3,3);
|
|
local dir_sep = package.config:sub(1,1);
|
|
local sub_path = dir_sep.."lua"..dir_sep..lua_version..dir_sep;
|
|
if not string.find(package.path, installer_plugin_path, 1, true) then
|
|
package.path = package.path..lua_path_sep..installer_plugin_path..dir_sep.."share"..sub_path.."?.lua";
|
|
package.path = package.path..lua_path_sep..installer_plugin_path..dir_sep.."share"..sub_path.."?"..dir_sep.."init.lua";
|
|
end
|
|
if not string.find(package.path, installer_plugin_path, 1, true) then
|
|
package.cpath = package.cpath..lua_path_sep..installer_plugin_path..dir_sep.."lib"..sub_path.."?.so";
|
|
end
|
|
end
|
|
|
|
return path_util;
|