TSUpdate does not install if up to date

This commit is contained in:
Shane Hird 2021-06-24 23:20:29 +10:00 committed by Stephan Seitz
parent b46580fb66
commit 76ea2b8871
4 changed files with 126 additions and 88 deletions

View file

@ -184,10 +184,15 @@ Supported options:
COMMANDS *nvim-treesitter-commands* COMMANDS *nvim-treesitter-commands*
*:TSInstall* *:TSInstall*
:TSInstall| {language} ...~ :TSInstall {language} ...~
Install one or more treesitter parsers. Install one or more treesitter parsers.
You can use |:TSInstall| `all` to install all parsers. You can use |:TSInstall| `all` to install all parsers. Use |:TSInstall!| to
force the reinstallation of already installed parsers.
*:TSInstallSync*
:TSInstallSync {language} ...~
Perform the |:TSInstall| operation synchronously.
*:TSInstallInfo* *:TSInstallInfo*
:TSInstallInfo~ :TSInstallInfo~
@ -195,10 +200,16 @@ You can use |:TSInstall| `all` to install all parsers.
List informations about currently installed parsers List informations about currently installed parsers
*:TSUpdate* *:TSUpdate*
:TSUpdate {language}~ :TSUpdate {language} ...~
Update the installed parser of {language} or all installed parsers Update the installed parser for one more {language} or all installed parsers
if {language} is omitted. if {language} is omitted. The specified parser is installed if it is not already
installed.
*:TSUpdateSync*
:TSUpdateSync {language} ...~
Perform the |:TSUpdate| operation synchronously.
*:TSUninstall* *:TSUninstall*
:TSUninstall {language}~ :TSUninstall {language}~

View file

@ -332,7 +332,7 @@ function M.setup(user_data)
local ensure_installed = user_data.ensure_installed or {} local ensure_installed = user_data.ensure_installed or {}
if #ensure_installed > 0 then if #ensure_installed > 0 then
require'nvim-treesitter.install'.ensure_installed(ensure_installed) require'nvim-treesitter.install'.ensure_installed('',ensure_installed)
end end
config.modules.ensure_installed = nil config.modules.ensure_installed = nil

View file

@ -50,6 +50,10 @@ local function get_installed_revision(lang)
end end
end end
local function is_installed(lang)
return #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0
end
local function needs_update(lang) local function needs_update(lang)
return not get_revision(lang) or get_revision(lang) ~= get_installed_revision(lang) return not get_revision(lang) or get_revision(lang) ~= get_installed_revision(lang)
end end
@ -280,9 +284,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync,
end end
local function install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) 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 is_installed(lang) and bang ~= '!' then return 1 end
if bang ~= '!' then return 1 end
end
local parser_config = parsers.get_parser_configs()[lang] local parser_config = parsers.get_parser_configs()[lang]
if not parser_config then if not parser_config then
@ -305,7 +307,8 @@ local function install(options)
local generate_from_grammar = options.generate_from_grammar local generate_from_grammar = options.generate_from_grammar
local exclude_configured_parsers = options.exclude_configured_parsers local exclude_configured_parsers = options.exclude_configured_parsers
return function (bang, ...) return function (bang)
return function (...)
if fn.executable('git') == 0 then if fn.executable('git') == 0 then
return api.nvim_err_writeln('Git is required on your system to run this command') return api.nvim_err_writeln('Git is required on your system to run this command')
end end
@ -341,13 +344,27 @@ local function install(options)
print('Parsers already installed. Use :TSInstall! to force reinstallation.') print('Parsers already installed. Use :TSInstall! to force reinstallation.')
end end
end end
end
end end
function M.update(bang, lang) function M.update(options)
options = options or {}
return function(bang)
return function (...)
M.lockfile = {} M.lockfile = {}
reset_progress_counter() reset_progress_counter()
if lang and lang ~= 'all' then if ... and ... ~= 'all' then
install({})('!', lang) 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 else
local parsers_to_update = configs.get_update_strategy() == 'lockfile' local parsers_to_update = configs.get_update_strategy() == 'lockfile'
and outdated_parsers() and outdated_parsers()
@ -357,13 +374,17 @@ function M.update(bang, lang)
end end
for _, lang in pairs(parsers_to_update) do for _, lang in pairs(parsers_to_update) do
install({ install({
exclude_configured_parsers = true exclude_configured_parsers = true,
})('!', lang) with_sync = options.with_sync
})('!')(lang)
end
end
end end
end end
end end
function M.uninstall(bang,lang) function M.uninstall(bang)
return function (lang)
local path_sep = '/' local path_sep = '/'
if fn.has('win32') == 1 then if fn.has('win32') == 1 then
path_sep = '\\' path_sep = '\\'
@ -376,8 +397,8 @@ function M.uninstall(bang,lang)
local maintained = parsers.maintained_parsers() local maintained = parsers.maintained_parsers()
installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed) installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed)
end end
for _, lang in pairs(installed) do for _, langitem in pairs(installed) do
M.uninstall(lang) M.uninstall(langitem)
end end
elseif lang then elseif lang then
local install_dir, err = utils.get_parser_install_dir() local install_dir, err = utils.get_parser_install_dir()
@ -390,6 +411,7 @@ function M.uninstall(bang,lang)
} }
M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled') M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled')
end end
end
end end
function M.write_lockfile(verbose, skip_langs) function M.write_lockfile(verbose, skip_langs)
@ -453,10 +475,16 @@ M.commands = {
}, },
}, },
TSUpdate = { TSUpdate = {
run = M.update, run = M.update({}),
args = {
"-nargs=*",
"-complete=custom,nvim_treesitter#installed_parsers",
},
},
TSUpdateSync = {
run = M.update({ with_sync = true }),
args = { args = {
"-nargs=*", "-nargs=*",
"-bang",
"-complete=custom,nvim_treesitter#installed_parsers", "-complete=custom,nvim_treesitter#installed_parsers",
}, },
}, },
@ -464,7 +492,6 @@ M.commands = {
run = M.uninstall, run = M.uninstall,
args = { args = {
"-nargs=+", "-nargs=+",
"-bang",
"-complete=custom,nvim_treesitter#installed_parsers", "-complete=custom,nvim_treesitter#installed_parsers",
}, },
}, },

View file

@ -6,7 +6,7 @@ local M = {}
function M.setup_commands(mod, commands) function M.setup_commands(mod, commands)
for command_name, def in pairs(commands) do for command_name, def in pairs(commands) do
local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('<bang>',<f-args>)", mod, command_name) local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('<bang>')(<f-args>)", mod, command_name)
local parts = vim.tbl_flatten({ local parts = vim.tbl_flatten({
"command!", "command!",
def.args, def.args,