vhyrro/luarocks.nvim

luarocks is not executable because .rocks directory is installed in temporary dir instead of plugin root

Opened this issue · 0 comments

When manually running nvim -l build.lua from within the plugin root directory, the .rocks directory ends up in /run/user/1000/luarocks-* instead of within the plugin root directory.

I tested this by I adding a print statement to paths.lua on the plugin_path variable:

local utils = require("luarocks-nvim.utils")

local plugin_path = utils.get_plugin_path()
print(plugin_path) <-- HERE
local rocks_path = utils.combine_paths(plugin_path, ".rocks")
local lib_extension = utils.is_win() and "?.dll" or "?.so"

When executing the build directly from the plugin root, the plugin path was printed as ".", whereas when run from inside Neovim, it was printed as the full path to the plugin root directory.

I wrote some code to fix the issue and it worked here.

-- utils.lua
local utils = {}

function utils.is_win()
	return vim.loop.os_uname().sysname:lower():find("windows")
end

function utils.get_path_separator()
	if utils.is_win() then
		return "\\"
	end
	return "/"
end

function utils.combine_paths(...)
	return table.concat({ ... }, utils.get_path_separator())
end

local function get_current_dir()
	if utils.is_win() then
		return os.getenv("CD")
	else
		return os.getenv("PWD")
	end
end

local function change_relative_to_absolute_path(path)
	local string_without_dot = path:sub(2)
	local absolute_path = get_current_dir()
	return (absolute_path .. string_without_dot)
end

local function path_is_relative(path)
	if path:sub(1,1) == "." and (path:sub(2,2) == "/" or path:sub(2,2) == "\\") then
		return true
	else
		return false
	end
end


function utils.get_plugin_path()
	local str = debug.getinfo(2, "S").source:sub(2)
	if utils.is_win() then
		str = str:gsub("/", "\\")
	end
	if path_is_relative(str) then
		str = change_relative_to_absolute_path(str)
	end
	return vim.fn.fnamemodify(str:match("(.*" .. utils.get_path_separator() .. ")"), ":h:h:h")
end

return utils

All I did was checking if the first char in the path is a '.' and if it is change the dot for the $PWD or CD for windows.