diff options
17 files changed, 110 insertions, 228 deletions
diff --git a/lua/mason-core/installer/registry/init.lua b/lua/mason-core/installer/registry/init.lua index 27a7da2a..6b03296f 100644 --- a/lua/mason-core/installer/registry/init.lua +++ b/lua/mason-core/installer/registry/init.lua @@ -6,6 +6,7 @@ local a = require "mason-core.async" local link = require "mason-core.installer.registry.link" local log = require "mason-core.log" local schemas = require "mason-core.installer.registry.schemas" +local util = require "mason-core.installer.registry.util" local M = {} @@ -132,6 +133,7 @@ function M.parse(spec, opts) return { provider = provider, source = parsed_source, + raw_source = source, purl = purl, } end):on_failure(function(err) @@ -162,13 +164,19 @@ function M.compile(spec, opts) { _.T, _.identity }, } - ---@type { purl: Purl, provider: InstallerProvider, source: ParsedPackageSource } + ---@type { purl: Purl, provider: InstallerProvider, source: ParsedPackageSource, raw_source: RegistryPackageSource } local parsed = try(M.parse(spec, opts):map_err(map_parse_err)) ---@async ---@param ctx InstallContext return function(ctx) return Result.try(function(try) + if ctx.opts.version then + try(util.ensure_valid_version(function() + return parsed.provider.get_versions(parsed.purl, parsed.raw_source) + end)) + end + -- Run installer try(parsed.provider.install(ctx, parsed.source, parsed.purl)) diff --git a/lua/mason-core/installer/registry/providers/cargo.lua b/lua/mason-core/installer/registry/providers/cargo.lua index 464fba5b..312a2938 100644 --- a/lua/mason-core/installer/registry/providers/cargo.lua +++ b/lua/mason-core/installer/registry/providers/cargo.lua @@ -48,17 +48,11 @@ end function M.install(ctx, source) local cargo = require "mason-core.installer.managers.cargo" - return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.crates.get_all_versions(source.crate) - end)) - - try(cargo.install(source.crate, source.version, { - git = source.git, - features = source.features, - locked = source.locked, - })) - end) + return cargo.install(source.crate, source.version, { + git = source.git, + features = source.features, + locked = source.locked, + }) end ---@async diff --git a/lua/mason-core/installer/registry/providers/composer.lua b/lua/mason-core/installer/registry/providers/composer.lua index 7cc03ed8..d85dd2ba 100644 --- a/lua/mason-core/installer/registry/providers/composer.lua +++ b/lua/mason-core/installer/registry/providers/composer.lua @@ -21,14 +21,7 @@ end ---@param source ParsedComposerSource function M.install(ctx, source) local composer = require "mason-core.installer.managers.composer" - - return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.packagist.get_all_versions(source.package) - end)) - - try(composer.install(source.package, source.version)) - end) + return composer.install(source.package, source.version) end ---@async diff --git a/lua/mason-core/installer/registry/providers/gem.lua b/lua/mason-core/installer/registry/providers/gem.lua index 100046d9..9653f116 100644 --- a/lua/mason-core/installer/registry/providers/gem.lua +++ b/lua/mason-core/installer/registry/providers/gem.lua @@ -32,16 +32,9 @@ end ---@param source ParsedGemSource function M.install(ctx, source) local gem = require "mason-core.installer.managers.gem" - - return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.rubygems.get_all_versions(source.package) - end)) - - try(gem.install(source.package, source.version, { - extra_packages = source.extra_packages, - })) - end) + return gem.install(source.package, source.version, { + extra_packages = source.extra_packages, + }) end ---@async diff --git a/lua/mason-core/installer/registry/providers/github/release.lua b/lua/mason-core/installer/registry/providers/github/release.lua index 9d01ba32..5fe95cab 100644 --- a/lua/mason-core/installer/registry/providers/github/release.lua +++ b/lua/mason-core/installer/registry/providers/github/release.lua @@ -88,13 +88,8 @@ end ---@param source ParsedGitHubReleaseSource function M.install(ctx, source) local std = require "mason-core.installer.managers.std" - local providers = require "mason-core.providers" return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.github.get_all_release_versions(source.repo) - end)) - for __, download in ipairs(source.downloads) do a.scheduler() local out_dir = vim.fn.fnamemodify(download.out_file, ":h") diff --git a/lua/mason-core/installer/registry/providers/golang.lua b/lua/mason-core/installer/registry/providers/golang.lua index f8e68bab..40327bb2 100644 --- a/lua/mason-core/installer/registry/providers/golang.lua +++ b/lua/mason-core/installer/registry/providers/golang.lua @@ -36,15 +36,9 @@ end function M.install(ctx, source) local golang = require "mason-core.installer.managers.golang" - return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.golang.get_all_versions(source.package) - end)) - - try(golang.install(source.package, source.version, { - extra_packages = source.extra_packages, - })) - end) + return golang.install(source.package, source.version, { + extra_packages = source.extra_packages, + }) end ---@async diff --git a/lua/mason-core/installer/registry/providers/npm.lua b/lua/mason-core/installer/registry/providers/npm.lua index 85b204c8..d1865b96 100644 --- a/lua/mason-core/installer/registry/providers/npm.lua +++ b/lua/mason-core/installer/registry/providers/npm.lua @@ -35,13 +35,8 @@ end ---@param source ParsedNpmSource function M.install(ctx, source) local npm = require "mason-core.installer.managers.npm" - local providers = require "mason-core.providers" return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.npm.get_all_versions(source.package) - end)) - try(npm.init()) try(npm.install(source.package, source.version, { extra_packages = source.extra_packages, diff --git a/lua/mason-core/installer/registry/providers/pypi.lua b/lua/mason-core/installer/registry/providers/pypi.lua index 6efb9730..c162c120 100644 --- a/lua/mason-core/installer/registry/providers/pypi.lua +++ b/lua/mason-core/installer/registry/providers/pypi.lua @@ -41,10 +41,6 @@ function M.install(ctx, source) local pypi = require "mason-core.installer.managers.pypi" return Result.try(function(try) - try(util.ensure_valid_version(function() - return providers.pypi.get_all_versions(source.package) - end)) - try(pypi.init { upgrade_pip = source.pip.upgrade, install_extra_args = source.pip.extra_args, diff --git a/lua/mason-core/installer/registry/util.lua b/lua/mason-core/installer/registry/util.lua index ed98b738..04492bbf 100644 --- a/lua/mason-core/installer/registry/util.lua +++ b/lua/mason-core/installer/registry/util.lua @@ -38,7 +38,7 @@ end ---Checks whether a custom version of a package installation corresponds to a valid version. ---@async ----@param versions_thunk async fun(): Result Result<string> +---@param versions_thunk async fun(): Result Result<string[]> function M.ensure_valid_version(versions_thunk) local ctx = installer.context() local version = ctx.opts.version diff --git a/tests/mason-core/installer/registry/installer_spec.lua b/tests/mason-core/installer/registry/installer_spec.lua index 3559c3b9..6ac25da9 100644 --- a/tests/mason-core/installer/registry/installer_spec.lua +++ b/tests/mason-core/installer/registry/installer_spec.lua @@ -1,6 +1,7 @@ local Result = require "mason-core.result" local installer = require "mason-core.installer.registry" local match = require "luassert.match" +local spy = require "luassert.spy" local stub = require "luassert.stub" local util = require "mason-core.installer.registry.util" @@ -28,6 +29,9 @@ local dummy_provider = { return Result.success() end end, + get_versions = function() + return Result.success { "v1.0.0", "v2.0.0" } + end, } describe("registry installer :: parsing", function() @@ -125,37 +129,112 @@ end) describe("registry installer :: compiling", function() it("should run compiled installer function successfully", function() installer.register_provider("dummy", dummy_provider) + spy.on(dummy_provider, "get_versions") + + ---@type PackageInstallOpts + local opts = {} local result = installer.compile({ schema = "registry+v1", source = { id = "pkg:dummy/package-name@v1.2.3", }, - }, {}) + }, opts) assert.is_true(result:is_success()) - local installer_fn = result:get_or_nil() + local installer_fn = result:get_or_throw() - local ctx = create_dummy_context() + local ctx = create_dummy_context(opts) local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn) + assert.same(Result.success(), installer_result) + assert.spy(dummy_provider.get_versions).was_not_called() + end) + + it("should ensure valid version", function() + installer.register_provider("dummy", dummy_provider) + spy.on(dummy_provider, "get_versions") + + ---@type PackageInstallOpts + local opts = { version = "v2.0.0" } + + local result = installer.compile({ + schema = "registry+v1", + source = { + id = "pkg:dummy/package-name@v1.2.3", + }, + }, opts) + + assert.is_true(result:is_success()) + local installer_fn = result:get_or_throw() + + local ctx = create_dummy_context(opts) + local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn) + assert.same(Result.success(), installer_result) + + assert.spy(dummy_provider.get_versions).was_called(1) + assert.spy(dummy_provider.get_versions).was_called_with({ + name = "package-name", + scheme = "pkg", + type = "dummy", + version = "v2.0.0", + }, { + id = "pkg:dummy/package-name@v1.2.3", + }) + end) + + it("should reject invalid version", function() + installer.register_provider("dummy", dummy_provider) + spy.on(dummy_provider, "get_versions") + + ---@type PackageInstallOpts + local opts = { version = "v13.3.7" } + + local result = installer.compile({ + schema = "registry+v1", + source = { + id = "pkg:dummy/package-name@v1.2.3", + }, + }, opts) + + assert.is_true(result:is_success()) + local installer_fn = result:get_or_throw() + + local ctx = create_dummy_context(opts) + local err = assert.has_error(function() + require("mason-core.installer").exec_in_context(ctx, installer_fn) + end) + + assert.equals([[Version "v13.3.7" is not available.]], err) + assert.spy(dummy_provider.get_versions).was_called(1) + assert.spy(dummy_provider.get_versions).was_called_with({ + name = "package-name", + scheme = "pkg", + type = "dummy", + version = "v13.3.7", + }, { + id = "pkg:dummy/package-name@v1.2.3", + }) end) it("should raise errors upon installer failures", function() installer.register_provider("dummy", dummy_provider) + ---@type PackageInstallOpts + local opts = {} + local result = installer.compile({ schema = "registry+v1", source = { id = "pkg:dummy/package-name@v1.2.3", should_fail = true, }, - }, {}) + }, opts) assert.is_true(result:is_success()) local installer_fn = result:get_or_nil() - local ctx = create_dummy_context() + local ctx = create_dummy_context(opts) local err = assert.has_error(function() require("mason-core.installer").exec_in_context(ctx, installer_fn) end) @@ -178,13 +257,15 @@ describe("registry installer :: compiling", function() opt = { ["opt/"] = "opt/" }, share = { ["share/"] = "share/" }, } + ---@type PackageInstallOpts + local opts = {} - local result = installer.compile(spec, {}) + local result = installer.compile(spec, opts) assert.is_true(result:is_success()) local installer_fn = result:get_or_nil() - local ctx = create_dummy_context() + local ctx = create_dummy_context(opts) local installer_result = require("mason-core.installer").exec_in_context(ctx, installer_fn) assert.is_true(installer_result:is_success()) diff --git a/tests/mason-core/installer/registry/providers/cargo_spec.lua b/tests/mason-core/installer/registry/providers/cargo_spec.lua index 61cbd6c0..674164c2 100644 --- a/tests/mason-core/installer/registry/providers/cargo_spec.lua +++ b/tests/mason-core/installer/registry/providers/cargo_spec.lua @@ -116,28 +116,4 @@ describe("cargo provider :: installing", function() locked = true, }) end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.cargo" - local providers = require "mason-core.providers" - stub(providers.crates, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return cargo.install(ctx, { - crate = "crate-name", - version = "1.10.0", - features = nil, - locked = true, - git = nil, - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.install).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/composer_spec.lua b/tests/mason-core/installer/registry/providers/composer_spec.lua index a8c29d59..8b771ff9 100644 --- a/tests/mason-core/installer/registry/providers/composer_spec.lua +++ b/tests/mason-core/installer/registry/providers/composer_spec.lua @@ -42,25 +42,4 @@ describe("composer provider :: installing", function() assert.spy(manager.install).was_called(1) assert.spy(manager.install).was_called_with("vendor/package", "1.2.0") end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.composer" - local providers = require "mason-core.providers" - stub(providers.packagist, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return composer.install(ctx, { - package = "vendor/package", - version = "1.10.0", - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.install).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/gem_spec.lua b/tests/mason-core/installer/registry/providers/gem_spec.lua index 0ddfdcc1..965cdbe8 100644 --- a/tests/mason-core/installer/registry/providers/gem_spec.lua +++ b/tests/mason-core/installer/registry/providers/gem_spec.lua @@ -48,25 +48,4 @@ describe("gem provider :: installing", function() assert.spy(manager.install).was_called(1) assert.spy(manager.install).was_called_with("package", "5.2.0", { extra_packages = { "extra" } }) end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.gem" - local providers = require "mason-core.providers" - stub(providers.rubygems, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return gem.install(ctx, { - package = "package", - version = "1.10.0", - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.install).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/github/release_spec.lua b/tests/mason-core/installer/registry/providers/github/release_spec.lua index 6d0ff5df..47ac47c8 100644 --- a/tests/mason-core/installer/registry/providers/github/release_spec.lua +++ b/tests/mason-core/installer/registry/providers/github/release_spec.lua @@ -352,33 +352,4 @@ describe("github provider :: release :: installing", function() assert.is_true(match.matches "out/dir$"(unpack_cwd)) assert.spy(std.unpack).was_called_with "file.zip" end) - - it("should install ensure valid version when installing release asset", function() - local ctx = create_dummy_context { - version = "1.42.0", - } - local std = require "mason-core.installer.managers.std" - local providers = require "mason-core.providers" - stub(std, "download_file") - stub(providers.github, "get_all_release_versions", mockx.returns(Result.success { "2023-03-09" })) - - local result = installer.exec_in_context(ctx, function() - return github.install(ctx, { - repo = "namespace/name", - asset = { - file = "file.zip", - }, - downloads = { - { - out_file = "out/dir/file.zip", - download_url = "https://github.com/namespace/name/releases/download/2023-03-09/file.zip", - }, - }, - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.42.0" is not available.]], result) - assert.spy(std.download_file).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/golang_spec.lua b/tests/mason-core/installer/registry/providers/golang_spec.lua index 696c257e..6ba57272 100644 --- a/tests/mason-core/installer/registry/providers/golang_spec.lua +++ b/tests/mason-core/installer/registry/providers/golang_spec.lua @@ -44,25 +44,4 @@ describe("golang provider :: installing", function() assert.spy(manager.install).was_called(1) assert.spy(manager.install).was_called_with("namespace/package", "v1.5.0", { extra_packages = { "extra" } }) end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.golang" - local providers = require "mason-core.providers" - stub(providers.golang, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return golang.install(ctx, { - package = "package", - version = "1.10.0", - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.install).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/npm_spec.lua b/tests/mason-core/installer/registry/providers/npm_spec.lua index ce968d43..b39d092a 100644 --- a/tests/mason-core/installer/registry/providers/npm_spec.lua +++ b/tests/mason-core/installer/registry/providers/npm_spec.lua @@ -46,27 +46,4 @@ describe("npm provider :: installing", function() assert.spy(manager.install).was_called(1) assert.spy(manager.install).was_called_with("@namespace/package", "v1.5.0", { extra_packages = { "extra" } }) end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.npm" - local providers = require "mason-core.providers" - stub(providers.npm, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "init", mockx.returns(Result.success())) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return npm.install(ctx, { - package = "package", - version = "1.10.0", - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.init).was_called(0) - assert.spy(manager.install).was_called(0) - end) end) diff --git a/tests/mason-core/installer/registry/providers/pypi_spec.lua b/tests/mason-core/installer/registry/providers/pypi_spec.lua index f6f4c5c3..5ba9609b 100644 --- a/tests/mason-core/installer/registry/providers/pypi_spec.lua +++ b/tests/mason-core/installer/registry/providers/pypi_spec.lua @@ -83,32 +83,4 @@ describe("pypi provider :: installing", function() ) settings.set(settings._DEFAULT_SETTINGS) end) - - it("should ensure valid version", function() - local ctx = create_dummy_context { - version = "1.10.0", - } - local manager = require "mason-core.installer.managers.pypi" - local providers = require "mason-core.providers" - stub(providers.pypi, "get_all_versions", mockx.returns(Result.success { "1.0.0" })) - stub(manager, "init", mockx.returns(Result.success())) - stub(manager, "install", mockx.returns(Result.success())) - - local result = installer.exec_in_context(ctx, function() - return pypi.install(ctx, { - package = "package", - version = "1.5.0", - extra_packages = {}, - pip = { - upgrade = true, - extra_args = { "--proxy", "http://localghost" }, - }, - }) - end) - - assert.is_true(result:is_failure()) - assert.same(Result.failure [[Version "1.10.0" is not available.]], result) - assert.spy(manager.init).was_called(0) - assert.spy(manager.install).was_called(0) - end) end) |
