diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-11-02 11:04:58 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-11-02 11:04:58 +0900 |
commit | 789b1f70422d5c9ffb3a0ecb11284aa0ac13985e (patch) | |
tree | 23d8b90cefd141b667962c4fcdf70968c91eeb42 /sequencer.c | |
parent | Merge branch 'js/rebase-autostash-fix' (diff) | |
parent | rebase -i: introduce the 'break' command (diff) | |
download | tgif-789b1f70422d5c9ffb3a0ecb11284aa0ac13985e.tar.xz |
Merge branch 'js/rebase-i-break'
"git rebase -i" learned a new insn, 'break', that the user can
insert in the to-do list. Upon hitting it, the command returns
control back to the user.
* js/rebase-i-break:
rebase -i: introduce the 'break' command
rebase -i: clarify what happens on a failed `exec`
Diffstat (limited to 'sequencer.c')
-rw-r--r-- | sequencer.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sequencer.c b/sequencer.c index 22d7532c5a..73efa92da8 100644 --- a/sequencer.c +++ b/sequencer.c @@ -1458,6 +1458,7 @@ enum todo_command { TODO_SQUASH, /* commands that do something else than handling a single commit */ TODO_EXEC, + TODO_BREAK, TODO_LABEL, TODO_RESET, TODO_MERGE, @@ -1479,6 +1480,7 @@ static struct { { 'f', "fixup" }, { 's', "squash" }, { 'x', "exec" }, + { 'b', "break" }, { 'l', "label" }, { 't', "reset" }, { 'm', "merge" }, @@ -2004,7 +2006,7 @@ static int parse_insn_line(struct todo_item *item, const char *bol, char *eol) padding = strspn(bol, " \t"); bol += padding; - if (item->command == TODO_NOOP) { + if (item->command == TODO_NOOP || item->command == TODO_BREAK) { if (bol != eol) return error(_("%s does not accept arguments: '%s'"), command_to_string(item->command), bol); @@ -3393,6 +3395,24 @@ static int checkout_onto(struct replay_opts *opts, return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR); } +static int stopped_at_head(void) +{ + struct object_id head; + struct commit *commit; + struct commit_message message; + + if (get_oid("HEAD", &head) || + !(commit = lookup_commit(the_repository, &head)) || + parse_commit(commit) || get_message(commit, &message)) + fprintf(stderr, _("Stopped at HEAD\n")); + else { + fprintf(stderr, _("Stopped at %s\n"), message.label); + free_message(commit, &message); + } + return 0; + +} + static const char rescheduled_advice[] = N_("Could not execute the todo command\n" "\n" @@ -3439,6 +3459,9 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts) unlink(rebase_path_stopped_sha()); unlink(rebase_path_amend()); delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF); + + if (item->command == TODO_BREAK) + return stopped_at_head(); } if (item->command <= TODO_SQUASH) { if (is_rebase_i(opts)) |