sequencer (rebase -i): implement the short commands
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Mon, 2 Jan 2017 15:27:15 +0000 (16:27 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Jan 2017 22:57:29 +0000 (14:57 -0800)
For users' convenience, most rebase commands can be abbreviated, e.g.
'p' instead of 'pick' and 'x' instead of 'exec'. Let's teach the
sequencer to handle those abbreviated commands just fine.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sequencer.c
index 6a939a10bdf6617bcedcf7bc695a78dab36b6480..29b944d724a4f91ce694e65499e98c8f8544f230 100644 (file)
@@ -678,20 +678,23 @@ enum todo_command {
        TODO_NOOP
 };
 
-static const char *todo_command_strings[] = {
-       "pick",
-       "revert",
-       "edit",
-       "fixup",
-       "squash",
-       "exec",
-       "noop"
+static struct {
+       char c;
+       const char *str;
+} todo_command_info[] = {
+       { 'p', "pick" },
+       { 0,   "revert" },
+       { 'e', "edit" },
+       { 'f', "fixup" },
+       { 's', "squash" },
+       { 'x', "exec" },
+       { 0,   "noop" }
 };
 
 static const char *command_to_string(const enum todo_command command)
 {
-       if ((size_t)command < ARRAY_SIZE(todo_command_strings))
-               return todo_command_strings[command];
+       if ((size_t)command < ARRAY_SIZE(todo_command_info))
+               return todo_command_info[command].str;
        die("Unknown command: %d", command);
 }
 
@@ -1087,12 +1090,16 @@ static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
                return 0;
        }
 
-       for (i = 0; i < ARRAY_SIZE(todo_command_strings); i++)
-               if (skip_prefix(bol, todo_command_strings[i], &bol)) {
+       for (i = 0; i < ARRAY_SIZE(todo_command_info); i++)
+               if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
+                       item->command = i;
+                       break;
+               } else if (bol[1] == ' ' && *bol == todo_command_info[i].c) {
+                       bol++;
                        item->command = i;
                        break;
                }
-       if (i >= ARRAY_SIZE(todo_command_strings))
+       if (i >= ARRAY_SIZE(todo_command_info))
                return -1;
 
        if (item->command == TODO_NOOP) {
@@ -1287,7 +1294,7 @@ static int walk_revs_populate_todo(struct todo_list *todo_list,
 {
        enum todo_command command = opts->action == REPLAY_PICK ?
                TODO_PICK : TODO_REVERT;
-       const char *command_string = todo_command_strings[command];
+       const char *command_string = todo_command_info[command].str;
        struct commit *commit;
 
        if (prepare_revs(opts))