aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/package/version-check.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-07-08 18:34:38 +0200
committerGitHub <noreply@github.com>2022-07-08 18:34:38 +0200
commit976aa4fbee8a070f362cab6f6ec84e9251a90cf9 (patch)
tree5e8d9c9c59444a25c7801b8f39763c4ba6e1f76d /lua/mason-core/package/version-check.lua
parentfeat: add gotests, gomodifytags, impl (#28) (diff)
downloadmason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.gz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.bz2
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.lz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.xz
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.tar.zst
mason-976aa4fbee8a070f362cab6f6ec84e9251a90cf9.zip
refactor: add mason-schemas and mason-core modules (#29)
* refactor: add mason-schemas and move generated filetype map to mason-lspconfig * refactor: add mason-core module
Diffstat (limited to 'lua/mason-core/package/version-check.lua')
-rw-r--r--lua/mason-core/package/version-check.lua91
1 files changed, 91 insertions, 0 deletions
diff --git a/lua/mason-core/package/version-check.lua b/lua/mason-core/package/version-check.lua
new file mode 100644
index 00000000..b999c280
--- /dev/null
+++ b/lua/mason-core/package/version-check.lua
@@ -0,0 +1,91 @@
+local Result = require "mason-core.result"
+local cargo = require "mason-core.managers.cargo"
+local composer = require "mason-core.managers.composer"
+local eclipse = require "mason-core.clients.eclipse"
+local gem = require "mason-core.managers.gem"
+local git = require "mason-core.managers.git"
+local github = require "mason-core.managers.github"
+local go = require "mason-core.managers.go"
+local luarocks = require "mason-core.managers.luarocks"
+local npm = require "mason-core.managers.npm"
+local pip3 = require "mason-core.managers.pip3"
+
+---@param field_name string
+local function version_in_receipt(field_name)
+ ---@param receipt InstallReceipt
+ ---@return Result
+ return function(receipt)
+ return Result.success(receipt.primary_source[field_name])
+ end
+end
+
+---@type table<InstallReceiptSourceType, async fun(receipt: InstallReceipt, install_dir: string): Result>
+local get_installed_version_by_type = {
+ ["npm"] = npm.get_installed_primary_package_version,
+ ["pip3"] = pip3.get_installed_primary_package_version,
+ ["gem"] = gem.get_installed_primary_package_version,
+ ["cargo"] = cargo.get_installed_primary_package_version,
+ ["composer"] = composer.get_installed_primary_package_version,
+ ["git"] = git.get_installed_revision,
+ ["go"] = go.get_installed_primary_package_version,
+ ["luarocks"] = luarocks.get_installed_primary_package_version,
+ ["github_release_file"] = version_in_receipt "release",
+ ["github_release"] = version_in_receipt "release",
+ ["github_tag"] = version_in_receipt "tag",
+ ["jdtls"] = version_in_receipt "version",
+}
+
+---@async
+---@param receipt InstallReceipt
+local function jdtls_check(receipt)
+ return eclipse.fetch_latest_jdtls_version():map_catching(function(latest_version)
+ if receipt.primary_source.version ~= latest_version then
+ return {
+ name = "jdtls",
+ current_version = receipt.primary_source.version,
+ latest_version = latest_version,
+ }
+ end
+ error "Primary package is not outdated."
+ end)
+end
+
+---@class NewPackageVersion
+---@field name string
+---@field current_version string
+---@field latest_version string
+
+local get_new_version_by_type = {
+ ["npm"] = npm.check_outdated_primary_package,
+ ["pip3"] = pip3.check_outdated_primary_package,
+ ["git"] = git.check_outdated_git_clone,
+ ["cargo"] = cargo.check_outdated_primary_package,
+ ["composer"] = composer.check_outdated_primary_package,
+ ["gem"] = gem.check_outdated_primary_package,
+ ["go"] = go.check_outdated_primary_package,
+ ["luarocks"] = luarocks.check_outdated_primary_package,
+ ["jdtls"] = jdtls_check,
+ ["github_release_file"] = github.check_outdated_primary_package_release,
+ ["github_release"] = github.check_outdated_primary_package_release,
+ ["github_tag"] = github.check_outdated_primary_package_tag,
+}
+
+---@param provider_mapping table<string, async fun(receipt: InstallReceipt, install_dir: string)>: Result
+local function version_check(provider_mapping)
+ ---@param receipt InstallReceipt
+ ---@param install_dir string
+ return function(receipt, install_dir)
+ local check = provider_mapping[receipt.primary_source.type]
+ if not check then
+ return Result.failure(
+ ("Packages installed via %s does not yet support version check."):format(receipt.primary_source.type)
+ )
+ end
+ return check(receipt, install_dir)
+ end
+end
+
+return {
+ get_installed_version = version_check(get_installed_version_by_type),
+ get_new_version = version_check(get_new_version_by_type),
+}