From d4050ebc7ed909dcf4b536c109e8ce291112efc3 Mon Sep 17 00:00:00 2001 From: logrusx <45463882+logrusx@users.noreply.github.com> Date: Wed, 4 Feb 2026 04:15:12 +0000 Subject: [PATCH 1/3] feat: add curl downloader (#473) On some Mac systems the user cannot install wget, but curl is available OTB. --- lua/pkgm/downloaders/curl.lua | 63 ++++++++++++++++++++++++++++++++ lua/pkgm/downloaders/factory.lua | 7 ++++ 2 files changed, 70 insertions(+) create mode 100644 lua/pkgm/downloaders/curl.lua diff --git a/lua/pkgm/downloaders/curl.lua b/lua/pkgm/downloaders/curl.lua new file mode 100644 index 0000000..2009ab8 --- /dev/null +++ b/lua/pkgm/downloaders/curl.lua @@ -0,0 +1,63 @@ +local path = require('java-core.utils.path') +local class = require('java-core.utils.class') +local log = require('java-core.utils.log2') + +---@class java-core.Curl +---@field url string +---@field dest string +---@field retry_count number +---@field timeout number +local Curl = class() + +---@class java-core.CurlOpts +---@field url string URL to download +---@field dest? string Destination path (optional, uses temp if not provided) +---@field retry_count? number Retry count (optional, defaults to 5) +---@field timeout? number Timeout in seconds (optional, defaults to 30) + +---@param opts java-core.CurlOpts +function Curl:_init(opts) + self.url = opts.url + + if not opts.dest then + local filename = vim.fs.basename(opts.url) + local tmp_dir = vim.fn.tempname() + vim.fn.mkdir(tmp_dir, 'p') + self.dest = path.join(tmp_dir, filename) + log.debug('Using temp destination:', self.dest) + else + self.dest = opts.dest + log.debug('Using provided destination:', self.dest) + end + + self.retry_count = opts.retry_count or 5 + self.timeout = opts.timeout or 30 +end + +---Download file using curl +---@return string|nil # Path to downloaded file, or nil on failure +---@return string|nil # Error message if failed +function Curl:download() + log.debug('curl downloading:', self.url, 'to', self.dest) + local cmd = string.format( + 'curl --retry %d --connect-timeout %d -o %s %s', + self.retry_count, + self.timeout, + vim.fn.shellescape(self.dest), + vim.fn.shellescape(self.url) + ) + log.debug('curl command:', cmd) + + local result = vim.fn.system(cmd) + local exit_code = vim.v.shell_error + + if exit_code ~= 0 then + log.error('curl failed:', exit_code, result) + return nil, string.format('curl failed (exit %d): %s', exit_code, result) + end + + log.debug('curl download completed:', self.dest) + return self.dest, nil +end + +return Curl diff --git a/lua/pkgm/downloaders/factory.lua b/lua/pkgm/downloaders/factory.lua index f041fe6..a0163c4 100644 --- a/lua/pkgm/downloaders/factory.lua +++ b/lua/pkgm/downloaders/factory.lua @@ -1,4 +1,5 @@ local system = require('java-core.utils.system') +local Curl = require('pkgm.downloaders.curl') local Wget = require('pkgm.downloaders.wget') local PowerShell = require('pkgm.downloaders.powershell') local log = require('java-core.utils.log2') @@ -27,6 +28,12 @@ function M.get_downloader(opts) return Wget(opts) end + -- Check for curl on all platforms + if vim.fn.executable('curl') == 1 then + log.debug('Using curl downloader') + return Curl(opts) + end + -- On Windows, fallback to PowerShell if available if os == 'win' and (vim.fn.executable('pwsh') == 1 or vim.fn.executable('powershell') == 1) then log.debug('Using PowerShell downloader (fallback)') From e4cc304fa7a5daf41c13d6894bc90b4e99e576e6 Mon Sep 17 00:00:00 2001 From: Marco K Date: Wed, 4 Feb 2026 05:20:42 +0100 Subject: [PATCH 2/3] feat: add JavaTestRunAllTests and JavaTestDebugAllTests commands (#467) --- lua/java-test/api.lua | 34 ++++++++++++++++++++++++++++++++++ lua/java-test/init.lua | 28 ++++++++++++++++++++++++++++ plugin/java.lua | 12 ++++++++++++ 3 files changed, 74 insertions(+) diff --git a/lua/java-test/api.lua b/lua/java-test/api.lua index 93e327a..71103f6 100644 --- a/lua/java-test/api.lua +++ b/lua/java-test/api.lua @@ -157,4 +157,38 @@ function M:find_current_test_method() end end +---Run all tests in the workspace +---@param report java-test.JUnitTestReport +---@param config java-dap.DapLauncherConfigOverridable +function M:execute_all_tests(report, config) + log.debug('running all tests') + + local projects = self.test_client:find_java_projects() + + if #projects < 1 then + notify.warn('No Java projects found') + return + end + + -- Discover test classes from all projects + local all_tests = {} + for _, project in ipairs(projects) do + local packages = self.test_client:find_test_packages_and_types(project.jdtHandler) + for _, pkg in ipairs(packages or {}) do + -- Package children are the test classes + for _, test_class in ipairs(pkg.children or {}) do + table.insert(all_tests, test_class) + end + end + end + + if #all_tests < 1 then + notify.warn('No tests found in workspace') + return + end + + log.debug('found ' .. #all_tests .. ' test classes') + self:run_test(all_tests, report, config) +end + return M diff --git a/lua/java-test/init.lua b/lua/java-test/init.lua index 2b2f481..2c525cc 100644 --- a/lua/java-test/init.lua +++ b/lua/java-test/init.lua @@ -71,6 +71,34 @@ function M.run_current_method() .run() end +function M.run_all_tests() + log.info('run all tests') + + return runner(function() + local test_api = JavaTestApi:new({ + client = lsp_utils.get_jdtls(), + runner = DapRunner(), + }) + return test_api:execute_all_tests(M.get_report(), { noDebug = true }) + end) + .catch(get_error_handler('failed to run all tests')) + .run() +end + +function M.debug_all_tests() + log.info('debug all tests') + + return runner(function() + local test_api = JavaTestApi:new({ + client = lsp_utils.get_jdtls(), + runner = DapRunner(), + }) + return test_api:execute_all_tests(M.get_report(), {}) + end) + .catch(get_error_handler('failed to debug all tests')) + .run() +end + function M.view_last_report() if M.last_report then M.last_report:show_report() diff --git a/plugin/java.lua b/plugin/java.lua index 524dc3d..5feba3f 100644 --- a/plugin/java.lua +++ b/plugin/java.lua @@ -35,6 +35,18 @@ local cmd_map = { end, }, + JavaTestRunAllTests = { + function() + require('java-test').run_all_tests() + end, + }, + + JavaTestDebugAllTests = { + function() + require('java-test').debug_all_tests() + end, + }, + JavaTestViewLastReport = { function() require('java-test').view_last_report() From 61e18c47dcf237e29c9689201bf13c0708c288bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 09:53:20 +0530 Subject: [PATCH 3/3] chore(main): release 4.1.0 (#476) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6734155..b07db49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [4.1.0](https://github.com/nvim-java/nvim-java/compare/v4.0.4...v4.1.0) (2026-02-04) + + +### Features + +* add curl downloader ([#473](https://github.com/nvim-java/nvim-java/issues/473)) ([d4050eb](https://github.com/nvim-java/nvim-java/commit/d4050ebc7ed909dcf4b536c109e8ce291112efc3)) +* add JavaTestRunAllTests and JavaTestDebugAllTests commands ([#467](https://github.com/nvim-java/nvim-java/issues/467)) ([e4cc304](https://github.com/nvim-java/nvim-java/commit/e4cc304fa7a5daf41c13d6894bc90b4e99e576e6)) + ## [4.0.4](https://github.com/nvim-java/nvim-java/compare/v4.0.3...v4.0.4) (2025-12-11)