diff options
| -rw-r--r-- | lua/mason/_generated/package_index.lua | 2 | ||||
| -rw-r--r-- | lua/mason/core/functional/init.lua | 1 | ||||
| -rw-r--r-- | lua/mason/core/functional/string.lua | 6 | ||||
| -rw-r--r-- | lua/mason/core/managers/go/init.lua | 31 | ||||
| -rw-r--r-- | lua/mason/packages/delve/init.lua | 11 | ||||
| -rw-r--r-- | lua/mason/packages/go-debug-adapter/init.lua | 24 | ||||
| -rw-r--r-- | lua/mason/ui/instance.lua | 1 | ||||
| -rw-r--r-- | scripts/autogen_metadata.lua | 6 | ||||
| -rw-r--r-- | tests/core/managers/go_spec.lua | 27 |
9 files changed, 88 insertions, 21 deletions
diff --git a/lua/mason/_generated/package_index.lua b/lua/mason/_generated/package_index.lua index 32dac71c..55323c26 100644 --- a/lua/mason/_generated/package_index.lua +++ b/lua/mason/_generated/package_index.lua @@ -26,6 +26,7 @@ return { ["cssmodules-language-server"] = "mason.packages.cssmodules-language-server", ["cucumber-language-server"] = "mason.packages.cucumber-language-server", debugpy = "mason.packages.debugpy", + delve = "mason.packages.delve", deno = "mason.packages.deno", ["dhall-lsp"] = "mason.packages.dhall-lsp", ["diagnostic-languageserver"] = "mason.packages.diagnostic-languageserver", @@ -44,6 +45,7 @@ return { ["foam-language-server"] = "mason.packages.foam-language-server", fortls = "mason.packages.fortls", fsautocomplete = "mason.packages.fsautocomplete", + ["go-debug-adapter"] = "mason.packages.go-debug-adapter", ["golangci-lint"] = "mason.packages.golangci-lint", ["golangci-lint-langserver"] = "mason.packages.golangci-lint-langserver", gopls = "mason.packages.gopls", diff --git a/lua/mason/core/functional/init.lua b/lua/mason/core/functional/init.lua index cd28ecb7..fd24f9ee 100644 --- a/lua/mason/core/functional/init.lua +++ b/lua/mason/core/functional/init.lua @@ -73,6 +73,7 @@ _.split = string.split _.gsub = string.gsub _.trim = string.trim _.dedent = string.dedent +_.starts_with = string.starts_with -- table local tbl = require "mason.core.functional.table" diff --git a/lua/mason/core/functional/string.lua b/lua/mason/core/functional/string.lua index 8a5817a8..512c7ce1 100644 --- a/lua/mason/core/functional/string.lua +++ b/lua/mason/core/functional/string.lua @@ -65,4 +65,10 @@ _.dedent = fun.curryN(function(str) return lines:match "^(.-)%s*$" end, 1) +---@param prefix string +---@str string +_.starts_with = fun.curryN(function(prefix, str) + return vim.startswith(str, prefix) +end, 2) + return _ diff --git a/lua/mason/core/managers/go/init.lua b/lua/mason/core/managers/go/init.lua index efa062a6..e4f07df8 100644 --- a/lua/mason/core/managers/go/init.lua +++ b/lua/mason/core/managers/go/init.lua @@ -5,6 +5,8 @@ local spawn = require "mason.core.spawn" local a = require "mason.core.async" local Optional = require "mason.core.optional" local _ = require "mason.core.functional" +local fs = require "mason.core.fs" +local path = require "mason.core.path" local M = {} @@ -81,9 +83,28 @@ function M.parse_mod_version_output(output) return result end +local trim_wildcard_suffix = _.gsub("/%.%.%.$", "") + ---@param pkg string -function M.strip_package_wildcard(pkg) - return string.gsub(pkg, "/%.%.%.$", "") +function M.parse_package_mod(pkg) + if _.starts_with("github.com", pkg) then + local components = _.split("/", pkg) + return trim_wildcard_suffix(_.join("/", { + components[1], -- github.com + components[2], -- owner + components[3], -- repo + })) + elseif _.starts_with("golang.org", pkg) then + local components = _.split("/", pkg) + return trim_wildcard_suffix(_.join("/", { + components[1], -- golang.org + components[2], -- x + components[3], -- owner + components[4], -- repo + })) + else + return trim_wildcard_suffix(pkg) + end end ---@async @@ -93,7 +114,7 @@ function M.get_installed_primary_package_version(receipt, install_dir) if vim.in_fast_event() then a.scheduler() end - local normalized_pkg_name = M.strip_package_wildcard(receipt.primary_source.package) + local normalized_pkg_name = trim_wildcard_suffix(receipt.primary_source.package) -- trims e.g. golang.org/x/tools/gopls to gopls local executable = vim.fn.fnamemodify(normalized_pkg_name, ":t") return spawn @@ -105,7 +126,7 @@ function M.get_installed_primary_package_version(receipt, install_dir) }) :map_catching(function(result) local parsed_output = M.parse_mod_version_output(result.stdout) - return Optional.of_nilable(parsed_output.mod[normalized_pkg_name]) + return Optional.of_nilable(parsed_output.mod[M.parse_package_mod(receipt.primary_source.package)]) :or_else_throw "Failed to parse mod version" end) end @@ -114,7 +135,7 @@ end ---@param receipt InstallReceipt ---@param install_dir string function M.check_outdated_primary_package(receipt, install_dir) - local normalized_pkg_name = M.strip_package_wildcard(receipt.primary_source.package) + local normalized_pkg_name = M.parse_package_mod(receipt.primary_source.package) return spawn .go({ "list", diff --git a/lua/mason/packages/delve/init.lua b/lua/mason/packages/delve/init.lua new file mode 100644 index 00000000..eb6c9e59 --- /dev/null +++ b/lua/mason/packages/delve/init.lua @@ -0,0 +1,11 @@ +local Pkg = require "mason.core.package" +local go = require "mason.core.managers.go" + +return Pkg.new { + name = "delve", + desc = [[Delve is a debugger for the Go programming language.]], + homepage = "https://github.com/go-delve/delve", + languages = { Pkg.Lang.Go }, + categories = { Pkg.Cat.DAP }, + install = go.packages { "github.com/go-delve/delve/cmd/dlv", bin = { "dlv" } }, +} diff --git a/lua/mason/packages/go-debug-adapter/init.lua b/lua/mason/packages/go-debug-adapter/init.lua new file mode 100644 index 00000000..a191b730 --- /dev/null +++ b/lua/mason/packages/go-debug-adapter/init.lua @@ -0,0 +1,24 @@ +local Pkg = require "mason.core.package" +local github = require "mason.core.managers.github" +local _ = require "mason.core.functional" +local path = require "mason.core.path" + +return Pkg.new { + name = "go-debug-adapter", + desc = [[Go debug adapter sourced from the VSCode Go extension.]], + homepage = "https://github.com/golang/vscode-go", + languages = { Pkg.Lang.Go }, + categories = { Pkg.Cat.DAP }, + ---@async + ---@param ctx InstallContext + install = function(ctx) + github + .unzip_release_file({ + repo = "golang/vscode-go", + asset_file = _.compose(_.format "go-%s.vsix", _.gsub("^v", "")), + }) + .with_receipt() + ctx:write_node_exec_wrapper("go-debug-adapter", path.concat { "extension", "dist", "debugAdapter.js" }) + ctx:link_bin("go-debug-adapter", "go-debug-adapter") + end, +} diff --git a/lua/mason/ui/instance.lua b/lua/mason/ui/instance.lua index 9f44966c..2f96e347 100644 --- a/lua/mason/ui/instance.lua +++ b/lua/mason/ui/instance.lua @@ -312,6 +312,7 @@ for _, pkg in ipairs(packages) do local pkg_state = state.packages.states[pkg.name] pkg_state.new_version = nil pkg_state.version = nil + pkg_state.has_expanded_before = false pkg_state.tailed_output = {} pkg_state.short_tailed_output = {} end) diff --git a/scripts/autogen_metadata.lua b/scripts/autogen_metadata.lua index ff57794b..d28e2803 100644 --- a/scripts/autogen_metadata.lua +++ b/scripts/autogen_metadata.lua @@ -106,9 +106,9 @@ local function create_package_index() end a.run_blocking(function() - a.wait_all { + a.wait_all(_.filter(_.identity, { create_lspconfig_filetype_map, -- TODO is this needed? - create_lsp_setting_schema_files, + not vim.env.SKIP_SCHEMAS and create_lsp_setting_schema_files, create_package_index, - } + })) end) diff --git a/tests/core/managers/go_spec.lua b/tests/core/managers/go_spec.lua index 0afe09a8..7526120e 100644 --- a/tests/core/managers/go_spec.lua +++ b/tests/core/managers/go_spec.lua @@ -63,8 +63,8 @@ end) describe("go version check", function() local go_version_output = [[ gopls: go1.18 - path golang.org/x/tools/gopls - mod golang.org/x/tools/gopls v0.8.1 h1:q5nDpRopYrnF4DN/1o8ZQ7Oar4Yd4I5OtGMx5RyV2/8= + path golang.org/x/tools/cmd + mod golang.org/x/tools/cmd v0.8.1 h1:q5nDpRopYrnF4DN/1o8ZQ7Oar4Yd4I5OtGMx5RyV2/8= dep github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o= dep mvdan.cc/xurls/v2 v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc= build -compiler=gc @@ -74,8 +74,8 @@ gopls: go1.18 it("should parse go version output", function() local parsed = go.parse_mod_version_output(go_version_output) assert.same({ - path = { ["golang.org/x/tools/gopls"] = "" }, - mod = { ["golang.org/x/tools/gopls"] = "v0.8.1" }, + path = { ["golang.org/x/tools/cmd"] = "" }, + mod = { ["golang.org/x/tools/cmd"] = "v0.8.1" }, dep = { ["github.com/google/go-cmp"] = "v0.5.7", ["mvdan.cc/xurls/v2"] = "v2.4.0" }, build = { ["-compiler=gc"] = "", ["GOOS=darwin"] = "" }, }, parsed) @@ -92,7 +92,7 @@ gopls: go1.18 mock.new { primary_source = mock.new { type = "go", - package = "golang.org/x/tools/gopls/...", + package = "golang.org/x/tools/cmd/gopls/...", }, }, path.package_prefix "dummy" @@ -105,6 +105,7 @@ gopls: go1.18 "gopls", cwd = path.package_prefix "dummy", } + print(result:err_or_nil()) assert.is_true(result:is_success()) assert.equals("v0.8.1", result:get_or_nil()) @@ -121,7 +122,7 @@ gopls: go1.18 "list", "-json", "-m", - "golang.org/x/tools/gopls@latest", + "golang.org/x/tools/cmd@latest", cwd = path.package_prefix "dummy", }) .returns(Result.success { @@ -147,7 +148,7 @@ gopls: go1.18 mock.new { primary_source = mock.new { type = "go", - package = "golang.org/x/tools/gopls/...", + package = "golang.org/x/tools/cmd/gopls/...", }, }, path.package_prefix "dummy" @@ -155,7 +156,7 @@ gopls: go1.18 assert.is_true(result:is_success()) assert.same({ - name = "golang.org/x/tools/gopls", + name = "golang.org/x/tools/cmd", current_version = "v0.8.1", latest_version = "v2.0.0", }, result:get_or_nil()) @@ -164,10 +165,10 @@ gopls: go1.18 end) ) - it("should trim package wildcard specifier", function() - assert.equals( - "https://github.com/cweill/gotests", - go.strip_package_wildcard "https://github.com/cweill/gotests/..." - ) + it("should parse package mod names", function() + assert.equals("github.com/cweill/gotests", go.parse_package_mod "github.com/cweill/gotests/...") + assert.equals("golang.org/x/tools/gopls", go.parse_package_mod "golang.org/x/tools/gopls/...") + assert.equals("golang.org/x/crypto", go.parse_package_mod "golang.org/x/crypto/...") + assert.equals("github.com/go-delve/delve", go.parse_package_mod "github.com/go-delve/delve/cmd/dlv") end) end) |
