Ensure correct tools installation in goenv mode (#332)
* Ensure correct tools installation in goenv mode Tools will be installed in appropriated directory when [goenv](https://github.com/syndbg/goenv) manages GOPATH. * Check goenv existence with which * Try better (?) goenv detection command * Do not check if tool is installed twice Once a tool is known to be installed, that information is cached in utils.installed_tools. * Wait 500ms for action to take effect in tests
This commit is contained in:
parent
40684d1ee0
commit
8ea5439288
@ -35,16 +35,38 @@ for tool, _ in pairs(url) do
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function is_installed(bin)
|
local function is_installed(bin)
|
||||||
local env_path = os.getenv('PATH')
|
if utils.installed_tools[bin] then
|
||||||
if vim.fn.executable(bin) == 1 then
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
local sep = utils.sep2()
|
local sep = utils.sep2()
|
||||||
local ext = utils.ext()
|
local ext = utils.ext()
|
||||||
|
|
||||||
|
|
||||||
|
if utils.goenv_mode() then
|
||||||
|
local cwd = vim.fn.getcwd()
|
||||||
|
local cmd = "cd " .. cwd .. " && goenv which " .. bin .. " 2>&1"
|
||||||
|
|
||||||
|
local status = os.execute(cmd)
|
||||||
|
|
||||||
|
if status == 0 then
|
||||||
|
utils.installed_tools[bin] = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if vim.fn.executable(bin) == 1 then
|
||||||
|
utils.installed_tools[bin] = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local env_path = os.getenv('PATH')
|
||||||
local base_paths = vim.split(env_path, sep, true)
|
local base_paths = vim.split(env_path, sep, true)
|
||||||
|
|
||||||
for _, value in pairs(base_paths) do
|
for _, value in pairs(base_paths) do
|
||||||
if uv.fs_stat(value .. DIR_SEP .. bin .. ext) then
|
if uv.fs_stat(value .. DIR_SEP .. bin .. ext) then
|
||||||
|
utils.installed_tools[bin] = true
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -63,6 +85,9 @@ local function go_install_sync(pkg)
|
|||||||
|
|
||||||
u = u .. '@latest'
|
u = u .. '@latest'
|
||||||
local setup = { 'go', 'install', u }
|
local setup = { 'go', 'install', u }
|
||||||
|
if utils.goenv_mode() then
|
||||||
|
setup = { 'goenv', 'exec', 'go', 'install', u }
|
||||||
|
end
|
||||||
local output = vim.fn.system(table.concat(setup, ' '))
|
local output = vim.fn.system(table.concat(setup, ' '))
|
||||||
if vim.v.shell_error ~= 0 then
|
if vim.v.shell_error ~= 0 then
|
||||||
vim.notify('install ' .. pkg .. ' failed: ' .. output, vim.log.levels.ERROR)
|
vim.notify('install ' .. pkg .. ' failed: ' .. output, vim.log.levels.ERROR)
|
||||||
@ -83,6 +108,9 @@ local function go_install(pkg)
|
|||||||
|
|
||||||
u = u .. '@latest'
|
u = u .. '@latest'
|
||||||
local setup = { 'go', 'install', u }
|
local setup = { 'go', 'install', u }
|
||||||
|
if utils.goenv_mode() then
|
||||||
|
setup = { 'goenv', 'exec', 'go', 'install', u }
|
||||||
|
end
|
||||||
|
|
||||||
vim.fn.jobstart(setup, {
|
vim.fn.jobstart(setup, {
|
||||||
on_stdout = function(_, data, _)
|
on_stdout = function(_, data, _)
|
||||||
|
@ -47,6 +47,7 @@ function util.ext()
|
|||||||
end
|
end
|
||||||
return ''
|
return ''
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_path_sep()
|
local function get_path_sep()
|
||||||
if is_windows then
|
if is_windows then
|
||||||
return ';'
|
return ';'
|
||||||
@ -190,7 +191,7 @@ end
|
|||||||
|
|
||||||
util.map = function(modes, key, result, options)
|
util.map = function(modes, key, result, options)
|
||||||
options =
|
options =
|
||||||
util.merge({ noremap = true, silent = false, expr = false, nowait = false }, options or {})
|
util.merge({ noremap = true, silent = false, expr = false, nowait = false }, options or {})
|
||||||
local buffer = options.buffer
|
local buffer = options.buffer
|
||||||
options.buffer = nil
|
options.buffer = nil
|
||||||
|
|
||||||
@ -291,7 +292,8 @@ util.log = function(...)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
util.trace = function(...) end
|
util.trace = function(...)
|
||||||
|
end
|
||||||
|
|
||||||
local rhs_options = {}
|
local rhs_options = {}
|
||||||
|
|
||||||
@ -446,7 +448,7 @@ end
|
|||||||
|
|
||||||
function util.relative_to_cwd(name)
|
function util.relative_to_cwd(name)
|
||||||
local rel = fn.isdirectory(name) == 0 and fn.fnamemodify(name, ':h:.')
|
local rel = fn.isdirectory(name) == 0 and fn.fnamemodify(name, ':h:.')
|
||||||
or fn.fnamemodify(name, ':.')
|
or fn.fnamemodify(name, ':.')
|
||||||
if rel == '.' then
|
if rel == '.' then
|
||||||
return '.'
|
return '.'
|
||||||
else
|
else
|
||||||
@ -652,6 +654,7 @@ function util.get_active_buf()
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
-- for l:item in l:blist
|
-- for l:item in l:blist
|
||||||
-- "skip unnamed buffers; also skip hidden buffers?
|
-- "skip unnamed buffers; also skip hidden buffers?
|
||||||
-- if empty(l:item.name) || l:item.hidden
|
-- if empty(l:item.name) || l:item.hidden
|
||||||
@ -747,7 +750,7 @@ function util.uuid()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local lorem =
|
local lorem =
|
||||||
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum'
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum'
|
||||||
function util.lorem()
|
function util.lorem()
|
||||||
return lorem
|
return lorem
|
||||||
end
|
end
|
||||||
@ -828,7 +831,6 @@ util.extract_filepath = function(msg, pkg_path)
|
|||||||
msg = msg or ''
|
msg = msg or ''
|
||||||
-- util.log(msg)
|
-- util.log(msg)
|
||||||
--[[ or [[ findAllSubStr_test.go:234: Error inserting caseResult1: operation error DynamoDB: PutItem, exceeded maximum number of attempts]]
|
--[[ or [[ findAllSubStr_test.go:234: Error inserting caseResult1: operation error DynamoDB: PutItem, exceeded maximum number of attempts]]
|
||||||
|
|
||||||
-- or 'path/path2/filename.go:50:11: Error invaild
|
-- or 'path/path2/filename.go:50:11: Error invaild
|
||||||
-- or /home/ray/go/src/github/sample/app/driver.go:342 +0x19e5
|
-- or /home/ray/go/src/github/sample/app/driver.go:342 +0x19e5
|
||||||
local ma = fn.matchlist(msg, [[\v\s*(\w+.+\.go):(\d+):]])
|
local ma = fn.matchlist(msg, [[\v\s*(\w+.+\.go):(\d+):]])
|
||||||
@ -907,4 +909,21 @@ util.remove_ansi_escape = function(str)
|
|||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Keeps track of tools that are already installed.
|
||||||
|
-- The keys are the names of tools and the values are booleans
|
||||||
|
-- indicating whether the tools is available or not.
|
||||||
|
util.installed_tools = {}
|
||||||
|
|
||||||
|
-- Check if host has goenv in path.
|
||||||
|
util.goenv_mode = function()
|
||||||
|
if is_windows then
|
||||||
|
-- always return false for Windows because goenv doesn't seem to be supported there.
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local cmd = "command -v goenv > /dev/null 2>&1"
|
||||||
|
local status = os.execute(cmd)
|
||||||
|
return status == 0
|
||||||
|
end
|
||||||
|
|
||||||
return util
|
return util
|
||||||
|
@ -6,6 +6,9 @@ local cur_dir = vim.fn.expand("%:p:h")
|
|||||||
-- local status = require("plenary.reload").reload_module("go.nvim")
|
-- local status = require("plenary.reload").reload_module("go.nvim")
|
||||||
-- status = require("plenary.reload").reload_module("nvim-treesitter")
|
-- status = require("plenary.reload").reload_module("nvim-treesitter")
|
||||||
|
|
||||||
|
-- time to wait for action to take effect
|
||||||
|
local wait_time = 500
|
||||||
|
|
||||||
-- local ulog = require('go.utils').log
|
-- local ulog = require('go.utils').log
|
||||||
describe("should run gotags", function()
|
describe("should run gotags", function()
|
||||||
local cmd
|
local cmd
|
||||||
@ -37,7 +40,7 @@ describe("should run gotags", function()
|
|||||||
local gotags = require("go.tags")
|
local gotags = require("go.tags")
|
||||||
gotags.add()
|
gotags.add()
|
||||||
-- enable the channel response
|
-- enable the channel response
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
||||||
-- ulog("tagged file: " .. fmt)
|
-- ulog("tagged file: " .. fmt)
|
||||||
@ -71,13 +74,13 @@ describe("should run gotags", function()
|
|||||||
local gotags = require("go.tags")
|
local gotags = require("go.tags")
|
||||||
gotags.rm('json')
|
gotags.rm('json')
|
||||||
-- enable the channel response
|
-- enable the channel response
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- format the code
|
-- format the code
|
||||||
local gofmt = require("go.format")
|
local gofmt = require("go.format")
|
||||||
gofmt.gofmt()
|
gofmt.gofmt()
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
||||||
-- ulog("tagged file: " .. fmt)
|
-- ulog("tagged file: " .. fmt)
|
||||||
@ -111,12 +114,12 @@ describe("should run gotags", function()
|
|||||||
local gotags = require("go.tags")
|
local gotags = require("go.tags")
|
||||||
gotags.rm()
|
gotags.rm()
|
||||||
-- enable the channel response
|
-- enable the channel response
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local gofmt = require("go.format")
|
local gofmt = require("go.format")
|
||||||
gofmt.gofmt()
|
gofmt.gofmt()
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
||||||
@ -152,12 +155,12 @@ describe("should run gotags", function()
|
|||||||
local gotags = require("go.tags")
|
local gotags = require("go.tags")
|
||||||
gotags.rm()
|
gotags.rm()
|
||||||
-- enable the channel response
|
-- enable the channel response
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local gofmt = require("go.format")
|
local gofmt = require("go.format")
|
||||||
gofmt.gofmt()
|
gofmt.gofmt()
|
||||||
vim.wait(100, function()
|
vim.wait(wait_time, function()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
local fmt = vim.fn.join(vim.fn.readfile(name), "\n")
|
||||||
|
Loading…
Reference in New Issue
Block a user