rebase-interactive: use todo_list_write_to_file() in edit_todo_list()
Just like complete_action(), edit_todo_list() used a function (transform_todo_file()) that read the todo list from the disk and wrote it back, resulting in useless disk accesses. This changes edit_todo_list() to call directly todo_list_write_to_file() instead. Signed-off-by: Alban Gruin <alban.gruin@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6bfeb7f1b5
commit
ddb81e5072
@ -79,39 +79,33 @@ void append_todo_help(unsigned edit_todo, unsigned keep_empty,
|
|||||||
|
|
||||||
int edit_todo_list(struct repository *r, unsigned flags)
|
int edit_todo_list(struct repository *r, unsigned flags)
|
||||||
{
|
{
|
||||||
struct strbuf buf = STRBUF_INIT;
|
|
||||||
const char *todo_file = rebase_path_todo();
|
const char *todo_file = rebase_path_todo();
|
||||||
|
struct todo_list todo_list = TODO_LIST_INIT;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
if (strbuf_read_file(&buf, todo_file, 0) < 0)
|
if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
|
||||||
return error_errno(_("could not read '%s'."), todo_file);
|
return error_errno(_("could not read '%s'."), todo_file);
|
||||||
|
|
||||||
strbuf_stripspace(&buf, 1);
|
strbuf_stripspace(&todo_list.buf, 1);
|
||||||
if (write_message(buf.buf, buf.len, todo_file, 0)) {
|
todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
|
||||||
strbuf_release(&buf);
|
if (todo_list_write_to_file(r, &todo_list, todo_file, NULL, NULL, -1,
|
||||||
|
flags | TODO_LIST_SHORTEN_IDS | TODO_LIST_APPEND_TODO_HELP)) {
|
||||||
|
todo_list_release(&todo_list);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strbuf_release(&buf);
|
strbuf_reset(&todo_list.buf);
|
||||||
|
if (launch_sequence_editor(todo_file, &todo_list.buf, NULL)) {
|
||||||
transform_todo_file(r, flags | TODO_LIST_SHORTEN_IDS);
|
todo_list_release(&todo_list);
|
||||||
|
|
||||||
if (strbuf_read_file(&buf, todo_file, 0) < 0)
|
|
||||||
return error_errno(_("could not read '%s'."), todo_file);
|
|
||||||
|
|
||||||
append_todo_help(1, 0, &buf);
|
|
||||||
if (write_message(buf.buf, buf.len, todo_file, 0)) {
|
|
||||||
strbuf_release(&buf);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
strbuf_release(&buf);
|
if (!todo_list_parse_insn_buffer(r, todo_list.buf.buf, &todo_list))
|
||||||
|
res = todo_list_write_to_file(r, &todo_list, todo_file, NULL, NULL, -1,
|
||||||
|
flags & ~(TODO_LIST_SHORTEN_IDS));
|
||||||
|
|
||||||
if (launch_sequence_editor(todo_file, NULL, NULL))
|
todo_list_release(&todo_list);
|
||||||
return -1;
|
return res;
|
||||||
|
|
||||||
transform_todo_file(r, flags & ~(TODO_LIST_SHORTEN_IDS));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
define_commit_slab(commit_seen, unsigned char);
|
define_commit_slab(commit_seen, unsigned char);
|
||||||
|
@ -383,8 +383,8 @@ static void print_advice(struct repository *r, int show_hint,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_message(const void *buf, size_t len, const char *filename,
|
static int write_message(const void *buf, size_t len, const char *filename,
|
||||||
int append_eol)
|
int append_eol)
|
||||||
{
|
{
|
||||||
struct lock_file msg_file = LOCK_INIT;
|
struct lock_file msg_file = LOCK_INIT;
|
||||||
|
|
||||||
|
@ -64,9 +64,6 @@ struct replay_opts {
|
|||||||
};
|
};
|
||||||
#define REPLAY_OPTS_INIT { .action = -1, .current_fixups = STRBUF_INIT }
|
#define REPLAY_OPTS_INIT { .action = -1, .current_fixups = STRBUF_INIT }
|
||||||
|
|
||||||
int write_message(const void *buf, size_t len, const char *filename,
|
|
||||||
int append_eol);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that ordering matters in this enum. Not only must it match the mapping
|
* Note that ordering matters in this enum. Not only must it match the mapping
|
||||||
* of todo_command_info (in sequencer.c), it is also divided into several
|
* of todo_command_info (in sequencer.c), it is also divided into several
|
||||||
|
Loading…
Reference in New Issue
Block a user