diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh index 2cef123c93..d64f6b6db2 100755 --- a/scripts/vim-patch.sh +++ b/scripts/vim-patch.sh @@ -33,7 +33,7 @@ usage() { echo " -l [git-log opts] List missing Vim patches." echo " -L [git-log opts] List missing Vim patches (for scripts)." echo " -m {vim-revision} List previous (older) missing Vim patches." - echo " -M List all merged patch-numbers (at current v:version)." + echo " -M List all merged patch-numbers (since current v:version) in ascending order." echo " -n List possible N/A Vim patches." echo " -p {vim-revision} Download and generate a Vim patch. vim-revision" echo " can be a Vim version (8.1.xxx) or a Git hash." @@ -570,13 +570,23 @@ list_vimpatch_tokens() { | sed -nEe 's/^(vim-patch:([0-9]+\.[^ ]+|[0-9a-z]{7,7})).*/\1/p' } -# Prints all patch-numbers (for the current v:version) for which there is -# a "vim-patch:xxx" token in the Nvim git log. +# Prints all merged patches (since current v:version) in ascending order. +# +# Search "vim-patch:xxx" tokens in the Nvim git log. +# Ignore tokens older than current v:version. +# Left-pad the patch number of "vim-patch:xxx" for stable sort + dedupe. +# Filter reverted Vim tokens. list_vimpatch_numbers() { - # Transform "vim-patch:X.Y.ZZZZ" to "ZZZZ". - list_vimpatch_tokens | while read -r vimpatch_token; do - echo "$vimpatch_token" | grep -F '8.1.' | sed -Ee 's/.*vim-patch:8\.1\.([0-9a-z]+).*/\1/' - done + local patch_pat='(8\.[12]|9\.[0-9])\.[0-9]{1,4}' + diff "${NVIM_SOURCE_DIR}/scripts/vimpatch_token_reverts.txt" <( + git -C "${NVIM_SOURCE_DIR}" log --format="%s%n%b" -E --grep="^[* ]*vim-patch:${patch_pat}" | + grep -oE "^[* ]*vim-patch:${patch_pat}" | + sed -nEe 's/^[* ]*vim-patch:('"${patch_pat}"').*$/\1/p' | + awk '{split($0, a, "."); printf "%d.%d.%04d\n", a[1], a[2], a[3]}' | + sort | + uniq ) | + grep -e '^> ' | + sed -e 's/^> //' } declare -A tokens diff --git a/scripts/vimpatch.lua b/scripts/vimpatch.lua index 5d8bea6a98..5575783d5f 100755 --- a/scripts/vimpatch.lua +++ b/scripts/vimpatch.lua @@ -15,31 +15,45 @@ local function systemlist(...) return rv end -local function vimpatch_sh_list_numbers() +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/version.c +-- Generates the lines to be inserted into the src/nvim/version.c -- `included_patches[]` definition. local function gen_version_c_lines() - -- Set of merged Vim 8.1.zzzz patch numbers. - local merged_patch_numbers = {} - local highest = 0 - for _, n in ipairs(vimpatch_sh_list_numbers()) do - n = tonumber(n) - if n then - merged_patch_numbers[n] = true - highest = math.max(highest, n) + -- Sets of merged Vim x.y.zzzz patch numbers. + local merged_patch_sets = {} + 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 + 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) 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 i = highest, 0, -1 do - local is_merged = (nil ~= merged_patch_numbers[i]) - if is_merged then - table.insert(lines, string.format(' %s,', i)) - else - table.insert(lines, string.format(' // %s,', i)) + 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] + 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)) + end + end end end diff --git a/scripts/vimpatch_token_reverts.txt b/scripts/vimpatch_token_reverts.txt new file mode 100644 index 0000000000..36cb4b2e82 --- /dev/null +++ b/scripts/vimpatch_token_reverts.txt @@ -0,0 +1,3 @@ +8.1.2294 +9.1.0055 +9.2.1731