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.schinde...@gmx.de>
---
 sequencer.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/sequencer.c b/sequencer.c
index ef818a2..4ddb12e 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -1807,6 +1807,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;
@@ -1815,6 +1850,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) ||
-- 
2.10.0.rc2.102.g5c102ec


Reply via email to