sequencer: always discard index after checkout

As the checkout runs in a separate process our index will be out of date so it should be discarded. The existing callers are not doing this consistently so do it here to avoid the callers having to worry about it. This fixes some test failures that happen if do_interactive_rebase() is called without forking rebase--interactive which we will implement shortly. Running git rebase -i master topic starting on master created empty todo lists because all the commits in topic were marked as cherry-picks. After topic was checked out in prepare_branch_to_be_rebased() the working tree contained the contents from topic but the index contained master and the cache entries were still valid. This meant that diff_populate_filespec() which loads the blobs when calculating patch-id's ended up reading the contents for master from the working tree which actually contained topic. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Phillip Wood committed Mar 19, 2019 at 19:03 UTC fc4a6735ee10b7699c22dfb58a9dd40f225e51bd
3 files changed +20 -12
builtin/rebase--interactive.c
+1 -1
@@ -171,7 +171,7 @@ static int do_interactive_rebase(struct replay_opts *opts, unsigned flags,
171 struct argv_array make_script_args = ARGV_ARRAY_INIT;
172 struct todo_list todo_list = TODO_LIST_INIT;
173
174 - if (prepare_branch_to_be_rebased(opts, switch_to))
174 + if (prepare_branch_to_be_rebased(the_repository, opts, switch_to))
175 return -1;
176
177 if (get_revision_ranges(upstream, onto, &head_hash,
sequencer.c
+17 -10
@@ -3418,10 +3418,11 @@ static const char *reflog_message(struct replay_opts *opts,
3418 return buf.buf;
3419 }
3420
3421 -static int run_git_checkout(struct replay_opts *opts, const char *commit,
3422 - const char *action)
3421 +static int run_git_checkout(struct repository *r, struct replay_opts *opts,
3422 + const char *commit, const char *action)
3423 {
3424 struct child_process cmd = CHILD_PROCESS_INIT;
3425 + int ret;
3426
3427 cmd.git_cmd = 1;
3428
@@ -3430,25 +3431,31 @@ static int run_git_checkout(struct replay_opts *opts, const char *commit,
3431 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3432
3433 if (opts->verbose)
3433 - return run_command(&cmd);
3434 + ret = run_command(&cmd);
3435 else
3435 - return run_command_silent_on_success(&cmd);
3436 + ret = run_command_silent_on_success(&cmd);
3437 +
3438 + if (!ret)
3439 + discard_index(r->index);
3440 +
3441 + return ret;
3442 }
3443
3438 -int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit)
3444 +int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
3445 + const char *commit)
3446 {
3447 const char *action;
3448
3449 if (commit && *commit) {
3450 action = reflog_message(opts, "start", "checkout %s", commit);
3444 - if (run_git_checkout(opts, commit, action))
3451 + if (run_git_checkout(r, opts, commit, action))
3452 return error(_("could not checkout %s"), commit);
3453 }
3454
3455 return 0;
3456 }
3457
3451 -static int checkout_onto(struct replay_opts *opts,
3458 +static int checkout_onto(struct repository *r, struct replay_opts *opts,
3459 const char *onto_name, const char *onto,
3460 const char *orig_head)
3461 {
@@ -3458,7 +3465,7 @@ static int checkout_onto(struct replay_opts *opts,
3465 if (get_oid(orig_head, &oid))
3466 return error(_("%s: not a valid OID"), orig_head);
3467
3461 - if (run_git_checkout(opts, onto, action)) {
3468 + if (run_git_checkout(r, opts, onto, action)) {
3469 apply_autostash(opts);
3470 sequencer_remove_state(opts);
3471 return error(_("could not detach HEAD"));
@@ -4786,7 +4793,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla
4793 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) ||
4794 todo_list_check(todo_list, &new_todo)) {
4795 fprintf(stderr, _(edit_todo_list_advice));
4789 - checkout_onto(opts, onto_name, onto, orig_head);
4796 + checkout_onto(r, opts, onto_name, onto, orig_head);
4797 todo_list_release(&new_todo);
4798
4799 return -1;
@@ -4805,7 +4812,7 @@ int complete_action(struct repository *r, struct replay_opts *opts, unsigned fla
4812
4813 todo_list_release(&new_todo);
4814
4808 - if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head))
4815 + if (checkout_onto(r, opts, onto_name, oid_to_hex(&oid), orig_head))
4816 return -1;
4817
4818 if (require_clean_work_tree(r, "rebase", "", 1, 1))
sequencer.h
+2 -1
@@ -175,7 +175,8 @@ void commit_post_rewrite(struct repository *r,
175 const struct commit *current_head,
176 const struct object_id *new_head);
177
178 -int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit);
178 +int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
179 + const char *commit);
180
181 #define SUMMARY_INITIAL_COMMIT (1 << 0)
182 #define SUMMARY_SHOW_AUTHOR_DATE (1 << 1)