diff --git a/lockfile.json b/lockfile.json new file mode 100644 index 000000000..3b49e4c37 --- /dev/null +++ b/lockfile.json @@ -0,0 +1 @@ +{"jsdoc": {"revision": "77e7785739ad3e90c3de8ed5a55418a5fd2b8225"}, "tsx": {"revision": "d8c2f0147970a3f46bbca05948db4529a82123c3"}, "html": {"revision": "7f442e1c6163d450c69c75c7a621badc3a0ea98f"}, "typescript": {"revision": "d8c2f0147970a3f46bbca05948db4529a82123c3"}, "go": {"revision": "34181774b3e86b7801c939c79c7b80a82df91a2b"}, "nix": {"revision": "791b5ff0e4f0da358cbb941788b78d436a2ca621"}, "vue": {"revision": "da1c6e1e3832fc6bbc90431f1fcf6bde1a5d39f2"}, "lua": {"revision": "6b6ce9516f796a001a8e38771a1ed999958c5c27"}, "bash": {"revision": "8ece09ca4c0b5e59b124cd19fa92c76b1a9e9dd4"}, "yaml": {"revision": "89a606b23ff71d270884b363863838ee69749d1f"}, "ocaml": {"revision": "ac885cabeeec4d8b5ed1dcd577533b0b549496fe"}, "python": {"revision": "d00b1d4016bdaf74e24a1fbddcfd07e08deebcd0"}, "c": {"revision": "99151b1e9293c9e025498fee7e6691e1a52e1d03"}, "haskell": {"revision": "2a0aa1cb5f1b787a4056a29fa0791e87846e33fb"}, "julia": {"revision": "320ddc211be3db8b26986a035e4d14e6c44e0dce"}, "elm": {"revision": "3c43083a7fab232b63e85d586eaab4ed6feac824"}, "swift": {"revision": "a22fa5e19bae50098e2252ea96cba3aba43f4c58"}, "toml": {"revision": "4a239a19c0debd9f8f0f4815f462ca17494dcc6e"}, "java": {"revision": "ee0a2a076785145e350fbd413775d1e003f79315"}, "javascript": {"revision": "feca6ec5e577fa30766f0c0a1e03d32c073027f9"}, "fennel": {"revision": "c939aa1315e5ef86b10e0816da11087951e6d0c5"}, "css": {"revision": "23f2cb97d47860c517f67f03e1f4b621d5bd2085"}, "scala": {"revision": "211bb726bb5857f872247b600c7c1808e641a8d4"}, "php": {"revision": "b0c0367d4b7058921fdc4ba11e257441a64ab809"}, "query": {"revision": "0ec086c6fcd3528a134eb6172c3a96cf669a355f"}, "markdown": {"revision": "fb98cf3c8b2145ec707bca27415f86f1cbe67237"}, "c_sharp": {"revision": "075a1b2ff5fae3142a9318d9479d568843d2fe5d"}, "rst": {"revision": "cf2d281941f61d7b55a3dc28d4c9446e904a7dae"}, "json": {"revision": "d3976b27df8622ed17bef6dd5e358b398e73c676"}, "ruby": {"revision": "14a5e56a6fff1f2d40c151ae38b5581fc5c44574"}, "dart": {"revision": "07fc4595471ba9d3b2038fe3f6e3bb502988684b"}, "cpp": {"revision": "5e7476bd014445abdae879661e9caf299215478a"}, "rust": {"revision": "40620bf4097cbc9cea79504d7e877865df43a19e"}, "regex": {"revision": "be2e415b5716615530234d179dc27c32b7a1d86b"}} diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index 51d982c79..6a6101b32 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -20,7 +20,8 @@ end local config = { modules = {}, - ensure_installed = {} + ensure_installed = {}, + update_strategy = 'lockfile', } -- List of modules that need to be setup on initialization. local queued_modules_defs = {} @@ -299,6 +300,8 @@ function M.setup(user_data) if name == 'ensure_installed' then config.ensure_installed = data require'nvim-treesitter.install'.ensure_installed(data) + elseif name == 'update_strategy' then + config.update_strategy = data else config.modules[name] = vim.tbl_deep_extend('force', config.modules[name] or {}, data) @@ -435,4 +438,8 @@ function M.init() end end +function M.get_update_strategy() + return config.update_strategy +end + return M diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index eac4af7e0..9a1ea40ad 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -5,8 +5,10 @@ local luv = vim.loop 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 M = {} +local lockfile = {} function M.iter_cmd(cmd_list, i, lang, success_message) if i == #cmd_list + 1 then return print(success_message) end @@ -58,6 +60,13 @@ local function iter_cmd_sync(cmd_list) return true end +local function get_revision(lang) + if #lockfile == 0 then + lockfile = vim.fn.json_decode(vim.fn.readfile(utils.get_package_path()..'/lockfile.json')) + end + return (lockfile[lang] and lockfile[lang].revision) or 'master' +end + local function run_install(cache_folder, package_path, lang, repo, with_sync) parsers.reset_cache() @@ -66,6 +75,8 @@ local function run_install(cache_folder, package_path, lang, repo, with_sync) -- compile_location only needed for typescript installs. local compile_location = cache_folder..'/'..(repo.location or project_name) local parser_lib_name = package_path.."/parser/"..lang..".so" + local revision = configs.get_update_strategy() == 'lockfile' and get_revision(lang) or 'master' + local command_list = { { cmd = 'rm', @@ -78,7 +89,7 @@ local function run_install(cache_folder, package_path, lang, repo, with_sync) info = 'Downloading...', err = 'Error during download, please verify your internet connection', opts = { - args = { 'clone', '--single-branch', '--branch', 'master', '--depth', '1', repo.url, project_name }, + args = { 'clone', '--single-branch', '--branch', revision, '--depth', '1', repo.url, project_name }, cwd = cache_folder, }, }, @@ -220,6 +231,30 @@ function M.uninstall(lang) end end +function M.write_lockfile(verbose) + local sorted_parsers = {} + + for k, v in pairs(parsers.get_parser_configs()) do + table.insert(sorted_parsers, {name = k, parser = v}) + end + + table.sort(sorted_parsers, function(a, b) return a.name < b.name end) + + for _, v in ipairs(sorted_parsers) do + -- I'm sure this can be done in aync way with iter_cmd + local sha = vim.split(vim.fn.systemlist('git ls-remote '..v.parser.install_info.url)[1], '\t')[1] + lockfile[v.name] = { revision = sha } + if verbose then + print(v.name..': '..sha) + end + end + + if verbose then + print(vim.inspect(lockfile)) + end + vim.fn.writefile(vim.fn.split(vim.fn.json_encode(lockfile), '\n'), utils.get_package_path().."/lockfile.json") +end + M.ensure_installed = install(false, false) M.commands = { diff --git a/scripts/write-lockfile.lua b/scripts/write-lockfile.lua new file mode 100644 index 000000000..b1218eca0 --- /dev/null +++ b/scripts/write-lockfile.lua @@ -0,0 +1,3 @@ +-- Execute as `nvim --headless -c "luafile ./scripts/write-lockfile.lua"` +require 'nvim-treesitter.install'.write_lockfile('verbose') +vim.cmd('q')