From c17de5689045f75c6244462182ae3b4b62df02d9 Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sun, 14 Apr 2024 16:25:28 +0200 Subject: feat!: track parser revision in Lua Problem: Tracking parser revision in lockfile and allowing override through the parsers module complicates the code. In addition, only revision changes are handled robustly, not changes to other installation info. Solution: Track parser revision in the parsers module directly. Reload parser table on every install or update call. Support modifying parser table in a `User TSUpdate` autocommand. --- scripts/update-parsers.lua | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 scripts/update-parsers.lua (limited to 'scripts/update-parsers.lua') diff --git a/scripts/update-parsers.lua b/scripts/update-parsers.lua new file mode 100755 index 000000000..ec1308d77 --- /dev/null +++ b/scripts/update-parsers.lua @@ -0,0 +1,65 @@ +#!/usr/bin/env -S nvim -l +vim.opt.runtimepath:append('.') +local util = require('nvim-treesitter.util') +local parsers = require('nvim-treesitter.parsers') + +local jobs = {} ---@type table +local updates = {} ---@type string[] + +-- check for new revisions +for k, p in pairs(parsers) do + if p.tier < 5 and p.install_info then + print('Updating ' .. k) + jobs[k] = vim.system({ 'git', 'ls-remote', p.install_info.url }) + end + + if #vim.tbl_keys(jobs) % 100 == 0 or next(parsers, k) == nil then + for name, job in pairs(jobs) do + local stdout = vim.split(job:wait().stdout, '\n') + jobs[name] = nil + + local info = parsers[name].install_info + assert(info) + + local branch = info.branch + local line = 1 + if branch then + for j, l in ipairs(stdout) do + if l:find(vim.pesc(branch)) then + line = j + break + end + end + end + + local sha = vim.split(stdout[line], '\t')[1] + if info.revision ~= sha then + info.revision = sha + updates[#updates + 1] = name + end + end + end +end + +assert(#vim.tbl_keys(jobs) == 0) + +if #updates > 0 then + -- write new parser file + local header = '---@type nvim-ts.parsers\nreturn ' + local parser_file = header .. vim.inspect(parsers) + if vim.fn.executable('stylua') == 1 then + parser_file = vim.system({ 'stylua', '-' }, { stdin = parser_file }):wait().stdout --[[@as string]] + end + util.write_file('lua/nvim-treesitter/parsers.lua', parser_file) + + local update_list = table.concat(updates, ', ') + print(string.format('\nUpdated parsers: %s', update_list)) + -- pass list to workflow + if os.getenv('GITHUB_ENV') then + local env = io.open(os.getenv('GITHUB_ENV'), 'a') + env:write(string.format('UPDATED_PARSERS=%s\n', update_list)) + env:close() + end +else + print('\nAll parsers up to date!') +end -- cgit v1.2.3-70-g09d2