From 2e02aede7cfa67843595829343d836cc31fc221c Mon Sep 17 00:00:00 2001 From: Guldoman Date: Thu, 2 Feb 2023 01:28:21 +0100 Subject: [PATCH] Make mod-version follow semver (#1036) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make mod-version follow semver Now plugins can optionally specify the minor and patch version they support. If no minor or patch version is specified, it's considered 0. Plugins are only loaded if they have the same major version and a smaller or equal minor+patch version. * Add modversion to logging and plugin mismatch nagview --------- Co-authored-by: Jefferson González --- data/core/init.lua | 52 ++++++++++++++++++++++++++++++++++++--------- data/core/start.lua | 5 ++++- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/data/core/init.lua b/data/core/init.lua index 130bc97a..09bf5a4c 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -673,6 +673,9 @@ end function core.init() + core.log_items = {} + core.log_quiet("Lite XL version %s - mod-version %s", VERSION, MOD_VERSION_STRING) + command = require "core.command" keymap = require "core.keymap" dirwatch = require "core.dirwatch" @@ -726,7 +729,6 @@ function core.init() core.frame_start = 0 core.clip_rect_stack = {{ 0,0,0,0 }} - core.log_items = {} core.docs = {} core.cursor_clipboard = {} core.cursor_clipboard_whole_line = {} @@ -824,15 +826,19 @@ function core.init() local msg = {} for _, entry in pairs(plugins_refuse_list) do if #entry.plugins > 0 then - msg[#msg + 1] = string.format("Plugins from directory \"%s\":\n%s", common.home_encode(entry.dir), table.concat(entry.plugins, "\n")) + local msg_list = {} + for _, p in pairs(entry.plugins) do + table.insert(msg_list, string.format("%s[%s]", p.file, p.version_string)) + end + msg[#msg + 1] = string.format("Plugins from directory \"%s\":\n%s", common.home_encode(entry.dir), table.concat(msg_list, "\n")) end end core.nag_view:show( "Refused Plugins", string.format( - "Some plugins are not loaded due to version mismatch.\n\n%s.\n\n" .. + "Some plugins are not loaded due to version mismatch. Expected version %s.\n\n%s.\n\n" .. "Please download a recent version from https://github.com/lite-xl/lite-xl-plugins.", - table.concat(msg, ".\n\n")), + MOD_VERSION_STRING, table.concat(msg, ".\n\n")), opt, function(item) if item.text == "Exit" then os.exit(1) end end) @@ -921,6 +927,8 @@ function core.restart() end +local mod_version_regex = + regex.compile([[--.*mod-version:(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:$|\s)]]) local function get_plugin_details(filename) local info = system.get_file_info(filename) if info ~= nil and info.type == "dir" then @@ -932,17 +940,32 @@ local function get_plugin_details(filename) if not f then return false end local priority = false local version_match = false + local major, minor, patch + for line in f:lines() do if not version_match then - local mod_version = line:match('%-%-.*%f[%a]mod%-version%s*:%s*(%d+)') - if mod_version then - version_match = (mod_version == MOD_VERSION) + local _major, _minor, _patch = mod_version_regex:match(line) + if _major then + _major = tonumber(_major) or 0 + _minor = tonumber(_minor) or 0 + _patch = tonumber(_patch) or 0 + major, minor, patch = _major, _minor, _patch + + version_match = major == MOD_VERSION_MAJOR + if version_match then + version_match = minor <= MOD_VERSION_MINOR + end + if version_match then + version_match = patch <= MOD_VERSION_PATCH + end end end + if not priority then priority = line:match('%-%-.*%f[%a]priority%s*:%s*(%d+)') if priority then priority = tonumber(priority) end end + if version_match then break end @@ -950,6 +973,7 @@ local function get_plugin_details(filename) f:close() return true, { version_match = version_match, + version = major and {major, minor, patch} or {}, priority = priority or 100 } end @@ -985,6 +1009,8 @@ function core.load_plugins() plugin.dir = dir plugin.priority = details and details.priority or 100 plugin.version_match = details and details.version_match or false + plugin.version = details and details.version or {} + plugin.version_string = #plugin.version > 0 and table.concat(plugin.version, ".") or "unknown" end -- sort by priority or name for plugins that have same priority @@ -1000,21 +1026,27 @@ function core.load_plugins() if plugin.valid then if not config.skip_plugins_version and not plugin.version_match then core.log_quiet( - "Version mismatch for plugin %q from %s", + "Version mismatch for plugin %q[%s] from %s", plugin.name, + plugin.version_string, plugin.dir ) local rlist = plugin.dir:find(USERDIR, 1, true) == 1 and 'userdir' or 'datadir' local list = refused_list[rlist].plugins - table.insert(list, plugin.file) + table.insert(list, plugin) elseif config.plugins[plugin.name] ~= false then local start = system.get_time() local ok, loaded_plugin = core.try(require, "plugins." .. plugin.name) if ok then + local plugin_version = "" + if plugin.version_string ~= MOD_VERSION_STRING then + plugin_version = "["..plugin.version_string.."]" + end core.log_quiet( - "Loaded plugin %q from %s in %.1fms", + "Loaded plugin %q%s from %s in %.1fms", plugin.name, + plugin_version, plugin.dir, (system.get_time() - start) * 1000 ) diff --git a/data/core/start.lua b/data/core/start.lua index d504108a..bb10d7ef 100644 --- a/data/core/start.lua +++ b/data/core/start.lua @@ -1,6 +1,9 @@ -- this file is used by lite-xl to setup the Lua environment when starting VERSION = "@PROJECT_VERSION@" -MOD_VERSION = "3" +MOD_VERSION_MAJOR = 3 +MOD_VERSION_MINOR = 0 +MOD_VERSION_PATCH = 0 +MOD_VERSION_STRING = string.format("%d.%d.%d", MOD_VERSION_MAJOR, MOD_VERSION_MINOR, MOD_VERSION_PATCH) SCALE = tonumber(os.getenv("LITE_SCALE") or os.getenv("GDK_SCALE") or os.getenv("QT_SCALE_FACTOR")) or SCALE PATHSEP = package.config:sub(1, 1)