mirror of
https://github.com/git/git.git
synced 2026-02-04 06:53:10 +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:
40
sequencer.c
40
sequencer.c
@@ -1826,6 +1826,42 @@ 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\n"
|
||||
"first and then run 'git rebase "
|
||||
"--continue' again."));
|
||||
|
||||
strbuf_release(&rev);
|
||||
amend = 1;
|
||||
}
|
||||
|
||||
if (run_git_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;
|
||||
@@ -1834,6 +1870,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