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
|
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_check = require "nvim-lsp-installer.jobs.outdated-servers.npm"
local cargo_check = require "nvim-lsp-installer.jobs.outdated-servers.cargo"
local pip3_check = require "nvim-lsp-installer.jobs.outdated-servers.pip3"
local gem_check = require "nvim-lsp-installer.jobs.outdated-servers.gem"
local git_check = require "nvim-lsp-installer.jobs.outdated-servers.git"
local github_release_file_check = require "nvim-lsp-installer.jobs.outdated-servers.github_release_file"
local github_tag_check = require "nvim-lsp-installer.jobs.outdated-servers.github_tag"
local jdtls = require "nvim-lsp-installer.jobs.outdated-servers.jdtls"
local composer_check = require "nvim-lsp-installer.jobs.outdated-servers.composer"
local M = {}
local jobpool = JobExecutionPool:new {
size = 4,
}
local function noop(server, _, on_result)
on_result(VersionCheckResult.empty(server))
end
---@type Record<InstallReceiptSourceType, function>
local checkers = {
["npm"] = npm_check,
["pip3"] = pip3_check,
["cargo"] = cargo_check,
["gem"] = gem_check,
["composer"] = composer_check,
["go"] = noop, -- TODO
["dotnet"] = noop, -- TODO
["r_package"] = noop, -- TODO
["unmanaged"] = noop,
["system"] = noop,
["jdtls"] = jdtls,
["git"] = git_check,
["github_release_file"] = github_release_file_check,
["github_tag"] = github_tag_check,
["opam"] = noop,
}
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
checker(server, receipt.primary_source, complete)
else
complete(VersionCheckResult.empty(server))
log.fmt_error("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
|