sequencer (rebase -i): allow continuing with staged changes

When an interactive rebase is interrupted, the user may stage changes
before continuing, and we need to commit those changes in that case.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
Johannes Schindelin
2016-03-09 17:12:20 +01:00
parent dbe70b6b66
commit a3e5dbd984

View File

@@ -1806,6 +1806,41 @@ static int continue_single_pick(void)
return run_command_v_opt(argv, RUN_GIT_CMD);
}
static int commit_staged_changes(struct replay_opts *opts)
{
int amend = 0;
if (has_unstaged_changes(1))
return error(_("Cannot rebase: You have unstaged changes."));
if (!has_uncommitted_changes(0))
return 0;
if (file_exists(rebase_path_amend())) {
struct strbuf rev = STRBUF_INIT;
unsigned char head[20], to_amend[20];
if (get_sha1("HEAD", head))
return error("Cannot amend non-existing commit");
if (!read_oneliner(&rev, rebase_path_amend(), 0))
return error("Invalid file: %s", rebase_path_amend());
if (get_sha1_hex(rev.buf, to_amend))
return error("Invalid contents: %s",
rebase_path_amend());
if (hashcmp(head, to_amend))
return error("\nYou have uncommitted changes in your "
"working tree. Please, commit them\nfirst and "
"then run 'git rebase --continue' again.");
strbuf_release(&rev);
amend = 1;
}
if (sequencer_commit(rebase_path_message(), opts, 1, 1, amend, 0))
return error("Could not commit staged changes.");
unlink(rebase_path_amend());
return 0;
}
int sequencer_continue(struct replay_opts *opts)
{
struct todo_list todo_list = TODO_LIST_INIT;
@@ -1814,6 +1849,10 @@ int sequencer_continue(struct replay_opts *opts)
if (read_and_refresh_cache(opts))
return -1;
if (is_rebase_i(opts)) {
if (commit_staged_changes(opts))
return -1;
}
if (!file_exists(get_todo_path(opts)))
return continue_single_pick();
if (read_populate_opts(opts))