From 76ea2b8871d2d053da46a7202efec12020d9c76e Mon Sep 17 00:00:00 2001 From: Shane Hird Date: Thu, 24 Jun 2021 23:20:29 +1000 Subject: TSUpdate does not install if up to date --- lua/nvim-treesitter/configs.lua | 2 +- lua/nvim-treesitter/install.lua | 173 +++++++++++++++++++++++----------------- lua/nvim-treesitter/utils.lua | 2 +- 3 files changed, 102 insertions(+), 75 deletions(-) (limited to 'lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index f6815a80f..2428b826b 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -332,7 +332,7 @@ function M.setup(user_data) local ensure_installed = user_data.ensure_installed or {} if #ensure_installed > 0 then - require'nvim-treesitter.install'.ensure_installed(ensure_installed) + require'nvim-treesitter.install'.ensure_installed('',ensure_installed) end config.modules.ensure_installed = nil diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index 44506606e..46d0bc7fe 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -50,6 +50,10 @@ local function get_installed_revision(lang) end end +local function is_installed(lang) + return #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0 +end + local function needs_update(lang) return not get_revision(lang) or get_revision(lang) ~= get_installed_revision(lang) end @@ -280,9 +284,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync, end local function install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) - if #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0 then - if bang ~= '!' then return 1 end - end + if is_installed(lang) and bang ~= '!' then return 1 end local parser_config = parsers.get_parser_configs()[lang] if not parser_config then @@ -305,90 +307,110 @@ local function install(options) local generate_from_grammar = options.generate_from_grammar local exclude_configured_parsers = options.exclude_configured_parsers - return function (bang, ...) - if fn.executable('git') == 0 then - return api.nvim_err_writeln('Git is required on your system to run this command') - end + return function (bang) + return function (...) + if fn.executable('git') == 0 then + return api.nvim_err_writeln('Git is required on your system to run this command') + end - local cache_folder, err = utils.get_cache_dir() - if err then return api.nvim_err_writeln(err) end + local cache_folder, err = utils.get_cache_dir() + if err then return api.nvim_err_writeln(err) end - local install_folder, err = utils.get_parser_install_dir() - if err then return api.nvim_err_writeln(err) end + local install_folder, err = utils.get_parser_install_dir() + if err then return api.nvim_err_writeln(err) end - local languages - if ... == 'all' then - languages = parsers.available_parsers() - elseif ... == 'maintained' then - languages = parsers.maintained_parsers() - else - languages = vim.tbl_flatten({...}) - end + local languages + if ... == 'all' then + languages = parsers.available_parsers() + elseif ... == 'maintained' then + languages = parsers.maintained_parsers() + else + languages = vim.tbl_flatten({...}) + end - if exclude_configured_parsers then - languages = utils.difference(languages, configs.get_ignored_parser_installs()) - end + if exclude_configured_parsers then + languages = utils.difference(languages, configs.get_ignored_parser_installs()) + end - if #languages > 1 then - reset_progress_counter() - end + if #languages > 1 then + reset_progress_counter() + end - local skipped = 0 - for _, lang in ipairs(languages) do - skipped = skipped + install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) - end - if skipped > 0 then - print('Parsers already installed. Use :TSInstall! to force reinstallation.') + local skipped = 0 + for _, lang in ipairs(languages) do + skipped = skipped + install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) + end + if skipped > 0 then + print('Parsers already installed. Use :TSInstall! to force reinstallation.') + end end end end -function M.update(bang, lang) - M.lockfile = {} - reset_progress_counter() - if lang and lang ~= 'all' then - install({})('!', lang) - else - local parsers_to_update = configs.get_update_strategy() == 'lockfile' - and outdated_parsers() - or info.installed_parsers() - if #parsers_to_update == 0 then - print('All parsers are up-to-date!') - end - for _, lang in pairs(parsers_to_update) do - install({ - exclude_configured_parsers = true - })('!', lang) +function M.update(options) + options = options or {} + return function(bang) + return function (...) + M.lockfile = {} + reset_progress_counter() + if ... and ... ~= 'all' then + local languages = vim.tbl_flatten({...}) + local installed = 0 + for _, lang in ipairs(languages) do + if (not is_installed(lang)) or (needs_update(lang)) then + installed = installed + 1 + install({ with_sync = options.with_sync })('!')(lang) + end + end + if installed == 0 then + print('Parsers are up-to-date!') + end + else + local parsers_to_update = configs.get_update_strategy() == 'lockfile' + and outdated_parsers() + or info.installed_parsers() + if #parsers_to_update == 0 then + print('All parsers are up-to-date!') + end + for _, lang in pairs(parsers_to_update) do + install({ + exclude_configured_parsers = true, + with_sync = options.with_sync + })('!')(lang) + end + end end end end -function M.uninstall(bang,lang) - local path_sep = '/' - if fn.has('win32') == 1 then - path_sep = '\\' - end - - if vim.tbl_contains({'all', 'maintained'}, lang) then - reset_progress_counter() - local installed = info.installed_parsers() - if lang == "maintained" then - local maintained = parsers.maintained_parsers() - installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed) - end - for _, lang in pairs(installed) do - M.uninstall(lang) +function M.uninstall(bang) + return function (lang) + local path_sep = '/' + if fn.has('win32') == 1 then + path_sep = '\\' end - elseif lang then - local install_dir, err = utils.get_parser_install_dir() - if err then return api.nvim_err_writeln(err) end - local parser_lib = install_dir..path_sep..lang..".so" + if vim.tbl_contains({'all', 'maintained'}, lang) then + reset_progress_counter() + local installed = info.installed_parsers() + if lang == "maintained" then + local maintained = parsers.maintained_parsers() + installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed) + end + for _, langitem in pairs(installed) do + M.uninstall(langitem) + end + elseif lang then + local install_dir, err = utils.get_parser_install_dir() + if err then return api.nvim_err_writeln(err) end + + local parser_lib = install_dir..path_sep..lang..".so" - local command_list = { - shell.select_rm_file_cmd(parser_lib, "Uninstalling parser for "..lang) - } - M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled') + local command_list = { + shell.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 end end @@ -453,10 +475,16 @@ M.commands = { }, }, TSUpdate = { - run = M.update, + run = M.update({}), + args = { + "-nargs=*", + "-complete=custom,nvim_treesitter#installed_parsers", + }, + }, + TSUpdateSync = { + run = M.update({ with_sync = true }), args = { "-nargs=*", - "-bang", "-complete=custom,nvim_treesitter#installed_parsers", }, }, @@ -464,7 +492,6 @@ M.commands = { run = M.uninstall, args = { "-nargs=+", - "-bang", "-complete=custom,nvim_treesitter#installed_parsers", }, }, diff --git a/lua/nvim-treesitter/utils.lua b/lua/nvim-treesitter/utils.lua index 8a73a66b5..fff04bcfb 100644 --- a/lua/nvim-treesitter/utils.lua +++ b/lua/nvim-treesitter/utils.lua @@ -6,7 +6,7 @@ local M = {} function M.setup_commands(mod, commands) for command_name, def in pairs(commands) do - local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('',)", mod, command_name) + local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('')()", mod, command_name) local parts = vim.tbl_flatten({ "command!", def.args, -- cgit v1.2.3-70-g09d2