Hi, On Fri, 30 Nov 2018, Phillip Wood wrote: > > diff --git a/sequencer.c b/sequencer.c > > index 900899ef20..11692d0b98 100644 > > --- a/sequencer.c > > +++ b/sequencer.c > > @@ -4394,24 +4394,29 @@ 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) > > +static void todo_list_add_exec_commands(struct todo_list *todo_list, > > + struct string_list *commands) > > { > > - const char *todo_file = rebase_path_todo(); > > - struct todo_list todo_list = TODO_LIST_INIT; > > - struct strbuf *buf = &todo_list.buf; > > - size_t offset = 0, commands_len = strlen(commands); > > - int i, insert; > > + struct strbuf *buf = &todo_list->buf; > > + const char *old_buf = buf->buf; > > + size_t base_length = buf->len; > > + int i, insert, nr = 0, alloc = 0; > > + struct todo_item *items = NULL, *base_items = NULL; > > > > - if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0) > > - return error(_("could not read '%s'."), todo_file); > > + for (i = 0; i < commands->nr; ++i) { > > + strbuf_addstr(buf, commands->items[i].string); > > + strbuf_addch(buf, '\n'); > > + } > > This could cause buf->buf to be reallocated in which case all the > todo_list_item.arg pointers will be invalidated. I guess it is a good time for me to admit that the `arg` idea was not my best. Maybe it would be good to convert that from a pointer to an offset, e.g. `size_t arg_offset_in_buf;`? Or maybe we should just drop the `_in_buf` suffix and clarify in a comment next to the declaration of the fields that they are offsets in the strbuf? Ciao, Dscho