aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua
blob: 065fabfb24b4cc6c8c6b48763fc1eef80bf6f41d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
local a = require "nvim-lsp-installer.core.async"
local JobExecutionPool = require "nvim-lsp-installer.jobs.pool"
local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.version-check-result"
local log = require "nvim-lsp-installer.log"

local npm = require "nvim-lsp-installer.core.managers.npm"
local pip3 = require "nvim-lsp-installer.core.managers.pip3"
local git = require "nvim-lsp-installer.core.managers.git"
local gem = require "nvim-lsp-installer.core.managers.gem"
local go = require "nvim-lsp-installer.core.managers.go"
local cargo = require "nvim-lsp-installer.core.managers.cargo"
local github = require "nvim-lsp-installer.core.managers.github"
local composer = require "nvim-lsp-installer.core.managers.composer"
local jdtls_check = require "nvim-lsp-installer.jobs.outdated-servers.jdtls"
local luarocks = require "nvim-lsp-installer.core.managers.luarocks"

local M = {}

local jobpool = JobExecutionPool:new {
    size = 4,
}

---@type table<InstallReceiptSourceType, async fun(receipt: InstallReceipt, install_dir: string): Result>
local checkers = {
    ["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,
}

local pending_servers = {}

---@alias VersionCheckResultProgress {completed: integer, total: integer}

---@param servers Server[]
---@param on_result fun(result: VersionCheckResult, progress: VersionCheckResultProgress)
function M.identify_outdated_servers(servers, on_result)
    local total_checks = #servers
    local completed_checks = 0
    for _, server in ipairs(servers) do
        if not pending_servers[server.name] then
            pending_servers[server.name] = true
            jobpool:supply(function(_done)
                local function complete(result)
                    completed_checks = completed_checks + 1
                    pending_servers[server.name] = nil
                    on_result(result, { completed = completed_checks, total = total_checks })
                    _done()
                end

                local receipt = server:get_receipt()
                if receipt then
                    if
                        vim.tbl_contains({ "github_release_file", "github_tag" }, receipt.primary_source.type)
                        and receipt.schema_version == "1.0"
                    then
                        -- Receipts of this version are in some cases incomplete.
                        return complete(VersionCheckResult.fail(server))
                    end

                    local checker = checkers[receipt.primary_source.type]
                    if checker then
                        a.run(checker, function(success, result)
                            if success and result:is_success() then
                                complete(VersionCheckResult.success(server, { result:get_or_nil() }))
                            else
                                complete(VersionCheckResult.fail(server))
                            end
                        end, receipt, server.root_dir)
                    else
                        complete(VersionCheckResult.empty(server))
                        log.fmt_debug("Unable to find checker for source=%s", receipt.primary_source.type)
                    end
                else
                    complete(VersionCheckResult.empty(server))
                    log.fmt_trace("No receipt found for server=%s", server.name)
                end
            end)
        else
            completed_checks = completed_checks + 1
            on_result(VersionCheckResult.fail(server), { completed = completed_checks, total = total_checks })
        end
    end
end

return M