system(): handle profiling and 'verbose' #8730

closes #8362

Vim's code calls `call_shell` directly from `get_system_output_as_rettv`
whereas in Nvim this function has been rewritten to not call `call_shell` but to call
`os_system` via `do_os_system`, losing the support for profiling and verbose.

Changing the code to call `call_shell` from `get_system_output_as_rettv`
seems to be too complicated to be worth it on the current version of the
code. So this commit duplicates the relevant code.
This commit is contained in:
Marcos Almeida
2018-07-29 03:49:11 +02:00
committed by Justin M. Keyes
parent befc7de26f
commit a2253744c9
4 changed files with 69 additions and 0 deletions

View File

@@ -16401,9 +16401,12 @@ static list_T *string_to_list(const char *str, size_t len, const bool keepempty)
return list;
}
// os_system wrapper. Handles 'verbose', :profile, and v:shell_error.
static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
bool retlist)
{
proftime_T wait_time;
rettv->v_type = VAR_STRING;
rettv->vval.v_string = NULL;
@@ -16430,11 +16433,29 @@ static void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv,
return; // Already did emsg.
}
if (p_verbose > 3) {
char buf[NUMBUFLEN];
const char * cmd = tv_get_string_buf(argvars, buf);
verbose_enter_scroll();
smsg(_("Calling shell to execute: \"%s\""), cmd);
msg_puts("\n\n");
verbose_leave_scroll();
}
if (do_profiling == PROF_YES) {
prof_child_enter(&wait_time);
}
// execute the command
size_t nread = 0;
char *res = NULL;
int status = os_system(argv, input, input_len, &res, &nread);
if (do_profiling == PROF_YES) {
prof_child_exit(&wait_time);
}
xfree(input);
set_vim_var_nr(VV_SHELL_ERROR, (long) status);