Re: [PATCH v2 2/2] rebase: fix todo-list rereading
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Sep 24, 2021, 16:13 UTC
- Message-ID
- <xmqqilyqvtmh.fsf@gitster.g>
- In-Reply-To
- <0d89c506192a84822a3fbd6c76befac187129ad4.1632410782.git.gitgitgadget@gmail.com>
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes:
> .... Instead of relying on stat > data this patch simply reads the possibly edited todo list and > compares it to the original with memcmp(). This is much faster than > reparsing the todo list each time.
Nice. Is that an egg of Columbus or what ;-)
Show 8 quoted lines
> + if (strbuf_read_file_or_whine(&buf, get_todo_path(opts)) < 0)
> + return -1;
> + offset = get_item_line_offset(todo_list, todo_list->current + 1);
> + if (buf.len != todo_list->buf.len - offset ||
> + memcmp(buf.buf, todo_list->buf.buf + offset, buf.len)) {
> /* Reread the todo file if it has changed. */
> todo_list_release(todo_list);
> if (read_populate_todo(r, todo_list, opts))As we already have the contents of hte file in the buffer, we could further refactor the code around read_populate_todo() to tell it not to reopen and reread the rebase-todo file (which risks toctou race), but that is OK for now, I would think.
Show 17 quoted lines
> @@ -4271,6 +4267,7 @@ static int reread_todo_if_changed(struct repository *r,
> /* `current` will be incremented on return */
> todo_list->current = -1;
> }
> + strbuf_release(&buf);
>
> return 0;
> }
> diff --git a/sequencer.h b/sequencer.h
> index d57d8ea23d7..cdeb0c6be47 100644
> --- a/sequencer.h
> +++ b/sequencer.h
> @@ -116,7 +116,6 @@ struct todo_list {
> struct todo_item *items;
> int nr, alloc, current;
> int done_nr, total_nr;
> - struct stat_data stat;Good riddance ;-)
Will queue. Thanks.