From ca887b80a911df4db4ab5f5496075b9415b9990a Mon Sep 17 00:00:00 2001 From: Gianmaria Bajo Date: Tue, 6 Jun 2023 15:38:45 +0200 Subject: 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()) --- runtime/lua/vim/version.lua | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'runtime/lua/vim/version.lua') diff --git a/runtime/lua/vim/version.lua b/runtime/lua/vim/version.lua index ebe8f4e053..d4a3752e37 100644 --- a/runtime/lua/vim/version.lua +++ b/runtime/lua/vim/version.lua @@ -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 --- } --- --- ---- `: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: ---
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: @@ -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 -- cgit