fix: version-range < and <= #23539

vim.version.range() couldn't parse them correctly.
For example, vim.version.range('<0.9.0'):has('0.9.0') returned `true`.

fix: range:has() accepts vim.version()
So that it's possible to compare a range with:

    vim.version.range(spec):has(vim.version())
This commit is contained in:
Gianmaria Bajo 2023-06-06 15:38:45 +02:00 committed by GitHub
parent f5d12889e8
commit ca887b80a9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 7 deletions

View File

@ -2832,11 +2832,15 @@ range({spec}) *vim.version.range()*
}
<
`:has()` checks if a version is in the range (inclusive `from` , exclusive `to` ). Example: >lua
`:has()` checks if a version is in the range (inclusive `from`, exclusive
`to`).
Example: >lua
local r = vim.version.range('1.0.0 - 2.0.0')
print(r:has('1.9.9')) -- true
print(r:has('2.0.0')) -- false
print(r:has('1.9.9')) -- true
print(r:has('2.0.0')) -- false
print(r:has(vim.version())) -- check against current Nvim version
<
Or use cmp(), eq(), lt(), and gt() to compare `.to` and `.from` directly: >lua

View File

@ -226,8 +226,13 @@ function Range:has(version)
if type(version) == 'string' then
---@diagnostic disable-next-line: cast-local-type
version = M.parse(version)
else
-- Need metatable to compare versions.
version = setmetatable(vim.deepcopy(version), Version)
end
if version then
-- Workaround: vim.version() reports "prerelease" as a boolean.
version.prerelease = version.prerelease or nil
if version.prerelease ~= self.from.prerelease then
return false
end
@ -244,11 +249,14 @@ end
--- }
--- </pre>
---
--- `:has()` checks if a version is in the range (inclusive `from`, exclusive `to`). Example:
--- `:has()` checks if a version is in the range (inclusive `from`, exclusive `to`).
---
--- Example:
--- <pre>lua
--- local r = vim.version.range('1.0.0 - 2.0.0')
--- print(r:has('1.9.9')) -- true
--- print(r:has('2.0.0')) -- false
--- print(r:has('1.9.9')) -- true
--- print(r:has('2.0.0')) -- false
--- print(r:has(vim.version())) -- check against current Nvim version
--- </pre>
---
--- Or use cmp(), eq(), lt(), and gt() to compare `.to` and `.from` directly:
@ -279,7 +287,7 @@ function M.range(spec) -- Adapted from https://github.com/folke/lazy.nvim
}, { __index = Range })
end
---@type string, string
local mods, version = spec:lower():match('^([%^=>~]*)(.*)$')
local mods, version = spec:lower():match('^([%^=<>~]*)(.*)$')
version = version:gsub('%.[%*x]', '')
local parts = vim.split(version:gsub('%-.*', ''), '.', { plain = true })
if #parts < 3 and mods == '' then
@ -292,6 +300,11 @@ function M.range(spec) -- Adapted from https://github.com/folke/lazy.nvim
local to = vim.deepcopy(semver)
if mods == '' or mods == '=' then
to.patch = to.patch + 1
elseif mods == '<' then
from = M._version({})
elseif mods == '<=' then
from = M._version({})
to.patch = to.patch + 1
elseif mods == '>' then
from.patch = from.patch + 1
to = nil ---@diagnostic disable-line: cast-local-type

View File

@ -40,6 +40,8 @@ describe('version', function()
['=1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 2, 4 } },
['>1.2.3'] = { from = { 1, 2, 4 } },
['>=1.2.3'] = { from = { 1, 2, 3 } },
['<1.2.3'] = { from = { 0, 0, 0 }, to = { 1, 2, 3 } },
['<=1.2.3'] = { from = { 0, 0, 0 }, to = { 1, 2, 4 } },
['~1.2.3'] = { from = { 1, 2, 3 }, to = { 1, 3, 0 } },
['^1.2.3'] = { from = { 1, 2, 3 }, to = { 2, 0, 0 } },
['^0.2.3'] = { from = { 0, 2, 3 }, to = { 0, 3, 0 } },