mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
feat(lua): exit 1 on Lua "-l" script error
This commit is contained in:
@@ -1042,7 +1042,7 @@ EXTERN int vim_ignored;
|
|||||||
|
|
||||||
// stdio is an RPC channel (--embed).
|
// stdio is an RPC channel (--embed).
|
||||||
EXTERN bool embedded_mode INIT(= false);
|
EXTERN bool embedded_mode INIT(= false);
|
||||||
// Do not start a UI nor read/write to stdio (unless embedding).
|
// Do not start UI (--headless, -l) nor read/write to stdio (unless embedding).
|
||||||
EXTERN bool headless_mode INIT(= false);
|
EXTERN bool headless_mode INIT(= false);
|
||||||
|
|
||||||
// uncrustify:on
|
// uncrustify:on
|
||||||
|
@@ -325,10 +325,11 @@ static int nlua_thr_api_nvim__get_runtime(lua_State *lstate)
|
|||||||
|
|
||||||
/// Copies args starting at `lua_arg0` into the Lua `arg` global.
|
/// Copies args starting at `lua_arg0` into the Lua `arg` global.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example (`lua_arg0` points to "--arg1"):
|
||||||
/// nvim -l foo.lua --arg1 --arg2
|
/// nvim -l foo.lua --arg1 --arg2
|
||||||
///
|
///
|
||||||
/// @note `lua` CLI sets _negative_ `arg` indices to the arguments upto "-e".
|
/// @note Lua CLI sets arguments upto "-e" as _negative_ `_G.arg` indices, but we currently don't
|
||||||
|
/// follow that convention.
|
||||||
///
|
///
|
||||||
/// @see https://www.lua.org/pil/1.4.html
|
/// @see https://www.lua.org/pil/1.4.html
|
||||||
/// @see https://github.com/premake/premake-core/blob/1c1304637f4f5e50ba8c57aae8d1d80ec3b7aaf2/src/host/premake.c#L563-L594
|
/// @see https://github.com/premake/premake-core/blob/1c1304637f4f5e50ba8c57aae8d1d80ec3b7aaf2/src/host/premake.c#L563-L594
|
||||||
@@ -1710,10 +1711,10 @@ void ex_luafile(exarg_T *const eap)
|
|||||||
nlua_exec_file((const char *)eap->arg);
|
nlua_exec_file((const char *)eap->arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// execute lua code from a file.
|
/// Executes Lua code from a file.
|
||||||
///
|
///
|
||||||
/// Note: we call the lua global loadfile as opposed to calling luaL_loadfile
|
/// Note: we call the Lua global loadfile as opposed to calling luaL_loadfile
|
||||||
/// in case loadfile has been overridden in the users environment.
|
/// in case loadfile was overridden in the user's environment.
|
||||||
///
|
///
|
||||||
/// @param path path of the file
|
/// @param path path of the file
|
||||||
///
|
///
|
||||||
|
@@ -608,8 +608,9 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (params.luaf != NULL) {
|
if (params.luaf != NULL) {
|
||||||
nlua_exec_file(params.luaf);
|
bool lua_ok = nlua_exec_file(params.luaf);
|
||||||
// return 0;
|
TIME_MSG("executing Lua -l script");
|
||||||
|
getout(lua_ok ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
TIME_MSG("before starting main loop");
|
TIME_MSG("before starting main loop");
|
||||||
@@ -659,9 +660,8 @@ void getout(int exitval)
|
|||||||
{
|
{
|
||||||
exiting = true;
|
exiting = true;
|
||||||
|
|
||||||
// When running in Ex mode an error causes us to exit with a non-zero exit
|
// On error during Ex mode, exit with a non-zero code.
|
||||||
// code. POSIX requires this, although it's not 100% clear from the
|
// POSIX requires this, although it's not 100% clear from the standard.
|
||||||
// standard.
|
|
||||||
if (exmode_active) {
|
if (exmode_active) {
|
||||||
exitval += ex_exitval;
|
exitval += ex_exitval;
|
||||||
}
|
}
|
||||||
@@ -752,6 +752,7 @@ void getout(int exitval)
|
|||||||
if (did_emsg) {
|
if (did_emsg) {
|
||||||
// give the user a chance to read the (error) message
|
// give the user a chance to read the (error) message
|
||||||
no_wait_return = false;
|
no_wait_return = false;
|
||||||
|
// TODO(justinmk): this may call getout(0), clobbering exitval...
|
||||||
wait_return(false);
|
wait_return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -775,10 +776,9 @@ void getout(int exitval)
|
|||||||
os_exit(exitval);
|
os_exit(exitval);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Preserve files and exit.
|
/// Preserve files, print contents of `IObuff`, and exit 1.
|
||||||
/// @note IObuff must contain a message.
|
///
|
||||||
/// @note This may be called from deadly_signal() in a signal handler, avoid
|
/// May be called from deadly_signal().
|
||||||
/// unsafe functions, such as allocating memory.
|
|
||||||
void preserve_exit(void)
|
void preserve_exit(void)
|
||||||
FUNC_ATTR_NORETURN
|
FUNC_ATTR_NORETURN
|
||||||
{
|
{
|
||||||
@@ -1309,6 +1309,7 @@ static void command_line_scan(mparm_T *parmp)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'l': // "-l" Lua script: args after "-l".
|
case 'l': // "-l" Lua script: args after "-l".
|
||||||
|
headless_mode = true;
|
||||||
silent_mode = true;
|
silent_mode = true;
|
||||||
p_verbose = 1;
|
p_verbose = 1;
|
||||||
parmp->no_swap_file = true;
|
parmp->no_swap_file = true;
|
||||||
@@ -1403,8 +1404,8 @@ scripterror:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (embedded_mode && silent_mode) {
|
if (embedded_mode && (silent_mode || parmp->luaf)) {
|
||||||
mainerr(_("--embed conflicts with -es/-Es"), NULL);
|
mainerr(_("--embed conflicts with -es/-Es/-l"), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a "+123" or "-c" command, set v:swapcommand to the first one.
|
// If there is a "+123" or "-c" command, set v:swapcommand to the first one.
|
||||||
|
@@ -88,11 +88,11 @@ describe('startup', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
describe('-l Lua', function()
|
describe('-l Lua', function()
|
||||||
local function assert_l_out(expected, args_before, args_after)
|
local function assert_l_out(expected, nvim_args, lua_args)
|
||||||
local args = { nvim_prog, '--clean' }
|
local args = { nvim_prog, '--clean' }
|
||||||
vim.list_extend(args, args_before or {})
|
vim.list_extend(args, nvim_args or {})
|
||||||
vim.list_extend(args, { '-l', 'test/functional/fixtures/startup.lua' })
|
vim.list_extend(args, { '-l', 'test/functional/fixtures/startup.lua' })
|
||||||
vim.list_extend(args, args_after or {})
|
vim.list_extend(args, lua_args or {})
|
||||||
local out = funcs.system(args):gsub('\r\n', '\n')
|
local out = funcs.system(args):gsub('\r\n', '\n')
|
||||||
return eq(dedent(expected), out)
|
return eq(dedent(expected), out)
|
||||||
end
|
end
|
||||||
@@ -115,6 +115,13 @@ describe('startup', function()
|
|||||||
eq(73, eval('v:shell_error'))
|
eq(73, eval('v:shell_error'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('Lua error sets Nvim exitcode', function()
|
||||||
|
eq(0, eval('v:shell_error'))
|
||||||
|
matches('E5113: .* my pearls!!',
|
||||||
|
funcs.system({ nvim_prog, '-l', 'test/functional/fixtures/startup-fail.lua' }))
|
||||||
|
eq(1, eval('v:shell_error'))
|
||||||
|
end)
|
||||||
|
|
||||||
it('sets _G.arg', function()
|
it('sets _G.arg', function()
|
||||||
-- nvim -l foo.lua -arg1 -- a b c
|
-- nvim -l foo.lua -arg1 -- a b c
|
||||||
assert_l_out([[
|
assert_l_out([[
|
||||||
@@ -396,11 +403,13 @@ describe('startup', function()
|
|||||||
{ 'put =mode(1)', 'print', '' }))
|
{ 'put =mode(1)', 'print', '' }))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('fails on --embed with -es/-Es', function()
|
it('fails on --embed with -es/-Es/-l', function()
|
||||||
matches('nvim[.exe]*: %-%-embed conflicts with %-es/%-Es',
|
matches('nvim[.exe]*: %-%-embed conflicts with %-es/%-Es/%-l',
|
||||||
funcs.system({nvim_prog, '--embed', '-es' }))
|
funcs.system({nvim_prog, '--embed', '-es' }))
|
||||||
matches('nvim[.exe]*: %-%-embed conflicts with %-es/%-Es',
|
matches('nvim[.exe]*: %-%-embed conflicts with %-es/%-Es/%-l',
|
||||||
funcs.system({nvim_prog, '--embed', '-Es' }))
|
funcs.system({nvim_prog, '--embed', '-Es' }))
|
||||||
|
matches('nvim[.exe]*: %-%-embed conflicts with %-es/%-Es/%-l',
|
||||||
|
funcs.system({nvim_prog, '--embed', '-l', 'foo.lua' }))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does not crash if --embed is given twice', function()
|
it('does not crash if --embed is given twice', function()
|
||||||
|
7
test/functional/fixtures/startup-fail.lua
Normal file
7
test/functional/fixtures/startup-fail.lua
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
-- Test "nvim -l foo.lua …" with a Lua error.
|
||||||
|
|
||||||
|
local function main()
|
||||||
|
error('my pearls!!')
|
||||||
|
end
|
||||||
|
|
||||||
|
main()
|
@@ -1,3 +1,5 @@
|
|||||||
|
-- Tests for system() and :! shell.
|
||||||
|
|
||||||
local helpers = require('test.functional.helpers')(after_each)
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
|
|
||||||
local assert_alive = helpers.assert_alive
|
local assert_alive = helpers.assert_alive
|
||||||
|
Reference in New Issue
Block a user