rebase -i -x: add exec commands via the rebase--helper

Recent work on `git-rebase--interactive` aims to convert shell code to
C. Even if this is most likely not a big performance enhancement, let's
convert it too since a coming change to abbreviate command names
requires it to be updated.

Signed-off-by: Liam Beguin <liambeguin@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Liam Beguin
2017-12-05 12:52:33 -05:00
committed by Junio C Hamano
parent 313a48eaca
commit 0cce4a2756
4 changed files with 47 additions and 23 deletions

View File

@ -2494,6 +2494,45 @@ int sequencer_make_script(FILE *out, int argc, const char **argv,
return 0;
}
/*
* Add commands after pick and (series of) squash/fixup commands
* in the todo list.
*/
int sequencer_add_exec_commands(const char *commands)
{
const char *todo_file = rebase_path_todo();
struct todo_list todo_list = TODO_LIST_INIT;
struct todo_item *item;
struct strbuf *buf = &todo_list.buf;
size_t offset = 0, commands_len = strlen(commands);
int i, first;
if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
return error(_("could not read '%s'."), todo_file);
if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
todo_list_release(&todo_list);
return error(_("unusable todo list: '%s'"), todo_file);
}
first = 1;
/* insert <commands> before every pick except the first one */
for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
if (item->command == TODO_PICK && !first) {
strbuf_insert(buf, item->offset_in_buf + offset,
commands, commands_len);
offset += commands_len;
}
first = 0;
}
/* append final <commands> */
strbuf_add(buf, commands, commands_len);
i = write_message(buf->buf, buf->len, todo_file, 0);
todo_list_release(&todo_list);
return i;
}
int transform_todos(unsigned flags)
{