aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lua/nvim-treesitter/install.lua185
-rw-r--r--lua/nvim-treesitter/shell_command_selectors.lua175
2 files changed, 184 insertions, 176 deletions
diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua
index 1069cae97..f6ba1724f 100644
--- a/lua/nvim-treesitter/install.lua
+++ b/lua/nvim-treesitter/install.lua
@@ -6,6 +6,7 @@ local utils = require'nvim-treesitter.utils'
local parsers = require'nvim-treesitter.parsers'
local info = require'nvim-treesitter.info'
local configs = require'nvim-treesitter.configs'
+local shell_command_selectors = require'nvim-treesitter.shell_command_selectors'
local M = {}
local lockfile = {}
@@ -37,52 +38,6 @@ local function get_revision(lang)
return (lockfile[lang] and lockfile[lang].revision)
end
-local function select_mkdir_cmd(directory, cwd, info_msg)
- if fn.has('win32') == 1 then
- return {
- cmd = 'cmd',
- opts = {
- args = { '/C', 'mkdir', directory},
- cwd = cwd,
- },
- info = info_msg,
- err = "Could not create "..directory,
- }
- else
- return {
- cmd = 'mkdir',
- opts = {
- args = { directory },
- cwd = cwd,
- },
- info = info_msg,
- err = "Could not create "..directory,
- }
- end
-end
-
-local function select_rm_file_cmd(file, info_msg)
- if fn.has('win32') == 1 then
- return {
- cmd = 'cmd',
- opts = {
- args = { '/C', 'if', 'exist', file, 'del', file },
- },
- info = info_msg,
- err = "Could not delete "..file,
- }
- else
- return {
- cmd = 'rm',
- opts = {
- args = { file },
- },
- info = info_msg,
- err = "Could not delete "..file,
- }
- end
-end
-
function M.iter_cmd(cmd_list, i, lang, success_message)
if i == 1 then
started_commands = started_commands + 1
@@ -146,129 +101,6 @@ local function iter_cmd_sync(cmd_list)
return true
end
-local function select_executable(executables)
- return vim.tbl_filter(function(c) return fn.executable(c) == 1 end, executables)[1]
-end
-
-local function select_args(repo)
- local args = {
- '-o',
- 'parser.so',
- '-I./src',
- repo.files,
- '-shared',
- '-Os',
- '-lstdc++',
- }
- if fn.has('win32') == 0 then
- table.insert(args, '-fPIC')
- end
- return args
-end
-
-local function select_install_rm_cmd(cache_folder, project_name)
- if fn.has('win32') == 1 then
- local dir = cache_folder ..'\\'.. project_name
- return {
- cmd = 'cmd',
- opts = {
- args = { '/C', 'if', 'exist', dir, 'rmdir', '/s', '/q', dir },
- }
- }
- else
- return {
- cmd = 'rm',
- opts = {
- args = { '-rf', cache_folder..'/'..project_name },
- }
- }
- end
-end
-
-local function select_mv_cmd(from, to, cwd)
- if fn.has('win32') == 1 then
- return {
- cmd = 'cmd',
- opts = {
- args = { '/C', 'move', '/Y', from, to },
- cwd = cwd,
- }
- }
- else
- return {
- cmd = 'mv',
- opts = {
- args = { from, to },
- cwd = cwd,
- },
- }
- end
-end
-
-local function select_download_commands(repo, project_name, cache_folder, revision)
- if vim.fn.executable('tar') == 1 and vim.fn.executable('curl') == 1 and repo.url:find("github.com", 1, true) then
-
- revision = revision or repo.branch or "master"
- local path_sep = utils.get_path_sep()
- return {
- select_install_rm_cmd(cache_folder, project_name..'-tmp'),
- {
- cmd = 'curl',
- info = 'Downloading...',
- err = 'Error during download, please verify your internet connection',
- opts = {
- args = {
- '-L', -- follow redirects
- repo.url.."/archive/"..revision..".tar.gz",
- '--output',
- project_name..".tar.gz"
- },
- cwd = cache_folder,
- },
- },
- select_mkdir_cmd(project_name..'-tmp', cache_folder, 'Creating temporary directory'),
- {
- cmd = 'tar',
- info = 'Extracting...',
- err = 'Error during tarball extraction.',
- opts = {
- args = {
- '-xvf',
- project_name..".tar.gz",
- '-C',
- project_name..'-tmp',
- },
- cwd = cache_folder,
- },
- },
- select_rm_file_cmd(cache_folder..path_sep..project_name..".tar.gz"),
- select_mv_cmd(utils.join_path(project_name..'-tmp', repo.url:match('[^/]-$')..'-'..revision),
- project_name,
- cache_folder),
- select_install_rm_cmd(cache_folder, project_name..'-tmp')
- }
- else
- return {
- {
- cmd = 'git',
- info = 'Downloading...',
- err = 'Error during download, please verify your internet connection',
- opts = {
- args = {
- 'clone',
- '--single-branch',
- '--branch', repo.branch or 'master',
- '--depth', '1',
- repo.url,
- project_name
- },
- cwd = cache_folder,
- },
- }
- }
- end
-end
-
local function run_install(cache_folder, install_folder, lang, repo, with_sync)
parsers.reset_cache()
@@ -279,7 +111,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync)
local compile_location = cache_folder..path_sep..(repo.location or project_name)
local parser_lib_name = install_folder..path_sep..lang..".so"
- local cc = select_executable(M.compilers)
+ local cc = shell_command_selectors.select_executable(M.compilers)
if not cc then
api.nvim_err_writeln('No C compiler found! "'
..table.concat(vim.tbl_filter(function(c) return type(c) == 'string' end, M.compilers), '", "')
@@ -289,20 +121,21 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync)
local revision = configs.get_update_strategy() == 'lockfile' and get_revision(lang)
local command_list = {}
- vim.list_extend(command_list, { select_install_rm_cmd(cache_folder, project_name) })
- vim.list_extend(command_list, select_download_commands(repo, project_name, cache_folder, revision))
+ vim.list_extend(command_list, { shell_command_selectors.select_install_rm_cmd(cache_folder, project_name) })
+ vim.list_extend(command_list,
+ shell_command_selectors.select_download_commands(repo, project_name, cache_folder, revision))
vim.list_extend(command_list, {
{
cmd = cc,
info = 'Compiling...',
err = 'Error during compilation',
opts = {
- args = vim.tbl_flatten(select_args(repo)),
+ args = vim.tbl_flatten(shell_command_selectors.select_compiler_args(repo)),
cwd = compile_location
}
},
- select_mv_cmd('parser.so', parser_lib_name, compile_location),
- select_install_rm_cmd(cache_folder, project_name)
+ shell_command_selectors.select_mv_cmd('parser.so', parser_lib_name, compile_location),
+ shell_command_selectors.select_install_rm_cmd(cache_folder, project_name)
})
if with_sync then
@@ -402,7 +235,7 @@ function M.uninstall(lang)
local parser_lib = install_dir..path_sep..lang..".so"
local command_list = {
- select_rm_file_cmd(parser_lib, "Uninstalling parser for "..lang)
+ shell_command_selectors.select_rm_file_cmd(parser_lib, "Uninstalling parser for "..lang)
}
M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled')
end
diff --git a/lua/nvim-treesitter/shell_command_selectors.lua b/lua/nvim-treesitter/shell_command_selectors.lua
new file mode 100644
index 000000000..17cbb78cb
--- /dev/null
+++ b/lua/nvim-treesitter/shell_command_selectors.lua
@@ -0,0 +1,175 @@
+local fn = vim.fn
+local utils = require'nvim-treesitter.utils'
+
+local M = {}
+
+function M.select_mkdir_cmd(directory, cwd, info_msg)
+ if fn.has('win32') == 1 then
+ return {
+ cmd = 'cmd',
+ opts = {
+ args = { '/C', 'mkdir', directory},
+ cwd = cwd,
+ },
+ info = info_msg,
+ err = "Could not create "..directory,
+ }
+ else
+ return {
+ cmd = 'mkdir',
+ opts = {
+ args = { directory },
+ cwd = cwd,
+ },
+ info = info_msg,
+ err = "Could not create "..directory,
+ }
+ end
+end
+
+function M.select_rm_file_cmd(file, info_msg)
+ if fn.has('win32') == 1 then
+ return {
+ cmd = 'cmd',
+ opts = {
+ args = { '/C', 'if', 'exist', file, 'del', file },
+ },
+ info = info_msg,
+ err = "Could not delete "..file,
+ }
+ else
+ return {
+ cmd = 'rm',
+ opts = {
+ args = { file },
+ },
+ info = info_msg,
+ err = "Could not delete "..file,
+ }
+ end
+end
+
+function M.select_executable(executables)
+ return vim.tbl_filter(function(c) return fn.executable(c) == 1 end, executables)[1]
+end
+
+function M.select_compiler_args(repo)
+ local args = {
+ '-o',
+ 'parser.so',
+ '-I./src',
+ repo.files,
+ '-shared',
+ '-Os',
+ '-lstdc++',
+ }
+ if fn.has('win32') == 0 then
+ table.insert(args, '-fPIC')
+ end
+ return args
+end
+
+function M.select_install_rm_cmd(cache_folder, project_name)
+ if fn.has('win32') == 1 then
+ local dir = cache_folder ..'\\'.. project_name
+ return {
+ cmd = 'cmd',
+ opts = {
+ args = { '/C', 'if', 'exist', dir, 'rmdir', '/s', '/q', dir },
+ }
+ }
+ else
+ return {
+ cmd = 'rm',
+ opts = {
+ args = { '-rf', cache_folder..'/'..project_name },
+ }
+ }
+ end
+end
+
+function M.select_mv_cmd(from, to, cwd)
+ if fn.has('win32') == 1 then
+ return {
+ cmd = 'cmd',
+ opts = {
+ args = { '/C', 'move', '/Y', from, to },
+ cwd = cwd,
+ }
+ }
+ else
+ return {
+ cmd = 'mv',
+ opts = {
+ args = { from, to },
+ cwd = cwd,
+ },
+ }
+ end
+end
+
+function M.select_download_commands(repo, project_name, cache_folder, revision)
+ if vim.fn.executable('tar') == 1 and vim.fn.executable('curl') == 1 and repo.url:find("github.com", 1, true) then
+
+ revision = revision or repo.branch or "master"
+ local path_sep = utils.get_path_sep()
+ return {
+ M.select_install_rm_cmd(cache_folder, project_name..'-tmp'),
+ {
+ cmd = 'curl',
+ info = 'Downloading...',
+ err = 'Error during download, please verify your internet connection',
+ opts = {
+ args = {
+ '-L', -- follow redirects
+ repo.url.."/archive/"..revision..".tar.gz",
+ '--output',
+ project_name..".tar.gz"
+ },
+ cwd = cache_folder,
+ },
+ },
+ M.select_mkdir_cmd(project_name..'-tmp', cache_folder, 'Creating temporary directory'),
+ {
+ cmd = 'tar',
+ info = 'Extracting...',
+ err = 'Error during tarball extraction.',
+ opts = {
+ args = {
+ '-xvf',
+ project_name..".tar.gz",
+ '-C',
+ project_name..'-tmp',
+ },
+ cwd = cache_folder,
+ },
+ },
+ M.select_rm_file_cmd(cache_folder..path_sep..project_name..".tar.gz"),
+ M.select_mv_cmd(utils.join_path(project_name..'-tmp', repo.url:match('[^/]-$')..'-'..revision),
+ project_name,
+ cache_folder),
+ M.select_install_rm_cmd(cache_folder, project_name..'-tmp')
+ }
+ else
+ return {
+ {
+ cmd = 'git',
+ info = 'Downloading...',
+ err = 'Error during download, please verify your internet connection',
+ opts = {
+ args = {
+ 'clone',
+ '--single-branch',
+ '--branch', repo.branch or 'master',
+ '--depth', '1',
+ repo.url,
+ project_name
+ },
+ cwd = cache_folder,
+ },
+ }
+ }
+ end
+end
+
+return M