@@ -54,6 +54,52 @@ local function loadUpdaterModule()
5454 return true , mod_or_err , sake_dir , plugins_root
5555end
5656
57+ local function readUpdaterVersion (plugins_root )
58+ if not plugins_root then
59+ return nil , " Cannot determine plugins root"
60+ end
61+
62+ local meta_path = plugins_root .. " /sakeUpdater.koplugin/_meta.lua"
63+ local ok , meta_or_err = pcall (dofile , meta_path )
64+ if not ok or type (meta_or_err ) ~= " table" then
65+ return nil , " Failed to read Sake Updater _meta.lua"
66+ end
67+ if not meta_or_err .version then
68+ return nil , " Sake Updater _meta.lua has no version"
69+ end
70+
71+ return tostring (meta_or_err .version )
72+ end
73+
74+ local function parseVersion (version )
75+ local parts = {}
76+ for n in tostring (version or " " ):gmatch (" (%d+)" ) do
77+ table.insert (parts , tonumber (n ))
78+ end
79+ if # parts == 0 then
80+ return nil
81+ end
82+ return parts
83+ end
84+
85+ local function isVersionAtLeast (version , minimum )
86+ local a = parseVersion (version )
87+ local b = parseVersion (minimum )
88+ if not a or not b then
89+ return false
90+ end
91+
92+ local max_len = math.max (# a , # b )
93+ for i = 1 , max_len do
94+ local av = a [i ] or 0
95+ local bv = b [i ] or 0
96+ if av > bv then return true end
97+ if av < bv then return false end
98+ end
99+
100+ return true
101+ end
102+
57103function Sake :startDeferredProgressWatcher ()
58104 if self .progress_watcher_active then
59105 return
@@ -374,47 +420,50 @@ function Sake:openPluginVersionPicker()
374420 return
375421 end
376422
377- UIManager :show (InfoMessage :new {
378- text = _ (" Loading plugin versions..." ),
379- timeout = 1
380- })
381-
382- UIManager :scheduleIn (0.1 , function ()
383- local ok , result_or_err = self .updater :listReleases ()
384- if not ok then
385- logger .warn (" [Sake] Plugin release list failed: " .. tostring (result_or_err ))
386- UIManager :show (InfoMessage :new {
387- text = _ (" Could not load plugin versions: " ) .. tostring (result_or_err ),
388- timeout = 6
389- })
390- return
391- end
423+ local updater_version , updater_version_err = readUpdaterVersion (self .plugins_root )
424+ if not updater_version or not isVersionAtLeast (updater_version , " 1.1.0" ) then
425+ logger .warn (" [Sake] Specific version install blocked. Updater version: " .. tostring (updater_version or updater_version_err ))
426+ UIManager :show (InfoMessage :new {
427+ text = _ (" Install Specific Plugin Version requires Sake Updater 1.1.0 or newer." ),
428+ timeout = 6
429+ })
430+ return
431+ end
392432
393- local result = result_or_err
394- if not result .releases or # result .releases == 0 then
395- UIManager :show (InfoMessage :new {
396- text = _ (" No plugin versions available." ),
397- timeout = 4
398- })
399- return
400- end
433+ local ok , result_or_err = self .updater :listReleases ()
434+ if not ok then
435+ logger .warn (" [Sake] Plugin release list failed: " .. tostring (result_or_err ))
436+ UIManager :show (InfoMessage :new {
437+ text = _ (" Could not load plugin versions: " ) .. tostring (result_or_err ),
438+ timeout = 6
439+ })
440+ return
441+ end
401442
402- Dialogs .showPluginVersionPicker (self .ctx , {
403- current_version = result .current_version ,
404- releases = result .releases ,
405- on_select = function (release )
406- if release and tostring (release .version or " " ) == tostring (result .current_version or " " ) then
407- UIManager :show (InfoMessage :new {
408- text = _ (" That plugin version is already installed." ),
409- timeout = 4
410- })
411- return
412- end
413-
414- self :performPluginUpdateWithRelease (release )
415- end ,
443+ local result = result_or_err
444+ if not result .releases or # result .releases == 0 then
445+ UIManager :show (InfoMessage :new {
446+ text = _ (" No plugin versions available." ),
447+ timeout = 4
416448 })
417- end )
449+ return
450+ end
451+
452+ Dialogs .showPluginVersionPicker (self .ctx , {
453+ current_version = result .current_version ,
454+ releases = result .releases ,
455+ on_select = function (release )
456+ if release and tostring (release .version or " " ) == tostring (result .current_version or " " ) then
457+ UIManager :show (InfoMessage :new {
458+ text = _ (" That plugin version is already installed." ),
459+ timeout = 4
460+ })
461+ return
462+ end
463+
464+ self :performPluginUpdateWithRelease (release )
465+ end ,
466+ })
418467end
419468
420469function Sake :onDispatcherRegisterActions ()
@@ -443,6 +492,7 @@ function Sake:init()
443492 self .bg_error_messages = {}
444493 self .progress_watcher_active = false
445494 self .updater = nil
495+ self .plugins_root = nil
446496 local device_name = tostring (self .settings .device_name or " Not Set" )
447497 local api_url = (self .settings .api_url ~= " " and self .settings .api_url or " Not Set" )
448498 logger .info (" [Sake] Initialized. Device: " .. device_name .. " | URL: " .. api_url )
@@ -464,6 +514,7 @@ function Sake:init()
464514 sake_plugin_dir = sake_plugin_dir ,
465515 plugins_root = plugins_root ,
466516 })
517+ self .plugins_root = plugins_root
467518 logger .info (" [Sake] Updater module loaded." )
468519 else
469520 logger .warn (" [Sake] Updater module not loaded: " .. tostring (updater_mod_or_err ))
0 commit comments