9 #include "run-command.h"
12 #include "cache-tree.h"
16 #include "merge-recursive.h"
18 #include "argv-array.h"
22 #include "wt-status.h"
24 #include "notes-utils.h"
26 #include "commit-slab.h"
28 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
30 const char sign_off_header[] = "Signed-off-by: ";
31 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
33 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
35 GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
37 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
38 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
39 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
40 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
42 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
44 * The file containing rebase commands, comments, and empty lines.
45 * This file is created by "git rebase -i" then edited by the user. As
46 * the lines are processed, they are removed from the front of this
47 * file and written to the tail of 'done'.
49 static GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
51 * The rebase command lines that have already been processed. A line
52 * is moved here when it is first handled, before any associated user
55 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
57 * The file to keep track of how many commands were already processed (e.g.
60 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum");
62 * The file to keep track of how many commands are to be processed in total
63 * (e.g. for the prompt).
65 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end");
67 * The commit message that is planned to be used for any changes that
68 * need to be committed following a user interaction.
70 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
72 * The file into which is accumulated the suggested commit message for
73 * squash/fixup commands. When the first of a series of squash/fixups
74 * is seen, the file is created and the commit message from the
75 * previous commit and from the first squash/fixup commit are written
76 * to it. The commit message for each subsequent squash/fixup commit
77 * is appended to the file as it is processed.
79 * The first line of the file is of the form
80 * # This is a combination of $count commits.
81 * where $count is the number of commits whose messages have been
82 * written to the file so far (including the initial "pick" commit).
83 * Each time that a commit message is processed, this line is read and
84 * updated. It is deleted just before the combined commit is made.
86 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
88 * If the current series of squash/fixups has not yet included a squash
89 * command, then this file exists and holds the commit message of the
90 * original "pick" commit. (If the series ends without a "squash"
91 * command, then this can be used as the commit message of the combined
92 * commit without opening the editor.)
94 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
96 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
97 * GIT_AUTHOR_DATE that will be used for the commit that is currently
100 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
102 * When an "edit" rebase command is being processed, the SHA1 of the
103 * commit to be edited is recorded in this file. When "git rebase
104 * --continue" is executed, if there are any staged changes then they
105 * will be amended to the HEAD commit, but only provided the HEAD
106 * commit is still the commit to be edited. When any other rebase
107 * command is processed, this file is deleted.
109 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
111 * When we stop at a given patch via the "edit" command, this file contains
112 * the abbreviated commit name of the corresponding patch.
114 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
116 * For the post-rewrite hook, we make a list of rewritten commits and
117 * their new sha1s. The rewritten-pending list keeps the sha1s of
118 * commits that have been processed, but not committed yet,
119 * e.g. because they are waiting for a 'squash' command.
121 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
122 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
123 "rebase-merge/rewritten-pending")
125 * The following files are written by git-rebase just after parsing the
126 * command-line (and are only consumed, not modified, by the sequencer).
128 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
129 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
130 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
131 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
132 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
133 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
134 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
135 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
136 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
137 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
139 static int git_sequencer_config(const char *k, const char *v, void *cb)
141 struct replay_opts *opts = cb;
144 if (!strcmp(k, "commit.cleanup")) {
147 status = git_config_string(&s, k, v);
151 if (!strcmp(s, "verbatim"))
152 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
153 else if (!strcmp(s, "whitespace"))
154 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
155 else if (!strcmp(s, "strip"))
156 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
157 else if (!strcmp(s, "scissors"))
158 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
160 warning(_("invalid commit message cleanup mode '%s'"),
166 if (!strcmp(k, "commit.gpgsign")) {
167 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
171 status = git_gpg_config(k, v, NULL);
175 return git_diff_basic_config(k, v, NULL);
178 void sequencer_init_config(struct replay_opts *opts)
180 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
181 git_config(git_sequencer_config, opts);
184 static inline int is_rebase_i(const struct replay_opts *opts)
186 return opts->action == REPLAY_INTERACTIVE_REBASE;
189 static const char *get_dir(const struct replay_opts *opts)
191 if (is_rebase_i(opts))
192 return rebase_path();
193 return git_path_seq_dir();
196 static const char *get_todo_path(const struct replay_opts *opts)
198 if (is_rebase_i(opts))
199 return rebase_path_todo();
200 return git_path_todo_file();
204 * Returns 0 for non-conforming footer
205 * Returns 1 for conforming footer
206 * Returns 2 when sob exists within conforming footer
207 * Returns 3 when sob exists within conforming footer as last entry
209 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
212 struct trailer_info info;
214 int found_sob = 0, found_sob_last = 0;
216 trailer_info_get(&info, sb->buf);
218 if (info.trailer_start == info.trailer_end)
221 for (i = 0; i < info.trailer_nr; i++)
222 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
224 if (i == info.trailer_nr - 1)
228 trailer_info_release(&info);
237 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
239 static struct strbuf buf = STRBUF_INIT;
243 sq_quotef(&buf, "-S%s", opts->gpg_sign);
247 int sequencer_remove_state(struct replay_opts *opts)
249 struct strbuf dir = STRBUF_INIT;
252 free(opts->gpg_sign);
253 free(opts->strategy);
254 for (i = 0; i < opts->xopts_nr; i++)
255 free(opts->xopts[i]);
258 strbuf_addstr(&dir, get_dir(opts));
259 remove_dir_recursively(&dir, 0);
260 strbuf_release(&dir);
265 static const char *action_name(const struct replay_opts *opts)
267 switch (opts->action) {
271 return N_("cherry-pick");
272 case REPLAY_INTERACTIVE_REBASE:
273 return N_("rebase -i");
275 die(_("Unknown action: %d"), opts->action);
278 struct commit_message {
285 static const char *short_commit_name(struct commit *commit)
287 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
290 static int get_message(struct commit *commit, struct commit_message *out)
292 const char *abbrev, *subject;
295 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
296 abbrev = short_commit_name(commit);
298 subject_len = find_commit_subject(out->message, &subject);
300 out->subject = xmemdupz(subject, subject_len);
301 out->label = xstrfmt("%s... %s", abbrev, out->subject);
302 out->parent_label = xstrfmt("parent of %s", out->label);
307 static void free_message(struct commit *commit, struct commit_message *msg)
309 free(msg->parent_label);
312 unuse_commit_buffer(commit, msg->message);
315 static void print_advice(int show_hint, struct replay_opts *opts)
317 char *msg = getenv("GIT_CHERRY_PICK_HELP");
320 fprintf(stderr, "%s\n", msg);
322 * A conflict has occurred but the porcelain
323 * (typically rebase --interactive) wants to take care
324 * of the commit itself so remove CHERRY_PICK_HEAD
326 unlink(git_path_cherry_pick_head());
332 advise(_("after resolving the conflicts, mark the corrected paths\n"
333 "with 'git add <paths>' or 'git rm <paths>'"));
335 advise(_("after resolving the conflicts, mark the corrected paths\n"
336 "with 'git add <paths>' or 'git rm <paths>'\n"
337 "and commit the result with 'git commit'"));
341 static int write_message(const void *buf, size_t len, const char *filename,
344 struct lock_file msg_file = LOCK_INIT;
346 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
348 return error_errno(_("could not lock '%s'"), filename);
349 if (write_in_full(msg_fd, buf, len) < 0) {
350 rollback_lock_file(&msg_file);
351 return error_errno(_("could not write to '%s'"), filename);
353 if (append_eol && write(msg_fd, "\n", 1) < 0) {
354 rollback_lock_file(&msg_file);
355 return error_errno(_("could not write eol to '%s'"), filename);
357 if (commit_lock_file(&msg_file) < 0)
358 return error(_("failed to finalize '%s'"), filename);
364 * Reads a file that was presumably written by a shell script, i.e. with an
365 * end-of-line marker that needs to be stripped.
367 * Note that only the last end-of-line marker is stripped, consistent with the
368 * behavior of "$(cat path)" in a shell script.
370 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
372 static int read_oneliner(struct strbuf *buf,
373 const char *path, int skip_if_empty)
375 int orig_len = buf->len;
377 if (!file_exists(path))
380 if (strbuf_read_file(buf, path, 0) < 0) {
381 warning_errno(_("could not read '%s'"), path);
385 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
386 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
388 buf->buf[buf->len] = '\0';
391 if (skip_if_empty && buf->len == orig_len)
397 static struct tree *empty_tree(void)
399 return lookup_tree(the_hash_algo->empty_tree);
402 static int error_dirty_index(struct replay_opts *opts)
404 if (read_cache_unmerged())
405 return error_resolve_conflict(_(action_name(opts)));
407 error(_("your local changes would be overwritten by %s."),
408 _(action_name(opts)));
410 if (advice_commit_before_merge)
411 advise(_("commit your changes or stash them to proceed."));
415 static void update_abort_safety_file(void)
417 struct object_id head;
419 /* Do nothing on a single-pick */
420 if (!file_exists(git_path_seq_dir()))
423 if (!get_oid("HEAD", &head))
424 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
426 write_file(git_path_abort_safety_file(), "%s", "");
429 static int fast_forward_to(const struct object_id *to, const struct object_id *from,
430 int unborn, struct replay_opts *opts)
432 struct ref_transaction *transaction;
433 struct strbuf sb = STRBUF_INIT;
434 struct strbuf err = STRBUF_INIT;
437 if (checkout_fast_forward(from, to, 1))
438 return -1; /* the callee should have complained already */
440 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
442 transaction = ref_transaction_begin(&err);
444 ref_transaction_update(transaction, "HEAD",
445 to, unborn ? &null_oid : from,
447 ref_transaction_commit(transaction, &err)) {
448 ref_transaction_free(transaction);
449 error("%s", err.buf);
451 strbuf_release(&err);
456 strbuf_release(&err);
457 ref_transaction_free(transaction);
458 update_abort_safety_file();
462 void append_conflicts_hint(struct strbuf *msgbuf)
466 strbuf_addch(msgbuf, '\n');
467 strbuf_commented_addf(msgbuf, "Conflicts:\n");
468 for (i = 0; i < active_nr;) {
469 const struct cache_entry *ce = active_cache[i++];
471 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
472 while (i < active_nr && !strcmp(ce->name,
473 active_cache[i]->name))
479 static int do_recursive_merge(struct commit *base, struct commit *next,
480 const char *base_label, const char *next_label,
481 struct object_id *head, struct strbuf *msgbuf,
482 struct replay_opts *opts)
484 struct merge_options o;
485 struct tree *result, *next_tree, *base_tree, *head_tree;
488 struct lock_file index_lock = LOCK_INIT;
490 if (hold_locked_index(&index_lock, LOCK_REPORT_ON_ERROR) < 0)
495 init_merge_options(&o);
496 o.ancestor = base ? base_label : "(empty tree)";
498 o.branch2 = next ? next_label : "(empty tree)";
499 if (is_rebase_i(opts))
501 o.show_rename_progress = 1;
503 head_tree = parse_tree_indirect(head);
504 next_tree = next ? next->tree : empty_tree();
505 base_tree = base ? base->tree : empty_tree();
507 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
508 parse_merge_opt(&o, *xopt);
510 clean = merge_trees(&o,
512 next_tree, base_tree, &result);
513 if (is_rebase_i(opts) && clean <= 0)
514 fputs(o.obuf.buf, stdout);
515 strbuf_release(&o.obuf);
516 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
518 rollback_lock_file(&index_lock);
522 if (write_locked_index(&the_index, &index_lock,
523 COMMIT_LOCK | SKIP_IF_UNCHANGED))
525 * TRANSLATORS: %s will be "revert", "cherry-pick" or
528 return error(_("%s: Unable to write new index file"),
529 _(action_name(opts)));
532 append_conflicts_hint(msgbuf);
537 static int is_index_unchanged(void)
539 struct object_id head_oid;
540 struct commit *head_commit;
542 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
543 return error(_("could not resolve HEAD commit"));
545 head_commit = lookup_commit(&head_oid);
548 * If head_commit is NULL, check_commit, called from
549 * lookup_commit, would have indicated that head_commit is not
550 * a commit object already. parse_commit() will return failure
551 * without further complaints in such a case. Otherwise, if
552 * the commit is invalid, parse_commit() will complain. So
553 * there is nothing for us to say here. Just return failure.
555 if (parse_commit(head_commit))
558 if (!active_cache_tree)
559 active_cache_tree = cache_tree();
561 if (!cache_tree_fully_valid(active_cache_tree))
562 if (cache_tree_update(&the_index, 0))
563 return error(_("unable to update cache tree"));
565 return !oidcmp(&active_cache_tree->oid,
566 &head_commit->tree->object.oid);
569 static int write_author_script(const char *message)
571 struct strbuf buf = STRBUF_INIT;
576 if (!*message || starts_with(message, "\n")) {
578 /* Missing 'author' line? */
579 unlink(rebase_path_author_script());
581 } else if (skip_prefix(message, "author ", &message))
583 else if ((eol = strchr(message, '\n')))
588 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
589 while (*message && *message != '\n' && *message != '\r')
590 if (skip_prefix(message, " <", &message))
592 else if (*message != '\'')
593 strbuf_addch(&buf, *(message++));
595 strbuf_addf(&buf, "'\\\\%c'", *(message++));
596 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
597 while (*message && *message != '\n' && *message != '\r')
598 if (skip_prefix(message, "> ", &message))
600 else if (*message != '\'')
601 strbuf_addch(&buf, *(message++));
603 strbuf_addf(&buf, "'\\\\%c'", *(message++));
604 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
605 while (*message && *message != '\n' && *message != '\r')
606 if (*message != '\'')
607 strbuf_addch(&buf, *(message++));
609 strbuf_addf(&buf, "'\\\\%c'", *(message++));
610 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
611 strbuf_release(&buf);
616 * Read a list of environment variable assignments (such as the author-script
617 * file) into an environment block. Returns -1 on error, 0 otherwise.
619 static int read_env_script(struct argv_array *env)
621 struct strbuf script = STRBUF_INIT;
625 if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0)
628 for (p = script.buf; *p; p++)
629 if (skip_prefix(p, "'\\\\''", (const char **)&p2))
630 strbuf_splice(&script, p - script.buf, p2 - p, "'", 1);
632 strbuf_splice(&script, p-- - script.buf, 1, "", 0);
633 else if (*p == '\n') {
638 for (i = 0, p = script.buf; i < count; i++) {
639 argv_array_push(env, p);
646 static char *get_author(const char *message)
651 a = find_commit_header(message, "author", &len);
653 return xmemdupz(a, len);
658 static const char staged_changes_advice[] =
659 N_("you have staged changes in your working tree\n"
660 "If these changes are meant to be squashed into the previous commit, run:\n"
662 " git commit --amend %s\n"
664 "If they are meant to go into a new commit, run:\n"
668 "In both cases, once you're done, continue with:\n"
670 " git rebase --continue\n");
672 #define ALLOW_EMPTY (1<<0)
673 #define EDIT_MSG (1<<1)
674 #define AMEND_MSG (1<<2)
675 #define CLEANUP_MSG (1<<3)
676 #define VERIFY_MSG (1<<4)
679 * If we are cherry-pick, and if the merge did not result in
680 * hand-editing, we will hit this commit and inherit the original
681 * author date and name.
683 * If we are revert, or if our cherry-pick results in a hand merge,
684 * we had better say that the current user is responsible for that.
686 * An exception is when run_git_commit() is called during an
687 * interactive rebase: in that case, we will want to retain the
690 static int run_git_commit(const char *defmsg, struct replay_opts *opts,
693 struct child_process cmd = CHILD_PROCESS_INIT;
698 if (is_rebase_i(opts)) {
699 if (!(flags & EDIT_MSG)) {
700 cmd.stdout_to_stderr = 1;
704 if (read_env_script(&cmd.env_array)) {
705 const char *gpg_opt = gpg_sign_opt_quoted(opts);
707 return error(_(staged_changes_advice),
712 argv_array_push(&cmd.args, "commit");
714 if (!(flags & VERIFY_MSG))
715 argv_array_push(&cmd.args, "-n");
716 if ((flags & AMEND_MSG))
717 argv_array_push(&cmd.args, "--amend");
719 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
721 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
722 if ((flags & CLEANUP_MSG))
723 argv_array_push(&cmd.args, "--cleanup=strip");
724 if ((flags & EDIT_MSG))
725 argv_array_push(&cmd.args, "-e");
726 else if (!(flags & CLEANUP_MSG) &&
727 !opts->signoff && !opts->record_origin &&
728 git_config_get_value("commit.cleanup", &value))
729 argv_array_push(&cmd.args, "--cleanup=verbatim");
731 if ((flags & ALLOW_EMPTY))
732 argv_array_push(&cmd.args, "--allow-empty");
734 if (opts->allow_empty_message)
735 argv_array_push(&cmd.args, "--allow-empty-message");
738 /* hide stderr on success */
739 struct strbuf buf = STRBUF_INIT;
740 int rc = pipe_command(&cmd,
742 /* stdout is already redirected */
746 fputs(buf.buf, stderr);
747 strbuf_release(&buf);
751 return run_command(&cmd);
754 static int rest_is_empty(const struct strbuf *sb, int start)
759 /* Check if the rest is just whitespace and Signed-off-by's. */
760 for (i = start; i < sb->len; i++) {
761 nl = memchr(sb->buf + i, '\n', sb->len - i);
767 if (strlen(sign_off_header) <= eol - i &&
768 starts_with(sb->buf + i, sign_off_header)) {
773 if (!isspace(sb->buf[i++]))
781 * Find out if the message in the strbuf contains only whitespace and
782 * Signed-off-by lines.
784 int message_is_empty(const struct strbuf *sb,
785 enum commit_msg_cleanup_mode cleanup_mode)
787 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
789 return rest_is_empty(sb, 0);
793 * See if the user edited the message in the editor or left what
794 * was in the template intact
796 int template_untouched(const struct strbuf *sb, const char *template_file,
797 enum commit_msg_cleanup_mode cleanup_mode)
799 struct strbuf tmpl = STRBUF_INIT;
802 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
805 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
808 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
809 if (!skip_prefix(sb->buf, tmpl.buf, &start))
811 strbuf_release(&tmpl);
812 return rest_is_empty(sb, start - sb->buf);
815 int update_head_with_reflog(const struct commit *old_head,
816 const struct object_id *new_head,
817 const char *action, const struct strbuf *msg,
820 struct ref_transaction *transaction;
821 struct strbuf sb = STRBUF_INIT;
826 strbuf_addstr(&sb, action);
827 strbuf_addstr(&sb, ": ");
830 nl = strchr(msg->buf, '\n');
832 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
834 strbuf_addbuf(&sb, msg);
835 strbuf_addch(&sb, '\n');
838 transaction = ref_transaction_begin(err);
840 ref_transaction_update(transaction, "HEAD", new_head,
841 old_head ? &old_head->object.oid : &null_oid,
843 ref_transaction_commit(transaction, err)) {
846 ref_transaction_free(transaction);
852 static int run_rewrite_hook(const struct object_id *oldoid,
853 const struct object_id *newoid)
855 struct child_process proc = CHILD_PROCESS_INIT;
858 struct strbuf sb = STRBUF_INIT;
860 argv[0] = find_hook("post-rewrite");
869 proc.stdout_to_stderr = 1;
871 code = start_command(&proc);
874 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
875 sigchain_push(SIGPIPE, SIG_IGN);
876 write_in_full(proc.in, sb.buf, sb.len);
879 sigchain_pop(SIGPIPE);
880 return finish_command(&proc);
883 void commit_post_rewrite(const struct commit *old_head,
884 const struct object_id *new_head)
886 struct notes_rewrite_cfg *cfg;
888 cfg = init_copy_notes_for_rewrite("amend");
890 /* we are amending, so old_head is not NULL */
891 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
892 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
894 run_rewrite_hook(&old_head->object.oid, new_head);
897 static int run_prepare_commit_msg_hook(struct strbuf *msg, const char *commit)
899 struct argv_array hook_env = ARGV_ARRAY_INIT;
903 name = git_path_commit_editmsg();
904 if (write_message(msg->buf, msg->len, name, 0))
907 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", get_index_file());
908 argv_array_push(&hook_env, "GIT_EDITOR=:");
910 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
911 "commit", commit, NULL);
913 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
916 ret = error(_("'prepare-commit-msg' hook failed"));
917 argv_array_clear(&hook_env);
922 static const char implicit_ident_advice_noconfig[] =
923 N_("Your name and email address were configured automatically based\n"
924 "on your username and hostname. Please check that they are accurate.\n"
925 "You can suppress this message by setting them explicitly. Run the\n"
926 "following command and follow the instructions in your editor to edit\n"
927 "your configuration file:\n"
929 " git config --global --edit\n"
931 "After doing this, you may fix the identity used for this commit with:\n"
933 " git commit --amend --reset-author\n");
935 static const char implicit_ident_advice_config[] =
936 N_("Your name and email address were configured automatically based\n"
937 "on your username and hostname. Please check that they are accurate.\n"
938 "You can suppress this message by setting them explicitly:\n"
940 " git config --global user.name \"Your Name\"\n"
941 " git config --global user.email you@example.com\n"
943 "After doing this, you may fix the identity used for this commit with:\n"
945 " git commit --amend --reset-author\n");
947 static const char *implicit_ident_advice(void)
949 char *user_config = expand_user_path("~/.gitconfig", 0);
950 char *xdg_config = xdg_config_home("config");
951 int config_exists = file_exists(user_config) || file_exists(xdg_config);
957 return _(implicit_ident_advice_config);
959 return _(implicit_ident_advice_noconfig);
963 void print_commit_summary(const char *prefix, const struct object_id *oid,
967 struct commit *commit;
968 struct strbuf format = STRBUF_INIT;
970 struct pretty_print_context pctx = {0};
971 struct strbuf author_ident = STRBUF_INIT;
972 struct strbuf committer_ident = STRBUF_INIT;
974 commit = lookup_commit(oid);
976 die(_("couldn't look up newly created commit"));
977 if (parse_commit(commit))
978 die(_("could not parse newly created commit"));
980 strbuf_addstr(&format, "format:%h] %s");
982 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
983 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
984 if (strbuf_cmp(&author_ident, &committer_ident)) {
985 strbuf_addstr(&format, "\n Author: ");
986 strbuf_addbuf_percentquote(&format, &author_ident);
988 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
989 struct strbuf date = STRBUF_INIT;
991 format_commit_message(commit, "%ad", &date, &pctx);
992 strbuf_addstr(&format, "\n Date: ");
993 strbuf_addbuf_percentquote(&format, &date);
994 strbuf_release(&date);
996 if (!committer_ident_sufficiently_given()) {
997 strbuf_addstr(&format, "\n Committer: ");
998 strbuf_addbuf_percentquote(&format, &committer_ident);
999 if (advice_implicit_identity) {
1000 strbuf_addch(&format, '\n');
1001 strbuf_addstr(&format, implicit_ident_advice());
1004 strbuf_release(&author_ident);
1005 strbuf_release(&committer_ident);
1007 init_revisions(&rev, prefix);
1008 setup_revisions(0, NULL, &rev, NULL);
1011 rev.diffopt.output_format =
1012 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1014 rev.verbose_header = 1;
1015 rev.show_root_diff = 1;
1016 get_commit_format(format.buf, &rev);
1017 rev.always_show_header = 0;
1018 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1019 rev.diffopt.break_opt = 0;
1020 diff_setup_done(&rev.diffopt);
1022 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1024 die_errno(_("unable to resolve HEAD after creating commit"));
1025 if (!strcmp(head, "HEAD"))
1026 head = _("detached HEAD");
1028 skip_prefix(head, "refs/heads/", &head);
1029 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1030 _(" (root-commit)") : "");
1032 if (!log_tree_commit(&rev, commit)) {
1033 rev.always_show_header = 1;
1034 rev.use_terminator = 1;
1035 log_tree_commit(&rev, commit);
1038 strbuf_release(&format);
1041 static int parse_head(struct commit **head)
1043 struct commit *current_head;
1044 struct object_id oid;
1046 if (get_oid("HEAD", &oid)) {
1047 current_head = NULL;
1049 current_head = lookup_commit_reference(&oid);
1051 return error(_("could not parse HEAD"));
1052 if (oidcmp(&oid, ¤t_head->object.oid)) {
1053 warning(_("HEAD %s is not a commit!"),
1056 if (parse_commit(current_head))
1057 return error(_("could not parse HEAD commit"));
1059 *head = current_head;
1065 * Try to commit without forking 'git commit'. In some cases we need
1066 * to run 'git commit' to display an error message
1069 * -1 - error unable to commit
1071 * 1 - run 'git commit'
1073 static int try_to_commit(struct strbuf *msg, const char *author,
1074 struct replay_opts *opts, unsigned int flags,
1075 struct object_id *oid)
1077 struct object_id tree;
1078 struct commit *current_head;
1079 struct commit_list *parents = NULL;
1080 struct commit_extra_header *extra = NULL;
1081 struct strbuf err = STRBUF_INIT;
1082 struct strbuf commit_msg = STRBUF_INIT;
1083 char *amend_author = NULL;
1084 const char *hook_commit = NULL;
1085 enum commit_msg_cleanup_mode cleanup;
1088 if (parse_head(¤t_head))
1091 if (flags & AMEND_MSG) {
1092 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1093 const char *out_enc = get_commit_output_encoding();
1094 const char *message = logmsg_reencode(current_head, NULL,
1098 const char *orig_message = NULL;
1100 find_commit_subject(message, &orig_message);
1102 strbuf_addstr(msg, orig_message);
1103 hook_commit = "HEAD";
1105 author = amend_author = get_author(message);
1106 unuse_commit_buffer(current_head, message);
1108 res = error(_("unable to parse commit author"));
1111 parents = copy_commit_list(current_head->parents);
1112 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1113 } else if (current_head) {
1114 commit_list_insert(current_head, &parents);
1117 if (write_cache_as_tree(&tree, 0, NULL)) {
1118 res = error(_("git write-tree failed to write a tree"));
1122 if (!(flags & ALLOW_EMPTY) && !oidcmp(current_head ?
1123 ¤t_head->tree->object.oid :
1124 &empty_tree_oid, &tree)) {
1125 res = 1; /* run 'git commit' to display error message */
1129 if (find_hook("prepare-commit-msg")) {
1130 res = run_prepare_commit_msg_hook(msg, hook_commit);
1133 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1135 res = error_errno(_("unable to read commit message "
1137 git_path_commit_editmsg());
1143 cleanup = (flags & CLEANUP_MSG) ? COMMIT_MSG_CLEANUP_ALL :
1144 opts->default_msg_cleanup;
1146 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1147 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1148 if (!opts->allow_empty_message && message_is_empty(msg, cleanup)) {
1149 res = 1; /* run 'git commit' to display error message */
1155 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1156 oid, author, opts->gpg_sign, extra)) {
1157 res = error(_("failed to write commit object"));
1161 if (update_head_with_reflog(current_head, oid,
1162 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1163 res = error("%s", err.buf);
1167 if (flags & AMEND_MSG)
1168 commit_post_rewrite(current_head, oid);
1171 free_commit_extra_headers(extra);
1172 strbuf_release(&err);
1173 strbuf_release(&commit_msg);
1179 static int do_commit(const char *msg_file, const char *author,
1180 struct replay_opts *opts, unsigned int flags)
1184 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1185 struct object_id oid;
1186 struct strbuf sb = STRBUF_INIT;
1188 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1189 return error_errno(_("unable to read commit message "
1193 res = try_to_commit(msg_file ? &sb : NULL, author, opts, flags,
1195 strbuf_release(&sb);
1197 unlink(git_path_cherry_pick_head());
1198 unlink(git_path_merge_msg());
1199 if (!is_rebase_i(opts))
1200 print_commit_summary(NULL, &oid,
1201 SUMMARY_SHOW_AUTHOR_DATE);
1206 return run_git_commit(msg_file, opts, flags);
1211 static int is_original_commit_empty(struct commit *commit)
1213 const struct object_id *ptree_oid;
1215 if (parse_commit(commit))
1216 return error(_("could not parse commit %s"),
1217 oid_to_hex(&commit->object.oid));
1218 if (commit->parents) {
1219 struct commit *parent = commit->parents->item;
1220 if (parse_commit(parent))
1221 return error(_("could not parse parent commit %s"),
1222 oid_to_hex(&parent->object.oid));
1223 ptree_oid = &parent->tree->object.oid;
1225 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1228 return !oidcmp(ptree_oid, &commit->tree->object.oid);
1232 * Do we run "git commit" with "--allow-empty"?
1234 static int allow_empty(struct replay_opts *opts, struct commit *commit)
1236 int index_unchanged, empty_commit;
1241 * (1) we do not allow empty at all and error out.
1243 * (2) we allow ones that were initially empty, but
1244 * forbid the ones that become empty;
1246 * (3) we allow both.
1248 if (!opts->allow_empty)
1249 return 0; /* let "git commit" barf as necessary */
1251 index_unchanged = is_index_unchanged();
1252 if (index_unchanged < 0)
1253 return index_unchanged;
1254 if (!index_unchanged)
1255 return 0; /* we do not have to say --allow-empty */
1257 if (opts->keep_redundant_commits)
1260 empty_commit = is_original_commit_empty(commit);
1261 if (empty_commit < 0)
1262 return empty_commit;
1270 * Note that ordering matters in this enum. Not only must it match the mapping
1271 * below, it is also divided into several sections that matter. When adding
1272 * new commands, make sure you add it in the right section.
1275 /* commands that handle commits */
1282 /* commands that do something else than handling a single commit */
1284 /* commands that do nothing but are counted for reporting progress */
1287 /* comments (not counted for reporting progress) */
1294 } todo_command_info[] = {
1307 static const char *command_to_string(const enum todo_command command)
1309 if (command < TODO_COMMENT)
1310 return todo_command_info[command].str;
1311 die("Unknown command: %d", command);
1314 static char command_to_char(const enum todo_command command)
1316 if (command < TODO_COMMENT && todo_command_info[command].c)
1317 return todo_command_info[command].c;
1318 return comment_line_char;
1321 static int is_noop(const enum todo_command command)
1323 return TODO_NOOP <= command;
1326 static int is_fixup(enum todo_command command)
1328 return command == TODO_FIXUP || command == TODO_SQUASH;
1331 static int update_squash_messages(enum todo_command command,
1332 struct commit *commit, struct replay_opts *opts)
1334 struct strbuf buf = STRBUF_INIT;
1336 const char *message, *body;
1338 if (file_exists(rebase_path_squash_msg())) {
1339 struct strbuf header = STRBUF_INIT;
1342 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 2048) <= 0)
1343 return error(_("could not read '%s'"),
1344 rebase_path_squash_msg());
1347 eol = strchrnul(buf.buf, '\n');
1348 if (buf.buf[0] != comment_line_char ||
1349 (p += strcspn(p, "0123456789\n")) == eol)
1350 return error(_("unexpected 1st line of squash message:"
1352 (int)(eol - buf.buf), buf.buf);
1353 count = strtol(p, NULL, 10);
1356 return error(_("invalid 1st line of squash message:\n"
1358 (int)(eol - buf.buf), buf.buf);
1360 strbuf_addf(&header, "%c ", comment_line_char);
1361 strbuf_addf(&header,
1362 _("This is a combination of %d commits."), ++count);
1363 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1364 strbuf_release(&header);
1366 struct object_id head;
1367 struct commit *head_commit;
1368 const char *head_message, *body;
1370 if (get_oid("HEAD", &head))
1371 return error(_("need a HEAD to fixup"));
1372 if (!(head_commit = lookup_commit_reference(&head)))
1373 return error(_("could not read HEAD"));
1374 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1375 return error(_("could not read HEAD's commit message"));
1377 find_commit_subject(head_message, &body);
1378 if (write_message(body, strlen(body),
1379 rebase_path_fixup_msg(), 0)) {
1380 unuse_commit_buffer(head_commit, head_message);
1381 return error(_("cannot write '%s'"),
1382 rebase_path_fixup_msg());
1386 strbuf_addf(&buf, "%c ", comment_line_char);
1387 strbuf_addf(&buf, _("This is a combination of %d commits."),
1389 strbuf_addf(&buf, "\n%c ", comment_line_char);
1390 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1391 strbuf_addstr(&buf, "\n\n");
1392 strbuf_addstr(&buf, body);
1394 unuse_commit_buffer(head_commit, head_message);
1397 if (!(message = get_commit_buffer(commit, NULL)))
1398 return error(_("could not read commit message of %s"),
1399 oid_to_hex(&commit->object.oid));
1400 find_commit_subject(message, &body);
1402 if (command == TODO_SQUASH) {
1403 unlink(rebase_path_fixup_msg());
1404 strbuf_addf(&buf, "\n%c ", comment_line_char);
1405 strbuf_addf(&buf, _("This is the commit message #%d:"), count);
1406 strbuf_addstr(&buf, "\n\n");
1407 strbuf_addstr(&buf, body);
1408 } else if (command == TODO_FIXUP) {
1409 strbuf_addf(&buf, "\n%c ", comment_line_char);
1410 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1412 strbuf_addstr(&buf, "\n\n");
1413 strbuf_add_commented_lines(&buf, body, strlen(body));
1415 return error(_("unknown command: %d"), command);
1416 unuse_commit_buffer(commit, message);
1418 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1419 strbuf_release(&buf);
1423 static void flush_rewritten_pending(void) {
1424 struct strbuf buf = STRBUF_INIT;
1425 struct object_id newoid;
1428 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1429 !get_oid("HEAD", &newoid) &&
1430 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1431 char *bol = buf.buf, *eol;
1434 eol = strchrnul(bol, '\n');
1435 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1436 bol, oid_to_hex(&newoid));
1442 unlink(rebase_path_rewritten_pending());
1444 strbuf_release(&buf);
1447 static void record_in_rewritten(struct object_id *oid,
1448 enum todo_command next_command) {
1449 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1454 fprintf(out, "%s\n", oid_to_hex(oid));
1457 if (!is_fixup(next_command))
1458 flush_rewritten_pending();
1461 static int do_pick_commit(enum todo_command command, struct commit *commit,
1462 struct replay_opts *opts, int final_fixup)
1464 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1465 const char *msg_file = opts->edit ? NULL : git_path_merge_msg();
1466 struct object_id head;
1467 struct commit *base, *next, *parent;
1468 const char *base_label, *next_label;
1469 char *author = NULL;
1470 struct commit_message msg = { NULL, NULL, NULL, NULL };
1471 struct strbuf msgbuf = STRBUF_INIT;
1472 int res, unborn = 0, allow;
1474 if (opts->no_commit) {
1476 * We do not intend to commit immediately. We just want to
1477 * merge the differences in, so let's compute the tree
1478 * that represents the "current" state for merge-recursive
1481 if (write_cache_as_tree(&head, 0, NULL))
1482 return error(_("your index file is unmerged."));
1484 unborn = get_oid("HEAD", &head);
1486 oidcpy(&head, the_hash_algo->empty_tree);
1487 if (index_differs_from(unborn ? EMPTY_TREE_SHA1_HEX : "HEAD",
1489 return error_dirty_index(opts);
1493 if (!commit->parents)
1495 else if (commit->parents->next) {
1496 /* Reverting or cherry-picking a merge commit */
1498 struct commit_list *p;
1500 if (!opts->mainline)
1501 return error(_("commit %s is a merge but no -m option was given."),
1502 oid_to_hex(&commit->object.oid));
1504 for (cnt = 1, p = commit->parents;
1505 cnt != opts->mainline && p;
1508 if (cnt != opts->mainline || !p)
1509 return error(_("commit %s does not have parent %d"),
1510 oid_to_hex(&commit->object.oid), opts->mainline);
1512 } else if (0 < opts->mainline)
1513 return error(_("mainline was specified but commit %s is not a merge."),
1514 oid_to_hex(&commit->object.oid));
1516 parent = commit->parents->item;
1518 if (get_message(commit, &msg) != 0)
1519 return error(_("cannot get commit message for %s"),
1520 oid_to_hex(&commit->object.oid));
1522 if (opts->allow_ff && !is_fixup(command) &&
1523 ((parent && !oidcmp(&parent->object.oid, &head)) ||
1524 (!parent && unborn))) {
1525 if (is_rebase_i(opts))
1526 write_author_script(msg.message);
1527 res = fast_forward_to(&commit->object.oid, &head, unborn,
1529 if (res || command != TODO_REWORD)
1531 flags |= EDIT_MSG | AMEND_MSG | VERIFY_MSG;
1533 goto fast_forward_edit;
1535 if (parent && parse_commit(parent) < 0)
1536 /* TRANSLATORS: The first %s will be a "todo" command like
1537 "revert" or "pick", the second %s a SHA1. */
1538 return error(_("%s: cannot parse parent commit %s"),
1539 command_to_string(command),
1540 oid_to_hex(&parent->object.oid));
1543 * "commit" is an existing commit. We would want to apply
1544 * the difference it introduces since its first parent "prev"
1545 * on top of the current HEAD if we are cherry-pick. Or the
1546 * reverse of it if we are revert.
1549 if (command == TODO_REVERT) {
1551 base_label = msg.label;
1553 next_label = msg.parent_label;
1554 strbuf_addstr(&msgbuf, "Revert \"");
1555 strbuf_addstr(&msgbuf, msg.subject);
1556 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1557 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1559 if (commit->parents && commit->parents->next) {
1560 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1561 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1563 strbuf_addstr(&msgbuf, ".\n");
1568 base_label = msg.parent_label;
1570 next_label = msg.label;
1572 /* Append the commit log message to msgbuf. */
1573 if (find_commit_subject(msg.message, &p))
1574 strbuf_addstr(&msgbuf, p);
1576 if (opts->record_origin) {
1577 strbuf_complete_line(&msgbuf);
1578 if (!has_conforming_footer(&msgbuf, NULL, 0))
1579 strbuf_addch(&msgbuf, '\n');
1580 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1581 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1582 strbuf_addstr(&msgbuf, ")\n");
1584 if (!is_fixup(command))
1585 author = get_author(msg.message);
1588 if (command == TODO_REWORD)
1589 flags |= EDIT_MSG | VERIFY_MSG;
1590 else if (is_fixup(command)) {
1591 if (update_squash_messages(command, commit, opts))
1595 msg_file = rebase_path_squash_msg();
1596 else if (file_exists(rebase_path_fixup_msg())) {
1597 flags |= CLEANUP_MSG;
1598 msg_file = rebase_path_fixup_msg();
1600 const char *dest = git_path_squash_msg();
1602 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1603 return error(_("could not rename '%s' to '%s'"),
1604 rebase_path_squash_msg(), dest);
1605 unlink(git_path_merge_msg());
1611 if (opts->signoff && !is_fixup(command))
1612 append_signoff(&msgbuf, 0, 0);
1614 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1616 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1617 res = do_recursive_merge(base, next, base_label, next_label,
1618 &head, &msgbuf, opts);
1621 res |= write_message(msgbuf.buf, msgbuf.len,
1622 git_path_merge_msg(), 0);
1624 struct commit_list *common = NULL;
1625 struct commit_list *remotes = NULL;
1627 res = write_message(msgbuf.buf, msgbuf.len,
1628 git_path_merge_msg(), 0);
1630 commit_list_insert(base, &common);
1631 commit_list_insert(next, &remotes);
1632 res |= try_merge_command(opts->strategy,
1633 opts->xopts_nr, (const char **)opts->xopts,
1634 common, oid_to_hex(&head), remotes);
1635 free_commit_list(common);
1636 free_commit_list(remotes);
1638 strbuf_release(&msgbuf);
1641 * If the merge was clean or if it failed due to conflict, we write
1642 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1643 * However, if the merge did not even start, then we don't want to
1646 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
1647 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
1648 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1650 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
1651 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
1652 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1656 error(command == TODO_REVERT
1657 ? _("could not revert %s... %s")
1658 : _("could not apply %s... %s"),
1659 short_commit_name(commit), msg.subject);
1660 print_advice(res == 1, opts);
1661 rerere(opts->allow_rerere_auto);
1665 allow = allow_empty(opts, commit);
1670 flags |= ALLOW_EMPTY;
1671 if (!opts->no_commit) {
1673 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1674 res = do_commit(msg_file, author, opts, flags);
1676 res = error(_("unable to parse commit author"));
1679 if (!res && final_fixup) {
1680 unlink(rebase_path_fixup_msg());
1681 unlink(rebase_path_squash_msg());
1685 free_message(commit, &msg);
1687 update_abort_safety_file();
1692 static int prepare_revs(struct replay_opts *opts)
1695 * picking (but not reverting) ranges (but not individual revisions)
1696 * should be done in reverse
1698 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1699 opts->revs->reverse ^= 1;
1701 if (prepare_revision_walk(opts->revs))
1702 return error(_("revision walk setup failed"));
1704 if (!opts->revs->commits)
1705 return error(_("empty commit set passed"));
1709 static int read_and_refresh_cache(struct replay_opts *opts)
1711 struct lock_file index_lock = LOCK_INIT;
1712 int index_fd = hold_locked_index(&index_lock, 0);
1713 if (read_index_preload(&the_index, NULL) < 0) {
1714 rollback_lock_file(&index_lock);
1715 return error(_("git %s: failed to read the index"),
1716 _(action_name(opts)));
1718 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
1719 if (index_fd >= 0) {
1720 if (write_locked_index(&the_index, &index_lock,
1721 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
1722 return error(_("git %s: failed to refresh the index"),
1723 _(action_name(opts)));
1730 enum todo_command command;
1731 struct commit *commit;
1734 size_t offset_in_buf;
1739 struct todo_item *items;
1740 int nr, alloc, current;
1741 int done_nr, total_nr;
1742 struct stat_data stat;
1745 #define TODO_LIST_INIT { STRBUF_INIT }
1747 static void todo_list_release(struct todo_list *todo_list)
1749 strbuf_release(&todo_list->buf);
1750 FREE_AND_NULL(todo_list->items);
1751 todo_list->nr = todo_list->alloc = 0;
1754 static struct todo_item *append_new_todo(struct todo_list *todo_list)
1756 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
1757 return todo_list->items + todo_list->nr++;
1760 static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
1762 struct object_id commit_oid;
1763 char *end_of_object_name;
1764 int i, saved, status, padding;
1767 bol += strspn(bol, " \t");
1769 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
1770 item->command = TODO_COMMENT;
1771 item->commit = NULL;
1773 item->arg_len = eol - bol;
1777 for (i = 0; i < TODO_COMMENT; i++)
1778 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
1781 } else if (bol[1] == ' ' && *bol == todo_command_info[i].c) {
1786 if (i >= TODO_COMMENT)
1789 /* Eat up extra spaces/ tabs before object name */
1790 padding = strspn(bol, " \t");
1793 if (item->command == TODO_NOOP) {
1795 return error(_("%s does not accept arguments: '%s'"),
1796 command_to_string(item->command), bol);
1797 item->commit = NULL;
1799 item->arg_len = eol - bol;
1804 return error(_("missing arguments for %s"),
1805 command_to_string(item->command));
1807 if (item->command == TODO_EXEC) {
1808 item->commit = NULL;
1810 item->arg_len = (int)(eol - bol);
1814 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
1815 saved = *end_of_object_name;
1816 *end_of_object_name = '\0';
1817 status = get_oid(bol, &commit_oid);
1818 *end_of_object_name = saved;
1820 item->arg = end_of_object_name + strspn(end_of_object_name, " \t");
1821 item->arg_len = (int)(eol - item->arg);
1826 item->commit = lookup_commit_reference(&commit_oid);
1827 return !item->commit;
1830 static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
1832 struct todo_item *item;
1833 char *p = buf, *next_p;
1834 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
1836 for (i = 1; *p; i++, p = next_p) {
1837 char *eol = strchrnul(p, '\n');
1839 next_p = *eol ? eol + 1 /* skip LF */ : eol;
1841 if (p != eol && eol[-1] == '\r')
1842 eol--; /* strip Carriage Return */
1844 item = append_new_todo(todo_list);
1845 item->offset_in_buf = p - todo_list->buf.buf;
1846 if (parse_insn_line(item, p, eol)) {
1847 res = error(_("invalid line %d: %.*s"),
1848 i, (int)(eol - p), p);
1849 item->command = TODO_NOOP;
1854 else if (is_fixup(item->command))
1855 return error(_("cannot '%s' without a previous commit"),
1856 command_to_string(item->command));
1857 else if (!is_noop(item->command))
1864 static int count_commands(struct todo_list *todo_list)
1868 for (i = 0; i < todo_list->nr; i++)
1869 if (todo_list->items[i].command != TODO_COMMENT)
1875 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
1880 fd = open(path, O_RDONLY);
1882 return error_errno(_("could not open '%s'"), path);
1883 len = strbuf_read(sb, fd, 0);
1886 return error(_("could not read '%s'."), path);
1890 static int read_populate_todo(struct todo_list *todo_list,
1891 struct replay_opts *opts)
1894 const char *todo_file = get_todo_path(opts);
1897 strbuf_reset(&todo_list->buf);
1898 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
1901 res = stat(todo_file, &st);
1903 return error(_("could not stat '%s'"), todo_file);
1904 fill_stat_data(&todo_list->stat, &st);
1906 res = parse_insn_buffer(todo_list->buf.buf, todo_list);
1908 if (is_rebase_i(opts))
1909 return error(_("please fix this using "
1910 "'git rebase --edit-todo'."));
1911 return error(_("unusable instruction sheet: '%s'"), todo_file);
1914 if (!todo_list->nr &&
1915 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
1916 return error(_("no commits parsed."));
1918 if (!is_rebase_i(opts)) {
1919 enum todo_command valid =
1920 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
1923 for (i = 0; i < todo_list->nr; i++)
1924 if (valid == todo_list->items[i].command)
1926 else if (valid == TODO_PICK)
1927 return error(_("cannot cherry-pick during a revert."));
1929 return error(_("cannot revert during a cherry-pick."));
1932 if (is_rebase_i(opts)) {
1933 struct todo_list done = TODO_LIST_INIT;
1934 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
1936 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
1937 !parse_insn_buffer(done.buf.buf, &done))
1938 todo_list->done_nr = count_commands(&done);
1940 todo_list->done_nr = 0;
1942 todo_list->total_nr = todo_list->done_nr
1943 + count_commands(todo_list);
1944 todo_list_release(&done);
1947 fprintf(f, "%d\n", todo_list->total_nr);
1955 static int git_config_string_dup(char **dest,
1956 const char *var, const char *value)
1959 return config_error_nonbool(var);
1961 *dest = xstrdup(value);
1965 static int populate_opts_cb(const char *key, const char *value, void *data)
1967 struct replay_opts *opts = data;
1972 else if (!strcmp(key, "options.no-commit"))
1973 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
1974 else if (!strcmp(key, "options.edit"))
1975 opts->edit = git_config_bool_or_int(key, value, &error_flag);
1976 else if (!strcmp(key, "options.signoff"))
1977 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
1978 else if (!strcmp(key, "options.record-origin"))
1979 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
1980 else if (!strcmp(key, "options.allow-ff"))
1981 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
1982 else if (!strcmp(key, "options.mainline"))
1983 opts->mainline = git_config_int(key, value);
1984 else if (!strcmp(key, "options.strategy"))
1985 git_config_string_dup(&opts->strategy, key, value);
1986 else if (!strcmp(key, "options.gpg-sign"))
1987 git_config_string_dup(&opts->gpg_sign, key, value);
1988 else if (!strcmp(key, "options.strategy-option")) {
1989 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
1990 opts->xopts[opts->xopts_nr++] = xstrdup(value);
1991 } else if (!strcmp(key, "options.allow-rerere-auto"))
1992 opts->allow_rerere_auto =
1993 git_config_bool_or_int(key, value, &error_flag) ?
1994 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
1996 return error(_("invalid key: %s"), key);
1999 return error(_("invalid value for %s: %s"), key, value);
2004 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2009 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2011 opts->strategy = strbuf_detach(buf, NULL);
2012 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2015 opts->xopts_nr = split_cmdline(buf->buf, (const char ***)&opts->xopts);
2016 for (i = 0; i < opts->xopts_nr; i++) {
2017 const char *arg = opts->xopts[i];
2019 skip_prefix(arg, "--", &arg);
2020 opts->xopts[i] = xstrdup(arg);
2024 static int read_populate_opts(struct replay_opts *opts)
2026 if (is_rebase_i(opts)) {
2027 struct strbuf buf = STRBUF_INIT;
2029 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2030 if (!starts_with(buf.buf, "-S"))
2033 free(opts->gpg_sign);
2034 opts->gpg_sign = xstrdup(buf.buf + 2);
2039 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2040 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2041 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2042 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2043 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2047 if (file_exists(rebase_path_verbose()))
2050 if (file_exists(rebase_path_signoff())) {
2055 read_strategy_opts(opts, &buf);
2056 strbuf_release(&buf);
2061 if (!file_exists(git_path_opts_file()))
2064 * The function git_parse_source(), called from git_config_from_file(),
2065 * may die() in case of a syntactically incorrect file. We do not care
2066 * about this case, though, because we wrote that file ourselves, so we
2067 * are pretty certain that it is syntactically correct.
2069 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2070 return error(_("malformed options sheet: '%s'"),
2071 git_path_opts_file());
2075 static int walk_revs_populate_todo(struct todo_list *todo_list,
2076 struct replay_opts *opts)
2078 enum todo_command command = opts->action == REPLAY_PICK ?
2079 TODO_PICK : TODO_REVERT;
2080 const char *command_string = todo_command_info[command].str;
2081 struct commit *commit;
2083 if (prepare_revs(opts))
2086 while ((commit = get_revision(opts->revs))) {
2087 struct todo_item *item = append_new_todo(todo_list);
2088 const char *commit_buffer = get_commit_buffer(commit, NULL);
2089 const char *subject;
2092 item->command = command;
2093 item->commit = commit;
2096 item->offset_in_buf = todo_list->buf.len;
2097 subject_len = find_commit_subject(commit_buffer, &subject);
2098 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2099 short_commit_name(commit), subject_len, subject);
2100 unuse_commit_buffer(commit, commit_buffer);
2105 static int create_seq_dir(void)
2107 if (file_exists(git_path_seq_dir())) {
2108 error(_("a cherry-pick or revert is already in progress"));
2109 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2111 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2112 return error_errno(_("could not create sequencer directory '%s'"),
2113 git_path_seq_dir());
2117 static int save_head(const char *head)
2119 struct lock_file head_lock = LOCK_INIT;
2120 struct strbuf buf = STRBUF_INIT;
2124 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2126 return error_errno(_("could not lock HEAD"));
2127 strbuf_addf(&buf, "%s\n", head);
2128 written = write_in_full(fd, buf.buf, buf.len);
2129 strbuf_release(&buf);
2131 rollback_lock_file(&head_lock);
2132 return error_errno(_("could not write to '%s'"),
2133 git_path_head_file());
2135 if (commit_lock_file(&head_lock) < 0)
2136 return error(_("failed to finalize '%s'"), git_path_head_file());
2140 static int rollback_is_safe(void)
2142 struct strbuf sb = STRBUF_INIT;
2143 struct object_id expected_head, actual_head;
2145 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2147 if (get_oid_hex(sb.buf, &expected_head)) {
2148 strbuf_release(&sb);
2149 die(_("could not parse %s"), git_path_abort_safety_file());
2151 strbuf_release(&sb);
2153 else if (errno == ENOENT)
2154 oidclr(&expected_head);
2156 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2158 if (get_oid("HEAD", &actual_head))
2159 oidclr(&actual_head);
2161 return !oidcmp(&actual_head, &expected_head);
2164 static int reset_for_rollback(const struct object_id *oid)
2166 const char *argv[4]; /* reset --merge <arg> + NULL */
2169 argv[1] = "--merge";
2170 argv[2] = oid_to_hex(oid);
2172 return run_command_v_opt(argv, RUN_GIT_CMD);
2175 static int rollback_single_pick(void)
2177 struct object_id head_oid;
2179 if (!file_exists(git_path_cherry_pick_head()) &&
2180 !file_exists(git_path_revert_head()))
2181 return error(_("no cherry-pick or revert in progress"));
2182 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2183 return error(_("cannot resolve HEAD"));
2184 if (is_null_oid(&head_oid))
2185 return error(_("cannot abort from a branch yet to be born"));
2186 return reset_for_rollback(&head_oid);
2189 int sequencer_rollback(struct replay_opts *opts)
2192 struct object_id oid;
2193 struct strbuf buf = STRBUF_INIT;
2196 f = fopen(git_path_head_file(), "r");
2197 if (!f && errno == ENOENT) {
2199 * There is no multiple-cherry-pick in progress.
2200 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2201 * a single-cherry-pick in progress, abort that.
2203 return rollback_single_pick();
2206 return error_errno(_("cannot open '%s'"), git_path_head_file());
2207 if (strbuf_getline_lf(&buf, f)) {
2208 error(_("cannot read '%s': %s"), git_path_head_file(),
2209 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2214 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2215 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2216 git_path_head_file());
2219 if (is_null_oid(&oid)) {
2220 error(_("cannot abort from a branch yet to be born"));
2224 if (!rollback_is_safe()) {
2225 /* Do not error, just do not rollback */
2226 warning(_("You seem to have moved HEAD. "
2227 "Not rewinding, check your HEAD!"));
2229 if (reset_for_rollback(&oid))
2231 strbuf_release(&buf);
2232 return sequencer_remove_state(opts);
2234 strbuf_release(&buf);
2238 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2240 struct lock_file todo_lock = LOCK_INIT;
2241 const char *todo_path = get_todo_path(opts);
2242 int next = todo_list->current, offset, fd;
2245 * rebase -i writes "git-rebase-todo" without the currently executing
2246 * command, appending it to "done" instead.
2248 if (is_rebase_i(opts))
2251 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2253 return error_errno(_("could not lock '%s'"), todo_path);
2254 offset = next < todo_list->nr ?
2255 todo_list->items[next].offset_in_buf : todo_list->buf.len;
2256 if (write_in_full(fd, todo_list->buf.buf + offset,
2257 todo_list->buf.len - offset) < 0)
2258 return error_errno(_("could not write to '%s'"), todo_path);
2259 if (commit_lock_file(&todo_lock) < 0)
2260 return error(_("failed to finalize '%s'"), todo_path);
2262 if (is_rebase_i(opts)) {
2263 const char *done_path = rebase_path_done();
2264 int fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
2265 int prev_offset = !next ? 0 :
2266 todo_list->items[next - 1].offset_in_buf;
2268 if (fd >= 0 && offset > prev_offset &&
2269 write_in_full(fd, todo_list->buf.buf + prev_offset,
2270 offset - prev_offset) < 0) {
2272 return error_errno(_("could not write to '%s'"),
2281 static int save_opts(struct replay_opts *opts)
2283 const char *opts_file = git_path_opts_file();
2286 if (opts->no_commit)
2287 res |= git_config_set_in_file_gently(opts_file, "options.no-commit", "true");
2289 res |= git_config_set_in_file_gently(opts_file, "options.edit", "true");
2291 res |= git_config_set_in_file_gently(opts_file, "options.signoff", "true");
2292 if (opts->record_origin)
2293 res |= git_config_set_in_file_gently(opts_file, "options.record-origin", "true");
2295 res |= git_config_set_in_file_gently(opts_file, "options.allow-ff", "true");
2296 if (opts->mainline) {
2297 struct strbuf buf = STRBUF_INIT;
2298 strbuf_addf(&buf, "%d", opts->mainline);
2299 res |= git_config_set_in_file_gently(opts_file, "options.mainline", buf.buf);
2300 strbuf_release(&buf);
2303 res |= git_config_set_in_file_gently(opts_file, "options.strategy", opts->strategy);
2305 res |= git_config_set_in_file_gently(opts_file, "options.gpg-sign", opts->gpg_sign);
2308 for (i = 0; i < opts->xopts_nr; i++)
2309 res |= git_config_set_multivar_in_file_gently(opts_file,
2310 "options.strategy-option",
2311 opts->xopts[i], "^$", 0);
2313 if (opts->allow_rerere_auto)
2314 res |= git_config_set_in_file_gently(opts_file, "options.allow-rerere-auto",
2315 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2320 static int make_patch(struct commit *commit, struct replay_opts *opts)
2322 struct strbuf buf = STRBUF_INIT;
2323 struct rev_info log_tree_opt;
2324 const char *subject, *p;
2327 p = short_commit_name(commit);
2328 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2330 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2331 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2332 res |= error(_("could not update %s"), "REBASE_HEAD");
2334 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2335 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2336 init_revisions(&log_tree_opt, NULL);
2337 log_tree_opt.abbrev = 0;
2338 log_tree_opt.diff = 1;
2339 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2340 log_tree_opt.disable_stdin = 1;
2341 log_tree_opt.no_commit_id = 1;
2342 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2343 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2344 if (!log_tree_opt.diffopt.file)
2345 res |= error_errno(_("could not open '%s'"), buf.buf);
2347 res |= log_tree_commit(&log_tree_opt, commit);
2348 fclose(log_tree_opt.diffopt.file);
2352 strbuf_addf(&buf, "%s/message", get_dir(opts));
2353 if (!file_exists(buf.buf)) {
2354 const char *commit_buffer = get_commit_buffer(commit, NULL);
2355 find_commit_subject(commit_buffer, &subject);
2356 res |= write_message(subject, strlen(subject), buf.buf, 1);
2357 unuse_commit_buffer(commit, commit_buffer);
2359 strbuf_release(&buf);
2364 static int intend_to_amend(void)
2366 struct object_id head;
2369 if (get_oid("HEAD", &head))
2370 return error(_("cannot read HEAD"));
2372 p = oid_to_hex(&head);
2373 return write_message(p, strlen(p), rebase_path_amend(), 1);
2376 static int error_with_patch(struct commit *commit,
2377 const char *subject, int subject_len,
2378 struct replay_opts *opts, int exit_code, int to_amend)
2380 if (make_patch(commit, opts))
2384 if (intend_to_amend())
2387 fprintf(stderr, "You can amend the commit now, with\n"
2389 " git commit --amend %s\n"
2391 "Once you are satisfied with your changes, run\n"
2393 " git rebase --continue\n", gpg_sign_opt_quoted(opts));
2394 } else if (exit_code)
2395 fprintf(stderr, "Could not apply %s... %.*s\n",
2396 short_commit_name(commit), subject_len, subject);
2401 static int error_failed_squash(struct commit *commit,
2402 struct replay_opts *opts, int subject_len, const char *subject)
2404 if (rename(rebase_path_squash_msg(), rebase_path_message()))
2405 return error(_("could not rename '%s' to '%s'"),
2406 rebase_path_squash_msg(), rebase_path_message());
2407 unlink(rebase_path_fixup_msg());
2408 unlink(git_path_merge_msg());
2409 if (copy_file(git_path_merge_msg(), rebase_path_message(), 0666))
2410 return error(_("could not copy '%s' to '%s'"),
2411 rebase_path_message(), git_path_merge_msg());
2412 return error_with_patch(commit, subject, subject_len, opts, 1, 0);
2415 static int do_exec(const char *command_line)
2417 struct argv_array child_env = ARGV_ARRAY_INIT;
2418 const char *child_argv[] = { NULL, NULL };
2421 fprintf(stderr, "Executing: %s\n", command_line);
2422 child_argv[0] = command_line;
2423 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
2424 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
2427 /* force re-reading of the cache */
2428 if (discard_cache() < 0 || read_cache() < 0)
2429 return error(_("could not read index"));
2431 dirty = require_clean_work_tree("rebase", NULL, 1, 1);
2434 warning(_("execution failed: %s\n%s"
2435 "You can fix the problem, and then run\n"
2437 " git rebase --continue\n"
2440 dirty ? N_("and made changes to the index and/or the "
2441 "working tree\n") : "");
2443 /* command not found */
2446 warning(_("execution succeeded: %s\nbut "
2447 "left changes to the index and/or the working tree\n"
2448 "Commit or stash your changes, and then run\n"
2450 " git rebase --continue\n"
2451 "\n"), command_line);
2455 argv_array_clear(&child_env);
2460 static int is_final_fixup(struct todo_list *todo_list)
2462 int i = todo_list->current;
2464 if (!is_fixup(todo_list->items[i].command))
2467 while (++i < todo_list->nr)
2468 if (is_fixup(todo_list->items[i].command))
2470 else if (!is_noop(todo_list->items[i].command))
2475 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
2479 for (i = todo_list->current + offset; i < todo_list->nr; i++)
2480 if (!is_noop(todo_list->items[i].command))
2481 return todo_list->items[i].command;
2486 static int apply_autostash(struct replay_opts *opts)
2488 struct strbuf stash_sha1 = STRBUF_INIT;
2489 struct child_process child = CHILD_PROCESS_INIT;
2492 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
2493 strbuf_release(&stash_sha1);
2496 strbuf_trim(&stash_sha1);
2499 child.no_stdout = 1;
2500 child.no_stderr = 1;
2501 argv_array_push(&child.args, "stash");
2502 argv_array_push(&child.args, "apply");
2503 argv_array_push(&child.args, stash_sha1.buf);
2504 if (!run_command(&child))
2505 fprintf(stderr, _("Applied autostash.\n"));
2507 struct child_process store = CHILD_PROCESS_INIT;
2510 argv_array_push(&store.args, "stash");
2511 argv_array_push(&store.args, "store");
2512 argv_array_push(&store.args, "-m");
2513 argv_array_push(&store.args, "autostash");
2514 argv_array_push(&store.args, "-q");
2515 argv_array_push(&store.args, stash_sha1.buf);
2516 if (run_command(&store))
2517 ret = error(_("cannot store %s"), stash_sha1.buf);
2520 _("Applying autostash resulted in conflicts.\n"
2521 "Your changes are safe in the stash.\n"
2522 "You can run \"git stash pop\" or"
2523 " \"git stash drop\" at any time.\n"));
2526 strbuf_release(&stash_sha1);
2530 static const char *reflog_message(struct replay_opts *opts,
2531 const char *sub_action, const char *fmt, ...)
2534 static struct strbuf buf = STRBUF_INIT;
2538 strbuf_addstr(&buf, action_name(opts));
2540 strbuf_addf(&buf, " (%s)", sub_action);
2542 strbuf_addstr(&buf, ": ");
2543 strbuf_vaddf(&buf, fmt, ap);
2550 static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
2554 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
2556 assert(!(opts->signoff || opts->no_commit ||
2557 opts->record_origin || opts->edit));
2558 if (read_and_refresh_cache(opts))
2561 while (todo_list->current < todo_list->nr) {
2562 struct todo_item *item = todo_list->items + todo_list->current;
2563 if (save_todo(todo_list, opts))
2565 if (is_rebase_i(opts)) {
2566 if (item->command != TODO_COMMENT) {
2567 FILE *f = fopen(rebase_path_msgnum(), "w");
2569 todo_list->done_nr++;
2572 fprintf(f, "%d\n", todo_list->done_nr);
2575 fprintf(stderr, "Rebasing (%d/%d)%s",
2577 todo_list->total_nr,
2578 opts->verbose ? "\n" : "\r");
2580 unlink(rebase_path_message());
2581 unlink(rebase_path_author_script());
2582 unlink(rebase_path_stopped_sha());
2583 unlink(rebase_path_amend());
2584 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
2586 if (item->command <= TODO_SQUASH) {
2587 if (is_rebase_i(opts))
2588 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
2589 command_to_string(item->command), NULL),
2591 res = do_pick_commit(item->command, item->commit,
2592 opts, is_final_fixup(todo_list));
2593 if (is_rebase_i(opts) && res < 0) {
2595 todo_list->current--;
2596 if (save_todo(todo_list, opts))
2599 if (item->command == TODO_EDIT) {
2600 struct commit *commit = item->commit;
2603 _("Stopped at %s... %.*s\n"),
2604 short_commit_name(commit),
2605 item->arg_len, item->arg);
2606 return error_with_patch(commit,
2607 item->arg, item->arg_len, opts, res,
2610 if (is_rebase_i(opts) && !res)
2611 record_in_rewritten(&item->commit->object.oid,
2612 peek_command(todo_list, 1));
2613 if (res && is_fixup(item->command)) {
2616 return error_failed_squash(item->commit, opts,
2617 item->arg_len, item->arg);
2618 } else if (res && is_rebase_i(opts))
2619 return res | error_with_patch(item->commit,
2620 item->arg, item->arg_len, opts, res,
2621 item->command == TODO_REWORD);
2622 } else if (item->command == TODO_EXEC) {
2623 char *end_of_arg = (char *)(item->arg + item->arg_len);
2624 int saved = *end_of_arg;
2628 res = do_exec(item->arg);
2629 *end_of_arg = saved;
2631 /* Reread the todo file if it has changed. */
2633 ; /* fall through */
2634 else if (stat(get_todo_path(opts), &st))
2635 res = error_errno(_("could not stat '%s'"),
2636 get_todo_path(opts));
2637 else if (match_stat_data(&todo_list->stat, &st)) {
2638 todo_list_release(todo_list);
2639 if (read_populate_todo(todo_list, opts))
2640 res = -1; /* message was printed */
2641 /* `current` will be incremented below */
2642 todo_list->current = -1;
2644 } else if (!is_noop(item->command))
2645 return error(_("unknown command %d"), item->command);
2647 todo_list->current++;
2652 if (is_rebase_i(opts)) {
2653 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
2656 /* Stopped in the middle, as planned? */
2657 if (todo_list->current < todo_list->nr)
2660 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
2661 starts_with(head_ref.buf, "refs/")) {
2663 struct object_id head, orig;
2666 if (get_oid("HEAD", &head)) {
2667 res = error(_("cannot read HEAD"));
2669 strbuf_release(&head_ref);
2670 strbuf_release(&buf);
2673 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
2674 get_oid_hex(buf.buf, &orig)) {
2675 res = error(_("could not read orig-head"));
2676 goto cleanup_head_ref;
2679 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
2680 res = error(_("could not read 'onto'"));
2681 goto cleanup_head_ref;
2683 msg = reflog_message(opts, "finish", "%s onto %s",
2684 head_ref.buf, buf.buf);
2685 if (update_ref(msg, head_ref.buf, &head, &orig,
2686 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
2687 res = error(_("could not update %s"),
2689 goto cleanup_head_ref;
2691 msg = reflog_message(opts, "finish", "returning to %s",
2693 if (create_symref("HEAD", head_ref.buf, msg)) {
2694 res = error(_("could not update HEAD to %s"),
2696 goto cleanup_head_ref;
2701 if (opts->verbose) {
2702 struct rev_info log_tree_opt;
2703 struct object_id orig, head;
2705 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2706 init_revisions(&log_tree_opt, NULL);
2707 log_tree_opt.diff = 1;
2708 log_tree_opt.diffopt.output_format =
2709 DIFF_FORMAT_DIFFSTAT;
2710 log_tree_opt.disable_stdin = 1;
2712 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
2713 !get_oid(buf.buf, &orig) &&
2714 !get_oid("HEAD", &head)) {
2715 diff_tree_oid(&orig, &head, "",
2716 &log_tree_opt.diffopt);
2717 log_tree_diff_flush(&log_tree_opt);
2720 flush_rewritten_pending();
2721 if (!stat(rebase_path_rewritten_list(), &st) &&
2723 struct child_process child = CHILD_PROCESS_INIT;
2724 const char *post_rewrite_hook =
2725 find_hook("post-rewrite");
2727 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
2729 argv_array_push(&child.args, "notes");
2730 argv_array_push(&child.args, "copy");
2731 argv_array_push(&child.args, "--for-rewrite=rebase");
2732 /* we don't care if this copying failed */
2733 run_command(&child);
2735 if (post_rewrite_hook) {
2736 struct child_process hook = CHILD_PROCESS_INIT;
2738 hook.in = open(rebase_path_rewritten_list(),
2740 hook.stdout_to_stderr = 1;
2741 argv_array_push(&hook.args, post_rewrite_hook);
2742 argv_array_push(&hook.args, "rebase");
2743 /* we don't care if this hook failed */
2747 apply_autostash(opts);
2749 fprintf(stderr, "Successfully rebased and updated %s.\n",
2752 strbuf_release(&buf);
2753 strbuf_release(&head_ref);
2757 * Sequence of picks finished successfully; cleanup by
2758 * removing the .git/sequencer directory
2760 return sequencer_remove_state(opts);
2763 static int continue_single_pick(void)
2765 const char *argv[] = { "commit", NULL };
2767 if (!file_exists(git_path_cherry_pick_head()) &&
2768 !file_exists(git_path_revert_head()))
2769 return error(_("no cherry-pick or revert in progress"));
2770 return run_command_v_opt(argv, RUN_GIT_CMD);
2773 static int commit_staged_changes(struct replay_opts *opts)
2775 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
2777 if (has_unstaged_changes(1))
2778 return error(_("cannot rebase: You have unstaged changes."));
2779 if (!has_uncommitted_changes(0)) {
2780 const char *cherry_pick_head = git_path_cherry_pick_head();
2782 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
2783 return error(_("could not remove CHERRY_PICK_HEAD"));
2787 if (file_exists(rebase_path_amend())) {
2788 struct strbuf rev = STRBUF_INIT;
2789 struct object_id head, to_amend;
2791 if (get_oid("HEAD", &head))
2792 return error(_("cannot amend non-existing commit"));
2793 if (!read_oneliner(&rev, rebase_path_amend(), 0))
2794 return error(_("invalid file: '%s'"), rebase_path_amend());
2795 if (get_oid_hex(rev.buf, &to_amend))
2796 return error(_("invalid contents: '%s'"),
2797 rebase_path_amend());
2798 if (oidcmp(&head, &to_amend))
2799 return error(_("\nYou have uncommitted changes in your "
2800 "working tree. Please, commit them\n"
2801 "first and then run 'git rebase "
2802 "--continue' again."));
2804 strbuf_release(&rev);
2808 if (run_git_commit(rebase_path_message(), opts, flags))
2809 return error(_("could not commit staged changes."));
2810 unlink(rebase_path_amend());
2814 int sequencer_continue(struct replay_opts *opts)
2816 struct todo_list todo_list = TODO_LIST_INIT;
2819 if (read_and_refresh_cache(opts))
2822 if (is_rebase_i(opts)) {
2823 if (commit_staged_changes(opts))
2825 } else if (!file_exists(get_todo_path(opts)))
2826 return continue_single_pick();
2827 if (read_populate_opts(opts))
2829 if ((res = read_populate_todo(&todo_list, opts)))
2830 goto release_todo_list;
2832 if (!is_rebase_i(opts)) {
2833 /* Verify that the conflict has been resolved */
2834 if (file_exists(git_path_cherry_pick_head()) ||
2835 file_exists(git_path_revert_head())) {
2836 res = continue_single_pick();
2838 goto release_todo_list;
2840 if (index_differs_from("HEAD", NULL, 0)) {
2841 res = error_dirty_index(opts);
2842 goto release_todo_list;
2844 todo_list.current++;
2845 } else if (file_exists(rebase_path_stopped_sha())) {
2846 struct strbuf buf = STRBUF_INIT;
2847 struct object_id oid;
2849 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
2850 !get_oid_committish(buf.buf, &oid))
2851 record_in_rewritten(&oid, peek_command(&todo_list, 0));
2852 strbuf_release(&buf);
2855 res = pick_commits(&todo_list, opts);
2857 todo_list_release(&todo_list);
2861 static int single_pick(struct commit *cmit, struct replay_opts *opts)
2863 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
2864 return do_pick_commit(opts->action == REPLAY_PICK ?
2865 TODO_PICK : TODO_REVERT, cmit, opts, 0);
2868 int sequencer_pick_revisions(struct replay_opts *opts)
2870 struct todo_list todo_list = TODO_LIST_INIT;
2871 struct object_id oid;
2875 if (read_and_refresh_cache(opts))
2878 for (i = 0; i < opts->revs->pending.nr; i++) {
2879 struct object_id oid;
2880 const char *name = opts->revs->pending.objects[i].name;
2882 /* This happens when using --stdin. */
2886 if (!get_oid(name, &oid)) {
2887 if (!lookup_commit_reference_gently(&oid, 1)) {
2888 enum object_type type = oid_object_info(&oid,
2890 return error(_("%s: can't cherry-pick a %s"),
2891 name, type_name(type));
2894 return error(_("%s: bad revision"), name);
2898 * If we were called as "git cherry-pick <commit>", just
2899 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
2900 * REVERT_HEAD, and don't touch the sequencer state.
2901 * This means it is possible to cherry-pick in the middle
2902 * of a cherry-pick sequence.
2904 if (opts->revs->cmdline.nr == 1 &&
2905 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
2906 opts->revs->no_walk &&
2907 !opts->revs->cmdline.rev->flags) {
2908 struct commit *cmit;
2909 if (prepare_revision_walk(opts->revs))
2910 return error(_("revision walk setup failed"));
2911 cmit = get_revision(opts->revs);
2912 if (!cmit || get_revision(opts->revs))
2913 return error("BUG: expected exactly one commit from walk");
2914 return single_pick(cmit, opts);
2918 * Start a new cherry-pick/ revert sequence; but
2919 * first, make sure that an existing one isn't in
2923 if (walk_revs_populate_todo(&todo_list, opts) ||
2924 create_seq_dir() < 0)
2926 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
2927 return error(_("can't revert as initial commit"));
2928 if (save_head(oid_to_hex(&oid)))
2930 if (save_opts(opts))
2932 update_abort_safety_file();
2933 res = pick_commits(&todo_list, opts);
2934 todo_list_release(&todo_list);
2938 void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag)
2940 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
2941 struct strbuf sob = STRBUF_INIT;
2944 strbuf_addstr(&sob, sign_off_header);
2945 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
2946 getenv("GIT_COMMITTER_EMAIL")));
2947 strbuf_addch(&sob, '\n');
2950 strbuf_complete_line(msgbuf);
2953 * If the whole message buffer is equal to the sob, pretend that we
2954 * found a conforming footer with a matching sob
2956 if (msgbuf->len - ignore_footer == sob.len &&
2957 !strncmp(msgbuf->buf, sob.buf, sob.len))
2960 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
2963 const char *append_newlines = NULL;
2964 size_t len = msgbuf->len - ignore_footer;
2968 * The buffer is completely empty. Leave foom for
2969 * the title and body to be filled in by the user.
2971 append_newlines = "\n\n";
2972 } else if (len == 1) {
2974 * Buffer contains a single newline. Add another
2975 * so that we leave room for the title and body.
2977 append_newlines = "\n";
2978 } else if (msgbuf->buf[len - 2] != '\n') {
2980 * Buffer ends with a single newline. Add another
2981 * so that there is an empty line between the message
2984 append_newlines = "\n";
2985 } /* else, the buffer already ends with two newlines. */
2987 if (append_newlines)
2988 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
2989 append_newlines, strlen(append_newlines));
2992 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
2993 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
2996 strbuf_release(&sob);
2999 int sequencer_make_script(FILE *out, int argc, const char **argv,
3002 char *format = NULL;
3003 struct pretty_print_context pp = {0};
3004 struct strbuf buf = STRBUF_INIT;
3005 struct rev_info revs;
3006 struct commit *commit;
3007 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
3008 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
3010 init_revisions(&revs, NULL);
3011 revs.verbose_header = 1;
3012 revs.max_parents = 1;
3013 revs.cherry_mark = 1;
3016 revs.right_only = 1;
3017 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
3018 revs.topo_order = 1;
3020 revs.pretty_given = 1;
3021 git_config_get_string("rebase.instructionFormat", &format);
3022 if (!format || !*format) {
3024 format = xstrdup("%s");
3026 get_commit_format(format, &revs);
3028 pp.fmt = revs.commit_format;
3029 pp.output_encoding = get_log_output_encoding();
3031 if (setup_revisions(argc, argv, &revs, NULL) > 1)
3032 return error(_("make_script: unhandled options"));
3034 if (prepare_revision_walk(&revs) < 0)
3035 return error(_("make_script: error preparing revisions"));
3037 while ((commit = get_revision(&revs))) {
3038 int is_empty = is_original_commit_empty(commit);
3040 if (!is_empty && (commit->object.flags & PATCHSAME))
3043 if (!keep_empty && is_empty)
3044 strbuf_addf(&buf, "%c ", comment_line_char);
3045 strbuf_addf(&buf, "%s %s ", insn,
3046 oid_to_hex(&commit->object.oid));
3047 pretty_print_commit(&pp, commit, &buf);
3048 strbuf_addch(&buf, '\n');
3049 fputs(buf.buf, out);
3051 strbuf_release(&buf);
3056 * Add commands after pick and (series of) squash/fixup commands
3059 int sequencer_add_exec_commands(const char *commands)
3061 const char *todo_file = rebase_path_todo();
3062 struct todo_list todo_list = TODO_LIST_INIT;
3063 struct todo_item *item;
3064 struct strbuf *buf = &todo_list.buf;
3065 size_t offset = 0, commands_len = strlen(commands);
3068 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
3069 return error(_("could not read '%s'."), todo_file);
3071 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
3072 todo_list_release(&todo_list);
3073 return error(_("unusable todo list: '%s'"), todo_file);
3077 /* insert <commands> before every pick except the first one */
3078 for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
3079 if (item->command == TODO_PICK && !first) {
3080 strbuf_insert(buf, item->offset_in_buf + offset,
3081 commands, commands_len);
3082 offset += commands_len;
3087 /* append final <commands> */
3088 strbuf_add(buf, commands, commands_len);
3090 i = write_message(buf->buf, buf->len, todo_file, 0);
3091 todo_list_release(&todo_list);
3095 int transform_todos(unsigned flags)
3097 const char *todo_file = rebase_path_todo();
3098 struct todo_list todo_list = TODO_LIST_INIT;
3099 struct strbuf buf = STRBUF_INIT;
3100 struct todo_item *item;
3103 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
3104 return error(_("could not read '%s'."), todo_file);
3106 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
3107 todo_list_release(&todo_list);
3108 return error(_("unusable todo list: '%s'"), todo_file);
3111 for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
3112 /* if the item is not a command write it and continue */
3113 if (item->command >= TODO_COMMENT) {
3114 strbuf_addf(&buf, "%.*s\n", item->arg_len, item->arg);
3118 /* add command to the buffer */
3119 if (flags & TODO_LIST_ABBREVIATE_CMDS)
3120 strbuf_addch(&buf, command_to_char(item->command));
3122 strbuf_addstr(&buf, command_to_string(item->command));
3126 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
3127 short_commit_name(item->commit) :
3128 oid_to_hex(&item->commit->object.oid);
3130 strbuf_addf(&buf, " %s", oid);
3132 /* add all the rest */
3134 strbuf_addch(&buf, '\n');
3136 strbuf_addf(&buf, " %.*s\n", item->arg_len, item->arg);
3139 i = write_message(buf.buf, buf.len, todo_file, 0);
3140 todo_list_release(&todo_list);
3145 CHECK_IGNORE = 0, CHECK_WARN, CHECK_ERROR
3148 static enum check_level get_missing_commit_check_level(void)
3152 if (git_config_get_value("rebase.missingcommitscheck", &value) ||
3153 !strcasecmp("ignore", value))
3154 return CHECK_IGNORE;
3155 if (!strcasecmp("warn", value))
3157 if (!strcasecmp("error", value))
3159 warning(_("unrecognized setting %s for option "
3160 "rebase.missingCommitsCheck. Ignoring."), value);
3161 return CHECK_IGNORE;
3164 define_commit_slab(commit_seen, unsigned char);
3166 * Check if the user dropped some commits by mistake
3167 * Behaviour determined by rebase.missingCommitsCheck.
3168 * Check if there is an unrecognized command or a
3169 * bad SHA-1 in a command.
3171 int check_todo_list(void)
3173 enum check_level check_level = get_missing_commit_check_level();
3174 struct strbuf todo_file = STRBUF_INIT;
3175 struct todo_list todo_list = TODO_LIST_INIT;
3176 struct strbuf missing = STRBUF_INIT;
3177 int advise_to_edit_todo = 0, res = 0, i;
3178 struct commit_seen commit_seen;
3180 init_commit_seen(&commit_seen);
3182 strbuf_addstr(&todo_file, rebase_path_todo());
3183 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
3187 advise_to_edit_todo = res =
3188 parse_insn_buffer(todo_list.buf.buf, &todo_list);
3190 if (res || check_level == CHECK_IGNORE)
3193 /* Mark the commits in git-rebase-todo as seen */
3194 for (i = 0; i < todo_list.nr; i++) {
3195 struct commit *commit = todo_list.items[i].commit;
3197 *commit_seen_at(&commit_seen, commit) = 1;
3200 todo_list_release(&todo_list);
3201 strbuf_addstr(&todo_file, ".backup");
3202 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
3206 strbuf_release(&todo_file);
3207 res = !!parse_insn_buffer(todo_list.buf.buf, &todo_list);
3209 /* Find commits in git-rebase-todo.backup yet unseen */
3210 for (i = todo_list.nr - 1; i >= 0; i--) {
3211 struct todo_item *item = todo_list.items + i;
3212 struct commit *commit = item->commit;
3213 if (commit && !*commit_seen_at(&commit_seen, commit)) {
3214 strbuf_addf(&missing, " - %s %.*s\n",
3215 short_commit_name(commit),
3216 item->arg_len, item->arg);
3217 *commit_seen_at(&commit_seen, commit) = 1;
3221 /* Warn about missing commits */
3225 if (check_level == CHECK_ERROR)
3226 advise_to_edit_todo = res = 1;
3229 _("Warning: some commits may have been dropped accidentally.\n"
3230 "Dropped commits (newer to older):\n"));
3232 /* Make the list user-friendly and display */
3233 fputs(missing.buf, stderr);
3234 strbuf_release(&missing);
3236 fprintf(stderr, _("To avoid this message, use \"drop\" to "
3237 "explicitly remove a commit.\n\n"
3238 "Use 'git config rebase.missingCommitsCheck' to change "
3239 "the level of warnings.\n"
3240 "The possible behaviours are: ignore, warn, error.\n\n"));
3243 clear_commit_seen(&commit_seen);
3244 strbuf_release(&todo_file);
3245 todo_list_release(&todo_list);
3247 if (advise_to_edit_todo)
3249 _("You can fix this with 'git rebase --edit-todo' "
3250 "and then run 'git rebase --continue'.\n"
3251 "Or you can abort the rebase with 'git rebase"
3257 static int rewrite_file(const char *path, const char *buf, size_t len)
3260 int fd = open(path, O_WRONLY | O_TRUNC);
3262 return error_errno(_("could not open '%s' for writing"), path);
3263 if (write_in_full(fd, buf, len) < 0)
3264 rc = error_errno(_("could not write to '%s'"), path);
3265 if (close(fd) && !rc)
3266 rc = error_errno(_("could not close '%s'"), path);
3270 /* skip picking commits whose parents are unchanged */
3271 int skip_unnecessary_picks(void)
3273 const char *todo_file = rebase_path_todo();
3274 struct strbuf buf = STRBUF_INIT;
3275 struct todo_list todo_list = TODO_LIST_INIT;
3276 struct object_id onto_oid, *oid = &onto_oid, *parent_oid;
3279 if (!read_oneliner(&buf, rebase_path_onto(), 0))
3280 return error(_("could not read 'onto'"));
3281 if (get_oid(buf.buf, &onto_oid)) {
3282 strbuf_release(&buf);
3283 return error(_("need a HEAD to fixup"));
3285 strbuf_release(&buf);
3287 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
3289 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
3290 todo_list_release(&todo_list);
3294 for (i = 0; i < todo_list.nr; i++) {
3295 struct todo_item *item = todo_list.items + i;
3297 if (item->command >= TODO_NOOP)
3299 if (item->command != TODO_PICK)
3301 if (parse_commit(item->commit)) {
3302 todo_list_release(&todo_list);
3303 return error(_("could not parse commit '%s'"),
3304 oid_to_hex(&item->commit->object.oid));
3306 if (!item->commit->parents)
3307 break; /* root commit */
3308 if (item->commit->parents->next)
3309 break; /* merge commit */
3310 parent_oid = &item->commit->parents->item->object.oid;
3311 if (hashcmp(parent_oid->hash, oid->hash))
3313 oid = &item->commit->object.oid;
3316 int offset = i < todo_list.nr ?
3317 todo_list.items[i].offset_in_buf : todo_list.buf.len;
3318 const char *done_path = rebase_path_done();
3320 fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
3322 error_errno(_("could not open '%s' for writing"),
3324 todo_list_release(&todo_list);
3327 if (write_in_full(fd, todo_list.buf.buf, offset) < 0) {
3328 error_errno(_("could not write to '%s'"), done_path);
3329 todo_list_release(&todo_list);
3335 if (rewrite_file(rebase_path_todo(), todo_list.buf.buf + offset,
3336 todo_list.buf.len - offset) < 0) {
3337 todo_list_release(&todo_list);
3341 todo_list.current = i;
3342 if (is_fixup(peek_command(&todo_list, 0)))
3343 record_in_rewritten(oid, peek_command(&todo_list, 0));
3346 todo_list_release(&todo_list);
3347 printf("%s\n", oid_to_hex(oid));
3352 struct subject2item_entry {
3353 struct hashmap_entry entry;
3355 char subject[FLEX_ARRAY];
3358 static int subject2item_cmp(const void *fndata,
3359 const struct subject2item_entry *a,
3360 const struct subject2item_entry *b, const void *key)
3362 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
3365 define_commit_slab(commit_todo_item, struct todo_item *);
3368 * Rearrange the todo list that has both "pick commit-id msg" and "pick
3369 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
3370 * after the former, and change "pick" to "fixup"/"squash".
3372 * Note that if the config has specified a custom instruction format, each log
3373 * message will have to be retrieved from the commit (as the oneline in the
3374 * script cannot be trusted) in order to normalize the autosquash arrangement.
3376 int rearrange_squash(void)
3378 const char *todo_file = rebase_path_todo();
3379 struct todo_list todo_list = TODO_LIST_INIT;
3380 struct hashmap subject2item;
3381 int res = 0, rearranged = 0, *next, *tail, i;
3383 struct commit_todo_item commit_todo;
3385 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
3387 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
3388 todo_list_release(&todo_list);
3392 init_commit_todo_item(&commit_todo);
3394 * The hashmap maps onelines to the respective todo list index.
3396 * If any items need to be rearranged, the next[i] value will indicate
3397 * which item was moved directly after the i'th.
3399 * In that case, last[i] will indicate the index of the latest item to
3400 * be moved to appear after the i'th.
3402 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
3403 NULL, todo_list.nr);
3404 ALLOC_ARRAY(next, todo_list.nr);
3405 ALLOC_ARRAY(tail, todo_list.nr);
3406 ALLOC_ARRAY(subjects, todo_list.nr);
3407 for (i = 0; i < todo_list.nr; i++) {
3408 struct strbuf buf = STRBUF_INIT;
3409 struct todo_item *item = todo_list.items + i;
3410 const char *commit_buffer, *subject, *p;
3413 struct subject2item_entry *entry;
3415 next[i] = tail[i] = -1;
3416 if (item->command >= TODO_EXEC) {
3421 if (is_fixup(item->command)) {
3422 todo_list_release(&todo_list);
3423 clear_commit_todo_item(&commit_todo);
3424 return error(_("the script was already rearranged."));
3427 *commit_todo_item_at(&commit_todo, item->commit) = item;
3429 parse_commit(item->commit);
3430 commit_buffer = get_commit_buffer(item->commit, NULL);
3431 find_commit_subject(commit_buffer, &subject);
3432 format_subject(&buf, subject, " ");
3433 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
3434 unuse_commit_buffer(item->commit, commit_buffer);
3435 if ((skip_prefix(subject, "fixup! ", &p) ||
3436 skip_prefix(subject, "squash! ", &p))) {
3437 struct commit *commit2;
3442 if (!skip_prefix(p, "fixup! ", &p) &&
3443 !skip_prefix(p, "squash! ", &p))
3447 if ((entry = hashmap_get_from_hash(&subject2item,
3449 /* found by title */
3451 else if (!strchr(p, ' ') &&
3453 lookup_commit_reference_by_name(p)) &&
3454 *commit_todo_item_at(&commit_todo, commit2))
3455 /* found by commit name */
3456 i2 = *commit_todo_item_at(&commit_todo, commit2)
3459 /* copy can be a prefix of the commit subject */
3460 for (i2 = 0; i2 < i; i2++)
3462 starts_with(subjects[i2], p))
3470 todo_list.items[i].command =
3471 starts_with(subject, "fixup!") ?
3472 TODO_FIXUP : TODO_SQUASH;
3478 } else if (!hashmap_get_from_hash(&subject2item,
3479 strhash(subject), subject)) {
3480 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
3482 hashmap_entry_init(entry, strhash(entry->subject));
3483 hashmap_put(&subject2item, entry);
3488 struct strbuf buf = STRBUF_INIT;
3490 for (i = 0; i < todo_list.nr; i++) {
3491 enum todo_command command = todo_list.items[i].command;
3495 * Initially, all commands are 'pick's. If it is a
3496 * fixup or a squash now, we have rearranged it.
3498 if (is_fixup(command))
3502 int offset = todo_list.items[cur].offset_in_buf;
3503 int end_offset = cur + 1 < todo_list.nr ?
3504 todo_list.items[cur + 1].offset_in_buf :
3506 char *bol = todo_list.buf.buf + offset;
3507 char *eol = todo_list.buf.buf + end_offset;
3509 /* replace 'pick', by 'fixup' or 'squash' */
3510 command = todo_list.items[cur].command;
3511 if (is_fixup(command)) {
3513 todo_command_info[command].str);
3514 bol += strcspn(bol, " \t");
3517 strbuf_add(&buf, bol, eol - bol);
3523 res = rewrite_file(todo_file, buf.buf, buf.len);
3524 strbuf_release(&buf);
3529 for (i = 0; i < todo_list.nr; i++)
3532 hashmap_free(&subject2item, 1);
3533 todo_list_release(&todo_list);
3535 clear_commit_todo_item(&commit_todo);