diff --git a/lua/java.lua b/lua/java.lua index 1a4587b..910c90c 100644 --- a/lua/java.lua +++ b/lua/java.lua @@ -14,12 +14,14 @@ function M.setup(custom_config) local config = vim.tbl_deep_extend('force', global_config, custom_config) nvim_dep.check() - mason_dep.install(config) - setup_wrap.setup(config) - decomple_watch.setup() + local is_installing = mason_dep.install(config) - dap.setup_dap_on_lsp_attach() + if not is_installing then + setup_wrap.setup(config) + decomple_watch.setup() + dap.setup_dap_on_lsp_attach() + end end ---------------------------------------------------------------------- diff --git a/lua/java/startup/mason-dep.lua b/lua/java/startup/mason-dep.lua index 2480f41..0d1832f 100644 --- a/lua/java/startup/mason-dep.lua +++ b/lua/java/startup/mason-dep.lua @@ -1,76 +1,54 @@ local log = require('java.utils.log') -local mason_reg = require('mason-registry') local mason_ui = require('mason.ui') +local mason_util = require('java.utils.mason') local notify = require('java-core.utils.notify') +local async = require('java-core.utils.async') +local sync = async.sync local M = {} -local dependecies = { - { name = 'jdtls', version = 'v1.29.0' }, - { name = 'java-test', version = '0.40.1' }, - { name = 'java-debug-adapter', version = '0.52.0' }, -} - ---Install mason package dependencies for nvim-java ---@param config java.Config function M.install(config) - log.info('check mason dependecies') - - local is_installing = false - - if config.jdk.auto_install then - table.insert(dependecies, { name = 'openjdk-17', version = '17.0.2' }) - end - - for _, dep in ipairs(dependecies) do - if not M.is_installed(dep.name, dep.version) then - log.info('installing mason pkg: ' .. tostring(dep.name)) - - is_installing = true - - local pkg = mason_reg.get_package(dep.name) - - pkg:install({ - version = dep.version, - force = true, - }) - end + local packages = M.get_pkg_list(config) + local is_outdated = mason_util.is_outdated(packages) + + if is_outdated then + sync(function() + M.refresh_and_install(packages) + end) + .catch(function(err) + notify.error('Failed to setup nvim-java ' .. tostring(err)) + log.error('failed to setup nvim-java ' .. tostring(err)) + end) + .run() end - if is_installing then - mason_ui.open() - notify.warn( - 'Please restart the editor after dependency installation is done' - ) - end + return is_outdated end ----Returns true if the package and its expected version is already installed ----@private ----@param pkg_name string name of the package ----@param expc_version string expected version of the package ----@return boolean true if the package and its version is already installed -function M.is_installed(pkg_name, expc_version) - local pkg = mason_reg.get_package(pkg_name) - - if not pkg:is_installed() then - return false - end +function M.refresh_and_install(packages) + vim.schedule(function() + mason_ui.open() + notify.warn('Please close and re-open after dependecies are installed') + end) - ---@type string | nil - local installed_version + mason_util.refresh_registry() + mason_util.install_pkgs(packages) +end - pkg:get_installed_version(function(ok, version) - if ok then - installed_version = version - end - end) +function M.get_pkg_list(config) + local dependecies = { + { name = 'jdtls', version = 'v1.29.0' }, + { name = 'java-test', version = '0.40.1' }, + { name = 'java-debug-adapter', version = '0.52.0' }, + } - if installed_version == expc_version then - return true + if config.jdk.auto_install then + table.insert(dependecies, { name = 'openjdk-17', version = '17.0.2' }) end - return false + return dependecies end return M diff --git a/lua/java/utils/mason.lua b/lua/java/utils/mason.lua new file mode 100644 index 0000000..6e239a2 --- /dev/null +++ b/lua/java/utils/mason.lua @@ -0,0 +1,80 @@ +local log = require('java.utils.log') +local mason_reg = require('mason-registry') +local async = require('java-core.utils.async') +local await = async.wait_handle_ok + +local M = {} + +function M.is_available(package_name, package_version) + local has_pkg = mason_reg.has_package(package_name) + + if not has_pkg then + return false + end + + local has_version = false + + local pkg = mason_reg.get_package(package_name) + pkg:get_installed_version(function(success, version) + if success and version == package_version then + has_version = true + end + end) + + return has_version +end + +function M.is_installed(package_name, package_version) + local pkg = mason_reg.get_package(package_name) + local is_installed = pkg:is_installed() + + if not is_installed then + return false + end + + local installed_version + pkg:get_installed_version(function(ok, version) + if not ok then + return + end + + installed_version = version + end) + + return installed_version == package_version +end + +function M.is_outdated(packages) + for _, pkg in ipairs(packages) do + if not M.is_available(pkg.name, pkg.version) then + return true + end + + if not M.is_installed(pkg.name, pkg.version) then + return true + end + end +end + +function M.refresh_registry() + await(function(callback) + mason_reg.update(callback) + end) +end + +function M.install_pkgs(packages) + log.info('check mason dependecies') + + for _, dep in ipairs(packages) do + if not M.is_installed(dep.name, dep.version) then + local pkg = mason_reg.get_package(dep.name) + + pkg:install({ + version = dep.version, + force = true, + }) + end + end +end + +return M