summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2026-04-22 08:12:55 +0800
committerGitHub <noreply@github.com>2026-04-22 08:12:55 +0800
commit208951cbc0ccf05b78edbaa10cfa00175e84f864 (patch)
treef1aea8cbdaf64090e7e655b1bcc2b4178d3bbbb2 /src
parentff68fd6b8a84ce83c14358db1d70a562f1524ebe (diff)
fix(:restart): avoid ERR/WRN logging on Windows with --listen (#39287)
Problem: :restart leads to ERR/WRN logging on Windows with --listen. Solution: Add a log_level flag to vim._with() and use it to suppress logging from serverstart()/serverstop() during restart.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/log.c6
-rw-r--r--src/nvim/log.h6
-rw-r--r--src/nvim/lua/stdlib.c15
3 files changed, 20 insertions, 7 deletions
diff --git a/src/nvim/log.c b/src/nvim/log.c
index c8cee3bffa..fe119ca41c 100644
--- a/src/nvim/log.c
+++ b/src/nvim/log.c
@@ -149,13 +149,9 @@ bool logmsg(int log_level, const char *context, const char *func_name, int line_
return false;
}
-#ifndef NVIM_LOG_DEBUG
- // This should rarely happen (callsites are compiled out), but to be sure.
- // TODO(bfredl): allow log levels to be configured at runtime
- if (log_level < LOGLVL_WRN) {
+ if (log_level < g_min_log_level) {
return false;
}
-#endif
#ifdef EXITFREE
// Logging after we've already started freeing all our memory will only cause
diff --git a/src/nvim/log.h b/src/nvim/log.h
index d6b5784c10..18f9096b8c 100644
--- a/src/nvim/log.h
+++ b/src/nvim/log.h
@@ -51,4 +51,10 @@
# define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
#endif
+#ifndef NVIM_LOG_DEBUG
+EXTERN int g_min_log_level INIT( = LOGLVL_WRN);
+#else
+EXTERN int g_min_log_level INIT( = 0);
+#endif
+
#include "log.h.generated.h"
diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c
index d6e750e1c1..1b36da4fbb 100644
--- a/src/nvim/lua/stdlib.c
+++ b/src/nvim/lua/stdlib.c
@@ -8,6 +8,7 @@
#include <string.h>
#include <uv.h>
+#include "nvim/log.h"
#ifdef NVIM_VENDOR_BIT
# include "bit.h"
#endif
@@ -581,6 +582,7 @@ static int nlua_with(lua_State *L)
int flags = 0;
buf_T *buf = NULL;
win_T *win = NULL;
+ int log_level = -1;
#define APPLY_FLAG(key, flag) \
if (strequal((key), k) && (v)) { \
@@ -594,10 +596,12 @@ static int nlua_with(lua_State *L)
if (lua_type(L, -2) == LUA_TSTRING) {
const char *k = lua_tostring(L, -2);
bool v = lua_toboolean(L, -1);
- if (strequal("buf", k)) { \
+ if (strequal("buf", k)) {
buf = handle_get_buffer((int)luaL_checkinteger(L, -1));
- } else if (strequal("win", k)) { \
+ } else if (strequal("win", k)) {
win = handle_get_window((int)luaL_checkinteger(L, -1));
+ } else if (strequal("log_level", k)) {
+ log_level = (int)luaL_checkinteger(L, -1);
} else {
APPLY_FLAG("sandbox", CMOD_SANDBOX);
APPLY_FLAG("silent", CMOD_SILENT);
@@ -618,6 +622,10 @@ static int nlua_with(lua_State *L)
int status = 0;
int rets = 0;
+ const int save_min_log_level = g_min_log_level;
+ if (log_level >= 0) {
+ g_min_log_level = log_level;
+ }
cmdmod_T save_cmdmod = cmdmod;
CLEAR_FIELD(cmdmod);
cmdmod.cmod_flags = flags;
@@ -652,6 +660,9 @@ static int nlua_with(lua_State *L)
undo_cmdmod(&cmdmod);
cmdmod = save_cmdmod;
+ if (log_level >= 0) {
+ g_min_log_level = save_min_log_level;
+ }
if (status) {
return lua_error(L);