mirror of
https://github.com/git/git.git
synced 2026-01-28 11:32:24 +00:00
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:
39
sequencer.c
39
sequencer.c
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user