sequencer (rebase -i): write the progress into files

For the benefit of e.g. the shell prompt, the interactive rebase not
only displays the progress for the user to see, but also writes it into
the msgnum/end files in the state directory.

Teach the sequencer this new trick.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2017-01-02 16:36:20 +01:00 committed by Junio C Hamano
parent 968492e44c
commit ef80069a03

View File

@ -46,6 +46,16 @@ static GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
* actions. * actions.
*/ */
static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done") static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
/*
* The file to keep track of how many commands were already processed (e.g.
* for the prompt).
*/
static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum");
/*
* The file to keep track of how many commands are to be processed in total
* (e.g. for the prompt).
*/
static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end");
/* /*
* The commit message that is planned to be used for any changes that * The commit message that is planned to be used for any changes that
* need to be committed following a user interaction. * need to be committed following a user interaction.
@ -1353,6 +1363,7 @@ static int read_populate_todo(struct todo_list *todo_list,
if (is_rebase_i(opts)) { if (is_rebase_i(opts)) {
struct todo_list done = TODO_LIST_INIT; struct todo_list done = TODO_LIST_INIT;
FILE *f = fopen(rebase_path_msgtotal(), "w");
if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 && if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
!parse_insn_buffer(done.buf.buf, &done)) !parse_insn_buffer(done.buf.buf, &done))
@ -1362,8 +1373,12 @@ static int read_populate_todo(struct todo_list *todo_list,
todo_list->total_nr = todo_list->done_nr todo_list->total_nr = todo_list->done_nr
+ count_commands(todo_list); + count_commands(todo_list);
todo_list_release(&done); todo_list_release(&done);
if (f) {
fprintf(f, "%d\n", todo_list->total_nr);
fclose(f);
}
} }
return 0; return 0;
@ -1947,11 +1962,20 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
if (save_todo(todo_list, opts)) if (save_todo(todo_list, opts))
return -1; return -1;
if (is_rebase_i(opts)) { if (is_rebase_i(opts)) {
if (item->command != TODO_COMMENT) if (item->command != TODO_COMMENT) {
FILE *f = fopen(rebase_path_msgnum(), "w");
todo_list->done_nr++;
if (f) {
fprintf(f, "%d\n", todo_list->done_nr);
fclose(f);
}
fprintf(stderr, "Rebasing (%d/%d)%s", fprintf(stderr, "Rebasing (%d/%d)%s",
++(todo_list->done_nr), todo_list->done_nr,
todo_list->total_nr, todo_list->total_nr,
opts->verbose ? "\n" : "\r"); opts->verbose ? "\n" : "\r");
}
unlink(rebase_path_message()); unlink(rebase_path_message());
unlink(rebase_path_author_script()); unlink(rebase_path_author_script());
unlink(rebase_path_stopped_sha()); unlink(rebase_path_stopped_sha());