The branch, hooks has been updated via a0bb0810fdc381a6669de569d9e372e3cd42ed32 (commit) from cd49fe985a9a3099d6939d99953871943022313d (commit)
- Log ----------------------------------------------------------------- commit a0bb0810fdc381a6669de569d9e372e3cd42ed32 Author: Nicholas Marriott <nicholas.marri...@gmail.com> Commit: Nicholas Marriott <nicholas.marri...@gmail.com> Drop error flags and just use return value, also enforce successful parsing of -c and -t for clients - if PREP_CLIENT_C or PREP_CLIENT_T is present, then a client but be available. --- cmd-list-clients.c | 4 +- cmd-queue.c | 6 +--- cmd.c | 70 +++++++++++++++++++++++++++++----------------------- hooks.c | 4 +- tmux.h | 4 +-- 5 files changed, 46 insertions(+), 42 deletions(-) diff --git a/cmd-list-clients.c b/cmd-list-clients.c index e71acb1..6182928 100644 --- a/cmd-list-clients.c +++ b/cmd-list-clients.c @@ -54,9 +54,9 @@ cmd_list_clients_exec(struct cmd *self, struct cmd_q *cmdq) u_int i; char *line; - if (args_has(args, 't')) { + if (args_has(args, 't')) s = cmdq->state.tflag.s; - } else + else s = NULL; if ((template = args_get(args, 'F')) == NULL) diff --git a/cmd-queue.c b/cmd-queue.c index fb8eeaa..d63e219 100644 --- a/cmd-queue.c +++ b/cmd-queue.c @@ -199,8 +199,7 @@ cmdq_continue(struct cmd_q *cmdq) do { while (cmdq->cmd != NULL) { - cmd_prepare_state(cmdq->cmd, cmdq); - if (cmdq->state.tflag.error || cmdq->state.sflag.error) + if (cmd_prepare_state(cmdq->cmd, cmdq) != 0) break; if (cmdq->state.tflag.s != NULL) @@ -227,8 +226,7 @@ cmdq_continue(struct cmd_q *cmdq) * it needs to be restored afterwards. XXX not very * obvious how this works from here... */ - cmd_prepare_state(cmdq->cmd, cmdq); - if (cmdq->state.tflag.error || cmdq->state.sflag.error) + if (cmd_prepare_state(cmdq->cmd, cmdq) != 0) break; retval = cmdq->cmd->entry->exec(cmdq->cmd, cmdq); diff --git a/cmd.c b/cmd.c index 13cef41..17c1b4c 100644 --- a/cmd.c +++ b/cmd.c @@ -119,8 +119,8 @@ const struct cmd_entry *cmd_table[] = { void cmd_clear_state(struct cmd_state *); struct client *cmd_get_state_client(struct cmd_q *); -void cmd_set_state_tflag(struct cmd *, struct cmd_q *, int); -void cmd_set_state_sflag(struct cmd *, struct cmd_q *, int); +int cmd_set_state_tflag(struct cmd *, struct cmd_q *, int); +int cmd_set_state_sflag(struct cmd *, struct cmd_q *, int); int cmd_session_better(struct session *, struct session *, int); struct session *cmd_choose_session_list(struct sessionslist *); struct session *cmd_choose_session(int); @@ -323,13 +323,11 @@ cmd_clear_state(struct cmd_state *state) { state->c = NULL; - state->tflag.error = 0; state->tflag.s = NULL; state->tflag.wl = NULL; state->tflag.wp = NULL; state->tflag.idx = -1; - state->sflag.error = 0; state->sflag.s = NULL; state->sflag.wl = NULL; state->sflag.wp = NULL; @@ -354,7 +352,7 @@ cmd_get_state_client(struct cmd_q *cmdq) } } -void +int cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) { struct cmd_state *state = &cmdq->state; @@ -363,7 +361,7 @@ cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) tflag = args_get(args, 't'); if (tflag == NULL && !everything) - return; + return (0); switch (cmd->entry->flags & CMD_PREP_ALL_T) { case 0: @@ -371,29 +369,29 @@ cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) case CMD_PREP_SESSION_T: state->tflag.s = cmd_find_session(cmdq, tflag, 0); if (state->tflag.s == NULL) - state->tflag.error = 1; + return (-1); break; case CMD_PREP_WINDOW_T: state->tflag.wl = cmd_find_window(cmdq, tflag, &state->tflag.s); if (state->tflag.wl == NULL) - state->tflag.error = 1; + return (-1); break; case CMD_PREP_PANE_T: state->tflag.wl = cmd_find_pane(cmdq, tflag, &state->tflag.s, &state->tflag.wp); if (state->tflag.wl == NULL) - state->tflag.error = 1; + return (-1); break; case CMD_PREP_INDEX_T: state->tflag.idx = cmd_find_index(cmdq, tflag, &state->tflag.s); if (state->tflag.idx == -2) - state->tflag.error = 1; + return (-1); break; default: log_fatalx("too many -t for %s", cmd->entry->name); } - if (!state->tflag.error && everything) { + if (everything) { if (state->tflag.s == NULL) state->tflag.s = state->c->session; if (state->tflag.wl == NULL) @@ -401,9 +399,10 @@ cmd_set_state_tflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) if (state->tflag.wp == NULL) state->tflag.wp = state->tflag.wl->window->active; } + return (0); } -void +int cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) { struct cmd_state *state = &cmdq->state; @@ -412,7 +411,7 @@ cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) sflag = args_get(args, 's'); if (sflag == NULL && !everything) - return; + return (0); switch (cmd->entry->flags & CMD_PREP_ALL_S) { case 0: @@ -420,29 +419,29 @@ cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) case CMD_PREP_SESSION_S: state->sflag.s = cmd_find_session(cmdq, sflag, 0); if (state->sflag.s == NULL) - state->sflag.error = 1; + return (-1); break; case CMD_PREP_WINDOW_S: state->sflag.wl = cmd_find_window(cmdq, sflag, &state->sflag.s); if (state->sflag.wl == NULL) - state->sflag.error = 1; + return (-1); break; case CMD_PREP_PANE_S: state->sflag.wl = cmd_find_pane(cmdq, sflag, &state->sflag.s, &state->sflag.wp); if (state->sflag.wl == NULL) - state->sflag.error = 1; + return (-1); break; case CMD_PREP_INDEX_S: state->sflag.idx = cmd_find_index(cmdq, sflag, &state->sflag.s); if (state->sflag.idx == -2) - state->sflag.error = 1; + return (-1); break; default: log_fatalx("too many -s for %s", cmd->entry->name); } - if (!state->sflag.error && everything) { + if (everything) { if (state->sflag.s == NULL) state->sflag.s = state->c->session; if (state->sflag.wl == NULL) @@ -450,9 +449,10 @@ cmd_set_state_sflag(struct cmd *cmd, struct cmd_q *cmdq, int everything) if (state->sflag.wp == NULL) state->sflag.wp = state->sflag.wl->window->active; } + return (0); } -void +int cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) { struct cmd_state *state = &cmdq->state; @@ -461,6 +461,7 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) const char *tflag; const char *sflag; char tmp[BUFSIZ]; + int error; cmd_print(cmd, tmp, sizeof tmp); log_debug("preparing state for: %s (client %p)", tmp, cmdq->client); @@ -470,7 +471,7 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) /* FIXME: Handle this! What should happen during cfg_load? */ if (cfg_finished == 0) - return; + return (0); /* * If the command wants a client and provides -c or -t, use it. If not, @@ -479,6 +480,13 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) switch (cmd->entry->flags & (CMD_PREP_CLIENT_C|CMD_PREP_CLIENT_T)) { case 0: state->c = cmd_get_state_client(cmdq); + if (state->c == NULL) { + if ((cmd->entry->flags & CMD_PREP_ALL_T) != 0) + return (-1); + if ((cmd->entry->flags & CMD_PREP_ALL_S) != 0) + return (-1); + return (0); + } break; case CMD_PREP_CLIENT_C: cflag = args_get(args, 'c'); @@ -486,6 +494,8 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) state->c = cmd_get_state_client(cmdq); else state->c = cmd_find_client(cmdq, cflag, 0); + if (state->c == NULL) + return (-1); break; case CMD_PREP_CLIENT_T: tflag = args_get(args, 't'); @@ -493,17 +503,12 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) state->c = cmd_get_state_client(cmdq); else state->c = cmd_find_client(cmdq, tflag, 0); + if (state->c == NULL) + return (-1); break; default: log_fatalx("both -c and -t for %s", cmd->entry->name); } - if (state->c == NULL) { - if ((cmd->entry->flags & CMD_PREP_ALL_T) != 0) - state->tflag.error = 1; - if ((cmd->entry->flags & CMD_PREP_ALL_S) != 0) - state->sflag.error = 1; - return; - } /* * If the command wants something for -t and no -t argument is present, @@ -511,14 +516,17 @@ cmd_prepare_state(struct cmd *cmd, struct cmd_q *cmdq) */ tflag = args_get(args, 't'); if (tflag == NULL && (cmd->entry->flags & CMD_PREP_ALL_T) != 0) - cmd_set_state_tflag(cmdq->cmd, cmdq, 1); + error = cmd_set_state_tflag(cmdq->cmd, cmdq, 1); else - cmd_set_state_tflag(cmd, cmdq, 0); + error = cmd_set_state_tflag(cmd, cmdq, 0); + if (error != 0) + return (error); sflag = args_get(args, 's'); if (sflag == NULL && (cmd->entry->flags & CMD_PREP_ALL_S) != 0) - cmd_set_state_sflag(cmdq->cmd, cmdq, 1); + error = cmd_set_state_sflag(cmdq->cmd, cmdq, 1); else - cmd_set_state_sflag(cmd, cmdq, 0); + error = cmd_set_state_sflag(cmd, cmdq, 0); + return (error); } size_t diff --git a/hooks.c b/hooks.c index 5f60dba..d485ae0 100644 --- a/hooks.c +++ b/hooks.c @@ -110,8 +110,8 @@ hooks_run(struct hook *hook, struct cmd_q *cmdq) TAILQ_FOREACH(cmd, &hook->cmdlist->list, qentry) { /* TA: FIXME: How do we handle errors here, if at all??? */ - cmd_prepare_state(cmd, cmdq); - cmd->entry->exec(cmd, cmdq); + if (cmd_prepare_state(cmd, cmdq) == 0) + cmd->entry->exec(cmd, cmdq); } log_debug("exiting hook %s", hook->name); diff --git a/tmux.h b/tmux.h index a4281ef..e586ce5 100644 --- a/tmux.h +++ b/tmux.h @@ -1365,7 +1365,6 @@ struct cmd_state { struct client *c; struct { - int error; struct session *s; struct winlink *wl; struct window_pane *wp; @@ -1373,7 +1372,6 @@ struct cmd_state { } tflag; struct { - int error; struct session *s; struct winlink *wl; struct window_pane *wp; @@ -1775,7 +1773,7 @@ char **cmd_copy_argv(int, char **); void cmd_free_argv(int, char **); char *cmd_stringify_argv(int, char **); struct cmd *cmd_parse(int, char **, const char *, u_int, char **); -void cmd_prepare_state(struct cmd *, struct cmd_q *); +int cmd_prepare_state(struct cmd *, struct cmd_q *); size_t cmd_print(struct cmd *, char *, size_t); struct session *cmd_current_session(struct cmd_q *, int); struct client *cmd_current_client(struct cmd_q *); ----------------------------------------------------------------------- Summary of changes: cmd-list-clients.c | 4 +- cmd-queue.c | 6 +--- cmd.c | 70 +++++++++++++++++++++++++++++----------------------- hooks.c | 4 +- tmux.h | 4 +-- 5 files changed, 46 insertions(+), 42 deletions(-) hooks/post-receive -- tmux ------------------------------------------------------------------------------ Dive into the World of Parallel Programming. The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ tmux-cvs mailing list tmux-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-cvs