]> git.ipfire.org Git - thirdparty/git.git/blobdiff - sequencer.c
Sync with maint
[thirdparty/git.git] / sequencer.c
index 35d996cbd0cb7991280a04f1f9c8e8e113508031..b9dbf1adb078188a0163ad8ae29cce92c0587b88 100644 (file)
@@ -2023,6 +2023,7 @@ void todo_list_release(struct todo_list *todo_list)
 static struct todo_item *append_new_todo(struct todo_list *todo_list)
 {
        ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
+       todo_list->total_nr++;
        return todo_list->items + todo_list->nr++;
 }
 
@@ -2294,6 +2295,16 @@ void sequencer_post_commit_cleanup(struct repository *r, int verbose)
        sequencer_remove_state(&opts);
 }
 
+static void todo_list_write_total_nr(struct todo_list *todo_list)
+{
+       FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
+
+       if (f) {
+               fprintf(f, "%d\n", todo_list->total_nr);
+               fclose(f);
+       }
+}
+
 static int read_populate_todo(struct repository *r,
                              struct todo_list *todo_list,
                              struct replay_opts *opts)
@@ -2339,7 +2350,6 @@ static int read_populate_todo(struct repository *r,
 
        if (is_rebase_i(opts)) {
                struct todo_list done = TODO_LIST_INIT;
-               FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
 
                if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
                    !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
@@ -2351,10 +2361,7 @@ static int read_populate_todo(struct repository *r,
                        + count_commands(todo_list);
                todo_list_release(&done);
 
-               if (f) {
-                       fprintf(f, "%d\n", todo_list->total_nr);
-                       fclose(f);
-               }
+               todo_list_write_total_nr(todo_list);
        }
 
        return 0;
@@ -4231,8 +4238,10 @@ int sequencer_continue(struct repository *r, struct replay_opts *opts)
        if (is_rebase_i(opts)) {
                if ((res = read_populate_todo(r, &todo_list, opts)))
                        goto release_todo_list;
-               if (commit_staged_changes(r, opts, &todo_list))
-                       return -1;
+               if (commit_staged_changes(r, opts, &todo_list)) {
+                       res = -1;
+                       goto release_todo_list;
+               }
        } else if (!file_exists(get_todo_path(opts)))
                return continue_single_pick(r);
        else if ((res = read_populate_todo(r, &todo_list, opts)))
@@ -5049,6 +5058,7 @@ static int skip_unnecessary_picks(struct repository *r,
                MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
                todo_list->nr -= i;
                todo_list->current = 0;
+               todo_list->done_nr += i;
 
                if (is_fixup(peek_command(todo_list, 0)))
                        record_in_rewritten(base_oid, peek_command(todo_list, 0));
@@ -5128,15 +5138,21 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla
                return error_errno(_("could not write '%s'"), todo_file);
        }
 
-       todo_list_release(&new_todo);
+       res = -1;
 
        if (checkout_onto(r, opts, onto_name, &oid, orig_head))
-               return -1;
+               goto cleanup;
 
        if (require_clean_work_tree(r, "rebase", "", 1, 1))
-               return -1;
+               goto cleanup;
 
-       return sequencer_continue(r, opts);
+       todo_list_write_total_nr(&new_todo);
+       res = pick_commits(r, &new_todo, opts);
+
+cleanup:
+       todo_list_release(&new_todo);
+
+       return res;
 }
 
 struct subject2item_entry {