aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYochem van Rosmalen <git@yochem.nl>2025-04-09 13:13:20 +0200
committerGitHub <noreply@github.com>2025-04-09 04:13:20 -0700
commit5a94edad70f9c47250fa53dd73cf30f191a3cd49 (patch)
treef47f636000b7b3bd4327a276d8f82d01eb756880
parentff2cbe8facd56e27705e6ada2c08136773e5bbe8 (diff)
downloadrneovim-5a94edad70f9c47250fa53dd73cf30f191a3cd49.tar.gz
rneovim-5a94edad70f9c47250fa53dd73cf30f191a3cd49.tar.bz2
rneovim-5a94edad70f9c47250fa53dd73cf30f191a3cd49.zip
feat(health): summary in section heading #33388
Problem: As checkhealth grows, it is increasingly hard to quickly glance through the information. Solution: Show a summary of ok, warn, and error outputs per section.
-rw-r--r--runtime/doc/news.txt2
-rw-r--r--runtime/lua/vim/health.lua28
-rw-r--r--test/functional/plugin/health_spec.lua36
3 files changed, 44 insertions, 22 deletions
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index 5b614c1b47..d67c78adb5 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -165,7 +165,7 @@ TUI
UI
-• todo
+• |:checkhealth| shows a summary in the header for every healthcheck.
VIMSCRIPT
diff --git a/runtime/lua/vim/health.lua b/runtime/lua/vim/health.lua
index 294f2a357a..302cc6bc99 100644
--- a/runtime/lua/vim/health.lua
+++ b/runtime/lua/vim/health.lua
@@ -106,6 +106,7 @@
local M = {}
local s_output = {} ---@type string[]
+local check_summary = { warn = 0, error = 0 }
-- From a path return a list [{name}, {func}, {type}] representing a healthcheck
local function filepath_to_healthcheck(path)
@@ -286,6 +287,7 @@ end
function M.warn(msg, ...)
local input = format_report_message('⚠️ WARNING', msg, ...)
collect_output(input)
+ check_summary['warn'] = check_summary['warn'] + 1
end
--- Reports an error.
@@ -295,6 +297,7 @@ end
function M.error(msg, ...)
local input = format_report_message('❌ ERROR', msg, ...)
collect_output(input)
+ check_summary['error'] = check_summary['error'] + 1
end
local path2name = function(path)
@@ -341,6 +344,23 @@ M._complete = function()
return rv
end
+--- Gets the results heading for the current report section.
+---
+---@return string
+local function get_summary()
+ local s = ''
+ local errors = check_summary['error']
+ local warns = check_summary['warn']
+
+ s = s .. (warns > 0 and (' %2d ⚠️'):format(warns) or '')
+ s = s .. (errors > 0 and (' %2d ❌'):format(errors) or '')
+ if errors == 0 and warns == 0 then
+ s = s .. '✅'
+ end
+
+ return s
+end
+
--- Runs the specified healthchecks.
--- Runs all discovered healthchecks if plugin_names is empty.
---
@@ -397,9 +417,9 @@ function M._check(mods, plugin_names)
local func = value[1]
local type = value[2]
s_output = {}
+ check_summary = { warn = 0, error = 0 }
if func == '' then
- s_output = {}
M.error('No healthcheck found for "' .. name .. '" plugin.')
end
if type == 'v' then
@@ -420,10 +440,12 @@ function M._check(mods, plugin_names)
M.error('The healthcheck report for "' .. name .. '" plugin is empty.')
end
+ local report = get_summary()
+ local replen = vim.fn.strwidth(report)
local header = {
string.rep('=', 78),
- -- Example: `foo.health: [ …] require("foo.health").check()`
- ('%s: %s%s'):format(name, (' '):rep(76 - name:len() - func:len()), func),
+ -- Example: `foo.health: [ …] 1 ⚠️ 5 ❌`
+ ('%s: %s%s'):format(name, (' '):rep(76 - name:len() - replen), report),
'',
}
diff --git a/test/functional/plugin/health_spec.lua b/test/functional/plugin/health_spec.lua
index 58634460c8..1b14edce1e 100644
--- a/test/functional/plugin/health_spec.lua
+++ b/test/functional/plugin/health_spec.lua
@@ -91,7 +91,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- test_plug.full_render: require("test_plug.full_render.health").check()
+ test_plug.full_render: 1 ⚠️ 1 ❌
report 1 ~
- ✅ OK life is fine
@@ -114,7 +114,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- test_plug: require("test_plug.health").check()
+ test_plug: ✅
report 1 ~
- ✅ OK everything is fine
@@ -123,7 +123,7 @@ describe('vim.health', function()
- ✅ OK nothing to see here
==============================================================================
- test_plug.success1: require("test_plug.success1.health").check()
+ test_plug.success1: ✅
report 1 ~
- ✅ OK everything is fine
@@ -132,7 +132,7 @@ describe('vim.health', function()
- ✅ OK nothing to see here
==============================================================================
- test_plug.success2: require("test_plug.success2.health").check()
+ test_plug.success2: ✅
another 1 ~
- ✅ OK ok
@@ -144,7 +144,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- test_plug.submodule: require("test_plug.submodule.health").check()
+ test_plug.submodule: ✅
report 1 ~
- ✅ OK everything is fine
@@ -159,7 +159,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- test_plug.submodule_empty: require("test_plug.submodule_empty.health").check()
+ test_plug.submodule_empty: 1 ❌
- ❌ ERROR The healthcheck report for "test_plug.submodule_empty" plugin is empty.
]])
@@ -185,7 +185,7 @@ describe('vim.health', function()
- ❌ {Error:ERROR} No healthcheck found for "foo" plugin. |
|
{Bar: }|
- {h1:test_plug.success1: require("test_pl}|
+ {h1:test_plug.success1: }|
|
{h2:report 1} |
- ✅ {Ok:OK} everything is fine |
@@ -200,7 +200,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- non_existent_healthcheck:
+ non_existent_healthcheck: 1 ❌
- ❌ ERROR No healthcheck found for "non_existent_healthcheck" plugin.
]])
@@ -218,7 +218,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- test_plug.lua: require("test_plug.lua.health").check()
+ test_plug.lua: ✅
nested lua/ directory ~
- ✅ OK everything is ok
@@ -236,7 +236,7 @@ describe('vim.health', function()
n.expect([[
==============================================================================
- nest: require("nest.health").check()
+ nest: ✅
healthy pack ~
- ✅ OK healthy ok
@@ -281,14 +281,14 @@ describe(':checkhealth window', function()
^ |
{14: }|
{14: } |
- {h1:test_plug.success1: }|
- {h1:require("test_plug.success1.health").check()} |
+ {h1:test_plug. }|
+ {h1:success1: }|
+ {h1: ✅} |
|
{h2:report 1} |
- ✅ {32:OK} everything is fine |
|
{h2:report 2} |
- - ✅ {32:OK} nothing to see here |
## grid 3
|
]],
@@ -324,8 +324,8 @@ describe(':checkhealth window', function()
{14: } |
{h1:test_plug. }|
{h1:success1: }|
- {h1:require("test_plug. }|
- {h1:success1.health").check()}|
+ {h1: }|
+ {h1: ✅} |
|
{h2:report 1} |
- ✅ {32:OK} everything is |
@@ -383,15 +383,15 @@ describe(':checkhealth window', function()
^ |
|
|
- test_plug.success1: |
- require("test_plug.success1.health").check() |
+ test_plug. |
+ success1: |
+ ✅ |
|
report 1 |
- ✅ OK everything is fine |
|
report 2 |
- ✅ OK nothing to see here |
- |
]]):format(
top
and [[