diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/vimpatch.lua | 101 |
1 files changed, 74 insertions, 27 deletions
diff --git a/scripts/vimpatch.lua b/scripts/vimpatch.lua index 5575783d5f..a1b4257079 100755 --- a/scripts/vimpatch.lua +++ b/scripts/vimpatch.lua @@ -19,58 +19,105 @@ local function vimpatch_sh_list_tokens() return systemlist({ { 'bash', '-c', 'scripts/vim-patch.sh -M' } }) end --- Generates the lines to be inserted into the src/nvim/version.c --- `included_patches[]` definition. +-- Generate the data,lines to update src/nvim/version.c. +-- - `vim_versions[]` +-- - `Versions[]` +-- - `num_patches[]` +-- - `included_patchsets[]` local function gen_version_c_lines() - -- Sets of merged Vim x.y.zzzz patch numbers. - local merged_patch_sets = {} + -- List of version sets where each set contains: + -- 1. major_minor_version (int) + -- 2. major_minor_version (string) + -- 3. set of merged patch numbers + local merged_version_list = {} for _, token in ipairs(vimpatch_sh_list_tokens()) do local major_version, minor_version, patch_num = string.match(token, '^(%d+).(%d+).(%d+)$') local n = tonumber(patch_num) - -- TODO(@janlazo): Allow multiple Vim versions - -- if n then - if n and major_version == '8' and minor_version == '1' then + if n then local major_minor_version = major_version * 100 + minor_version - merged_patch_sets[major_minor_version] = merged_patch_sets[major_minor_version] or {} - table.insert(merged_patch_sets[major_minor_version], n) + local len = #merged_version_list + if len == 0 or merged_version_list[len][1] ~= major_minor_version then + local vstr = '"' .. major_version .. '.' .. minor_version .. '"' + table.insert(merged_version_list, { major_minor_version, vstr, { n } }) + else + table.insert(merged_version_list[len][3], n) + end end end - local sorted_versions = {} - for k, _ in pairs(merged_patch_sets) do - table.insert(sorted_versions, k) - end - table.sort(sorted_versions) - local lines = {} - for _, major_minor_version in ipairs(sorted_versions) do - -- table.insert(lines, string.format(' // major minor version: %s', major_minor_version)) - local patch_set = merged_patch_sets[major_minor_version] + local major_vim_versions = {} + local major_vim_versions_str = {} + local num_patches = {} + local patch_lines = {} + for _, version_set in ipairs(merged_version_list) do + local major_minor_version, major_minor_version_str, patch_set = unpack(version_set) + table.insert(major_vim_versions, major_minor_version) + table.insert(major_vim_versions_str, major_minor_version_str) + table.insert(num_patches, #patch_set) + table.insert(patch_lines, ' (const int[]) { // ' .. major_minor_version) + + local patchset_set = {} for i = #patch_set, 1, -1 do local patch = patch_set[i] - table.insert(lines, string.format(' %s,', patch)) - if patch > 0 then - local oldest_unmerged_patch = patch_set[i - 1] and (patch_set[i - 1] + 1) or 0 - for unmerged_patch = patch -1, oldest_unmerged_patch, -1 do - table.insert(lines, string.format(' // %s,', unmerged_patch)) + local next_patch = patch_set[i - 1] + local patch_diff = patch - (next_patch or 0) + table.insert(patchset_set, patch) + + -- guard against last patch or `make formatc` + if #patchset_set > 15 or i == 1 or patch_diff > 1 then + table.insert(patch_lines, ' ' .. table.concat(patchset_set, ', ') .. ',') + patchset_set = {} + end + if i == 1 and patch > 0 then + local line = ' // 0' + if patch > 1 then + line = line .. '-' .. (patch - 1) + end + table.insert(patch_lines, line) + elseif patch_diff > 1 then + local line = ' // ' .. (next_patch + 1) + if patch_diff > 2 then + line = line .. '-' .. (patch - 1) end + table.insert(patch_lines, line) end end + + table.insert(patch_lines, ' },') end - return lines + return major_vim_versions, major_vim_versions_str, num_patches, patch_lines end local function patch_version_c() - local lines = gen_version_c_lines() + local major_vim_versions, major_vim_versions_str, num_patches, patch_lines = gen_version_c_lines() nvim.nvim_command('silent noswapfile noautocmd edit src/nvim/version.c') - nvim.nvim_command('/static const int included_patches') + nvim.nvim_command([[/^char \*Versions]]) + -- Replace the line. + nvim.nvim_call_function('setline', { + nvim.nvim_eval('line(".")'), + 'char *Versions[] = { ' .. table.concat(major_vim_versions_str, ', ') .. ' };', + }) + nvim.nvim_command([[/^static const int vim_versions]]) + -- Replace the line. + nvim.nvim_call_function('setline', { + nvim.nvim_eval('line(".")'), + 'static const int vim_versions[] = { ' .. table.concat(major_vim_versions, ', ') .. ' };', + }) + nvim.nvim_command([[/^static const int num_patches]]) + -- Replace the line. + nvim.nvim_call_function('setline', { + nvim.nvim_eval('line(".")'), + 'static const int num_patches[] = { ' .. table.concat(num_patches, ', ') .. ' };', + }) + nvim.nvim_command([[/^static const int \*included_patchsets]]) -- Delete the existing lines. nvim.nvim_command('silent normal! j0d/};\rk') -- Insert the lines. nvim.nvim_call_function('append', { nvim.nvim_eval('line(".")'), - lines, + patch_lines, }) nvim.nvim_command('silent write') end |
