At the moment it's possible to trample configuration file error reporting by having an error in fileB which is sourced from fileA at startup. If there were any errors in fileA these would be lost because fileB somewhat treads on the state of fileA.
Because source-file uses the same configuration loading code as the server, the callers are assumed to have pre-allocated an array of errors to be filled out as commands are processed. But each call to source-file will allocate a new array. When we end up reporting on this to the user, by entering copy-mode, this doesn't happen for every allocated buffer, just one of them. So not every error ends up being presented to the user. Instead, make the current cfg_causes array global, have it initialised by tmux before it parses its main config file, and have source-file also reference cfg_causes. This aggregates all the errors across files correctly and displays them in copy-mode. Bug originally reported by Sam Livingstone-Gray. --- cfg.c | 1 - cmd-source-file.c | 38 ++++++++++++++++---------------------- tmux.c | 3 +++ 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/cfg.c b/cfg.c index 17287d8..3b4c748 100644 --- a/cfg.c +++ b/cfg.c @@ -36,7 +36,6 @@ void printflike2 cfg_error(struct cmd_ctx *, const char *, ...); char *cfg_cause; int cfg_finished; -struct causelist cfg_causes = ARRAY_INITIALIZER; /* ARGSUSED */ void printflike2 diff --git a/cmd-source-file.c b/cmd-source-file.c index 12ed3de..775a0cc 100644 --- a/cmd-source-file.c +++ b/cmd-source-file.c @@ -42,35 +42,29 @@ enum cmd_retval cmd_source_file_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; - struct causelist causes; - char *cause; - struct window_pane *wp; int retval; u_int i; + char *cause; - ARRAY_INIT(&causes); + retval = load_cfg(args->argv[0], ctx, &cfg_causes); - retval = load_cfg(args->argv[0], ctx, &causes); - if (ARRAY_EMPTY(&causes)) + /* If the context for the cmdclient came from tmux's configuration + * file, then return the status of this command now, regardless of the + * error condition. Any errors from parsing a configuration file at + * startup will be handled for us by the server. + */ + if (ctx->cmdclient == NULL) return (retval); - if (retval == 1 && !RB_EMPTY(&sessions) && ctx->cmdclient != NULL) { - wp = RB_MIN(sessions, &sessions)->curw->window->active; - window_pane_set_mode(wp, &window_copy_mode); - window_copy_init_for_output(wp); - for (i = 0; i < ARRAY_LENGTH(&causes); i++) { - cause = ARRAY_ITEM(&causes, i); - window_copy_add(wp, "%s", cause); - free(cause); - } - } else { - for (i = 0; i < ARRAY_LENGTH(&causes); i++) { - cause = ARRAY_ITEM(&causes, i); - ctx->print(ctx, "%s", cause); - free(cause); - } + /* We were called from the command-line in which case print the errors + * gathered here directly. + */ + for (i = 0; i < ARRAY_LENGTH(&cfg_causes); i++) { + cause = ARRAY_ITEM(&cfg_causes, i); + ctx->print(ctx, "%s", cause); + free(cause); } - ARRAY_FREE(&causes); + ARRAY_FREE(&cfg_causes); return (retval); } diff --git a/tmux.c b/tmux.c index 5a773f6..e649be2 100644 --- a/tmux.c +++ b/tmux.c @@ -39,6 +39,7 @@ struct options global_w_options; /* window options */ struct environ global_environ; struct event_base *ev_base; +struct causelist cfg_causes; char *cfg_file; char *shell_cmd; @@ -333,6 +334,8 @@ main(int argc, char **argv) options_init(&global_w_options, NULL); options_table_populate_tree(window_options_table, &global_w_options); + ARRAY_INIT(&cfg_causes); + /* Enable UTF-8 if the first client is on UTF-8 terminal. */ if (flags & IDENTIFY_UTF8) { options_set_number(&global_s_options, "status-utf8", 1); -- 1.7.11.4 ------------------------------------------------------------------------------ Monitor your physical, virtual and cloud infrastructure from a single web console. Get in-depth insight into apps, servers, databases, vmware, SAP, cloud infrastructure, etc. Download 30-day Free Trial. Pricing starts from $795 for 25 servers or applications! http://p.sf.net/sfu/zoho_dev2dev_nov _______________________________________________ tmux-users mailing list tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users