The seventh batch
[git/gitster.git] / sequencer.c
blobaa2a23983573e8d85d6deaf204af6cfca18c680c
1 #include "git-compat-util.h"
2 #include "abspath.h"
3 #include "advice.h"
4 #include "config.h"
5 #include "copy.h"
6 #include "environment.h"
7 #include "gettext.h"
8 #include "hex.h"
9 #include "lockfile.h"
10 #include "dir.h"
11 #include "object-file.h"
12 #include "object-name.h"
13 #include "object-store-ll.h"
14 #include "object.h"
15 #include "pager.h"
16 #include "commit.h"
17 #include "sequencer.h"
18 #include "run-command.h"
19 #include "hook.h"
20 #include "utf8.h"
21 #include "cache-tree.h"
22 #include "diff.h"
23 #include "path.h"
24 #include "revision.h"
25 #include "rerere.h"
26 #include "merge.h"
27 #include "merge-ort.h"
28 #include "merge-ort-wrappers.h"
29 #include "refs.h"
30 #include "sparse-index.h"
31 #include "strvec.h"
32 #include "quote.h"
33 #include "trailer.h"
34 #include "log-tree.h"
35 #include "wt-status.h"
36 #include "hashmap.h"
37 #include "notes-utils.h"
38 #include "sigchain.h"
39 #include "unpack-trees.h"
40 #include "oidmap.h"
41 #include "oidset.h"
42 #include "commit-slab.h"
43 #include "alias.h"
44 #include "commit-reach.h"
45 #include "rebase-interactive.h"
46 #include "reset.h"
47 #include "branch.h"
49 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
52 * To accommodate common filesystem limitations, where the loose refs' file
53 * names must not exceed `NAME_MAX`, the labels generated by `git rebase
54 * --rebase-merges` need to be truncated if the corresponding commit subjects
55 * are too long.
56 * Add some margin to stay clear from reaching `NAME_MAX`.
58 #define GIT_MAX_LABEL_LENGTH ((NAME_MAX) - (LOCK_SUFFIX_LEN) - 16)
60 static const char sign_off_header[] = "Signed-off-by: ";
61 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
63 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
65 static GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
67 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
68 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
69 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
70 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
72 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
74 * The file containing rebase commands, comments, and empty lines.
75 * This file is created by "git rebase -i" then edited by the user. As
76 * the lines are processed, they are removed from the front of this
77 * file and written to the tail of 'done'.
79 GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
80 GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
82 GIT_PATH_FUNC(rebase_path_dropped, "rebase-merge/dropped")
85 * The rebase command lines that have already been processed. A line
86 * is moved here when it is first handled, before any associated user
87 * actions.
89 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
91 * The file to keep track of how many commands were already processed (e.g.
92 * for the prompt).
94 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
96 * The file to keep track of how many commands are to be processed in total
97 * (e.g. for the prompt).
99 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
101 * The commit message that is planned to be used for any changes that
102 * need to be committed following a user interaction.
104 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
106 * The file into which is accumulated the suggested commit message for
107 * squash/fixup commands. When the first of a series of squash/fixups
108 * is seen, the file is created and the commit message from the
109 * previous commit and from the first squash/fixup commit are written
110 * to it. The commit message for each subsequent squash/fixup commit
111 * is appended to the file as it is processed.
113 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
115 * If the current series of squash/fixups has not yet included a squash
116 * command, then this file exists and holds the commit message of the
117 * original "pick" commit. (If the series ends without a "squash"
118 * command, then this can be used as the commit message of the combined
119 * commit without opening the editor.)
121 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
123 * This file contains the list fixup/squash commands that have been
124 * accumulated into message-fixup or message-squash so far.
126 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
128 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
129 * GIT_AUTHOR_DATE that will be used for the commit that is currently
130 * being rebased.
132 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
134 * When an "edit" rebase command is being processed, the SHA1 of the
135 * commit to be edited is recorded in this file. When "git rebase
136 * --continue" is executed, if there are any staged changes then they
137 * will be amended to the HEAD commit, but only provided the HEAD
138 * commit is still the commit to be edited. When any other rebase
139 * command is processed, this file is deleted.
141 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
143 * When we stop at a given patch via the "edit" command, this file contains
144 * the commit object name of the corresponding patch.
146 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
148 * When we stop for the user to resolve conflicts this file contains
149 * the patch of the commit that is being picked.
151 static GIT_PATH_FUNC(rebase_path_patch, "rebase-merge/patch")
153 * For the post-rewrite hook, we make a list of rewritten commits and
154 * their new sha1s. The rewritten-pending list keeps the sha1s of
155 * commits that have been processed, but not committed yet,
156 * e.g. because they are waiting for a 'squash' command.
158 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
159 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
160 "rebase-merge/rewritten-pending")
163 * The path of the file containing the OID of the "squash onto" commit, i.e.
164 * the dummy commit used for `reset [new root]`.
166 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
169 * The path of the file listing refs that need to be deleted after the rebase
170 * finishes. This is used by the `label` command to record the need for cleanup.
172 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
175 * The update-refs file stores a list of refs that will be updated at the end
176 * of the rebase sequence. The 'update-ref <ref>' commands in the todo file
177 * update the OIDs for the refs in this file, but the refs are not updated
178 * until the end of the rebase sequence.
180 * rebase_path_update_refs() returns the path to this file for a given
181 * worktree directory. For the current worktree, pass the_repository->gitdir.
183 static char *rebase_path_update_refs(const char *wt_git_dir)
185 return xstrfmt("%s/rebase-merge/update-refs", wt_git_dir);
189 * The following files are written by git-rebase just after parsing the
190 * command-line.
192 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
193 static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
194 static GIT_PATH_FUNC(rebase_path_ignore_date, "rebase-merge/ignore_date")
195 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
196 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
197 static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
198 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
199 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
200 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
201 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
202 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
203 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
204 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
205 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
206 static GIT_PATH_FUNC(rebase_path_no_reschedule_failed_exec, "rebase-merge/no-reschedule-failed-exec")
207 static GIT_PATH_FUNC(rebase_path_drop_redundant_commits, "rebase-merge/drop_redundant_commits")
208 static GIT_PATH_FUNC(rebase_path_keep_redundant_commits, "rebase-merge/keep_redundant_commits")
211 * A 'struct replay_ctx' represents the private state of the sequencer.
213 struct replay_ctx {
215 * The commit message that will be used except at the end of a
216 * chain of fixup and squash commands.
218 struct strbuf message;
220 * The list of completed fixup and squash commands in the
221 * current chain.
223 struct strbuf current_fixups;
225 * Stores the reflog message that will be used when creating a
226 * commit. Points to a static buffer and should not be free()'d.
228 const char *reflog_message;
230 * The number of completed fixup and squash commands in the
231 * current chain.
233 int current_fixup_count;
235 * Whether message contains a commit message.
237 unsigned have_message :1;
240 struct replay_ctx* replay_ctx_new(void)
242 struct replay_ctx *ctx = xcalloc(1, sizeof(*ctx));
244 strbuf_init(&ctx->current_fixups, 0);
245 strbuf_init(&ctx->message, 0);
247 return ctx;
251 * A 'struct update_refs_record' represents a value in the update-refs
252 * list. We use a string_list to map refs to these (before, after) pairs.
254 struct update_ref_record {
255 struct object_id before;
256 struct object_id after;
259 static struct update_ref_record *init_update_ref_record(const char *ref)
261 struct update_ref_record *rec;
263 CALLOC_ARRAY(rec, 1);
265 oidcpy(&rec->before, null_oid());
266 oidcpy(&rec->after, null_oid());
268 /* This may fail, but that's fine, we will keep the null OID. */
269 refs_read_ref(get_main_ref_store(the_repository), ref, &rec->before);
271 return rec;
274 static int git_sequencer_config(const char *k, const char *v,
275 const struct config_context *ctx, void *cb)
277 struct replay_opts *opts = cb;
279 if (!strcmp(k, "commit.cleanup")) {
280 if (!v)
281 return config_error_nonbool(k);
283 if (!strcmp(v, "verbatim")) {
284 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
285 opts->explicit_cleanup = 1;
286 } else if (!strcmp(v, "whitespace")) {
287 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
288 opts->explicit_cleanup = 1;
289 } else if (!strcmp(v, "strip")) {
290 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
291 opts->explicit_cleanup = 1;
292 } else if (!strcmp(v, "scissors")) {
293 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
294 opts->explicit_cleanup = 1;
295 } else {
296 warning(_("invalid commit message cleanup mode '%s'"),
300 return 0;
303 if (!strcmp(k, "commit.gpgsign")) {
304 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
305 return 0;
308 if (!opts->default_strategy && !strcmp(k, "pull.twohead")) {
309 int ret = git_config_string((const char**)&opts->default_strategy, k, v);
310 if (ret == 0) {
312 * pull.twohead is allowed to be multi-valued; we only
313 * care about the first value.
315 char *tmp = strchr(opts->default_strategy, ' ');
316 if (tmp)
317 *tmp = '\0';
319 return ret;
322 if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
323 opts->commit_use_reference = git_config_bool(k, v);
325 return git_diff_basic_config(k, v, ctx, NULL);
328 void sequencer_init_config(struct replay_opts *opts)
330 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
331 git_config(git_sequencer_config, opts);
334 static inline int is_rebase_i(const struct replay_opts *opts)
336 return opts->action == REPLAY_INTERACTIVE_REBASE;
339 static const char *get_dir(const struct replay_opts *opts)
341 if (is_rebase_i(opts))
342 return rebase_path();
343 return git_path_seq_dir();
346 static const char *get_todo_path(const struct replay_opts *opts)
348 if (is_rebase_i(opts))
349 return rebase_path_todo();
350 return git_path_todo_file();
354 * Returns 0 for non-conforming footer
355 * Returns 1 for conforming footer
356 * Returns 2 when sob exists within conforming footer
357 * Returns 3 when sob exists within conforming footer as last entry
359 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
360 size_t ignore_footer)
362 struct trailer_iterator iter;
363 size_t i = 0;
364 int found_sob = 0, found_sob_last = 0;
365 char saved_char;
367 if (ignore_footer) {
368 saved_char = sb->buf[sb->len - ignore_footer];
369 sb->buf[sb->len - ignore_footer] = '\0';
372 trailer_iterator_init(&iter, sb->buf);
374 if (ignore_footer)
375 sb->buf[sb->len - ignore_footer] = saved_char;
377 while (trailer_iterator_advance(&iter)) {
378 i++;
379 if (sob && !strncmp(iter.raw, sob->buf, sob->len))
380 found_sob = i;
382 trailer_iterator_release(&iter);
384 if (!i)
385 return 0;
387 found_sob_last = (int)i == found_sob;
389 if (found_sob_last)
390 return 3;
391 if (found_sob)
392 return 2;
393 return 1;
396 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
398 static struct strbuf buf = STRBUF_INIT;
400 strbuf_reset(&buf);
401 if (opts->gpg_sign)
402 sq_quotef(&buf, "-S%s", opts->gpg_sign);
403 return buf.buf;
406 static void replay_ctx_release(struct replay_ctx *ctx)
408 strbuf_release(&ctx->current_fixups);
409 strbuf_release(&ctx->message);
412 void replay_opts_release(struct replay_opts *opts)
414 struct replay_ctx *ctx = opts->ctx;
416 free(opts->gpg_sign);
417 free(opts->reflog_action);
418 free(opts->default_strategy);
419 free(opts->strategy);
420 strvec_clear (&opts->xopts);
421 if (opts->revs)
422 release_revisions(opts->revs);
423 free(opts->revs);
424 replay_ctx_release(ctx);
425 free(opts->ctx);
428 int sequencer_remove_state(struct replay_opts *opts)
430 struct strbuf buf = STRBUF_INIT;
431 int ret = 0;
433 if (is_rebase_i(opts) &&
434 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
435 char *p = buf.buf;
436 while (*p) {
437 char *eol = strchr(p, '\n');
438 if (eol)
439 *eol = '\0';
440 if (refs_delete_ref(get_main_ref_store(the_repository), "(rebase) cleanup", p, NULL, 0) < 0) {
441 warning(_("could not delete '%s'"), p);
442 ret = -1;
444 if (!eol)
445 break;
446 p = eol + 1;
450 strbuf_reset(&buf);
451 strbuf_addstr(&buf, get_dir(opts));
452 if (remove_dir_recursively(&buf, 0))
453 ret = error(_("could not remove '%s'"), buf.buf);
454 strbuf_release(&buf);
456 return ret;
459 static const char *action_name(const struct replay_opts *opts)
461 switch (opts->action) {
462 case REPLAY_REVERT:
463 return N_("revert");
464 case REPLAY_PICK:
465 return N_("cherry-pick");
466 case REPLAY_INTERACTIVE_REBASE:
467 return N_("rebase");
469 die(_("unknown action: %d"), opts->action);
472 struct commit_message {
473 char *parent_label;
474 char *label;
475 char *subject;
476 const char *message;
479 static const char *short_commit_name(struct repository *r, struct commit *commit)
481 return repo_find_unique_abbrev(r, &commit->object.oid, DEFAULT_ABBREV);
484 static int get_message(struct commit *commit, struct commit_message *out)
486 const char *abbrev, *subject;
487 int subject_len;
489 out->message = repo_logmsg_reencode(the_repository, commit, NULL,
490 get_commit_output_encoding());
491 abbrev = short_commit_name(the_repository, commit);
493 subject_len = find_commit_subject(out->message, &subject);
495 out->subject = xmemdupz(subject, subject_len);
496 out->label = xstrfmt("%s (%s)", abbrev, out->subject);
497 out->parent_label = xstrfmt("parent of %s", out->label);
499 return 0;
502 static void free_message(struct commit *commit, struct commit_message *msg)
504 free(msg->parent_label);
505 free(msg->label);
506 free(msg->subject);
507 repo_unuse_commit_buffer(the_repository, commit, msg->message);
510 const char *rebase_resolvemsg =
511 N_("Resolve all conflicts manually, mark them as resolved with\n"
512 "\"git add/rm <conflicted_files>\", then run \"git rebase --continue\".\n"
513 "You can instead skip this commit: run \"git rebase --skip\".\n"
514 "To abort and get back to the state before \"git rebase\", run "
515 "\"git rebase --abort\".");
517 static void print_advice(struct repository *r, int show_hint,
518 struct replay_opts *opts)
520 const char *msg;
522 if (is_rebase_i(opts))
523 msg = rebase_resolvemsg;
524 else
525 msg = getenv("GIT_CHERRY_PICK_HELP");
527 if (msg) {
528 advise_if_enabled(ADVICE_MERGE_CONFLICT, "%s", msg);
530 * A conflict has occurred but the porcelain
531 * (typically rebase --interactive) wants to take care
532 * of the commit itself so remove CHERRY_PICK_HEAD
534 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
535 NULL, REF_NO_DEREF);
536 return;
539 if (show_hint) {
540 if (opts->no_commit)
541 advise_if_enabled(ADVICE_MERGE_CONFLICT,
542 _("after resolving the conflicts, mark the corrected paths\n"
543 "with 'git add <paths>' or 'git rm <paths>'"));
544 else if (opts->action == REPLAY_PICK)
545 advise_if_enabled(ADVICE_MERGE_CONFLICT,
546 _("After resolving the conflicts, mark them with\n"
547 "\"git add/rm <pathspec>\", then run\n"
548 "\"git cherry-pick --continue\".\n"
549 "You can instead skip this commit with \"git cherry-pick --skip\".\n"
550 "To abort and get back to the state before \"git cherry-pick\",\n"
551 "run \"git cherry-pick --abort\"."));
552 else if (opts->action == REPLAY_REVERT)
553 advise_if_enabled(ADVICE_MERGE_CONFLICT,
554 _("After resolving the conflicts, mark them with\n"
555 "\"git add/rm <pathspec>\", then run\n"
556 "\"git revert --continue\".\n"
557 "You can instead skip this commit with \"git revert --skip\".\n"
558 "To abort and get back to the state before \"git revert\",\n"
559 "run \"git revert --abort\"."));
560 else
561 BUG("unexpected pick action in print_advice()");
565 static int write_message(const void *buf, size_t len, const char *filename,
566 int append_eol)
568 struct lock_file msg_file = LOCK_INIT;
570 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
571 if (msg_fd < 0)
572 return error_errno(_("could not lock '%s'"), filename);
573 if (write_in_full(msg_fd, buf, len) < 0) {
574 error_errno(_("could not write to '%s'"), filename);
575 rollback_lock_file(&msg_file);
576 return -1;
578 if (append_eol && write(msg_fd, "\n", 1) < 0) {
579 error_errno(_("could not write eol to '%s'"), filename);
580 rollback_lock_file(&msg_file);
581 return -1;
583 if (commit_lock_file(&msg_file) < 0)
584 return error(_("failed to finalize '%s'"), filename);
586 return 0;
589 int read_oneliner(struct strbuf *buf,
590 const char *path, unsigned flags)
592 int orig_len = buf->len;
594 if (strbuf_read_file(buf, path, 0) < 0) {
595 if ((flags & READ_ONELINER_WARN_MISSING) ||
596 (errno != ENOENT && errno != ENOTDIR))
597 warning_errno(_("could not read '%s'"), path);
598 return 0;
601 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
602 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
603 --buf->len;
604 buf->buf[buf->len] = '\0';
607 if ((flags & READ_ONELINER_SKIP_IF_EMPTY) && buf->len == orig_len)
608 return 0;
610 return 1;
613 static struct tree *empty_tree(struct repository *r)
615 return lookup_tree(r, the_hash_algo->empty_tree);
618 static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
620 if (repo_read_index_unmerged(repo))
621 return error_resolve_conflict(action_name(opts));
623 error(_("your local changes would be overwritten by %s."),
624 _(action_name(opts)));
626 if (advice_enabled(ADVICE_COMMIT_BEFORE_MERGE))
627 advise(_("commit your changes or stash them to proceed."));
628 return -1;
631 static void update_abort_safety_file(void)
633 struct object_id head;
635 /* Do nothing on a single-pick */
636 if (!file_exists(git_path_seq_dir()))
637 return;
639 if (!repo_get_oid(the_repository, "HEAD", &head))
640 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
641 else
642 write_file(git_path_abort_safety_file(), "%s", "");
645 static int fast_forward_to(struct repository *r,
646 const struct object_id *to,
647 const struct object_id *from,
648 int unborn,
649 struct replay_opts *opts)
651 struct ref_transaction *transaction;
652 struct strbuf sb = STRBUF_INIT;
653 struct strbuf err = STRBUF_INIT;
655 repo_read_index(r);
656 if (checkout_fast_forward(r, from, to, 1))
657 return -1; /* the callee should have complained already */
659 strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
661 transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
662 &err);
663 if (!transaction ||
664 ref_transaction_update(transaction, "HEAD",
665 to, unborn && !is_rebase_i(opts) ?
666 null_oid() : from, NULL, NULL,
667 0, sb.buf, &err) ||
668 ref_transaction_commit(transaction, &err)) {
669 ref_transaction_free(transaction);
670 error("%s", err.buf);
671 strbuf_release(&sb);
672 strbuf_release(&err);
673 return -1;
676 strbuf_release(&sb);
677 strbuf_release(&err);
678 ref_transaction_free(transaction);
679 update_abort_safety_file();
680 return 0;
683 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
684 int use_editor)
686 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
687 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
688 COMMIT_MSG_CLEANUP_SPACE;
689 else if (!strcmp(cleanup_arg, "verbatim"))
690 return COMMIT_MSG_CLEANUP_NONE;
691 else if (!strcmp(cleanup_arg, "whitespace"))
692 return COMMIT_MSG_CLEANUP_SPACE;
693 else if (!strcmp(cleanup_arg, "strip"))
694 return COMMIT_MSG_CLEANUP_ALL;
695 else if (!strcmp(cleanup_arg, "scissors"))
696 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
697 COMMIT_MSG_CLEANUP_SPACE;
698 else
699 die(_("Invalid cleanup mode %s"), cleanup_arg);
703 * NB using int rather than enum cleanup_mode to stop clang's
704 * -Wtautological-constant-out-of-range-compare complaining that the comparison
705 * is always true.
707 static const char *describe_cleanup_mode(int cleanup_mode)
709 static const char *modes[] = { "whitespace",
710 "verbatim",
711 "scissors",
712 "strip" };
714 if (cleanup_mode < ARRAY_SIZE(modes))
715 return modes[cleanup_mode];
717 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
720 void append_conflicts_hint(struct index_state *istate,
721 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
723 int i;
725 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
726 strbuf_addch(msgbuf, '\n');
727 wt_status_append_cut_line(msgbuf);
728 strbuf_addstr(msgbuf, comment_line_str);
731 strbuf_addch(msgbuf, '\n');
732 strbuf_commented_addf(msgbuf, comment_line_str, "Conflicts:\n");
733 for (i = 0; i < istate->cache_nr;) {
734 const struct cache_entry *ce = istate->cache[i++];
735 if (ce_stage(ce)) {
736 strbuf_commented_addf(msgbuf, comment_line_str,
737 "\t%s\n", ce->name);
738 while (i < istate->cache_nr &&
739 !strcmp(ce->name, istate->cache[i]->name))
740 i++;
745 static int do_recursive_merge(struct repository *r,
746 struct commit *base, struct commit *next,
747 const char *base_label, const char *next_label,
748 struct object_id *head, struct strbuf *msgbuf,
749 struct replay_opts *opts)
751 struct merge_options o;
752 struct merge_result result;
753 struct tree *next_tree, *base_tree, *head_tree;
754 int clean, show_output;
755 int i;
756 struct lock_file index_lock = LOCK_INIT;
758 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
759 return -1;
761 repo_read_index(r);
763 init_merge_options(&o, r);
764 o.ancestor = base ? base_label : "(empty tree)";
765 o.branch1 = "HEAD";
766 o.branch2 = next ? next_label : "(empty tree)";
767 if (is_rebase_i(opts))
768 o.buffer_output = 2;
769 o.show_rename_progress = 1;
771 head_tree = parse_tree_indirect(head);
772 if (!head_tree)
773 return error(_("unable to read tree (%s)"), oid_to_hex(head));
774 next_tree = next ? repo_get_commit_tree(r, next) : empty_tree(r);
775 base_tree = base ? repo_get_commit_tree(r, base) : empty_tree(r);
777 for (i = 0; i < opts->xopts.nr; i++)
778 parse_merge_opt(&o, opts->xopts.v[i]);
780 if (!opts->strategy || !strcmp(opts->strategy, "ort")) {
781 memset(&result, 0, sizeof(result));
782 merge_incore_nonrecursive(&o, base_tree, head_tree, next_tree,
783 &result);
784 show_output = !is_rebase_i(opts) || !result.clean;
786 * TODO: merge_switch_to_result will update index/working tree;
787 * we only really want to do that if !result.clean || this is
788 * the final patch to be picked. But determining this is the
789 * final patch would take some work, and "head_tree" would need
790 * to be replace with the tree the index matched before we
791 * started doing any picks.
793 merge_switch_to_result(&o, head_tree, &result, 1, show_output);
794 clean = result.clean;
795 } else {
796 ensure_full_index(r->index);
797 clean = merge_trees(&o, head_tree, next_tree, base_tree);
798 if (is_rebase_i(opts) && clean <= 0)
799 fputs(o.obuf.buf, stdout);
800 strbuf_release(&o.obuf);
802 if (clean < 0) {
803 rollback_lock_file(&index_lock);
804 return clean;
807 if (write_locked_index(r->index, &index_lock,
808 COMMIT_LOCK | SKIP_IF_UNCHANGED))
810 * TRANSLATORS: %s will be "revert", "cherry-pick" or
811 * "rebase".
813 return error(_("%s: Unable to write new index file"),
814 _(action_name(opts)));
816 if (!clean)
817 append_conflicts_hint(r->index, msgbuf,
818 opts->default_msg_cleanup);
820 return !clean;
823 static struct object_id *get_cache_tree_oid(struct index_state *istate)
825 if (!cache_tree_fully_valid(istate->cache_tree))
826 if (cache_tree_update(istate, 0)) {
827 error(_("unable to update cache tree"));
828 return NULL;
831 return &istate->cache_tree->oid;
834 static int is_index_unchanged(struct repository *r)
836 struct object_id head_oid, *cache_tree_oid;
837 const struct object_id *head_tree_oid;
838 struct commit *head_commit;
839 struct index_state *istate = r->index;
840 const char *head_name;
842 if (!refs_resolve_ref_unsafe(get_main_ref_store(the_repository), "HEAD", RESOLVE_REF_READING, &head_oid, NULL)) {
843 /* Check to see if this is an unborn branch */
844 head_name = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
845 "HEAD",
846 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
847 &head_oid, NULL);
848 if (!head_name ||
849 !starts_with(head_name, "refs/heads/") ||
850 !is_null_oid(&head_oid))
851 return error(_("could not resolve HEAD commit"));
852 head_tree_oid = the_hash_algo->empty_tree;
853 } else {
854 head_commit = lookup_commit(r, &head_oid);
857 * If head_commit is NULL, check_commit, called from
858 * lookup_commit, would have indicated that head_commit is not
859 * a commit object already. repo_parse_commit() will return failure
860 * without further complaints in such a case. Otherwise, if
861 * the commit is invalid, repo_parse_commit() will complain. So
862 * there is nothing for us to say here. Just return failure.
864 if (repo_parse_commit(r, head_commit))
865 return -1;
867 head_tree_oid = get_commit_tree_oid(head_commit);
870 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
871 return -1;
873 return oideq(cache_tree_oid, head_tree_oid);
876 static int write_author_script(const char *message)
878 struct strbuf buf = STRBUF_INIT;
879 const char *eol;
880 int res;
882 for (;;)
883 if (!*message || starts_with(message, "\n")) {
884 missing_author:
885 /* Missing 'author' line? */
886 unlink(rebase_path_author_script());
887 return 0;
888 } else if (skip_prefix(message, "author ", &message))
889 break;
890 else if ((eol = strchr(message, '\n')))
891 message = eol + 1;
892 else
893 goto missing_author;
895 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
896 while (*message && *message != '\n' && *message != '\r')
897 if (skip_prefix(message, " <", &message))
898 break;
899 else if (*message != '\'')
900 strbuf_addch(&buf, *(message++));
901 else
902 strbuf_addf(&buf, "'\\%c'", *(message++));
903 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
904 while (*message && *message != '\n' && *message != '\r')
905 if (skip_prefix(message, "> ", &message))
906 break;
907 else if (*message != '\'')
908 strbuf_addch(&buf, *(message++));
909 else
910 strbuf_addf(&buf, "'\\%c'", *(message++));
911 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
912 while (*message && *message != '\n' && *message != '\r')
913 if (*message != '\'')
914 strbuf_addch(&buf, *(message++));
915 else
916 strbuf_addf(&buf, "'\\%c'", *(message++));
917 strbuf_addch(&buf, '\'');
918 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
919 strbuf_release(&buf);
920 return res;
924 * Take a series of KEY='VALUE' lines where VALUE part is
925 * sq-quoted, and append <KEY, VALUE> at the end of the string list
927 static int parse_key_value_squoted(char *buf, struct string_list *list)
929 while (*buf) {
930 struct string_list_item *item;
931 char *np;
932 char *cp = strchr(buf, '=');
933 if (!cp) {
934 np = strchrnul(buf, '\n');
935 return error(_("no key present in '%.*s'"),
936 (int) (np - buf), buf);
938 np = strchrnul(cp, '\n');
939 *cp++ = '\0';
940 item = string_list_append(list, buf);
942 buf = np + (*np == '\n');
943 *np = '\0';
944 cp = sq_dequote(cp);
945 if (!cp)
946 return error(_("unable to dequote value of '%s'"),
947 item->string);
948 item->util = xstrdup(cp);
950 return 0;
954 * Reads and parses the state directory's "author-script" file, and sets name,
955 * email and date accordingly.
956 * Returns 0 on success, -1 if the file could not be parsed.
958 * The author script is of the format:
960 * GIT_AUTHOR_NAME='$author_name'
961 * GIT_AUTHOR_EMAIL='$author_email'
962 * GIT_AUTHOR_DATE='$author_date'
964 * where $author_name, $author_email and $author_date are quoted. We are strict
965 * with our parsing, as the file was meant to be eval'd in the now-removed
966 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
967 * from what this function expects, it is better to bail out than to do
968 * something that the user does not expect.
970 int read_author_script(const char *path, char **name, char **email, char **date,
971 int allow_missing)
973 struct strbuf buf = STRBUF_INIT;
974 struct string_list kv = STRING_LIST_INIT_DUP;
975 int retval = -1; /* assume failure */
976 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
978 if (strbuf_read_file(&buf, path, 256) <= 0) {
979 strbuf_release(&buf);
980 if (errno == ENOENT && allow_missing)
981 return 0;
982 else
983 return error_errno(_("could not open '%s' for reading"),
984 path);
987 if (parse_key_value_squoted(buf.buf, &kv))
988 goto finish;
990 for (i = 0; i < kv.nr; i++) {
991 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
992 if (name_i != -2)
993 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
994 else
995 name_i = i;
996 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
997 if (email_i != -2)
998 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
999 else
1000 email_i = i;
1001 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
1002 if (date_i != -2)
1003 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
1004 else
1005 date_i = i;
1006 } else {
1007 err = error(_("unknown variable '%s'"),
1008 kv.items[i].string);
1011 if (name_i == -2)
1012 error(_("missing 'GIT_AUTHOR_NAME'"));
1013 if (email_i == -2)
1014 error(_("missing 'GIT_AUTHOR_EMAIL'"));
1015 if (date_i == -2)
1016 error(_("missing 'GIT_AUTHOR_DATE'"));
1017 if (name_i < 0 || email_i < 0 || date_i < 0 || err)
1018 goto finish;
1019 *name = kv.items[name_i].util;
1020 *email = kv.items[email_i].util;
1021 *date = kv.items[date_i].util;
1022 retval = 0;
1023 finish:
1024 string_list_clear(&kv, !!retval);
1025 strbuf_release(&buf);
1026 return retval;
1030 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
1031 * file with shell quoting into struct strvec. Returns -1 on
1032 * error, 0 otherwise.
1034 static int read_env_script(struct strvec *env)
1036 char *name, *email, *date;
1038 if (read_author_script(rebase_path_author_script(),
1039 &name, &email, &date, 0))
1040 return -1;
1042 strvec_pushf(env, "GIT_AUTHOR_NAME=%s", name);
1043 strvec_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
1044 strvec_pushf(env, "GIT_AUTHOR_DATE=%s", date);
1045 free(name);
1046 free(email);
1047 free(date);
1049 return 0;
1052 static char *get_author(const char *message)
1054 size_t len;
1055 const char *a;
1057 a = find_commit_header(message, "author", &len);
1058 if (a)
1059 return xmemdupz(a, len);
1061 return NULL;
1064 static const char *author_date_from_env(const struct strvec *env)
1066 int i;
1067 const char *date;
1069 for (i = 0; i < env->nr; i++)
1070 if (skip_prefix(env->v[i],
1071 "GIT_AUTHOR_DATE=", &date))
1072 return date;
1074 * If GIT_AUTHOR_DATE is missing we should have already errored out when
1075 * reading the script
1077 BUG("GIT_AUTHOR_DATE missing from author script");
1080 static const char staged_changes_advice[] =
1081 N_("you have staged changes in your working tree\n"
1082 "If these changes are meant to be squashed into the previous commit, run:\n"
1083 "\n"
1084 " git commit --amend %s\n"
1085 "\n"
1086 "If they are meant to go into a new commit, run:\n"
1087 "\n"
1088 " git commit %s\n"
1089 "\n"
1090 "In both cases, once you're done, continue with:\n"
1091 "\n"
1092 " git rebase --continue\n");
1094 #define ALLOW_EMPTY (1<<0)
1095 #define EDIT_MSG (1<<1)
1096 #define AMEND_MSG (1<<2)
1097 #define CLEANUP_MSG (1<<3)
1098 #define VERIFY_MSG (1<<4)
1099 #define CREATE_ROOT_COMMIT (1<<5)
1100 #define VERBATIM_MSG (1<<6)
1102 static int run_command_silent_on_success(struct child_process *cmd)
1104 struct strbuf buf = STRBUF_INIT;
1105 int rc;
1107 cmd->stdout_to_stderr = 1;
1108 rc = pipe_command(cmd,
1109 NULL, 0,
1110 NULL, 0,
1111 &buf, 0);
1113 if (rc)
1114 fputs(buf.buf, stderr);
1115 strbuf_release(&buf);
1116 return rc;
1120 * If we are cherry-pick, and if the merge did not result in
1121 * hand-editing, we will hit this commit and inherit the original
1122 * author date and name.
1124 * If we are revert, or if our cherry-pick results in a hand merge,
1125 * we had better say that the current user is responsible for that.
1127 * An exception is when run_git_commit() is called during an
1128 * interactive rebase: in that case, we will want to retain the
1129 * author metadata.
1131 static int run_git_commit(const char *defmsg,
1132 struct replay_opts *opts,
1133 unsigned int flags)
1135 struct replay_ctx *ctx = opts->ctx;
1136 struct child_process cmd = CHILD_PROCESS_INIT;
1138 if ((flags & CLEANUP_MSG) && (flags & VERBATIM_MSG))
1139 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1141 cmd.git_cmd = 1;
1143 if (is_rebase_i(opts) &&
1144 ((opts->committer_date_is_author_date && !opts->ignore_date) ||
1145 !(!defmsg && (flags & AMEND_MSG))) &&
1146 read_env_script(&cmd.env)) {
1147 const char *gpg_opt = gpg_sign_opt_quoted(opts);
1149 return error(_(staged_changes_advice),
1150 gpg_opt, gpg_opt);
1153 strvec_pushf(&cmd.env, GIT_REFLOG_ACTION "=%s", ctx->reflog_message);
1155 if (opts->committer_date_is_author_date)
1156 strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
1157 opts->ignore_date ?
1158 "" :
1159 author_date_from_env(&cmd.env));
1160 if (opts->ignore_date)
1161 strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
1163 strvec_push(&cmd.args, "commit");
1165 if (!(flags & VERIFY_MSG))
1166 strvec_push(&cmd.args, "-n");
1167 if ((flags & AMEND_MSG))
1168 strvec_push(&cmd.args, "--amend");
1169 if (opts->gpg_sign)
1170 strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
1171 else
1172 strvec_push(&cmd.args, "--no-gpg-sign");
1173 if (defmsg)
1174 strvec_pushl(&cmd.args, "-F", defmsg, NULL);
1175 else if (!(flags & EDIT_MSG))
1176 strvec_pushl(&cmd.args, "-C", "HEAD", NULL);
1177 if ((flags & CLEANUP_MSG))
1178 strvec_push(&cmd.args, "--cleanup=strip");
1179 if ((flags & VERBATIM_MSG))
1180 strvec_push(&cmd.args, "--cleanup=verbatim");
1181 if ((flags & EDIT_MSG))
1182 strvec_push(&cmd.args, "-e");
1183 else if (!(flags & CLEANUP_MSG) &&
1184 !opts->signoff && !opts->record_origin &&
1185 !opts->explicit_cleanup)
1186 strvec_push(&cmd.args, "--cleanup=verbatim");
1188 if ((flags & ALLOW_EMPTY))
1189 strvec_push(&cmd.args, "--allow-empty");
1191 if (!(flags & EDIT_MSG))
1192 strvec_push(&cmd.args, "--allow-empty-message");
1194 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
1195 return run_command_silent_on_success(&cmd);
1196 else
1197 return run_command(&cmd);
1200 static int rest_is_empty(const struct strbuf *sb, int start)
1202 int i, eol;
1203 const char *nl;
1205 /* Check if the rest is just whitespace and Signed-off-by's. */
1206 for (i = start; i < sb->len; i++) {
1207 nl = memchr(sb->buf + i, '\n', sb->len - i);
1208 if (nl)
1209 eol = nl - sb->buf;
1210 else
1211 eol = sb->len;
1213 if (strlen(sign_off_header) <= eol - i &&
1214 starts_with(sb->buf + i, sign_off_header)) {
1215 i = eol;
1216 continue;
1218 while (i < eol)
1219 if (!isspace(sb->buf[i++]))
1220 return 0;
1223 return 1;
1226 void cleanup_message(struct strbuf *msgbuf,
1227 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1229 if (verbose || /* Truncate the message just before the diff, if any. */
1230 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1231 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1232 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1233 strbuf_stripspace(msgbuf,
1234 cleanup_mode == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1238 * Find out if the message in the strbuf contains only whitespace and
1239 * Signed-off-by lines.
1241 int message_is_empty(const struct strbuf *sb,
1242 enum commit_msg_cleanup_mode cleanup_mode)
1244 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1245 return 0;
1246 return rest_is_empty(sb, 0);
1250 * See if the user edited the message in the editor or left what
1251 * was in the template intact
1253 int template_untouched(const struct strbuf *sb, const char *template_file,
1254 enum commit_msg_cleanup_mode cleanup_mode)
1256 struct strbuf tmpl = STRBUF_INIT;
1257 const char *start;
1259 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1260 return 0;
1262 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1263 return 0;
1265 strbuf_stripspace(&tmpl,
1266 cleanup_mode == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1267 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1268 start = sb->buf;
1269 strbuf_release(&tmpl);
1270 return rest_is_empty(sb, start - sb->buf);
1273 int update_head_with_reflog(const struct commit *old_head,
1274 const struct object_id *new_head,
1275 const char *action, const struct strbuf *msg,
1276 struct strbuf *err)
1278 struct ref_transaction *transaction;
1279 struct strbuf sb = STRBUF_INIT;
1280 const char *nl;
1281 int ret = 0;
1283 if (action) {
1284 strbuf_addstr(&sb, action);
1285 strbuf_addstr(&sb, ": ");
1288 nl = strchr(msg->buf, '\n');
1289 if (nl) {
1290 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1291 } else {
1292 strbuf_addbuf(&sb, msg);
1293 strbuf_addch(&sb, '\n');
1296 transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
1297 err);
1298 if (!transaction ||
1299 ref_transaction_update(transaction, "HEAD", new_head,
1300 old_head ? &old_head->object.oid : null_oid(),
1301 NULL, NULL, 0, sb.buf, err) ||
1302 ref_transaction_commit(transaction, err)) {
1303 ret = -1;
1305 ref_transaction_free(transaction);
1306 strbuf_release(&sb);
1308 return ret;
1311 static int run_rewrite_hook(const struct object_id *oldoid,
1312 const struct object_id *newoid)
1314 struct child_process proc = CHILD_PROCESS_INIT;
1315 int code;
1316 struct strbuf sb = STRBUF_INIT;
1317 const char *hook_path = find_hook("post-rewrite");
1319 if (!hook_path)
1320 return 0;
1322 strvec_pushl(&proc.args, hook_path, "amend", NULL);
1323 proc.in = -1;
1324 proc.stdout_to_stderr = 1;
1325 proc.trace2_hook_name = "post-rewrite";
1327 code = start_command(&proc);
1328 if (code)
1329 return code;
1330 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1331 sigchain_push(SIGPIPE, SIG_IGN);
1332 write_in_full(proc.in, sb.buf, sb.len);
1333 close(proc.in);
1334 strbuf_release(&sb);
1335 sigchain_pop(SIGPIPE);
1336 return finish_command(&proc);
1339 void commit_post_rewrite(struct repository *r,
1340 const struct commit *old_head,
1341 const struct object_id *new_head)
1343 struct notes_rewrite_cfg *cfg;
1345 cfg = init_copy_notes_for_rewrite("amend");
1346 if (cfg) {
1347 /* we are amending, so old_head is not NULL */
1348 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1349 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1351 run_rewrite_hook(&old_head->object.oid, new_head);
1354 static int run_prepare_commit_msg_hook(struct repository *r,
1355 struct strbuf *msg,
1356 const char *commit)
1358 int ret = 0;
1359 const char *name, *arg1 = NULL, *arg2 = NULL;
1361 name = git_path_commit_editmsg();
1362 if (write_message(msg->buf, msg->len, name, 0))
1363 return -1;
1365 if (commit) {
1366 arg1 = "commit";
1367 arg2 = commit;
1368 } else {
1369 arg1 = "message";
1371 if (run_commit_hook(0, r->index_file, NULL, "prepare-commit-msg", name,
1372 arg1, arg2, NULL))
1373 ret = error(_("'prepare-commit-msg' hook failed"));
1375 return ret;
1378 static const char implicit_ident_advice_noconfig[] =
1379 N_("Your name and email address were configured automatically based\n"
1380 "on your username and hostname. Please check that they are accurate.\n"
1381 "You can suppress this message by setting them explicitly. Run the\n"
1382 "following command and follow the instructions in your editor to edit\n"
1383 "your configuration file:\n"
1384 "\n"
1385 " git config --global --edit\n"
1386 "\n"
1387 "After doing this, you may fix the identity used for this commit with:\n"
1388 "\n"
1389 " git commit --amend --reset-author\n");
1391 static const char implicit_ident_advice_config[] =
1392 N_("Your name and email address were configured automatically based\n"
1393 "on your username and hostname. Please check that they are accurate.\n"
1394 "You can suppress this message by setting them explicitly:\n"
1395 "\n"
1396 " git config --global user.name \"Your Name\"\n"
1397 " git config --global user.email you@example.com\n"
1398 "\n"
1399 "After doing this, you may fix the identity used for this commit with:\n"
1400 "\n"
1401 " git commit --amend --reset-author\n");
1403 static const char *implicit_ident_advice(void)
1405 char *user_config = interpolate_path("~/.gitconfig", 0);
1406 char *xdg_config = xdg_config_home("config");
1407 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1409 free(user_config);
1410 free(xdg_config);
1412 if (config_exists)
1413 return _(implicit_ident_advice_config);
1414 else
1415 return _(implicit_ident_advice_noconfig);
1419 void print_commit_summary(struct repository *r,
1420 const char *prefix,
1421 const struct object_id *oid,
1422 unsigned int flags)
1424 struct rev_info rev;
1425 struct commit *commit;
1426 struct strbuf format = STRBUF_INIT;
1427 const char *head;
1428 struct pretty_print_context pctx = {0};
1429 struct strbuf author_ident = STRBUF_INIT;
1430 struct strbuf committer_ident = STRBUF_INIT;
1431 struct ref_store *refs;
1433 commit = lookup_commit(r, oid);
1434 if (!commit)
1435 die(_("couldn't look up newly created commit"));
1436 if (repo_parse_commit(r, commit))
1437 die(_("could not parse newly created commit"));
1439 strbuf_addstr(&format, "format:%h] %s");
1441 repo_format_commit_message(r, commit, "%an <%ae>", &author_ident,
1442 &pctx);
1443 repo_format_commit_message(r, commit, "%cn <%ce>", &committer_ident,
1444 &pctx);
1445 if (strbuf_cmp(&author_ident, &committer_ident)) {
1446 strbuf_addstr(&format, "\n Author: ");
1447 strbuf_addbuf_percentquote(&format, &author_ident);
1449 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1450 struct strbuf date = STRBUF_INIT;
1452 repo_format_commit_message(r, commit, "%ad", &date, &pctx);
1453 strbuf_addstr(&format, "\n Date: ");
1454 strbuf_addbuf_percentquote(&format, &date);
1455 strbuf_release(&date);
1457 if (!committer_ident_sufficiently_given()) {
1458 strbuf_addstr(&format, "\n Committer: ");
1459 strbuf_addbuf_percentquote(&format, &committer_ident);
1460 if (advice_enabled(ADVICE_IMPLICIT_IDENTITY)) {
1461 strbuf_addch(&format, '\n');
1462 strbuf_addstr(&format, implicit_ident_advice());
1465 strbuf_release(&author_ident);
1466 strbuf_release(&committer_ident);
1468 repo_init_revisions(r, &rev, prefix);
1469 setup_revisions(0, NULL, &rev, NULL);
1471 rev.diff = 1;
1472 rev.diffopt.output_format =
1473 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1475 rev.verbose_header = 1;
1476 rev.show_root_diff = 1;
1477 get_commit_format(format.buf, &rev);
1478 rev.always_show_header = 0;
1479 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1480 diff_setup_done(&rev.diffopt);
1482 refs = get_main_ref_store(r);
1483 head = refs_resolve_ref_unsafe(refs, "HEAD", 0, NULL, NULL);
1484 if (!head)
1485 die(_("unable to resolve HEAD after creating commit"));
1486 if (!strcmp(head, "HEAD"))
1487 head = _("detached HEAD");
1488 else
1489 skip_prefix(head, "refs/heads/", &head);
1490 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1491 _(" (root-commit)") : "");
1493 if (!log_tree_commit(&rev, commit)) {
1494 rev.always_show_header = 1;
1495 rev.use_terminator = 1;
1496 log_tree_commit(&rev, commit);
1499 release_revisions(&rev);
1500 strbuf_release(&format);
1503 static int parse_head(struct repository *r, struct commit **head)
1505 struct commit *current_head;
1506 struct object_id oid;
1508 if (repo_get_oid(r, "HEAD", &oid)) {
1509 current_head = NULL;
1510 } else {
1511 current_head = lookup_commit_reference(r, &oid);
1512 if (!current_head)
1513 return error(_("could not parse HEAD"));
1514 if (!oideq(&oid, &current_head->object.oid)) {
1515 warning(_("HEAD %s is not a commit!"),
1516 oid_to_hex(&oid));
1518 if (repo_parse_commit(r, current_head))
1519 return error(_("could not parse HEAD commit"));
1521 *head = current_head;
1523 return 0;
1527 * Try to commit without forking 'git commit'. In some cases we need
1528 * to run 'git commit' to display an error message
1530 * Returns:
1531 * -1 - error unable to commit
1532 * 0 - success
1533 * 1 - run 'git commit'
1535 static int try_to_commit(struct repository *r,
1536 struct strbuf *msg, const char *author,
1537 struct replay_opts *opts, unsigned int flags,
1538 struct object_id *oid)
1540 struct replay_ctx *ctx = opts->ctx;
1541 struct object_id tree;
1542 struct commit *current_head = NULL;
1543 struct commit_list *parents = NULL;
1544 struct commit_extra_header *extra = NULL;
1545 struct strbuf err = STRBUF_INIT;
1546 struct strbuf commit_msg = STRBUF_INIT;
1547 char *amend_author = NULL;
1548 const char *committer = NULL;
1549 const char *hook_commit = NULL;
1550 enum commit_msg_cleanup_mode cleanup;
1551 int res = 0;
1553 if ((flags & CLEANUP_MSG) && (flags & VERBATIM_MSG))
1554 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1556 if (parse_head(r, &current_head))
1557 return -1;
1559 if (flags & AMEND_MSG) {
1560 const char *exclude_gpgsig[] = { "gpgsig", "gpgsig-sha256", NULL };
1561 const char *out_enc = get_commit_output_encoding();
1562 const char *message = repo_logmsg_reencode(r, current_head,
1563 NULL, out_enc);
1565 if (!msg) {
1566 const char *orig_message = NULL;
1568 find_commit_subject(message, &orig_message);
1569 msg = &commit_msg;
1570 strbuf_addstr(msg, orig_message);
1571 hook_commit = "HEAD";
1573 author = amend_author = get_author(message);
1574 repo_unuse_commit_buffer(r, current_head,
1575 message);
1576 if (!author) {
1577 res = error(_("unable to parse commit author"));
1578 goto out;
1580 parents = copy_commit_list(current_head->parents);
1581 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1582 } else if (current_head &&
1583 (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1584 commit_list_insert(current_head, &parents);
1587 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1588 res = error(_("git write-tree failed to write a tree"));
1589 goto out;
1592 if (!(flags & ALLOW_EMPTY)) {
1593 struct commit *first_parent = current_head;
1595 if (flags & AMEND_MSG) {
1596 if (current_head->parents) {
1597 first_parent = current_head->parents->item;
1598 if (repo_parse_commit(r, first_parent)) {
1599 res = error(_("could not parse HEAD commit"));
1600 goto out;
1602 } else {
1603 first_parent = NULL;
1606 if (oideq(first_parent
1607 ? get_commit_tree_oid(first_parent)
1608 : the_hash_algo->empty_tree,
1609 &tree)) {
1610 res = 1; /* run 'git commit' to display error message */
1611 goto out;
1615 if (hook_exists("prepare-commit-msg")) {
1616 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1617 if (res)
1618 goto out;
1619 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1620 2048) < 0) {
1621 res = error_errno(_("unable to read commit message "
1622 "from '%s'"),
1623 git_path_commit_editmsg());
1624 goto out;
1626 msg = &commit_msg;
1629 if (flags & CLEANUP_MSG)
1630 cleanup = COMMIT_MSG_CLEANUP_ALL;
1631 else if (flags & VERBATIM_MSG)
1632 cleanup = COMMIT_MSG_CLEANUP_NONE;
1633 else if ((opts->signoff || opts->record_origin) &&
1634 !opts->explicit_cleanup)
1635 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1636 else
1637 cleanup = opts->default_msg_cleanup;
1639 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1640 strbuf_stripspace(msg,
1641 cleanup == COMMIT_MSG_CLEANUP_ALL ? comment_line_str : NULL);
1642 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1643 res = 1; /* run 'git commit' to display error message */
1644 goto out;
1647 if (opts->committer_date_is_author_date) {
1648 struct ident_split id;
1649 struct strbuf date = STRBUF_INIT;
1651 if (!opts->ignore_date) {
1652 if (split_ident_line(&id, author, (int)strlen(author)) < 0) {
1653 res = error(_("invalid author identity '%s'"),
1654 author);
1655 goto out;
1657 if (!id.date_begin) {
1658 res = error(_(
1659 "corrupt author: missing date information"));
1660 goto out;
1662 strbuf_addf(&date, "@%.*s %.*s",
1663 (int)(id.date_end - id.date_begin),
1664 id.date_begin,
1665 (int)(id.tz_end - id.tz_begin),
1666 id.tz_begin);
1667 } else {
1668 reset_ident_date();
1670 committer = fmt_ident(getenv("GIT_COMMITTER_NAME"),
1671 getenv("GIT_COMMITTER_EMAIL"),
1672 WANT_COMMITTER_IDENT,
1673 opts->ignore_date ? NULL : date.buf,
1674 IDENT_STRICT);
1675 strbuf_release(&date);
1676 } else {
1677 reset_ident_date();
1680 if (opts->ignore_date) {
1681 struct ident_split id;
1682 char *name, *email;
1684 if (split_ident_line(&id, author, strlen(author)) < 0) {
1685 error(_("invalid author identity '%s'"), author);
1686 goto out;
1688 name = xmemdupz(id.name_begin, id.name_end - id.name_begin);
1689 email = xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
1690 author = fmt_ident(name, email, WANT_AUTHOR_IDENT, NULL,
1691 IDENT_STRICT);
1692 free(name);
1693 free(email);
1696 if (commit_tree_extended(msg->buf, msg->len, &tree, parents, oid,
1697 author, committer, opts->gpg_sign, extra)) {
1698 res = error(_("failed to write commit object"));
1699 goto out;
1702 if (update_head_with_reflog(current_head, oid, ctx->reflog_message,
1703 msg, &err)) {
1704 res = error("%s", err.buf);
1705 goto out;
1708 run_commit_hook(0, r->index_file, NULL, "post-commit", NULL);
1709 if (flags & AMEND_MSG)
1710 commit_post_rewrite(r, current_head, oid);
1712 out:
1713 free_commit_extra_headers(extra);
1714 strbuf_release(&err);
1715 strbuf_release(&commit_msg);
1716 free(amend_author);
1718 return res;
1721 static int write_rebase_head(struct object_id *oid)
1723 if (refs_update_ref(get_main_ref_store(the_repository), "rebase", "REBASE_HEAD", oid,
1724 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1725 return error(_("could not update %s"), "REBASE_HEAD");
1727 return 0;
1730 static int do_commit(struct repository *r,
1731 const char *msg_file, const char *author,
1732 struct replay_opts *opts, unsigned int flags,
1733 struct object_id *oid)
1735 int res = 1;
1737 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1738 struct object_id oid;
1739 struct strbuf sb = STRBUF_INIT;
1741 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1742 return error_errno(_("unable to read commit message "
1743 "from '%s'"),
1744 msg_file);
1746 res = try_to_commit(r, msg_file ? &sb : NULL,
1747 author, opts, flags, &oid);
1748 strbuf_release(&sb);
1749 if (!res) {
1750 refs_delete_ref(get_main_ref_store(r), "",
1751 "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF);
1752 unlink(git_path_merge_msg(r));
1753 if (!is_rebase_i(opts))
1754 print_commit_summary(r, NULL, &oid,
1755 SUMMARY_SHOW_AUTHOR_DATE);
1756 return res;
1759 if (res == 1) {
1760 if (is_rebase_i(opts) && oid)
1761 if (write_rebase_head(oid))
1762 return -1;
1763 return run_git_commit(msg_file, opts, flags);
1766 return res;
1769 static int is_original_commit_empty(struct commit *commit)
1771 const struct object_id *ptree_oid;
1773 if (repo_parse_commit(the_repository, commit))
1774 return error(_("could not parse commit %s"),
1775 oid_to_hex(&commit->object.oid));
1776 if (commit->parents) {
1777 struct commit *parent = commit->parents->item;
1778 if (repo_parse_commit(the_repository, parent))
1779 return error(_("could not parse parent commit %s"),
1780 oid_to_hex(&parent->object.oid));
1781 ptree_oid = get_commit_tree_oid(parent);
1782 } else {
1783 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1786 return oideq(ptree_oid, get_commit_tree_oid(commit));
1790 * Should empty commits be allowed? Return status:
1791 * <0: Error in is_index_unchanged(r) or is_original_commit_empty(commit)
1792 * 0: Halt on empty commit
1793 * 1: Allow empty commit
1794 * 2: Drop empty commit
1796 static int allow_empty(struct repository *r,
1797 struct replay_opts *opts,
1798 struct commit *commit)
1800 int index_unchanged, originally_empty;
1803 * For a commit that is initially empty, allow_empty determines if it
1804 * should be kept or not
1806 * For a commit that becomes empty, keep_redundant_commits and
1807 * drop_redundant_commits determine whether the commit should be kept or
1808 * dropped. If neither is specified, halt.
1810 index_unchanged = is_index_unchanged(r);
1811 if (index_unchanged < 0)
1812 return index_unchanged;
1813 if (!index_unchanged)
1814 return 0; /* we do not have to say --allow-empty */
1816 originally_empty = is_original_commit_empty(commit);
1817 if (originally_empty < 0)
1818 return originally_empty;
1819 if (originally_empty)
1820 return opts->allow_empty;
1821 else if (opts->keep_redundant_commits)
1822 return 1;
1823 else if (opts->drop_redundant_commits)
1824 return 2;
1825 else
1826 return 0;
1829 static struct {
1830 char c;
1831 const char *str;
1832 } todo_command_info[] = {
1833 [TODO_PICK] = { 'p', "pick" },
1834 [TODO_REVERT] = { 0, "revert" },
1835 [TODO_EDIT] = { 'e', "edit" },
1836 [TODO_REWORD] = { 'r', "reword" },
1837 [TODO_FIXUP] = { 'f', "fixup" },
1838 [TODO_SQUASH] = { 's', "squash" },
1839 [TODO_EXEC] = { 'x', "exec" },
1840 [TODO_BREAK] = { 'b', "break" },
1841 [TODO_LABEL] = { 'l', "label" },
1842 [TODO_RESET] = { 't', "reset" },
1843 [TODO_MERGE] = { 'm', "merge" },
1844 [TODO_UPDATE_REF] = { 'u', "update-ref" },
1845 [TODO_NOOP] = { 0, "noop" },
1846 [TODO_DROP] = { 'd', "drop" },
1847 [TODO_COMMENT] = { 0, NULL },
1850 static const char *command_to_string(const enum todo_command command)
1852 if (command < TODO_COMMENT)
1853 return todo_command_info[command].str;
1854 if (command == TODO_COMMENT)
1855 return comment_line_str;
1856 die(_("unknown command: %d"), command);
1859 static char command_to_char(const enum todo_command command)
1861 if (command < TODO_COMMENT)
1862 return todo_command_info[command].c;
1863 return 0;
1866 static int is_noop(const enum todo_command command)
1868 return TODO_NOOP <= command;
1871 static int is_fixup(enum todo_command command)
1873 return command == TODO_FIXUP || command == TODO_SQUASH;
1876 /* Does this command create a (non-merge) commit? */
1877 static int is_pick_or_similar(enum todo_command command)
1879 switch (command) {
1880 case TODO_PICK:
1881 case TODO_REVERT:
1882 case TODO_EDIT:
1883 case TODO_REWORD:
1884 case TODO_FIXUP:
1885 case TODO_SQUASH:
1886 return 1;
1887 default:
1888 return 0;
1892 enum todo_item_flags {
1893 TODO_EDIT_MERGE_MSG = (1 << 0),
1894 TODO_REPLACE_FIXUP_MSG = (1 << 1),
1895 TODO_EDIT_FIXUP_MSG = (1 << 2),
1898 static const char first_commit_msg_str[] = N_("This is the 1st commit message:");
1899 static const char nth_commit_msg_fmt[] = N_("This is the commit message #%d:");
1900 static const char skip_first_commit_msg_str[] = N_("The 1st commit message will be skipped:");
1901 static const char skip_nth_commit_msg_fmt[] = N_("The commit message #%d will be skipped:");
1902 static const char combined_commit_msg_fmt[] = N_("This is a combination of %d commits.");
1904 static int is_fixup_flag(enum todo_command command, unsigned flag)
1906 return command == TODO_FIXUP && ((flag & TODO_REPLACE_FIXUP_MSG) ||
1907 (flag & TODO_EDIT_FIXUP_MSG));
1911 * Wrapper around strbuf_add_commented_lines() which avoids double
1912 * commenting commit subjects.
1914 static void add_commented_lines(struct strbuf *buf, const void *str, size_t len)
1916 const char *s = str;
1917 while (starts_with_mem(s, len, comment_line_str)) {
1918 size_t count;
1919 const char *n = memchr(s, '\n', len);
1920 if (!n)
1921 count = len;
1922 else
1923 count = n - s + 1;
1924 strbuf_add(buf, s, count);
1925 s += count;
1926 len -= count;
1928 strbuf_add_commented_lines(buf, s, len, comment_line_str);
1931 /* Does the current fixup chain contain a squash command? */
1932 static int seen_squash(struct replay_ctx *ctx)
1934 return starts_with(ctx->current_fixups.buf, "squash") ||
1935 strstr(ctx->current_fixups.buf, "\nsquash");
1938 static void update_comment_bufs(struct strbuf *buf1, struct strbuf *buf2, int n)
1940 strbuf_setlen(buf1, 2);
1941 strbuf_addf(buf1, _(nth_commit_msg_fmt), n);
1942 strbuf_addch(buf1, '\n');
1943 strbuf_setlen(buf2, 2);
1944 strbuf_addf(buf2, _(skip_nth_commit_msg_fmt), n);
1945 strbuf_addch(buf2, '\n');
1949 * Comment out any un-commented commit messages, updating the message comments
1950 * to say they will be skipped but do not comment out the empty lines that
1951 * surround commit messages and their comments.
1953 static void update_squash_message_for_fixup(struct strbuf *msg)
1955 void (*copy_lines)(struct strbuf *, const void *, size_t) = strbuf_add;
1956 struct strbuf buf1 = STRBUF_INIT, buf2 = STRBUF_INIT;
1957 const char *s, *start;
1958 char *orig_msg;
1959 size_t orig_msg_len;
1960 int i = 1;
1962 strbuf_addf(&buf1, "# %s\n", _(first_commit_msg_str));
1963 strbuf_addf(&buf2, "# %s\n", _(skip_first_commit_msg_str));
1964 s = start = orig_msg = strbuf_detach(msg, &orig_msg_len);
1965 while (s) {
1966 const char *next;
1967 size_t off;
1968 if (skip_prefix(s, buf1.buf, &next)) {
1970 * Copy the last message, preserving the blank line
1971 * preceding the current line
1973 off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1974 copy_lines(msg, start, s - start - off);
1975 if (off)
1976 strbuf_addch(msg, '\n');
1978 * The next message needs to be commented out but the
1979 * message header is already commented out so just copy
1980 * it and the blank line that follows it.
1982 strbuf_addbuf(msg, &buf2);
1983 if (*next == '\n')
1984 strbuf_addch(msg, *next++);
1985 start = s = next;
1986 copy_lines = add_commented_lines;
1987 update_comment_bufs(&buf1, &buf2, ++i);
1988 } else if (skip_prefix(s, buf2.buf, &next)) {
1989 off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1990 copy_lines(msg, start, s - start - off);
1991 start = s - off;
1992 s = next;
1993 copy_lines = strbuf_add;
1994 update_comment_bufs(&buf1, &buf2, ++i);
1995 } else {
1996 s = strchr(s, '\n');
1997 if (s)
1998 s++;
2001 copy_lines(msg, start, orig_msg_len - (start - orig_msg));
2002 free(orig_msg);
2003 strbuf_release(&buf1);
2004 strbuf_release(&buf2);
2007 static int append_squash_message(struct strbuf *buf, const char *body,
2008 enum todo_command command, struct replay_opts *opts,
2009 unsigned flag)
2011 struct replay_ctx *ctx = opts->ctx;
2012 const char *fixup_msg;
2013 size_t commented_len = 0, fixup_off;
2015 * amend is non-interactive and not normally used with fixup!
2016 * or squash! commits, so only comment out those subjects when
2017 * squashing commit messages.
2019 if (starts_with(body, "amend!") ||
2020 ((command == TODO_SQUASH || seen_squash(ctx)) &&
2021 (starts_with(body, "squash!") || starts_with(body, "fixup!"))))
2022 commented_len = commit_subject_length(body);
2024 strbuf_addf(buf, "\n%s ", comment_line_str);
2025 strbuf_addf(buf, _(nth_commit_msg_fmt),
2026 ++ctx->current_fixup_count + 1);
2027 strbuf_addstr(buf, "\n\n");
2028 strbuf_add_commented_lines(buf, body, commented_len, comment_line_str);
2029 /* buf->buf may be reallocated so store an offset into the buffer */
2030 fixup_off = buf->len;
2031 strbuf_addstr(buf, body + commented_len);
2033 /* fixup -C after squash behaves like squash */
2034 if (is_fixup_flag(command, flag) && !seen_squash(ctx)) {
2036 * We're replacing the commit message so we need to
2037 * append the Signed-off-by: trailer if the user
2038 * requested '--signoff'.
2040 if (opts->signoff)
2041 append_signoff(buf, 0, 0);
2043 if ((command == TODO_FIXUP) &&
2044 (flag & TODO_REPLACE_FIXUP_MSG) &&
2045 (file_exists(rebase_path_fixup_msg()) ||
2046 !file_exists(rebase_path_squash_msg()))) {
2047 fixup_msg = skip_blank_lines(buf->buf + fixup_off);
2048 if (write_message(fixup_msg, strlen(fixup_msg),
2049 rebase_path_fixup_msg(), 0) < 0)
2050 return error(_("cannot write '%s'"),
2051 rebase_path_fixup_msg());
2052 } else {
2053 unlink(rebase_path_fixup_msg());
2055 } else {
2056 unlink(rebase_path_fixup_msg());
2059 return 0;
2062 static int update_squash_messages(struct repository *r,
2063 enum todo_command command,
2064 struct commit *commit,
2065 struct replay_opts *opts,
2066 unsigned flag)
2068 struct replay_ctx *ctx = opts->ctx;
2069 struct strbuf buf = STRBUF_INIT;
2070 int res = 0;
2071 const char *message, *body;
2072 const char *encoding = get_commit_output_encoding();
2074 if (ctx->current_fixup_count > 0) {
2075 struct strbuf header = STRBUF_INIT;
2076 char *eol;
2078 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
2079 return error(_("could not read '%s'"),
2080 rebase_path_squash_msg());
2082 eol = !starts_with(buf.buf, comment_line_str) ?
2083 buf.buf : strchrnul(buf.buf, '\n');
2085 strbuf_addf(&header, "%s ", comment_line_str);
2086 strbuf_addf(&header, _(combined_commit_msg_fmt),
2087 ctx->current_fixup_count + 2);
2088 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
2089 strbuf_release(&header);
2090 if (is_fixup_flag(command, flag) && !seen_squash(ctx))
2091 update_squash_message_for_fixup(&buf);
2092 } else {
2093 struct object_id head;
2094 struct commit *head_commit;
2095 const char *head_message, *body;
2097 if (repo_get_oid(r, "HEAD", &head))
2098 return error(_("need a HEAD to fixup"));
2099 if (!(head_commit = lookup_commit_reference(r, &head)))
2100 return error(_("could not read HEAD"));
2101 if (!(head_message = repo_logmsg_reencode(r, head_commit, NULL,
2102 encoding)))
2103 return error(_("could not read HEAD's commit message"));
2105 find_commit_subject(head_message, &body);
2106 if (command == TODO_FIXUP && !flag && write_message(body, strlen(body),
2107 rebase_path_fixup_msg(), 0) < 0) {
2108 repo_unuse_commit_buffer(r, head_commit, head_message);
2109 return error(_("cannot write '%s'"), rebase_path_fixup_msg());
2111 strbuf_addf(&buf, "%s ", comment_line_str);
2112 strbuf_addf(&buf, _(combined_commit_msg_fmt), 2);
2113 strbuf_addf(&buf, "\n%s ", comment_line_str);
2114 strbuf_addstr(&buf, is_fixup_flag(command, flag) ?
2115 _(skip_first_commit_msg_str) :
2116 _(first_commit_msg_str));
2117 strbuf_addstr(&buf, "\n\n");
2118 if (is_fixup_flag(command, flag))
2119 strbuf_add_commented_lines(&buf, body, strlen(body),
2120 comment_line_str);
2121 else
2122 strbuf_addstr(&buf, body);
2124 repo_unuse_commit_buffer(r, head_commit, head_message);
2127 if (!(message = repo_logmsg_reencode(r, commit, NULL, encoding)))
2128 return error(_("could not read commit message of %s"),
2129 oid_to_hex(&commit->object.oid));
2130 find_commit_subject(message, &body);
2132 if (command == TODO_SQUASH || is_fixup_flag(command, flag)) {
2133 res = append_squash_message(&buf, body, command, opts, flag);
2134 } else if (command == TODO_FIXUP) {
2135 strbuf_addf(&buf, "\n%s ", comment_line_str);
2136 strbuf_addf(&buf, _(skip_nth_commit_msg_fmt),
2137 ++ctx->current_fixup_count + 1);
2138 strbuf_addstr(&buf, "\n\n");
2139 strbuf_add_commented_lines(&buf, body, strlen(body),
2140 comment_line_str);
2141 } else
2142 return error(_("unknown command: %d"), command);
2143 repo_unuse_commit_buffer(r, commit, message);
2145 if (!res)
2146 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(),
2148 strbuf_release(&buf);
2150 if (!res) {
2151 strbuf_addf(&ctx->current_fixups, "%s%s %s",
2152 ctx->current_fixups.len ? "\n" : "",
2153 command_to_string(command),
2154 oid_to_hex(&commit->object.oid));
2155 res = write_message(ctx->current_fixups.buf,
2156 ctx->current_fixups.len,
2157 rebase_path_current_fixups(), 0);
2160 return res;
2163 static void flush_rewritten_pending(void)
2165 struct strbuf buf = STRBUF_INIT;
2166 struct object_id newoid;
2167 FILE *out;
2169 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
2170 !repo_get_oid(the_repository, "HEAD", &newoid) &&
2171 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
2172 char *bol = buf.buf, *eol;
2174 while (*bol) {
2175 eol = strchrnul(bol, '\n');
2176 fprintf(out, "%.*s %s\n", (int)(eol - bol),
2177 bol, oid_to_hex(&newoid));
2178 if (!*eol)
2179 break;
2180 bol = eol + 1;
2182 fclose(out);
2183 unlink(rebase_path_rewritten_pending());
2185 strbuf_release(&buf);
2188 static void record_in_rewritten(struct object_id *oid,
2189 enum todo_command next_command)
2191 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
2193 if (!out)
2194 return;
2196 fprintf(out, "%s\n", oid_to_hex(oid));
2197 fclose(out);
2199 if (!is_fixup(next_command))
2200 flush_rewritten_pending();
2203 static int should_edit(struct replay_opts *opts) {
2204 if (opts->edit < 0)
2206 * Note that we only handle the case of non-conflicted
2207 * commits; continue_single_pick() handles the conflicted
2208 * commits itself instead of calling this function.
2210 return (opts->action == REPLAY_REVERT && isatty(0)) ? 1 : 0;
2211 return opts->edit;
2214 static void refer_to_commit(struct replay_opts *opts,
2215 struct strbuf *msgbuf, struct commit *commit)
2217 if (opts->commit_use_reference) {
2218 struct pretty_print_context ctx = {
2219 .abbrev = DEFAULT_ABBREV,
2220 .date_mode.type = DATE_SHORT,
2222 repo_format_commit_message(the_repository, commit,
2223 "%h (%s, %ad)", msgbuf, &ctx);
2224 } else {
2225 strbuf_addstr(msgbuf, oid_to_hex(&commit->object.oid));
2229 static int do_pick_commit(struct repository *r,
2230 struct todo_item *item,
2231 struct replay_opts *opts,
2232 int final_fixup, int *check_todo)
2234 struct replay_ctx *ctx = opts->ctx;
2235 unsigned int flags = should_edit(opts) ? EDIT_MSG : 0;
2236 const char *msg_file = should_edit(opts) ? NULL : git_path_merge_msg(r);
2237 struct object_id head;
2238 struct commit *base, *next, *parent;
2239 const char *base_label, *next_label;
2240 char *author = NULL;
2241 struct commit_message msg = { NULL, NULL, NULL, NULL };
2242 int res, unborn = 0, reword = 0, allow, drop_commit;
2243 enum todo_command command = item->command;
2244 struct commit *commit = item->commit;
2246 if (opts->no_commit) {
2248 * We do not intend to commit immediately. We just want to
2249 * merge the differences in, so let's compute the tree
2250 * that represents the "current" state for the merge machinery
2251 * to work on.
2253 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
2254 return error(_("your index file is unmerged."));
2255 } else {
2256 unborn = repo_get_oid(r, "HEAD", &head);
2257 /* Do we want to generate a root commit? */
2258 if (is_pick_or_similar(command) && opts->have_squash_onto &&
2259 oideq(&head, &opts->squash_onto)) {
2260 if (is_fixup(command))
2261 return error(_("cannot fixup root commit"));
2262 flags |= CREATE_ROOT_COMMIT;
2263 unborn = 1;
2264 } else if (unborn)
2265 oidcpy(&head, the_hash_algo->empty_tree);
2266 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
2267 NULL, 0))
2268 return error_dirty_index(r, opts);
2270 discard_index(r->index);
2272 if (!commit->parents)
2273 parent = NULL;
2274 else if (commit->parents->next) {
2275 /* Reverting or cherry-picking a merge commit */
2276 int cnt;
2277 struct commit_list *p;
2279 if (!opts->mainline)
2280 return error(_("commit %s is a merge but no -m option was given."),
2281 oid_to_hex(&commit->object.oid));
2283 for (cnt = 1, p = commit->parents;
2284 cnt != opts->mainline && p;
2285 cnt++)
2286 p = p->next;
2287 if (cnt != opts->mainline || !p)
2288 return error(_("commit %s does not have parent %d"),
2289 oid_to_hex(&commit->object.oid), opts->mainline);
2290 parent = p->item;
2291 } else if (1 < opts->mainline)
2293 * Non-first parent explicitly specified as mainline for
2294 * non-merge commit
2296 return error(_("commit %s does not have parent %d"),
2297 oid_to_hex(&commit->object.oid), opts->mainline);
2298 else
2299 parent = commit->parents->item;
2301 if (get_message(commit, &msg) != 0)
2302 return error(_("cannot get commit message for %s"),
2303 oid_to_hex(&commit->object.oid));
2305 if (opts->allow_ff && !is_fixup(command) &&
2306 ((parent && oideq(&parent->object.oid, &head)) ||
2307 (!parent && unborn))) {
2308 if (is_rebase_i(opts))
2309 write_author_script(msg.message);
2310 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
2311 opts);
2312 if (res || command != TODO_REWORD)
2313 goto leave;
2314 reword = 1;
2315 msg_file = NULL;
2316 goto fast_forward_edit;
2318 if (parent && repo_parse_commit(r, parent) < 0)
2319 /* TRANSLATORS: The first %s will be a "todo" command like
2320 "revert" or "pick", the second %s a SHA1. */
2321 return error(_("%s: cannot parse parent commit %s"),
2322 command_to_string(command),
2323 oid_to_hex(&parent->object.oid));
2326 * "commit" is an existing commit. We would want to apply
2327 * the difference it introduces since its first parent "prev"
2328 * on top of the current HEAD if we are cherry-pick. Or the
2329 * reverse of it if we are revert.
2332 if (command == TODO_REVERT) {
2333 const char *orig_subject;
2335 base = commit;
2336 base_label = msg.label;
2337 next = parent;
2338 next_label = msg.parent_label;
2339 if (opts->commit_use_reference) {
2340 strbuf_addstr(&ctx->message,
2341 "# *** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
2342 } else if (skip_prefix(msg.subject, "Revert \"", &orig_subject) &&
2344 * We don't touch pre-existing repeated reverts, because
2345 * theoretically these can be nested arbitrarily deeply,
2346 * thus requiring excessive complexity to deal with.
2348 !starts_with(orig_subject, "Revert \"")) {
2349 strbuf_addstr(&ctx->message, "Reapply \"");
2350 strbuf_addstr(&ctx->message, orig_subject);
2351 } else {
2352 strbuf_addstr(&ctx->message, "Revert \"");
2353 strbuf_addstr(&ctx->message, msg.subject);
2354 strbuf_addstr(&ctx->message, "\"");
2356 strbuf_addstr(&ctx->message, "\n\nThis reverts commit ");
2357 refer_to_commit(opts, &ctx->message, commit);
2359 if (commit->parents && commit->parents->next) {
2360 strbuf_addstr(&ctx->message, ", reversing\nchanges made to ");
2361 refer_to_commit(opts, &ctx->message, parent);
2363 strbuf_addstr(&ctx->message, ".\n");
2364 } else {
2365 const char *p;
2367 base = parent;
2368 base_label = msg.parent_label;
2369 next = commit;
2370 next_label = msg.label;
2372 /* Append the commit log message to ctx->message. */
2373 if (find_commit_subject(msg.message, &p))
2374 strbuf_addstr(&ctx->message, p);
2376 if (opts->record_origin) {
2377 strbuf_complete_line(&ctx->message);
2378 if (!has_conforming_footer(&ctx->message, NULL, 0))
2379 strbuf_addch(&ctx->message, '\n');
2380 strbuf_addstr(&ctx->message, cherry_picked_prefix);
2381 strbuf_addstr(&ctx->message, oid_to_hex(&commit->object.oid));
2382 strbuf_addstr(&ctx->message, ")\n");
2384 if (!is_fixup(command))
2385 author = get_author(msg.message);
2387 ctx->have_message = 1;
2389 if (command == TODO_REWORD)
2390 reword = 1;
2391 else if (is_fixup(command)) {
2392 if (update_squash_messages(r, command, commit,
2393 opts, item->flags)) {
2394 res = -1;
2395 goto leave;
2397 flags |= AMEND_MSG;
2398 if (!final_fixup)
2399 msg_file = rebase_path_squash_msg();
2400 else if (file_exists(rebase_path_fixup_msg())) {
2401 flags |= VERBATIM_MSG;
2402 msg_file = rebase_path_fixup_msg();
2403 } else {
2404 const char *dest = git_path_squash_msg(r);
2405 unlink(dest);
2406 if (copy_file(dest, rebase_path_squash_msg(), 0666)) {
2407 res = error(_("could not copy '%s' to '%s'"),
2408 rebase_path_squash_msg(), dest);
2409 goto leave;
2411 unlink(git_path_merge_msg(r));
2412 msg_file = dest;
2413 flags |= EDIT_MSG;
2417 if (opts->signoff && !is_fixup(command))
2418 append_signoff(&ctx->message, 0, 0);
2420 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
2421 res = -1;
2422 else if (!opts->strategy ||
2423 !strcmp(opts->strategy, "recursive") ||
2424 !strcmp(opts->strategy, "ort") ||
2425 command == TODO_REVERT) {
2426 res = do_recursive_merge(r, base, next, base_label, next_label,
2427 &head, &ctx->message, opts);
2428 if (res < 0)
2429 goto leave;
2431 res |= write_message(ctx->message.buf, ctx->message.len,
2432 git_path_merge_msg(r), 0);
2433 } else {
2434 struct commit_list *common = NULL;
2435 struct commit_list *remotes = NULL;
2437 res = write_message(ctx->message.buf, ctx->message.len,
2438 git_path_merge_msg(r), 0);
2440 commit_list_insert(base, &common);
2441 commit_list_insert(next, &remotes);
2442 res |= try_merge_command(r, opts->strategy,
2443 opts->xopts.nr, opts->xopts.v,
2444 common, oid_to_hex(&head), remotes);
2445 free_commit_list(common);
2446 free_commit_list(remotes);
2450 * If the merge was clean or if it failed due to conflict, we write
2451 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2452 * However, if the merge did not even start, then we don't want to
2453 * write it at all.
2455 if ((command == TODO_PICK || command == TODO_REWORD ||
2456 command == TODO_EDIT) && !opts->no_commit &&
2457 (res == 0 || res == 1) &&
2458 refs_update_ref(get_main_ref_store(the_repository), NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
2459 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2460 res = -1;
2461 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
2462 refs_update_ref(get_main_ref_store(the_repository), NULL, "REVERT_HEAD", &commit->object.oid, NULL,
2463 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2464 res = -1;
2466 if (res) {
2467 error(command == TODO_REVERT
2468 ? _("could not revert %s... %s")
2469 : _("could not apply %s... %s"),
2470 short_commit_name(r, commit), msg.subject);
2471 print_advice(r, res == 1, opts);
2472 repo_rerere(r, opts->allow_rerere_auto);
2473 goto leave;
2476 drop_commit = 0;
2477 allow = allow_empty(r, opts, commit);
2478 if (allow < 0) {
2479 res = allow;
2480 goto leave;
2481 } else if (allow == 1) {
2482 flags |= ALLOW_EMPTY;
2483 } else if (allow == 2) {
2484 drop_commit = 1;
2485 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
2486 NULL, REF_NO_DEREF);
2487 unlink(git_path_merge_msg(r));
2488 refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
2489 NULL, REF_NO_DEREF);
2490 fprintf(stderr,
2491 _("dropping %s %s -- patch contents already upstream\n"),
2492 oid_to_hex(&commit->object.oid), msg.subject);
2493 } /* else allow == 0 and there's nothing special to do */
2494 if (!opts->no_commit && !drop_commit) {
2495 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
2496 res = do_commit(r, msg_file, author, opts, flags,
2497 commit? &commit->object.oid : NULL);
2498 else
2499 res = error(_("unable to parse commit author"));
2500 *check_todo = !!(flags & EDIT_MSG);
2501 if (!res && reword) {
2502 fast_forward_edit:
2503 res = run_git_commit(NULL, opts, EDIT_MSG |
2504 VERIFY_MSG | AMEND_MSG |
2505 (flags & ALLOW_EMPTY));
2506 *check_todo = 1;
2511 if (!res && final_fixup) {
2512 unlink(rebase_path_fixup_msg());
2513 unlink(rebase_path_squash_msg());
2514 unlink(rebase_path_current_fixups());
2515 strbuf_reset(&ctx->current_fixups);
2516 ctx->current_fixup_count = 0;
2519 leave:
2520 free_message(commit, &msg);
2521 free(author);
2522 update_abort_safety_file();
2524 return res;
2527 static int prepare_revs(struct replay_opts *opts)
2530 * picking (but not reverting) ranges (but not individual revisions)
2531 * should be done in reverse
2533 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
2534 opts->revs->reverse ^= 1;
2536 if (prepare_revision_walk(opts->revs))
2537 return error(_("revision walk setup failed"));
2539 return 0;
2542 static int read_and_refresh_cache(struct repository *r,
2543 struct replay_opts *opts)
2545 struct lock_file index_lock = LOCK_INIT;
2546 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
2547 if (repo_read_index(r) < 0) {
2548 rollback_lock_file(&index_lock);
2549 return error(_("git %s: failed to read the index"),
2550 action_name(opts));
2552 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
2554 if (index_fd >= 0) {
2555 if (write_locked_index(r->index, &index_lock,
2556 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
2557 return error(_("git %s: failed to refresh the index"),
2558 action_name(opts));
2563 * If we are resolving merges in any way other than "ort", then
2564 * expand the sparse index.
2566 if (opts->strategy && strcmp(opts->strategy, "ort"))
2567 ensure_full_index(r->index);
2568 return 0;
2571 void todo_list_release(struct todo_list *todo_list)
2573 strbuf_release(&todo_list->buf);
2574 FREE_AND_NULL(todo_list->items);
2575 todo_list->nr = todo_list->alloc = 0;
2578 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2580 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2581 return todo_list->items + todo_list->nr++;
2584 const char *todo_item_get_arg(struct todo_list *todo_list,
2585 struct todo_item *item)
2587 return todo_list->buf.buf + item->arg_offset;
2590 static int is_command(enum todo_command command, const char **bol)
2592 const char *str = todo_command_info[command].str;
2593 const char nick = todo_command_info[command].c;
2594 const char *p = *bol;
2596 return (skip_prefix(p, str, &p) || (nick && *p++ == nick)) &&
2597 (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || !*p) &&
2598 (*bol = p);
2601 static int check_label_or_ref_arg(enum todo_command command, const char *arg)
2603 switch (command) {
2604 case TODO_LABEL:
2606 * '#' is not a valid label as the merge command uses it to
2607 * separate merge parents from the commit subject.
2609 if (!strcmp(arg, "#") ||
2610 check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2611 return error(_("'%s' is not a valid label"), arg);
2612 break;
2614 case TODO_UPDATE_REF:
2615 if (check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2616 return error(_("'%s' is not a valid refname"), arg);
2617 if (check_refname_format(arg, 0))
2618 return error(_("update-ref requires a fully qualified "
2619 "refname e.g. refs/heads/%s"), arg);
2620 break;
2622 default:
2623 BUG("unexpected todo_command");
2626 return 0;
2629 static int parse_insn_line(struct repository *r, struct todo_item *item,
2630 const char *buf, const char *bol, char *eol)
2632 struct object_id commit_oid;
2633 char *end_of_object_name;
2634 int i, saved, status, padding;
2636 item->flags = 0;
2638 /* left-trim */
2639 bol += strspn(bol, " \t");
2641 if (bol == eol || *bol == '\r' || starts_with_mem(bol, eol - bol, comment_line_str)) {
2642 item->command = TODO_COMMENT;
2643 item->commit = NULL;
2644 item->arg_offset = bol - buf;
2645 item->arg_len = eol - bol;
2646 return 0;
2649 for (i = 0; i < TODO_COMMENT; i++)
2650 if (is_command(i, &bol)) {
2651 item->command = i;
2652 break;
2654 if (i >= TODO_COMMENT)
2655 return error(_("invalid command '%.*s'"),
2656 (int)strcspn(bol, " \t\r\n"), bol);
2658 /* Eat up extra spaces/ tabs before object name */
2659 padding = strspn(bol, " \t");
2660 bol += padding;
2662 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2663 if (bol != eol)
2664 return error(_("%s does not accept arguments: '%s'"),
2665 command_to_string(item->command), bol);
2666 item->commit = NULL;
2667 item->arg_offset = bol - buf;
2668 item->arg_len = eol - bol;
2669 return 0;
2672 if (!padding)
2673 return error(_("missing arguments for %s"),
2674 command_to_string(item->command));
2676 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2677 item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
2678 int ret = 0;
2680 item->commit = NULL;
2681 item->arg_offset = bol - buf;
2682 item->arg_len = (int)(eol - bol);
2683 if (item->command == TODO_LABEL ||
2684 item->command == TODO_UPDATE_REF) {
2685 saved = *eol;
2686 *eol = '\0';
2687 ret = check_label_or_ref_arg(item->command, bol);
2688 *eol = saved;
2690 return ret;
2693 if (item->command == TODO_FIXUP) {
2694 if (skip_prefix(bol, "-C", &bol)) {
2695 bol += strspn(bol, " \t");
2696 item->flags |= TODO_REPLACE_FIXUP_MSG;
2697 } else if (skip_prefix(bol, "-c", &bol)) {
2698 bol += strspn(bol, " \t");
2699 item->flags |= TODO_EDIT_FIXUP_MSG;
2703 if (item->command == TODO_MERGE) {
2704 if (skip_prefix(bol, "-C", &bol))
2705 bol += strspn(bol, " \t");
2706 else if (skip_prefix(bol, "-c", &bol)) {
2707 bol += strspn(bol, " \t");
2708 item->flags |= TODO_EDIT_MERGE_MSG;
2709 } else {
2710 item->flags |= TODO_EDIT_MERGE_MSG;
2711 item->commit = NULL;
2712 item->arg_offset = bol - buf;
2713 item->arg_len = (int)(eol - bol);
2714 return 0;
2718 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2719 saved = *end_of_object_name;
2720 *end_of_object_name = '\0';
2721 status = repo_get_oid(r, bol, &commit_oid);
2722 if (status < 0)
2723 error(_("could not parse '%s'"), bol); /* return later */
2724 *end_of_object_name = saved;
2726 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2727 item->arg_offset = bol - buf;
2728 item->arg_len = (int)(eol - bol);
2730 if (status < 0)
2731 return status;
2733 item->commit = lookup_commit_reference(r, &commit_oid);
2734 return item->commit ? 0 : -1;
2737 int sequencer_get_last_command(struct repository *r UNUSED, enum replay_action *action)
2739 const char *todo_file, *bol;
2740 struct strbuf buf = STRBUF_INIT;
2741 int ret = 0;
2743 todo_file = git_path_todo_file();
2744 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2745 if (errno == ENOENT || errno == ENOTDIR)
2746 return -1;
2747 else
2748 return error_errno("unable to open '%s'", todo_file);
2750 bol = buf.buf + strspn(buf.buf, " \t\r\n");
2751 if (is_command(TODO_PICK, &bol) && (*bol == ' ' || *bol == '\t'))
2752 *action = REPLAY_PICK;
2753 else if (is_command(TODO_REVERT, &bol) &&
2754 (*bol == ' ' || *bol == '\t'))
2755 *action = REPLAY_REVERT;
2756 else
2757 ret = -1;
2759 strbuf_release(&buf);
2761 return ret;
2764 int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2765 struct todo_list *todo_list)
2767 struct todo_item *item;
2768 char *p = buf, *next_p;
2769 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2771 todo_list->current = todo_list->nr = todo_list->total_nr = 0;
2773 for (i = 1; *p; i++, p = next_p) {
2774 char *eol = strchrnul(p, '\n');
2776 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2778 if (p != eol && eol[-1] == '\r')
2779 eol--; /* strip Carriage Return */
2781 item = append_new_todo(todo_list);
2782 item->offset_in_buf = p - todo_list->buf.buf;
2783 if (parse_insn_line(r, item, buf, p, eol)) {
2784 res = error(_("invalid line %d: %.*s"),
2785 i, (int)(eol - p), p);
2786 item->command = TODO_COMMENT + 1;
2787 item->arg_offset = p - buf;
2788 item->arg_len = (int)(eol - p);
2789 item->commit = NULL;
2792 if (item->command != TODO_COMMENT)
2793 todo_list->total_nr++;
2795 if (fixup_okay)
2796 ; /* do nothing */
2797 else if (is_fixup(item->command))
2798 res = error(_("cannot '%s' without a previous commit"),
2799 command_to_string(item->command));
2800 else if (!is_noop(item->command))
2801 fixup_okay = 1;
2804 return res;
2807 static int count_commands(struct todo_list *todo_list)
2809 int count = 0, i;
2811 for (i = 0; i < todo_list->nr; i++)
2812 if (todo_list->items[i].command != TODO_COMMENT)
2813 count++;
2815 return count;
2818 static int get_item_line_offset(struct todo_list *todo_list, int index)
2820 return index < todo_list->nr ?
2821 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2824 static const char *get_item_line(struct todo_list *todo_list, int index)
2826 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2829 static int get_item_line_length(struct todo_list *todo_list, int index)
2831 return get_item_line_offset(todo_list, index + 1)
2832 - get_item_line_offset(todo_list, index);
2835 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2837 int fd;
2838 ssize_t len;
2840 fd = open(path, O_RDONLY);
2841 if (fd < 0)
2842 return error_errno(_("could not open '%s'"), path);
2843 len = strbuf_read(sb, fd, 0);
2844 close(fd);
2845 if (len < 0)
2846 return error(_("could not read '%s'."), path);
2847 return len;
2850 static int have_finished_the_last_pick(void)
2852 struct strbuf buf = STRBUF_INIT;
2853 const char *eol;
2854 const char *todo_path = git_path_todo_file();
2855 int ret = 0;
2857 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2858 if (errno == ENOENT) {
2859 return 0;
2860 } else {
2861 error_errno("unable to open '%s'", todo_path);
2862 return 0;
2865 /* If there is only one line then we are done */
2866 eol = strchr(buf.buf, '\n');
2867 if (!eol || !eol[1])
2868 ret = 1;
2870 strbuf_release(&buf);
2872 return ret;
2875 void sequencer_post_commit_cleanup(struct repository *r, int verbose)
2877 struct replay_opts opts = REPLAY_OPTS_INIT;
2878 int need_cleanup = 0;
2880 if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
2881 if (!refs_delete_ref(get_main_ref_store(r), "",
2882 "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF) &&
2883 verbose)
2884 warning(_("cancelling a cherry picking in progress"));
2885 opts.action = REPLAY_PICK;
2886 need_cleanup = 1;
2889 if (refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
2890 if (!refs_delete_ref(get_main_ref_store(r), "", "REVERT_HEAD",
2891 NULL, REF_NO_DEREF) &&
2892 verbose)
2893 warning(_("cancelling a revert in progress"));
2894 opts.action = REPLAY_REVERT;
2895 need_cleanup = 1;
2898 refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
2899 NULL, REF_NO_DEREF);
2901 if (!need_cleanup)
2902 goto out;
2904 if (!have_finished_the_last_pick())
2905 goto out;
2907 sequencer_remove_state(&opts);
2908 out:
2909 replay_opts_release(&opts);
2912 static void todo_list_write_total_nr(struct todo_list *todo_list)
2914 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2916 if (f) {
2917 fprintf(f, "%d\n", todo_list->total_nr);
2918 fclose(f);
2922 static int read_populate_todo(struct repository *r,
2923 struct todo_list *todo_list,
2924 struct replay_opts *opts)
2926 const char *todo_file = get_todo_path(opts);
2927 int res;
2929 strbuf_reset(&todo_list->buf);
2930 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2931 return -1;
2933 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2934 if (res) {
2935 if (is_rebase_i(opts))
2936 return error(_("please fix this using "
2937 "'git rebase --edit-todo'."));
2938 return error(_("unusable instruction sheet: '%s'"), todo_file);
2941 if (!todo_list->nr &&
2942 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2943 return error(_("no commits parsed."));
2945 if (!is_rebase_i(opts)) {
2946 enum todo_command valid =
2947 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2948 int i;
2950 for (i = 0; i < todo_list->nr; i++)
2951 if (valid == todo_list->items[i].command)
2952 continue;
2953 else if (valid == TODO_PICK)
2954 return error(_("cannot cherry-pick during a revert."));
2955 else
2956 return error(_("cannot revert during a cherry-pick."));
2959 if (is_rebase_i(opts)) {
2960 struct todo_list done = TODO_LIST_INIT;
2962 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2963 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
2964 todo_list->done_nr = count_commands(&done);
2965 else
2966 todo_list->done_nr = 0;
2968 todo_list->total_nr = todo_list->done_nr
2969 + count_commands(todo_list);
2970 todo_list_release(&done);
2972 todo_list_write_total_nr(todo_list);
2975 return 0;
2978 static int git_config_string_dup(char **dest,
2979 const char *var, const char *value)
2981 if (!value)
2982 return config_error_nonbool(var);
2983 free(*dest);
2984 *dest = xstrdup(value);
2985 return 0;
2988 static int populate_opts_cb(const char *key, const char *value,
2989 const struct config_context *ctx,
2990 void *data)
2992 struct replay_opts *opts = data;
2993 int error_flag = 1;
2995 if (!value)
2996 error_flag = 0;
2997 else if (!strcmp(key, "options.no-commit"))
2998 opts->no_commit = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
2999 else if (!strcmp(key, "options.edit"))
3000 opts->edit = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3001 else if (!strcmp(key, "options.allow-empty"))
3002 opts->allow_empty =
3003 git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3004 else if (!strcmp(key, "options.allow-empty-message"))
3005 opts->allow_empty_message =
3006 git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3007 else if (!strcmp(key, "options.drop-redundant-commits"))
3008 opts->drop_redundant_commits =
3009 git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3010 else if (!strcmp(key, "options.keep-redundant-commits"))
3011 opts->keep_redundant_commits =
3012 git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3013 else if (!strcmp(key, "options.signoff"))
3014 opts->signoff = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3015 else if (!strcmp(key, "options.record-origin"))
3016 opts->record_origin = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3017 else if (!strcmp(key, "options.allow-ff"))
3018 opts->allow_ff = git_config_bool_or_int(key, value, ctx->kvi, &error_flag);
3019 else if (!strcmp(key, "options.mainline"))
3020 opts->mainline = git_config_int(key, value, ctx->kvi);
3021 else if (!strcmp(key, "options.strategy"))
3022 git_config_string_dup(&opts->strategy, key, value);
3023 else if (!strcmp(key, "options.gpg-sign"))
3024 git_config_string_dup(&opts->gpg_sign, key, value);
3025 else if (!strcmp(key, "options.strategy-option")) {
3026 strvec_push(&opts->xopts, value);
3027 } else if (!strcmp(key, "options.allow-rerere-auto"))
3028 opts->allow_rerere_auto =
3029 git_config_bool_or_int(key, value, ctx->kvi, &error_flag) ?
3030 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
3031 else if (!strcmp(key, "options.default-msg-cleanup")) {
3032 opts->explicit_cleanup = 1;
3033 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
3034 } else
3035 return error(_("invalid key: %s"), key);
3037 if (!error_flag)
3038 return error(_("invalid value for '%s': '%s'"), key, value);
3040 return 0;
3043 static void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
3045 int i;
3046 int count;
3047 const char **argv;
3048 char *strategy_opts_string = raw_opts;
3050 if (*strategy_opts_string == ' ')
3051 strategy_opts_string++;
3053 count = split_cmdline(strategy_opts_string, &argv);
3054 if (count < 0)
3055 BUG("could not split '%s': %s", strategy_opts_string,
3056 split_cmdline_strerror(count));
3057 for (i = 0; i < count; i++) {
3058 const char *arg = argv[i];
3060 skip_prefix(arg, "--", &arg);
3061 strvec_push(&opts->xopts, arg);
3063 free(argv);
3066 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
3068 strbuf_reset(buf);
3069 if (!read_oneliner(buf, rebase_path_strategy(), 0))
3070 return;
3071 opts->strategy = strbuf_detach(buf, NULL);
3072 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
3073 return;
3075 parse_strategy_opts(opts, buf->buf);
3078 static int read_populate_opts(struct replay_opts *opts)
3080 struct replay_ctx *ctx = opts->ctx;
3082 if (is_rebase_i(opts)) {
3083 struct strbuf buf = STRBUF_INIT;
3084 int ret = 0;
3086 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(),
3087 READ_ONELINER_SKIP_IF_EMPTY)) {
3088 if (!starts_with(buf.buf, "-S"))
3089 strbuf_reset(&buf);
3090 else {
3091 free(opts->gpg_sign);
3092 opts->gpg_sign = xstrdup(buf.buf + 2);
3094 strbuf_reset(&buf);
3097 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(),
3098 READ_ONELINER_SKIP_IF_EMPTY)) {
3099 if (!strcmp(buf.buf, "--rerere-autoupdate"))
3100 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
3101 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
3102 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
3103 strbuf_reset(&buf);
3106 if (file_exists(rebase_path_verbose()))
3107 opts->verbose = 1;
3109 if (file_exists(rebase_path_quiet()))
3110 opts->quiet = 1;
3112 if (file_exists(rebase_path_signoff())) {
3113 opts->allow_ff = 0;
3114 opts->signoff = 1;
3117 if (file_exists(rebase_path_cdate_is_adate())) {
3118 opts->allow_ff = 0;
3119 opts->committer_date_is_author_date = 1;
3122 if (file_exists(rebase_path_ignore_date())) {
3123 opts->allow_ff = 0;
3124 opts->ignore_date = 1;
3127 if (file_exists(rebase_path_reschedule_failed_exec()))
3128 opts->reschedule_failed_exec = 1;
3129 else if (file_exists(rebase_path_no_reschedule_failed_exec()))
3130 opts->reschedule_failed_exec = 0;
3132 if (file_exists(rebase_path_drop_redundant_commits()))
3133 opts->drop_redundant_commits = 1;
3135 if (file_exists(rebase_path_keep_redundant_commits()))
3136 opts->keep_redundant_commits = 1;
3138 read_strategy_opts(opts, &buf);
3139 strbuf_reset(&buf);
3141 if (read_oneliner(&ctx->current_fixups,
3142 rebase_path_current_fixups(),
3143 READ_ONELINER_SKIP_IF_EMPTY)) {
3144 const char *p = ctx->current_fixups.buf;
3145 ctx->current_fixup_count = 1;
3146 while ((p = strchr(p, '\n'))) {
3147 ctx->current_fixup_count++;
3148 p++;
3152 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
3153 if (repo_get_oid_committish(the_repository, buf.buf, &opts->squash_onto) < 0) {
3154 ret = error(_("unusable squash-onto"));
3155 goto done_rebase_i;
3157 opts->have_squash_onto = 1;
3160 done_rebase_i:
3161 strbuf_release(&buf);
3162 return ret;
3165 if (!file_exists(git_path_opts_file()))
3166 return 0;
3168 * The function git_parse_source(), called from git_config_from_file(),
3169 * may die() in case of a syntactically incorrect file. We do not care
3170 * about this case, though, because we wrote that file ourselves, so we
3171 * are pretty certain that it is syntactically correct.
3173 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
3174 return error(_("malformed options sheet: '%s'"),
3175 git_path_opts_file());
3176 return 0;
3179 static void write_strategy_opts(struct replay_opts *opts)
3181 struct strbuf buf = STRBUF_INIT;
3184 * Quote strategy options so that they can be read correctly
3185 * by split_cmdline().
3187 quote_cmdline(&buf, opts->xopts.v);
3188 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
3189 strbuf_release(&buf);
3192 int write_basic_state(struct replay_opts *opts, const char *head_name,
3193 struct commit *onto, const struct object_id *orig_head)
3195 if (head_name)
3196 write_file(rebase_path_head_name(), "%s\n", head_name);
3197 if (onto)
3198 write_file(rebase_path_onto(), "%s\n",
3199 oid_to_hex(&onto->object.oid));
3200 if (orig_head)
3201 write_file(rebase_path_orig_head(), "%s\n",
3202 oid_to_hex(orig_head));
3204 if (opts->quiet)
3205 write_file(rebase_path_quiet(), "%s", "");
3206 if (opts->verbose)
3207 write_file(rebase_path_verbose(), "%s", "");
3208 if (opts->strategy)
3209 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
3210 if (opts->xopts.nr > 0)
3211 write_strategy_opts(opts);
3213 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
3214 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
3215 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
3216 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
3218 if (opts->gpg_sign)
3219 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
3220 if (opts->signoff)
3221 write_file(rebase_path_signoff(), "--signoff\n");
3222 if (opts->drop_redundant_commits)
3223 write_file(rebase_path_drop_redundant_commits(), "%s", "");
3224 if (opts->keep_redundant_commits)
3225 write_file(rebase_path_keep_redundant_commits(), "%s", "");
3226 if (opts->committer_date_is_author_date)
3227 write_file(rebase_path_cdate_is_adate(), "%s", "");
3228 if (opts->ignore_date)
3229 write_file(rebase_path_ignore_date(), "%s", "");
3230 if (opts->reschedule_failed_exec)
3231 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
3232 else
3233 write_file(rebase_path_no_reschedule_failed_exec(), "%s", "");
3235 return 0;
3238 static int walk_revs_populate_todo(struct todo_list *todo_list,
3239 struct replay_opts *opts)
3241 enum todo_command command = opts->action == REPLAY_PICK ?
3242 TODO_PICK : TODO_REVERT;
3243 const char *command_string = todo_command_info[command].str;
3244 const char *encoding;
3245 struct commit *commit;
3247 if (prepare_revs(opts))
3248 return -1;
3250 encoding = get_log_output_encoding();
3252 while ((commit = get_revision(opts->revs))) {
3253 struct todo_item *item = append_new_todo(todo_list);
3254 const char *commit_buffer = repo_logmsg_reencode(the_repository,
3255 commit, NULL,
3256 encoding);
3257 const char *subject;
3258 int subject_len;
3260 item->command = command;
3261 item->commit = commit;
3262 item->arg_offset = 0;
3263 item->arg_len = 0;
3264 item->offset_in_buf = todo_list->buf.len;
3265 subject_len = find_commit_subject(commit_buffer, &subject);
3266 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
3267 short_commit_name(the_repository, commit),
3268 subject_len, subject);
3269 repo_unuse_commit_buffer(the_repository, commit,
3270 commit_buffer);
3273 if (!todo_list->nr)
3274 return error(_("empty commit set passed"));
3276 return 0;
3279 static int create_seq_dir(struct repository *r)
3281 enum replay_action action;
3282 const char *in_progress_error = NULL;
3283 const char *in_progress_advice = NULL;
3284 unsigned int advise_skip =
3285 refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD") ||
3286 refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD");
3288 if (!sequencer_get_last_command(r, &action)) {
3289 switch (action) {
3290 case REPLAY_REVERT:
3291 in_progress_error = _("revert is already in progress");
3292 in_progress_advice =
3293 _("try \"git revert (--continue | %s--abort | --quit)\"");
3294 break;
3295 case REPLAY_PICK:
3296 in_progress_error = _("cherry-pick is already in progress");
3297 in_progress_advice =
3298 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
3299 break;
3300 default:
3301 BUG("unexpected action in create_seq_dir");
3304 if (in_progress_error) {
3305 error("%s", in_progress_error);
3306 if (advice_enabled(ADVICE_SEQUENCER_IN_USE))
3307 advise(in_progress_advice,
3308 advise_skip ? "--skip | " : "");
3309 return -1;
3311 if (mkdir(git_path_seq_dir(), 0777) < 0)
3312 return error_errno(_("could not create sequencer directory '%s'"),
3313 git_path_seq_dir());
3315 return 0;
3318 static int save_head(const char *head)
3320 return write_message(head, strlen(head), git_path_head_file(), 1);
3323 static int rollback_is_safe(void)
3325 struct strbuf sb = STRBUF_INIT;
3326 struct object_id expected_head, actual_head;
3328 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
3329 strbuf_trim(&sb);
3330 if (get_oid_hex(sb.buf, &expected_head)) {
3331 strbuf_release(&sb);
3332 die(_("could not parse %s"), git_path_abort_safety_file());
3334 strbuf_release(&sb);
3336 else if (errno == ENOENT)
3337 oidclr(&expected_head);
3338 else
3339 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
3341 if (repo_get_oid(the_repository, "HEAD", &actual_head))
3342 oidclr(&actual_head);
3344 return oideq(&actual_head, &expected_head);
3347 static int reset_merge(const struct object_id *oid)
3349 struct child_process cmd = CHILD_PROCESS_INIT;
3351 cmd.git_cmd = 1;
3352 strvec_pushl(&cmd.args, "reset", "--merge", NULL);
3354 if (!is_null_oid(oid))
3355 strvec_push(&cmd.args, oid_to_hex(oid));
3357 return run_command(&cmd);
3360 static int rollback_single_pick(struct repository *r)
3362 struct object_id head_oid;
3364 if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
3365 !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
3366 return error(_("no cherry-pick or revert in progress"));
3367 if (refs_read_ref_full(get_main_ref_store(the_repository), "HEAD", 0, &head_oid, NULL))
3368 return error(_("cannot resolve HEAD"));
3369 if (is_null_oid(&head_oid))
3370 return error(_("cannot abort from a branch yet to be born"));
3371 return reset_merge(&head_oid);
3374 static int skip_single_pick(void)
3376 struct object_id head;
3378 if (refs_read_ref_full(get_main_ref_store(the_repository), "HEAD", 0, &head, NULL))
3379 return error(_("cannot resolve HEAD"));
3380 return reset_merge(&head);
3383 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
3385 FILE *f;
3386 struct object_id oid;
3387 struct strbuf buf = STRBUF_INIT;
3388 const char *p;
3390 f = fopen(git_path_head_file(), "r");
3391 if (!f && errno == ENOENT) {
3393 * There is no multiple-cherry-pick in progress.
3394 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
3395 * a single-cherry-pick in progress, abort that.
3397 return rollback_single_pick(r);
3399 if (!f)
3400 return error_errno(_("cannot open '%s'"), git_path_head_file());
3401 if (strbuf_getline_lf(&buf, f)) {
3402 error(_("cannot read '%s': %s"), git_path_head_file(),
3403 ferror(f) ? strerror(errno) : _("unexpected end of file"));
3404 fclose(f);
3405 goto fail;
3407 fclose(f);
3408 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
3409 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
3410 git_path_head_file());
3411 goto fail;
3413 if (is_null_oid(&oid)) {
3414 error(_("cannot abort from a branch yet to be born"));
3415 goto fail;
3418 if (!rollback_is_safe()) {
3419 /* Do not error, just do not rollback */
3420 warning(_("You seem to have moved HEAD. "
3421 "Not rewinding, check your HEAD!"));
3422 } else
3423 if (reset_merge(&oid))
3424 goto fail;
3425 strbuf_release(&buf);
3426 return sequencer_remove_state(opts);
3427 fail:
3428 strbuf_release(&buf);
3429 return -1;
3432 int sequencer_skip(struct repository *r, struct replay_opts *opts)
3434 enum replay_action action = -1;
3435 sequencer_get_last_command(r, &action);
3438 * Check whether the subcommand requested to skip the commit is actually
3439 * in progress and that it's safe to skip the commit.
3441 * opts->action tells us which subcommand requested to skip the commit.
3442 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
3443 * action is in progress and we can skip the commit.
3445 * Otherwise we check that the last instruction was related to the
3446 * particular subcommand we're trying to execute and barf if that's not
3447 * the case.
3449 * Finally we check that the rollback is "safe", i.e., has the HEAD
3450 * moved? In this case, it doesn't make sense to "reset the merge" and
3451 * "skip the commit" as the user already handled this by committing. But
3452 * we'd not want to barf here, instead give advice on how to proceed. We
3453 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
3454 * it gets removed when the user commits, so if it still exists we're
3455 * sure the user can't have committed before.
3457 switch (opts->action) {
3458 case REPLAY_REVERT:
3459 if (!refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
3460 if (action != REPLAY_REVERT)
3461 return error(_("no revert in progress"));
3462 if (!rollback_is_safe())
3463 goto give_advice;
3465 break;
3466 case REPLAY_PICK:
3467 if (!refs_ref_exists(get_main_ref_store(r),
3468 "CHERRY_PICK_HEAD")) {
3469 if (action != REPLAY_PICK)
3470 return error(_("no cherry-pick in progress"));
3471 if (!rollback_is_safe())
3472 goto give_advice;
3474 break;
3475 default:
3476 BUG("unexpected action in sequencer_skip");
3479 if (skip_single_pick())
3480 return error(_("failed to skip the commit"));
3481 if (!is_directory(git_path_seq_dir()))
3482 return 0;
3484 return sequencer_continue(r, opts);
3486 give_advice:
3487 error(_("there is nothing to skip"));
3489 if (advice_enabled(ADVICE_RESOLVE_CONFLICT)) {
3490 advise(_("have you committed already?\n"
3491 "try \"git %s --continue\""),
3492 action == REPLAY_REVERT ? "revert" : "cherry-pick");
3494 return -1;
3497 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts,
3498 int reschedule)
3500 struct lock_file todo_lock = LOCK_INIT;
3501 const char *todo_path = get_todo_path(opts);
3502 int next = todo_list->current, offset, fd;
3505 * rebase -i writes "git-rebase-todo" without the currently executing
3506 * command, appending it to "done" instead.
3508 if (is_rebase_i(opts) && !reschedule)
3509 next++;
3511 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
3512 if (fd < 0)
3513 return error_errno(_("could not lock '%s'"), todo_path);
3514 offset = get_item_line_offset(todo_list, next);
3515 if (write_in_full(fd, todo_list->buf.buf + offset,
3516 todo_list->buf.len - offset) < 0)
3517 return error_errno(_("could not write to '%s'"), todo_path);
3518 if (commit_lock_file(&todo_lock) < 0)
3519 return error(_("failed to finalize '%s'"), todo_path);
3521 if (is_rebase_i(opts) && !reschedule && next > 0) {
3522 const char *done = rebase_path_done();
3523 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
3524 int ret = 0;
3526 if (fd < 0)
3527 return 0;
3528 if (write_in_full(fd, get_item_line(todo_list, next - 1),
3529 get_item_line_length(todo_list, next - 1))
3530 < 0)
3531 ret = error_errno(_("could not write to '%s'"), done);
3532 if (close(fd) < 0)
3533 ret = error_errno(_("failed to finalize '%s'"), done);
3534 return ret;
3536 return 0;
3539 static int save_opts(struct replay_opts *opts)
3541 const char *opts_file = git_path_opts_file();
3542 int res = 0;
3544 if (opts->no_commit)
3545 res |= git_config_set_in_file_gently(opts_file,
3546 "options.no-commit", NULL, "true");
3547 if (opts->edit >= 0)
3548 res |= git_config_set_in_file_gently(opts_file, "options.edit", NULL,
3549 opts->edit ? "true" : "false");
3550 if (opts->allow_empty)
3551 res |= git_config_set_in_file_gently(opts_file,
3552 "options.allow-empty", NULL, "true");
3553 if (opts->allow_empty_message)
3554 res |= git_config_set_in_file_gently(opts_file,
3555 "options.allow-empty-message", NULL, "true");
3556 if (opts->drop_redundant_commits)
3557 res |= git_config_set_in_file_gently(opts_file,
3558 "options.drop-redundant-commits", NULL, "true");
3559 if (opts->keep_redundant_commits)
3560 res |= git_config_set_in_file_gently(opts_file,
3561 "options.keep-redundant-commits", NULL, "true");
3562 if (opts->signoff)
3563 res |= git_config_set_in_file_gently(opts_file,
3564 "options.signoff", NULL, "true");
3565 if (opts->record_origin)
3566 res |= git_config_set_in_file_gently(opts_file,
3567 "options.record-origin", NULL, "true");
3568 if (opts->allow_ff)
3569 res |= git_config_set_in_file_gently(opts_file,
3570 "options.allow-ff", NULL, "true");
3571 if (opts->mainline) {
3572 struct strbuf buf = STRBUF_INIT;
3573 strbuf_addf(&buf, "%d", opts->mainline);
3574 res |= git_config_set_in_file_gently(opts_file,
3575 "options.mainline", NULL, buf.buf);
3576 strbuf_release(&buf);
3578 if (opts->strategy)
3579 res |= git_config_set_in_file_gently(opts_file,
3580 "options.strategy", NULL, opts->strategy);
3581 if (opts->gpg_sign)
3582 res |= git_config_set_in_file_gently(opts_file,
3583 "options.gpg-sign", NULL, opts->gpg_sign);
3584 for (size_t i = 0; i < opts->xopts.nr; i++)
3585 res |= git_config_set_multivar_in_file_gently(opts_file,
3586 "options.strategy-option",
3587 opts->xopts.v[i], "^$", NULL, 0);
3588 if (opts->allow_rerere_auto)
3589 res |= git_config_set_in_file_gently(opts_file,
3590 "options.allow-rerere-auto", NULL,
3591 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
3592 "true" : "false");
3594 if (opts->explicit_cleanup)
3595 res |= git_config_set_in_file_gently(opts_file,
3596 "options.default-msg-cleanup", NULL,
3597 describe_cleanup_mode(opts->default_msg_cleanup));
3598 return res;
3601 static int make_patch(struct repository *r,
3602 struct commit *commit,
3603 struct replay_opts *opts)
3605 struct rev_info log_tree_opt;
3606 const char *subject;
3607 char hex[GIT_MAX_HEXSZ + 1];
3608 int res = 0;
3610 if (!is_rebase_i(opts))
3611 BUG("make_patch should only be called when rebasing");
3613 oid_to_hex_r(hex, &commit->object.oid);
3614 if (write_message(hex, strlen(hex), rebase_path_stopped_sha(), 1) < 0)
3615 return -1;
3616 res |= write_rebase_head(&commit->object.oid);
3618 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3619 repo_init_revisions(r, &log_tree_opt, NULL);
3620 log_tree_opt.abbrev = 0;
3621 log_tree_opt.diff = 1;
3622 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
3623 log_tree_opt.disable_stdin = 1;
3624 log_tree_opt.no_commit_id = 1;
3625 log_tree_opt.diffopt.file = fopen(rebase_path_patch(), "w");
3626 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
3627 if (!log_tree_opt.diffopt.file)
3628 res |= error_errno(_("could not open '%s'"),
3629 rebase_path_patch());
3630 else {
3631 res |= log_tree_commit(&log_tree_opt, commit);
3632 fclose(log_tree_opt.diffopt.file);
3635 if (!file_exists(rebase_path_message())) {
3636 const char *encoding = get_commit_output_encoding();
3637 const char *commit_buffer = repo_logmsg_reencode(r,
3638 commit, NULL,
3639 encoding);
3640 find_commit_subject(commit_buffer, &subject);
3641 res |= write_message(subject, strlen(subject), rebase_path_message(), 1);
3642 repo_unuse_commit_buffer(r, commit,
3643 commit_buffer);
3645 release_revisions(&log_tree_opt);
3647 return res;
3650 static int intend_to_amend(void)
3652 struct object_id head;
3653 char *p;
3655 if (repo_get_oid(the_repository, "HEAD", &head))
3656 return error(_("cannot read HEAD"));
3658 p = oid_to_hex(&head);
3659 return write_message(p, strlen(p), rebase_path_amend(), 1);
3662 static int error_with_patch(struct repository *r,
3663 struct commit *commit,
3664 const char *subject, int subject_len,
3665 struct replay_opts *opts,
3666 int exit_code, int to_amend)
3668 struct replay_ctx *ctx = opts->ctx;
3671 * Write the commit message to be used by "git rebase
3672 * --continue". If a "fixup" or "squash" command has conflicts
3673 * then we will have already written rebase_path_message() in
3674 * error_failed_squash(). If an "edit" command was
3675 * fast-forwarded then we don't have a message in ctx->message
3676 * and rely on make_patch() to write rebase_path_message()
3677 * instead.
3679 if (ctx->have_message && !file_exists(rebase_path_message()) &&
3680 write_message(ctx->message.buf, ctx->message.len,
3681 rebase_path_message(), 0))
3682 return error(_("could not write commit message file"));
3684 if (commit && make_patch(r, commit, opts))
3685 return -1;
3687 if (to_amend) {
3688 if (intend_to_amend())
3689 return -1;
3691 fprintf(stderr,
3692 _("You can amend the commit now, with\n"
3693 "\n"
3694 " git commit --amend %s\n"
3695 "\n"
3696 "Once you are satisfied with your changes, run\n"
3697 "\n"
3698 " git rebase --continue\n"),
3699 gpg_sign_opt_quoted(opts));
3700 } else if (exit_code) {
3701 if (commit)
3702 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
3703 short_commit_name(r, commit), subject_len, subject);
3704 else
3706 * We don't have the hash of the parent so
3707 * just print the line from the todo file.
3709 fprintf_ln(stderr, _("Could not merge %.*s"),
3710 subject_len, subject);
3713 return exit_code;
3716 static int error_failed_squash(struct repository *r,
3717 struct commit *commit,
3718 struct replay_opts *opts,
3719 int subject_len,
3720 const char *subject)
3722 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3723 return error(_("could not copy '%s' to '%s'"),
3724 rebase_path_squash_msg(), rebase_path_message());
3725 unlink(git_path_merge_msg(r));
3726 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
3727 return error(_("could not copy '%s' to '%s'"),
3728 rebase_path_message(),
3729 git_path_merge_msg(r));
3730 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
3733 static int do_exec(struct repository *r, const char *command_line)
3735 struct child_process cmd = CHILD_PROCESS_INIT;
3736 int dirty, status;
3738 fprintf(stderr, _("Executing: %s\n"), command_line);
3739 cmd.use_shell = 1;
3740 strvec_push(&cmd.args, command_line);
3741 strvec_push(&cmd.env, "GIT_CHERRY_PICK_HELP");
3742 status = run_command(&cmd);
3744 /* force re-reading of the cache */
3745 discard_index(r->index);
3746 if (repo_read_index(r) < 0)
3747 return error(_("could not read index"));
3749 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
3751 if (status) {
3752 warning(_("execution failed: %s\n%s"
3753 "You can fix the problem, and then run\n"
3754 "\n"
3755 " git rebase --continue\n"
3756 "\n"),
3757 command_line,
3758 dirty ? _("and made changes to the index and/or the "
3759 "working tree.\n") : "");
3760 if (status == 127)
3761 /* command not found */
3762 status = 1;
3763 } else if (dirty) {
3764 warning(_("execution succeeded: %s\nbut "
3765 "left changes to the index and/or the working tree.\n"
3766 "Commit or stash your changes, and then run\n"
3767 "\n"
3768 " git rebase --continue\n"
3769 "\n"), command_line);
3770 status = 1;
3773 return status;
3776 __attribute__((format (printf, 2, 3)))
3777 static int safe_append(const char *filename, const char *fmt, ...)
3779 va_list ap;
3780 struct lock_file lock = LOCK_INIT;
3781 int fd = hold_lock_file_for_update(&lock, filename,
3782 LOCK_REPORT_ON_ERROR);
3783 struct strbuf buf = STRBUF_INIT;
3785 if (fd < 0)
3786 return -1;
3788 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3789 error_errno(_("could not read '%s'"), filename);
3790 rollback_lock_file(&lock);
3791 return -1;
3793 strbuf_complete(&buf, '\n');
3794 va_start(ap, fmt);
3795 strbuf_vaddf(&buf, fmt, ap);
3796 va_end(ap);
3798 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3799 error_errno(_("could not write to '%s'"), filename);
3800 strbuf_release(&buf);
3801 rollback_lock_file(&lock);
3802 return -1;
3804 if (commit_lock_file(&lock) < 0) {
3805 strbuf_release(&buf);
3806 return error(_("failed to finalize '%s'"), filename);
3809 strbuf_release(&buf);
3810 return 0;
3813 static int do_label(struct repository *r, const char *name, int len)
3815 struct ref_store *refs = get_main_ref_store(r);
3816 struct ref_transaction *transaction;
3817 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3818 struct strbuf msg = STRBUF_INIT;
3819 int ret = 0;
3820 struct object_id head_oid;
3822 if (len == 1 && *name == '#')
3823 return error(_("illegal label name: '%.*s'"), len, name);
3825 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3826 strbuf_addf(&msg, "rebase (label) '%.*s'", len, name);
3828 transaction = ref_store_transaction_begin(refs, &err);
3829 if (!transaction) {
3830 error("%s", err.buf);
3831 ret = -1;
3832 } else if (repo_get_oid(r, "HEAD", &head_oid)) {
3833 error(_("could not read HEAD"));
3834 ret = -1;
3835 } else if (ref_transaction_update(transaction, ref_name.buf,
3836 &head_oid, NULL, NULL, NULL,
3837 0, msg.buf, &err) < 0 ||
3838 ref_transaction_commit(transaction, &err)) {
3839 error("%s", err.buf);
3840 ret = -1;
3842 ref_transaction_free(transaction);
3843 strbuf_release(&err);
3844 strbuf_release(&msg);
3846 if (!ret)
3847 ret = safe_append(rebase_path_refs_to_delete(),
3848 "%s\n", ref_name.buf);
3849 strbuf_release(&ref_name);
3851 return ret;
3854 static const char *sequencer_reflog_action(struct replay_opts *opts)
3856 if (!opts->reflog_action) {
3857 opts->reflog_action = getenv(GIT_REFLOG_ACTION);
3858 opts->reflog_action =
3859 xstrdup(opts->reflog_action ? opts->reflog_action
3860 : action_name(opts));
3863 return opts->reflog_action;
3866 __attribute__((format (printf, 3, 4)))
3867 static const char *reflog_message(struct replay_opts *opts,
3868 const char *sub_action, const char *fmt, ...)
3870 va_list ap;
3871 static struct strbuf buf = STRBUF_INIT;
3873 va_start(ap, fmt);
3874 strbuf_reset(&buf);
3875 strbuf_addstr(&buf, sequencer_reflog_action(opts));
3876 if (sub_action)
3877 strbuf_addf(&buf, " (%s)", sub_action);
3878 if (fmt) {
3879 strbuf_addstr(&buf, ": ");
3880 strbuf_vaddf(&buf, fmt, ap);
3882 va_end(ap);
3884 return buf.buf;
3887 static struct commit *lookup_label(struct repository *r, const char *label,
3888 int len, struct strbuf *buf)
3890 struct commit *commit;
3891 struct object_id oid;
3893 strbuf_reset(buf);
3894 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3895 if (!refs_read_ref(get_main_ref_store(the_repository), buf->buf, &oid)) {
3896 commit = lookup_commit_object(r, &oid);
3897 } else {
3898 /* fall back to non-rewritten ref or commit */
3899 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3900 commit = lookup_commit_reference_by_name(buf->buf);
3903 if (!commit)
3904 error(_("could not resolve '%s'"), buf->buf);
3906 return commit;
3909 static int do_reset(struct repository *r,
3910 const char *name, int len,
3911 struct replay_opts *opts)
3913 struct strbuf ref_name = STRBUF_INIT;
3914 struct object_id oid;
3915 struct lock_file lock = LOCK_INIT;
3916 struct tree_desc desc = { 0 };
3917 struct tree *tree;
3918 struct unpack_trees_options unpack_tree_opts = { 0 };
3919 int ret = 0;
3921 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
3922 return -1;
3924 if (len == 10 && !strncmp("[new root]", name, len)) {
3925 if (!opts->have_squash_onto) {
3926 const char *hex;
3927 if (commit_tree("", 0, the_hash_algo->empty_tree,
3928 NULL, &opts->squash_onto,
3929 NULL, NULL))
3930 return error(_("writing fake root commit"));
3931 opts->have_squash_onto = 1;
3932 hex = oid_to_hex(&opts->squash_onto);
3933 if (write_message(hex, strlen(hex),
3934 rebase_path_squash_onto(), 0))
3935 return error(_("writing squash-onto"));
3937 oidcpy(&oid, &opts->squash_onto);
3938 } else {
3939 int i;
3940 struct commit *commit;
3942 /* Determine the length of the label */
3943 for (i = 0; i < len; i++)
3944 if (isspace(name[i]))
3945 break;
3946 len = i;
3948 commit = lookup_label(r, name, len, &ref_name);
3949 if (!commit) {
3950 ret = -1;
3951 goto cleanup;
3953 oid = commit->object.oid;
3956 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3957 unpack_tree_opts.head_idx = 1;
3958 unpack_tree_opts.src_index = r->index;
3959 unpack_tree_opts.dst_index = r->index;
3960 unpack_tree_opts.fn = oneway_merge;
3961 unpack_tree_opts.merge = 1;
3962 unpack_tree_opts.update = 1;
3963 unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
3964 unpack_tree_opts.skip_cache_tree_update = 1;
3965 init_checkout_metadata(&unpack_tree_opts.meta, name, &oid, NULL);
3967 if (repo_read_index_unmerged(r)) {
3968 ret = error_resolve_conflict(action_name(opts));
3969 goto cleanup;
3972 if (!fill_tree_descriptor(r, &desc, &oid)) {
3973 ret = error(_("failed to find tree of %s"), oid_to_hex(&oid));
3974 goto cleanup;
3977 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3978 ret = -1;
3979 goto cleanup;
3982 tree = parse_tree_indirect(&oid);
3983 if (!tree)
3984 return error(_("unable to read tree (%s)"), oid_to_hex(&oid));
3985 prime_cache_tree(r, r->index, tree);
3987 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3988 ret = error(_("could not write index"));
3990 if (!ret)
3991 ret = refs_update_ref(get_main_ref_store(the_repository), reflog_message(opts, "reset", "'%.*s'",
3992 len, name),
3993 "HEAD", &oid,
3994 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3995 cleanup:
3996 free((void *)desc.buffer);
3997 if (ret < 0)
3998 rollback_lock_file(&lock);
3999 strbuf_release(&ref_name);
4000 clear_unpack_trees_porcelain(&unpack_tree_opts);
4001 return ret;
4004 static int do_merge(struct repository *r,
4005 struct commit *commit,
4006 const char *arg, int arg_len,
4007 int flags, int *check_todo, struct replay_opts *opts)
4009 struct replay_ctx *ctx = opts->ctx;
4010 int run_commit_flags = 0;
4011 struct strbuf ref_name = STRBUF_INIT;
4012 struct commit *head_commit, *merge_commit, *i;
4013 struct commit_list *bases = NULL, *j;
4014 struct commit_list *to_merge = NULL, **tail = &to_merge;
4015 const char *strategy = !opts->xopts.nr &&
4016 (!opts->strategy ||
4017 !strcmp(opts->strategy, "recursive") ||
4018 !strcmp(opts->strategy, "ort")) ?
4019 NULL : opts->strategy;
4020 struct merge_options o;
4021 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
4022 static struct lock_file lock;
4023 const char *p;
4025 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
4026 ret = -1;
4027 goto leave_merge;
4030 head_commit = lookup_commit_reference_by_name("HEAD");
4031 if (!head_commit) {
4032 ret = error(_("cannot merge without a current revision"));
4033 goto leave_merge;
4037 * For octopus merges, the arg starts with the list of revisions to be
4038 * merged. The list is optionally followed by '#' and the oneline.
4040 merge_arg_len = oneline_offset = arg_len;
4041 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
4042 if (!*p)
4043 break;
4044 if (*p == '#' && (!p[1] || isspace(p[1]))) {
4045 p += 1 + strspn(p + 1, " \t\n");
4046 oneline_offset = p - arg;
4047 break;
4049 k = strcspn(p, " \t\n");
4050 if (!k)
4051 continue;
4052 merge_commit = lookup_label(r, p, k, &ref_name);
4053 if (!merge_commit) {
4054 ret = error(_("unable to parse '%.*s'"), k, p);
4055 goto leave_merge;
4057 tail = &commit_list_insert(merge_commit, tail)->next;
4058 p += k;
4059 merge_arg_len = p - arg;
4062 if (!to_merge) {
4063 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
4064 goto leave_merge;
4067 if (opts->have_squash_onto &&
4068 oideq(&head_commit->object.oid, &opts->squash_onto)) {
4070 * When the user tells us to "merge" something into a
4071 * "[new root]", let's simply fast-forward to the merge head.
4073 rollback_lock_file(&lock);
4074 if (to_merge->next)
4075 ret = error(_("octopus merge cannot be executed on "
4076 "top of a [new root]"));
4077 else
4078 ret = fast_forward_to(r, &to_merge->item->object.oid,
4079 &head_commit->object.oid, 0,
4080 opts);
4081 goto leave_merge;
4085 * If HEAD is not identical to the first parent of the original merge
4086 * commit, we cannot fast-forward.
4088 can_fast_forward = opts->allow_ff && commit && commit->parents &&
4089 oideq(&commit->parents->item->object.oid,
4090 &head_commit->object.oid);
4093 * If any merge head is different from the original one, we cannot
4094 * fast-forward.
4096 if (can_fast_forward) {
4097 struct commit_list *p = commit->parents->next;
4099 for (j = to_merge; j && p; j = j->next, p = p->next)
4100 if (!oideq(&j->item->object.oid,
4101 &p->item->object.oid)) {
4102 can_fast_forward = 0;
4103 break;
4106 * If the number of merge heads differs from the original merge
4107 * commit, we cannot fast-forward.
4109 if (j || p)
4110 can_fast_forward = 0;
4113 if (can_fast_forward) {
4114 rollback_lock_file(&lock);
4115 ret = fast_forward_to(r, &commit->object.oid,
4116 &head_commit->object.oid, 0, opts);
4117 if (flags & TODO_EDIT_MERGE_MSG)
4118 goto fast_forward_edit;
4120 goto leave_merge;
4123 if (commit) {
4124 const char *encoding = get_commit_output_encoding();
4125 const char *message = repo_logmsg_reencode(r, commit, NULL,
4126 encoding);
4127 const char *body;
4128 int len;
4130 if (!message) {
4131 ret = error(_("could not get commit message of '%s'"),
4132 oid_to_hex(&commit->object.oid));
4133 goto leave_merge;
4135 write_author_script(message);
4136 find_commit_subject(message, &body);
4137 len = strlen(body);
4138 strbuf_add(&ctx->message, body, len);
4139 repo_unuse_commit_buffer(r, commit, message);
4140 } else {
4141 struct strbuf buf = STRBUF_INIT;
4143 strbuf_addf(&buf, "author %s", git_author_info(0));
4144 write_author_script(buf.buf);
4145 strbuf_release(&buf);
4147 if (oneline_offset < arg_len) {
4148 strbuf_add(&ctx->message, arg + oneline_offset,
4149 arg_len - oneline_offset);
4150 } else {
4151 strbuf_addf(&ctx->message, "Merge %s '%.*s'",
4152 to_merge->next ? "branches" : "branch",
4153 merge_arg_len, arg);
4156 ctx->have_message = 1;
4157 if (write_message(ctx->message.buf, ctx->message.len,
4158 git_path_merge_msg(r), 0)) {
4159 ret = error_errno(_("could not write '%s'"),
4160 git_path_merge_msg(r));
4161 goto leave_merge;
4164 if (strategy || to_merge->next) {
4165 /* Octopus merge */
4166 struct child_process cmd = CHILD_PROCESS_INIT;
4168 if (read_env_script(&cmd.env)) {
4169 const char *gpg_opt = gpg_sign_opt_quoted(opts);
4171 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
4172 goto leave_merge;
4175 if (opts->committer_date_is_author_date)
4176 strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
4177 opts->ignore_date ?
4178 "" :
4179 author_date_from_env(&cmd.env));
4180 if (opts->ignore_date)
4181 strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
4183 cmd.git_cmd = 1;
4184 strvec_push(&cmd.args, "merge");
4185 strvec_push(&cmd.args, "-s");
4186 if (!strategy)
4187 strvec_push(&cmd.args, "octopus");
4188 else {
4189 strvec_push(&cmd.args, strategy);
4190 for (k = 0; k < opts->xopts.nr; k++)
4191 strvec_pushf(&cmd.args,
4192 "-X%s", opts->xopts.v[k]);
4194 if (!(flags & TODO_EDIT_MERGE_MSG))
4195 strvec_push(&cmd.args, "--no-edit");
4196 else
4197 strvec_push(&cmd.args, "--edit");
4198 strvec_push(&cmd.args, "--no-ff");
4199 strvec_push(&cmd.args, "--no-log");
4200 strvec_push(&cmd.args, "--no-stat");
4201 strvec_push(&cmd.args, "-F");
4202 strvec_push(&cmd.args, git_path_merge_msg(r));
4203 if (opts->gpg_sign)
4204 strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
4205 else
4206 strvec_push(&cmd.args, "--no-gpg-sign");
4208 /* Add the tips to be merged */
4209 for (j = to_merge; j; j = j->next)
4210 strvec_push(&cmd.args,
4211 oid_to_hex(&j->item->object.oid));
4213 strbuf_release(&ref_name);
4214 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
4215 NULL, REF_NO_DEREF);
4216 rollback_lock_file(&lock);
4218 ret = run_command(&cmd);
4220 /* force re-reading of the cache */
4221 if (!ret) {
4222 discard_index(r->index);
4223 if (repo_read_index(r) < 0)
4224 ret = error(_("could not read index"));
4226 goto leave_merge;
4229 merge_commit = to_merge->item;
4230 if (repo_get_merge_bases(r, head_commit, merge_commit, &bases) < 0) {
4231 ret = -1;
4232 goto leave_merge;
4235 if (bases && oideq(&merge_commit->object.oid,
4236 &bases->item->object.oid)) {
4237 ret = 0;
4238 /* skip merging an ancestor of HEAD */
4239 goto leave_merge;
4242 write_message(oid_to_hex(&merge_commit->object.oid), the_hash_algo->hexsz,
4243 git_path_merge_head(r), 0);
4244 write_message("no-ff", 5, git_path_merge_mode(r), 0);
4246 bases = reverse_commit_list(bases);
4248 repo_read_index(r);
4249 init_merge_options(&o, r);
4250 o.branch1 = "HEAD";
4251 o.branch2 = ref_name.buf;
4252 o.buffer_output = 2;
4254 if (!opts->strategy || !strcmp(opts->strategy, "ort")) {
4256 * TODO: Should use merge_incore_recursive() and
4257 * merge_switch_to_result(), skipping the call to
4258 * merge_switch_to_result() when we don't actually need to
4259 * update the index and working copy immediately.
4261 ret = merge_ort_recursive(&o,
4262 head_commit, merge_commit, bases,
4263 &i);
4264 } else {
4265 ret = merge_recursive(&o, head_commit, merge_commit, bases,
4266 &i);
4268 if (ret <= 0)
4269 fputs(o.obuf.buf, stdout);
4270 strbuf_release(&o.obuf);
4271 if (ret < 0) {
4272 error(_("could not even attempt to merge '%.*s'"),
4273 merge_arg_len, arg);
4274 unlink(git_path_merge_msg(r));
4275 goto leave_merge;
4278 * The return value of merge_recursive() is 1 on clean, and 0 on
4279 * unclean merge.
4281 * Let's reverse that, so that do_merge() returns 0 upon success and
4282 * 1 upon failed merge (keeping the return value -1 for the cases where
4283 * we will want to reschedule the `merge` command).
4285 ret = !ret;
4287 if (r->index->cache_changed &&
4288 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
4289 ret = error(_("merge: Unable to write new index file"));
4290 goto leave_merge;
4293 rollback_lock_file(&lock);
4294 if (ret)
4295 repo_rerere(r, opts->allow_rerere_auto);
4296 else
4298 * In case of problems, we now want to return a positive
4299 * value (a negative one would indicate that the `merge`
4300 * command needs to be rescheduled).
4302 ret = !!run_git_commit(git_path_merge_msg(r), opts,
4303 run_commit_flags);
4305 if (!ret && flags & TODO_EDIT_MERGE_MSG) {
4306 fast_forward_edit:
4307 *check_todo = 1;
4308 run_commit_flags |= AMEND_MSG | EDIT_MSG | VERIFY_MSG;
4309 ret = !!run_git_commit(NULL, opts, run_commit_flags);
4313 leave_merge:
4314 strbuf_release(&ref_name);
4315 rollback_lock_file(&lock);
4316 free_commit_list(to_merge);
4317 return ret;
4320 static int write_update_refs_state(struct string_list *refs_to_oids)
4322 int result = 0;
4323 struct lock_file lock = LOCK_INIT;
4324 FILE *fp = NULL;
4325 struct string_list_item *item;
4326 char *path;
4328 path = rebase_path_update_refs(the_repository->gitdir);
4330 if (!refs_to_oids->nr) {
4331 if (unlink(path) && errno != ENOENT)
4332 result = error_errno(_("could not unlink: %s"), path);
4333 goto cleanup;
4336 if (safe_create_leading_directories(path)) {
4337 result = error(_("unable to create leading directories of %s"),
4338 path);
4339 goto cleanup;
4342 if (hold_lock_file_for_update(&lock, path, 0) < 0) {
4343 result = error(_("another 'rebase' process appears to be running; "
4344 "'%s.lock' already exists"),
4345 path);
4346 goto cleanup;
4349 fp = fdopen_lock_file(&lock, "w");
4350 if (!fp) {
4351 result = error_errno(_("could not open '%s' for writing"), path);
4352 rollback_lock_file(&lock);
4353 goto cleanup;
4356 for_each_string_list_item(item, refs_to_oids) {
4357 struct update_ref_record *rec = item->util;
4358 fprintf(fp, "%s\n%s\n%s\n", item->string,
4359 oid_to_hex(&rec->before), oid_to_hex(&rec->after));
4362 result = commit_lock_file(&lock);
4364 cleanup:
4365 free(path);
4366 return result;
4370 * Parse the update-refs file for the current rebase, then remove the
4371 * refs that do not appear in the todo_list (and have not had updated
4372 * values stored) and add refs that are in the todo_list but not
4373 * represented in the update-refs file.
4375 * If there are changes to the update-refs list, then write the new state
4376 * to disk.
4378 void todo_list_filter_update_refs(struct repository *r,
4379 struct todo_list *todo_list)
4381 int i;
4382 int updated = 0;
4383 struct string_list update_refs = STRING_LIST_INIT_DUP;
4385 sequencer_get_update_refs_state(r->gitdir, &update_refs);
4388 * For each item in the update_refs list, if it has no updated
4389 * value and does not appear in the todo_list, then remove it
4390 * from the update_refs list.
4392 for (i = 0; i < update_refs.nr; i++) {
4393 int j;
4394 int found = 0;
4395 const char *ref = update_refs.items[i].string;
4396 size_t reflen = strlen(ref);
4397 struct update_ref_record *rec = update_refs.items[i].util;
4399 /* OID already stored as updated. */
4400 if (!is_null_oid(&rec->after))
4401 continue;
4403 for (j = 0; !found && j < todo_list->nr; j++) {
4404 struct todo_item *item = &todo_list->items[j];
4405 const char *arg = todo_list->buf.buf + item->arg_offset;
4407 if (item->command != TODO_UPDATE_REF)
4408 continue;
4410 if (item->arg_len != reflen ||
4411 strncmp(arg, ref, reflen))
4412 continue;
4414 found = 1;
4417 if (!found) {
4418 free(update_refs.items[i].string);
4419 free(update_refs.items[i].util);
4421 update_refs.nr--;
4422 MOVE_ARRAY(update_refs.items + i, update_refs.items + i + 1, update_refs.nr - i);
4424 updated = 1;
4425 i--;
4430 * For each todo_item, check if its ref is in the update_refs list.
4431 * If not, then add it as an un-updated ref.
4433 for (i = 0; i < todo_list->nr; i++) {
4434 struct todo_item *item = &todo_list->items[i];
4435 const char *arg = todo_list->buf.buf + item->arg_offset;
4436 int j, found = 0;
4438 if (item->command != TODO_UPDATE_REF)
4439 continue;
4441 for (j = 0; !found && j < update_refs.nr; j++) {
4442 const char *ref = update_refs.items[j].string;
4444 found = strlen(ref) == item->arg_len &&
4445 !strncmp(ref, arg, item->arg_len);
4448 if (!found) {
4449 struct string_list_item *inserted;
4450 struct strbuf argref = STRBUF_INIT;
4452 strbuf_add(&argref, arg, item->arg_len);
4453 inserted = string_list_insert(&update_refs, argref.buf);
4454 inserted->util = init_update_ref_record(argref.buf);
4455 strbuf_release(&argref);
4456 updated = 1;
4460 if (updated)
4461 write_update_refs_state(&update_refs);
4462 string_list_clear(&update_refs, 1);
4465 static int do_update_ref(struct repository *r, const char *refname)
4467 struct string_list_item *item;
4468 struct string_list list = STRING_LIST_INIT_DUP;
4470 if (sequencer_get_update_refs_state(r->gitdir, &list))
4471 return -1;
4473 for_each_string_list_item(item, &list) {
4474 if (!strcmp(item->string, refname)) {
4475 struct update_ref_record *rec = item->util;
4476 if (refs_read_ref(get_main_ref_store(the_repository), "HEAD", &rec->after))
4477 return -1;
4478 break;
4482 write_update_refs_state(&list);
4483 string_list_clear(&list, 1);
4484 return 0;
4487 static int do_update_refs(struct repository *r, int quiet)
4489 int res = 0;
4490 struct string_list_item *item;
4491 struct string_list refs_to_oids = STRING_LIST_INIT_DUP;
4492 struct ref_store *refs = get_main_ref_store(r);
4493 struct strbuf update_msg = STRBUF_INIT;
4494 struct strbuf error_msg = STRBUF_INIT;
4496 if ((res = sequencer_get_update_refs_state(r->gitdir, &refs_to_oids)))
4497 return res;
4499 for_each_string_list_item(item, &refs_to_oids) {
4500 struct update_ref_record *rec = item->util;
4501 int loop_res;
4503 loop_res = refs_update_ref(refs, "rewritten during rebase",
4504 item->string,
4505 &rec->after, &rec->before,
4506 0, UPDATE_REFS_MSG_ON_ERR);
4507 res |= loop_res;
4509 if (quiet)
4510 continue;
4512 if (loop_res)
4513 strbuf_addf(&error_msg, "\t%s\n", item->string);
4514 else
4515 strbuf_addf(&update_msg, "\t%s\n", item->string);
4518 if (!quiet &&
4519 (update_msg.len || error_msg.len)) {
4520 fprintf(stderr,
4521 _("Updated the following refs with %s:\n%s"),
4522 "--update-refs",
4523 update_msg.buf);
4525 if (res)
4526 fprintf(stderr,
4527 _("Failed to update the following refs with %s:\n%s"),
4528 "--update-refs",
4529 error_msg.buf);
4532 string_list_clear(&refs_to_oids, 1);
4533 strbuf_release(&update_msg);
4534 strbuf_release(&error_msg);
4535 return res;
4538 static int is_final_fixup(struct todo_list *todo_list)
4540 int i = todo_list->current;
4542 if (!is_fixup(todo_list->items[i].command))
4543 return 0;
4545 while (++i < todo_list->nr)
4546 if (is_fixup(todo_list->items[i].command))
4547 return 0;
4548 else if (!is_noop(todo_list->items[i].command))
4549 break;
4550 return 1;
4553 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
4555 int i;
4557 for (i = todo_list->current + offset; i < todo_list->nr; i++)
4558 if (!is_noop(todo_list->items[i].command))
4559 return todo_list->items[i].command;
4561 return -1;
4564 static void create_autostash_internal(struct repository *r,
4565 const char *path,
4566 const char *refname)
4568 struct strbuf buf = STRBUF_INIT;
4569 struct lock_file lock_file = LOCK_INIT;
4570 int fd;
4572 if (path && refname)
4573 BUG("can only pass path or refname");
4575 fd = repo_hold_locked_index(r, &lock_file, 0);
4576 refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
4577 if (0 <= fd)
4578 repo_update_index_if_able(r, &lock_file);
4579 rollback_lock_file(&lock_file);
4581 if (has_unstaged_changes(r, 1) ||
4582 has_uncommitted_changes(r, 1)) {
4583 struct child_process stash = CHILD_PROCESS_INIT;
4584 struct reset_head_opts ropts = { .flags = RESET_HEAD_HARD };
4585 struct object_id oid;
4587 strvec_pushl(&stash.args,
4588 "stash", "create", "autostash", NULL);
4589 stash.git_cmd = 1;
4590 stash.no_stdin = 1;
4591 strbuf_reset(&buf);
4592 if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
4593 die(_("Cannot autostash"));
4594 strbuf_trim_trailing_newline(&buf);
4595 if (repo_get_oid(r, buf.buf, &oid))
4596 die(_("Unexpected stash response: '%s'"),
4597 buf.buf);
4598 strbuf_reset(&buf);
4599 strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
4601 if (path) {
4602 if (safe_create_leading_directories_const(path))
4603 die(_("Could not create directory for '%s'"),
4604 path);
4605 write_file(path, "%s", oid_to_hex(&oid));
4606 } else {
4607 refs_update_ref(get_main_ref_store(r), "", refname,
4608 &oid, null_oid(), 0, UPDATE_REFS_DIE_ON_ERR);
4611 printf(_("Created autostash: %s\n"), buf.buf);
4612 if (reset_head(r, &ropts) < 0)
4613 die(_("could not reset --hard"));
4614 discard_index(r->index);
4615 if (repo_read_index(r) < 0)
4616 die(_("could not read index"));
4618 strbuf_release(&buf);
4621 void create_autostash(struct repository *r, const char *path)
4623 create_autostash_internal(r, path, NULL);
4626 void create_autostash_ref(struct repository *r, const char *refname)
4628 create_autostash_internal(r, NULL, refname);
4631 static int apply_save_autostash_oid(const char *stash_oid, int attempt_apply)
4633 struct child_process child = CHILD_PROCESS_INIT;
4634 int ret = 0;
4636 if (attempt_apply) {
4637 child.git_cmd = 1;
4638 child.no_stdout = 1;
4639 child.no_stderr = 1;
4640 strvec_push(&child.args, "stash");
4641 strvec_push(&child.args, "apply");
4642 strvec_push(&child.args, stash_oid);
4643 ret = run_command(&child);
4646 if (attempt_apply && !ret)
4647 fprintf(stderr, _("Applied autostash.\n"));
4648 else {
4649 struct child_process store = CHILD_PROCESS_INIT;
4651 store.git_cmd = 1;
4652 strvec_push(&store.args, "stash");
4653 strvec_push(&store.args, "store");
4654 strvec_push(&store.args, "-m");
4655 strvec_push(&store.args, "autostash");
4656 strvec_push(&store.args, "-q");
4657 strvec_push(&store.args, stash_oid);
4658 if (run_command(&store))
4659 ret = error(_("cannot store %s"), stash_oid);
4660 else
4661 fprintf(stderr,
4662 _("%s\n"
4663 "Your changes are safe in the stash.\n"
4664 "You can run \"git stash pop\" or"
4665 " \"git stash drop\" at any time.\n"),
4666 attempt_apply ?
4667 _("Applying autostash resulted in conflicts.") :
4668 _("Autostash exists; creating a new stash entry."));
4671 return ret;
4674 static int apply_save_autostash(const char *path, int attempt_apply)
4676 struct strbuf stash_oid = STRBUF_INIT;
4677 int ret = 0;
4679 if (!read_oneliner(&stash_oid, path,
4680 READ_ONELINER_SKIP_IF_EMPTY)) {
4681 strbuf_release(&stash_oid);
4682 return 0;
4684 strbuf_trim(&stash_oid);
4686 ret = apply_save_autostash_oid(stash_oid.buf, attempt_apply);
4688 unlink(path);
4689 strbuf_release(&stash_oid);
4690 return ret;
4693 int save_autostash(const char *path)
4695 return apply_save_autostash(path, 0);
4698 int apply_autostash(const char *path)
4700 return apply_save_autostash(path, 1);
4703 int apply_autostash_oid(const char *stash_oid)
4705 return apply_save_autostash_oid(stash_oid, 1);
4708 static int apply_save_autostash_ref(struct repository *r, const char *refname,
4709 int attempt_apply)
4711 struct object_id stash_oid;
4712 char stash_oid_hex[GIT_MAX_HEXSZ + 1];
4713 int flag, ret;
4715 if (!refs_ref_exists(get_main_ref_store(r), refname))
4716 return 0;
4718 if (!refs_resolve_ref_unsafe(get_main_ref_store(r), refname,
4719 RESOLVE_REF_READING, &stash_oid, &flag))
4720 return -1;
4721 if (flag & REF_ISSYMREF)
4722 return error(_("autostash reference is a symref"));
4724 oid_to_hex_r(stash_oid_hex, &stash_oid);
4725 ret = apply_save_autostash_oid(stash_oid_hex, attempt_apply);
4727 refs_delete_ref(get_main_ref_store(r), "", refname,
4728 &stash_oid, REF_NO_DEREF);
4730 return ret;
4733 int save_autostash_ref(struct repository *r, const char *refname)
4735 return apply_save_autostash_ref(r, refname, 0);
4738 int apply_autostash_ref(struct repository *r, const char *refname)
4740 return apply_save_autostash_ref(r, refname, 1);
4743 static int checkout_onto(struct repository *r, struct replay_opts *opts,
4744 const char *onto_name, const struct object_id *onto,
4745 const struct object_id *orig_head)
4747 struct reset_head_opts ropts = {
4748 .oid = onto,
4749 .orig_head = orig_head,
4750 .flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD |
4751 RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
4752 .head_msg = reflog_message(opts, "start", "checkout %s",
4753 onto_name),
4754 .default_reflog_action = sequencer_reflog_action(opts)
4756 if (reset_head(r, &ropts)) {
4757 apply_autostash(rebase_path_autostash());
4758 sequencer_remove_state(opts);
4759 return error(_("could not detach HEAD"));
4762 return 0;
4765 static int stopped_at_head(struct repository *r)
4767 struct object_id head;
4768 struct commit *commit;
4769 struct commit_message message;
4771 if (repo_get_oid(r, "HEAD", &head) ||
4772 !(commit = lookup_commit(r, &head)) ||
4773 repo_parse_commit(r, commit) || get_message(commit, &message))
4774 fprintf(stderr, _("Stopped at HEAD\n"));
4775 else {
4776 fprintf(stderr, _("Stopped at %s\n"), message.label);
4777 free_message(commit, &message);
4779 return 0;
4783 static int reread_todo_if_changed(struct repository *r,
4784 struct todo_list *todo_list,
4785 struct replay_opts *opts)
4787 int offset;
4788 struct strbuf buf = STRBUF_INIT;
4790 if (strbuf_read_file_or_whine(&buf, get_todo_path(opts)) < 0)
4791 return -1;
4792 offset = get_item_line_offset(todo_list, todo_list->current + 1);
4793 if (buf.len != todo_list->buf.len - offset ||
4794 memcmp(buf.buf, todo_list->buf.buf + offset, buf.len)) {
4795 /* Reread the todo file if it has changed. */
4796 todo_list_release(todo_list);
4797 if (read_populate_todo(r, todo_list, opts))
4798 return -1; /* message was printed */
4799 /* `current` will be incremented on return */
4800 todo_list->current = -1;
4802 strbuf_release(&buf);
4804 return 0;
4807 static const char rescheduled_advice[] =
4808 N_("Could not execute the todo command\n"
4809 "\n"
4810 " %.*s"
4811 "\n"
4812 "It has been rescheduled; To edit the command before continuing, please\n"
4813 "edit the todo list first:\n"
4814 "\n"
4815 " git rebase --edit-todo\n"
4816 " git rebase --continue\n");
4818 static int pick_one_commit(struct repository *r,
4819 struct todo_list *todo_list,
4820 struct replay_opts *opts,
4821 int *check_todo, int* reschedule)
4823 struct replay_ctx *ctx = opts->ctx;
4824 int res;
4825 struct todo_item *item = todo_list->items + todo_list->current;
4826 const char *arg = todo_item_get_arg(todo_list, item);
4827 if (is_rebase_i(opts))
4828 ctx->reflog_message = reflog_message(
4829 opts, command_to_string(item->command), NULL);
4831 res = do_pick_commit(r, item, opts, is_final_fixup(todo_list),
4832 check_todo);
4833 if (is_rebase_i(opts) && res < 0) {
4834 /* Reschedule */
4835 *reschedule = 1;
4836 return -1;
4838 if (item->command == TODO_EDIT) {
4839 struct commit *commit = item->commit;
4840 if (!res) {
4841 if (!opts->verbose)
4842 term_clear_line();
4843 fprintf(stderr, _("Stopped at %s... %.*s\n"),
4844 short_commit_name(r, commit), item->arg_len, arg);
4846 return error_with_patch(r, commit,
4847 arg, item->arg_len, opts, res, !res);
4849 if (is_rebase_i(opts) && !res)
4850 record_in_rewritten(&item->commit->object.oid,
4851 peek_command(todo_list, 1));
4852 if (res && is_fixup(item->command)) {
4853 if (res == 1)
4854 intend_to_amend();
4855 return error_failed_squash(r, item->commit, opts,
4856 item->arg_len, arg);
4857 } else if (res && is_rebase_i(opts) && item->commit) {
4858 int to_amend = 0;
4859 struct object_id oid;
4862 * If we are rewording and have either
4863 * fast-forwarded already, or are about to
4864 * create a new root commit, we want to amend,
4865 * otherwise we do not.
4867 if (item->command == TODO_REWORD &&
4868 !repo_get_oid(r, "HEAD", &oid) &&
4869 (oideq(&item->commit->object.oid, &oid) ||
4870 (opts->have_squash_onto &&
4871 oideq(&opts->squash_onto, &oid))))
4872 to_amend = 1;
4874 return res | error_with_patch(r, item->commit,
4875 arg, item->arg_len, opts,
4876 res, to_amend);
4878 return res;
4881 static int pick_commits(struct repository *r,
4882 struct todo_list *todo_list,
4883 struct replay_opts *opts)
4885 struct replay_ctx *ctx = opts->ctx;
4886 int res = 0, reschedule = 0;
4888 ctx->reflog_message = sequencer_reflog_action(opts);
4889 if (opts->allow_ff)
4890 assert(!(opts->signoff || opts->no_commit ||
4891 opts->record_origin || should_edit(opts) ||
4892 opts->committer_date_is_author_date ||
4893 opts->ignore_date));
4894 if (read_and_refresh_cache(r, opts))
4895 return -1;
4897 unlink(rebase_path_message());
4898 unlink(rebase_path_stopped_sha());
4899 unlink(rebase_path_amend());
4900 unlink(rebase_path_patch());
4902 while (todo_list->current < todo_list->nr) {
4903 struct todo_item *item = todo_list->items + todo_list->current;
4904 const char *arg = todo_item_get_arg(todo_list, item);
4905 int check_todo = 0;
4907 if (save_todo(todo_list, opts, reschedule))
4908 return -1;
4909 if (is_rebase_i(opts)) {
4910 if (item->command != TODO_COMMENT) {
4911 FILE *f = fopen(rebase_path_msgnum(), "w");
4913 todo_list->done_nr++;
4915 if (f) {
4916 fprintf(f, "%d\n", todo_list->done_nr);
4917 fclose(f);
4919 if (!opts->quiet)
4920 fprintf(stderr, _("Rebasing (%d/%d)%s"),
4921 todo_list->done_nr,
4922 todo_list->total_nr,
4923 opts->verbose ? "\n" : "\r");
4925 unlink(rebase_path_author_script());
4926 unlink(git_path_merge_head(r));
4927 refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
4928 NULL, REF_NO_DEREF);
4929 refs_delete_ref(get_main_ref_store(r), "", "REBASE_HEAD",
4930 NULL, REF_NO_DEREF);
4932 if (item->command == TODO_BREAK) {
4933 if (!opts->verbose)
4934 term_clear_line();
4935 return stopped_at_head(r);
4938 strbuf_reset(&ctx->message);
4939 ctx->have_message = 0;
4940 if (item->command <= TODO_SQUASH) {
4941 res = pick_one_commit(r, todo_list, opts, &check_todo,
4942 &reschedule);
4943 if (!res && item->command == TODO_EDIT)
4944 return 0;
4945 } else if (item->command == TODO_EXEC) {
4946 char *end_of_arg = (char *)(arg + item->arg_len);
4947 int saved = *end_of_arg;
4949 if (!opts->verbose)
4950 term_clear_line();
4951 *end_of_arg = '\0';
4952 res = do_exec(r, arg);
4953 *end_of_arg = saved;
4955 if (res) {
4956 if (opts->reschedule_failed_exec)
4957 reschedule = 1;
4959 check_todo = 1;
4960 } else if (item->command == TODO_LABEL) {
4961 if ((res = do_label(r, arg, item->arg_len)))
4962 reschedule = 1;
4963 } else if (item->command == TODO_RESET) {
4964 if ((res = do_reset(r, arg, item->arg_len, opts)))
4965 reschedule = 1;
4966 } else if (item->command == TODO_MERGE) {
4967 if ((res = do_merge(r, item->commit, arg, item->arg_len,
4968 item->flags, &check_todo, opts)) < 0)
4969 reschedule = 1;
4970 else if (item->commit)
4971 record_in_rewritten(&item->commit->object.oid,
4972 peek_command(todo_list, 1));
4973 if (res > 0)
4974 /* failed with merge conflicts */
4975 return error_with_patch(r, item->commit,
4976 arg, item->arg_len,
4977 opts, res, 0);
4978 } else if (item->command == TODO_UPDATE_REF) {
4979 struct strbuf ref = STRBUF_INIT;
4980 strbuf_add(&ref, arg, item->arg_len);
4981 if ((res = do_update_ref(r, ref.buf)))
4982 reschedule = 1;
4983 strbuf_release(&ref);
4984 } else if (!is_noop(item->command))
4985 return error(_("unknown command %d"), item->command);
4987 if (reschedule) {
4988 advise(_(rescheduled_advice),
4989 get_item_line_length(todo_list,
4990 todo_list->current),
4991 get_item_line(todo_list, todo_list->current));
4992 if (save_todo(todo_list, opts, reschedule))
4993 return -1;
4994 if (item->commit)
4995 write_rebase_head(&item->commit->object.oid);
4996 } else if (is_rebase_i(opts) && check_todo && !res &&
4997 reread_todo_if_changed(r, todo_list, opts)) {
4998 return -1;
5001 if (res)
5002 return res;
5004 todo_list->current++;
5007 if (is_rebase_i(opts)) {
5008 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
5009 struct stat st;
5011 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
5012 starts_with(head_ref.buf, "refs/")) {
5013 const char *msg;
5014 struct object_id head, orig;
5015 int res;
5017 if (repo_get_oid(r, "HEAD", &head)) {
5018 res = error(_("cannot read HEAD"));
5019 cleanup_head_ref:
5020 strbuf_release(&head_ref);
5021 strbuf_release(&buf);
5022 return res;
5024 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
5025 get_oid_hex(buf.buf, &orig)) {
5026 res = error(_("could not read orig-head"));
5027 goto cleanup_head_ref;
5029 strbuf_reset(&buf);
5030 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
5031 res = error(_("could not read 'onto'"));
5032 goto cleanup_head_ref;
5034 msg = reflog_message(opts, "finish", "%s onto %s",
5035 head_ref.buf, buf.buf);
5036 if (refs_update_ref(get_main_ref_store(the_repository), msg, head_ref.buf, &head, &orig,
5037 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
5038 res = error(_("could not update %s"),
5039 head_ref.buf);
5040 goto cleanup_head_ref;
5042 msg = reflog_message(opts, "finish", "returning to %s",
5043 head_ref.buf);
5044 if (refs_update_symref(get_main_ref_store(the_repository), "HEAD", head_ref.buf, msg)) {
5045 res = error(_("could not update HEAD to %s"),
5046 head_ref.buf);
5047 goto cleanup_head_ref;
5049 strbuf_reset(&buf);
5052 if (opts->verbose) {
5053 struct rev_info log_tree_opt;
5054 struct object_id orig, head;
5056 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
5057 repo_init_revisions(r, &log_tree_opt, NULL);
5058 log_tree_opt.diff = 1;
5059 log_tree_opt.diffopt.output_format =
5060 DIFF_FORMAT_DIFFSTAT;
5061 log_tree_opt.disable_stdin = 1;
5063 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
5064 !repo_get_oid(r, buf.buf, &orig) &&
5065 !repo_get_oid(r, "HEAD", &head)) {
5066 diff_tree_oid(&orig, &head, "",
5067 &log_tree_opt.diffopt);
5068 log_tree_diff_flush(&log_tree_opt);
5070 release_revisions(&log_tree_opt);
5072 flush_rewritten_pending();
5073 if (!stat(rebase_path_rewritten_list(), &st) &&
5074 st.st_size > 0) {
5075 struct child_process child = CHILD_PROCESS_INIT;
5076 struct run_hooks_opt hook_opt = RUN_HOOKS_OPT_INIT;
5078 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
5079 child.git_cmd = 1;
5080 strvec_push(&child.args, "notes");
5081 strvec_push(&child.args, "copy");
5082 strvec_push(&child.args, "--for-rewrite=rebase");
5083 /* we don't care if this copying failed */
5084 run_command(&child);
5086 hook_opt.path_to_stdin = rebase_path_rewritten_list();
5087 strvec_push(&hook_opt.args, "rebase");
5088 run_hooks_opt("post-rewrite", &hook_opt);
5090 apply_autostash(rebase_path_autostash());
5092 if (!opts->quiet) {
5093 if (!opts->verbose)
5094 term_clear_line();
5095 fprintf(stderr,
5096 _("Successfully rebased and updated %s.\n"),
5097 head_ref.buf);
5100 strbuf_release(&buf);
5101 strbuf_release(&head_ref);
5103 if (do_update_refs(r, opts->quiet))
5104 return -1;
5108 * Sequence of picks finished successfully; cleanup by
5109 * removing the .git/sequencer directory
5111 return sequencer_remove_state(opts);
5114 static int continue_single_pick(struct repository *r, struct replay_opts *opts)
5116 struct child_process cmd = CHILD_PROCESS_INIT;
5118 if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
5119 !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
5120 return error(_("no cherry-pick or revert in progress"));
5122 cmd.git_cmd = 1;
5123 strvec_push(&cmd.args, "commit");
5126 * continue_single_pick() handles the case of recovering from a
5127 * conflict. should_edit() doesn't handle that case; for a conflict,
5128 * we want to edit if the user asked for it, or if they didn't specify
5129 * and stdin is a tty.
5131 if (!opts->edit || (opts->edit < 0 && !isatty(0)))
5133 * Include --cleanup=strip as well because we don't want the
5134 * "# Conflicts:" messages.
5136 strvec_pushl(&cmd.args, "--no-edit", "--cleanup=strip", NULL);
5138 return run_command(&cmd);
5141 static int commit_staged_changes(struct repository *r,
5142 struct replay_opts *opts,
5143 struct todo_list *todo_list)
5145 struct replay_ctx *ctx = opts->ctx;
5146 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
5147 unsigned int final_fixup = 0, is_clean;
5149 if (has_unstaged_changes(r, 1))
5150 return error(_("cannot rebase: You have unstaged changes."));
5152 is_clean = !has_uncommitted_changes(r, 0);
5154 if (!is_clean && !file_exists(rebase_path_message())) {
5155 const char *gpg_opt = gpg_sign_opt_quoted(opts);
5157 return error(_(staged_changes_advice), gpg_opt, gpg_opt);
5159 if (file_exists(rebase_path_amend())) {
5160 struct strbuf rev = STRBUF_INIT;
5161 struct object_id head, to_amend;
5163 if (repo_get_oid(r, "HEAD", &head))
5164 return error(_("cannot amend non-existing commit"));
5165 if (!read_oneliner(&rev, rebase_path_amend(), 0))
5166 return error(_("invalid file: '%s'"), rebase_path_amend());
5167 if (get_oid_hex(rev.buf, &to_amend))
5168 return error(_("invalid contents: '%s'"),
5169 rebase_path_amend());
5170 if (!is_clean && !oideq(&head, &to_amend))
5171 return error(_("\nYou have uncommitted changes in your "
5172 "working tree. Please, commit them\n"
5173 "first and then run 'git rebase "
5174 "--continue' again."));
5176 * When skipping a failed fixup/squash, we need to edit the
5177 * commit message, the current fixup list and count, and if it
5178 * was the last fixup/squash in the chain, we need to clean up
5179 * the commit message and if there was a squash, let the user
5180 * edit it.
5182 if (!is_clean || !ctx->current_fixup_count)
5183 ; /* this is not the final fixup */
5184 else if (!oideq(&head, &to_amend) ||
5185 !file_exists(rebase_path_stopped_sha())) {
5186 /* was a final fixup or squash done manually? */
5187 if (!is_fixup(peek_command(todo_list, 0))) {
5188 unlink(rebase_path_fixup_msg());
5189 unlink(rebase_path_squash_msg());
5190 unlink(rebase_path_current_fixups());
5191 strbuf_reset(&ctx->current_fixups);
5192 ctx->current_fixup_count = 0;
5194 } else {
5195 /* we are in a fixup/squash chain */
5196 const char *p = ctx->current_fixups.buf;
5197 int len = ctx->current_fixups.len;
5199 ctx->current_fixup_count--;
5200 if (!len)
5201 BUG("Incorrect current_fixups:\n%s", p);
5202 while (len && p[len - 1] != '\n')
5203 len--;
5204 strbuf_setlen(&ctx->current_fixups, len);
5205 if (write_message(p, len, rebase_path_current_fixups(),
5206 0) < 0)
5207 return error(_("could not write file: '%s'"),
5208 rebase_path_current_fixups());
5211 * If a fixup/squash in a fixup/squash chain failed, the
5212 * commit message is already correct, no need to commit
5213 * it again.
5215 * Only if it is the final command in the fixup/squash
5216 * chain, and only if the chain is longer than a single
5217 * fixup/squash command (which was just skipped), do we
5218 * actually need to re-commit with a cleaned up commit
5219 * message.
5221 if (ctx->current_fixup_count > 0 &&
5222 !is_fixup(peek_command(todo_list, 0))) {
5223 final_fixup = 1;
5225 * If there was not a single "squash" in the
5226 * chain, we only need to clean up the commit
5227 * message, no need to bother the user with
5228 * opening the commit message in the editor.
5230 if (!starts_with(p, "squash ") &&
5231 !strstr(p, "\nsquash "))
5232 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
5233 } else if (is_fixup(peek_command(todo_list, 0))) {
5235 * We need to update the squash message to skip
5236 * the latest commit message.
5238 int res = 0;
5239 struct commit *commit;
5240 const char *msg;
5241 const char *path = rebase_path_squash_msg();
5242 const char *encoding = get_commit_output_encoding();
5244 if (parse_head(r, &commit))
5245 return error(_("could not parse HEAD"));
5247 p = repo_logmsg_reencode(r, commit, NULL, encoding);
5248 if (!p) {
5249 res = error(_("could not parse commit %s"),
5250 oid_to_hex(&commit->object.oid));
5251 goto unuse_commit_buffer;
5253 find_commit_subject(p, &msg);
5254 if (write_message(msg, strlen(msg), path, 0)) {
5255 res = error(_("could not write file: "
5256 "'%s'"), path);
5257 goto unuse_commit_buffer;
5259 unuse_commit_buffer:
5260 repo_unuse_commit_buffer(r, commit, p);
5261 if (res)
5262 return res;
5266 strbuf_release(&rev);
5267 flags |= AMEND_MSG;
5270 if (is_clean) {
5271 if (refs_ref_exists(get_main_ref_store(r),
5272 "CHERRY_PICK_HEAD") &&
5273 refs_delete_ref(get_main_ref_store(r), "",
5274 "CHERRY_PICK_HEAD", NULL, REF_NO_DEREF))
5275 return error(_("could not remove CHERRY_PICK_HEAD"));
5276 if (unlink(git_path_merge_msg(r)) && errno != ENOENT)
5277 return error_errno(_("could not remove '%s'"),
5278 git_path_merge_msg(r));
5279 if (!final_fixup)
5280 return 0;
5283 if (run_git_commit(final_fixup ? NULL : rebase_path_message(),
5284 opts, flags))
5285 return error(_("could not commit staged changes."));
5286 unlink(rebase_path_amend());
5287 unlink(git_path_merge_head(r));
5288 refs_delete_ref(get_main_ref_store(r), "", "AUTO_MERGE",
5289 NULL, REF_NO_DEREF);
5290 if (final_fixup) {
5291 unlink(rebase_path_fixup_msg());
5292 unlink(rebase_path_squash_msg());
5294 if (ctx->current_fixup_count > 0) {
5296 * Whether final fixup or not, we just cleaned up the commit
5297 * message...
5299 unlink(rebase_path_current_fixups());
5300 strbuf_reset(&ctx->current_fixups);
5301 ctx->current_fixup_count = 0;
5303 return 0;
5306 int sequencer_continue(struct repository *r, struct replay_opts *opts)
5308 struct replay_ctx *ctx = opts->ctx;
5309 struct todo_list todo_list = TODO_LIST_INIT;
5310 int res;
5312 if (read_and_refresh_cache(r, opts))
5313 return -1;
5315 if (read_populate_opts(opts))
5316 return -1;
5317 if (is_rebase_i(opts)) {
5318 if ((res = read_populate_todo(r, &todo_list, opts)))
5319 goto release_todo_list;
5321 if (file_exists(rebase_path_dropped())) {
5322 if ((res = todo_list_check_against_backup(r, &todo_list)))
5323 goto release_todo_list;
5325 unlink(rebase_path_dropped());
5328 ctx->reflog_message = reflog_message(opts, "continue", NULL);
5329 if (commit_staged_changes(r, opts, &todo_list)) {
5330 res = -1;
5331 goto release_todo_list;
5333 } else if (!file_exists(get_todo_path(opts)))
5334 return continue_single_pick(r, opts);
5335 else if ((res = read_populate_todo(r, &todo_list, opts)))
5336 goto release_todo_list;
5338 if (!is_rebase_i(opts)) {
5339 /* Verify that the conflict has been resolved */
5340 if (refs_ref_exists(get_main_ref_store(r),
5341 "CHERRY_PICK_HEAD") ||
5342 refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
5343 res = continue_single_pick(r, opts);
5344 if (res)
5345 goto release_todo_list;
5347 if (index_differs_from(r, "HEAD", NULL, 0)) {
5348 res = error_dirty_index(r, opts);
5349 goto release_todo_list;
5351 todo_list.current++;
5352 } else if (file_exists(rebase_path_stopped_sha())) {
5353 struct strbuf buf = STRBUF_INIT;
5354 struct object_id oid;
5356 if (read_oneliner(&buf, rebase_path_stopped_sha(),
5357 READ_ONELINER_SKIP_IF_EMPTY) &&
5358 !get_oid_hex(buf.buf, &oid))
5359 record_in_rewritten(&oid, peek_command(&todo_list, 0));
5360 strbuf_release(&buf);
5363 res = pick_commits(r, &todo_list, opts);
5364 release_todo_list:
5365 todo_list_release(&todo_list);
5366 return res;
5369 static int single_pick(struct repository *r,
5370 struct commit *cmit,
5371 struct replay_opts *opts)
5373 int check_todo;
5374 struct todo_item item;
5376 item.command = opts->action == REPLAY_PICK ?
5377 TODO_PICK : TODO_REVERT;
5378 item.commit = cmit;
5380 opts->ctx->reflog_message = sequencer_reflog_action(opts);
5381 return do_pick_commit(r, &item, opts, 0, &check_todo);
5384 int sequencer_pick_revisions(struct repository *r,
5385 struct replay_opts *opts)
5387 struct todo_list todo_list = TODO_LIST_INIT;
5388 struct object_id oid;
5389 int i, res;
5391 assert(opts->revs);
5392 if (read_and_refresh_cache(r, opts))
5393 return -1;
5395 for (i = 0; i < opts->revs->pending.nr; i++) {
5396 struct object_id oid;
5397 const char *name = opts->revs->pending.objects[i].name;
5399 /* This happens when using --stdin. */
5400 if (!strlen(name))
5401 continue;
5403 if (!repo_get_oid(r, name, &oid)) {
5404 if (!lookup_commit_reference_gently(r, &oid, 1)) {
5405 enum object_type type = oid_object_info(r,
5406 &oid,
5407 NULL);
5408 return error(_("%s: can't cherry-pick a %s"),
5409 name, type_name(type));
5411 } else
5412 return error(_("%s: bad revision"), name);
5416 * If we were called as "git cherry-pick <commit>", just
5417 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
5418 * REVERT_HEAD, and don't touch the sequencer state.
5419 * This means it is possible to cherry-pick in the middle
5420 * of a cherry-pick sequence.
5422 if (opts->revs->cmdline.nr == 1 &&
5423 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
5424 opts->revs->no_walk &&
5425 !opts->revs->cmdline.rev->flags) {
5426 struct commit *cmit;
5427 if (prepare_revision_walk(opts->revs))
5428 return error(_("revision walk setup failed"));
5429 cmit = get_revision(opts->revs);
5430 if (!cmit)
5431 return error(_("empty commit set passed"));
5432 if (get_revision(opts->revs))
5433 BUG("unexpected extra commit from walk");
5434 return single_pick(r, cmit, opts);
5438 * Start a new cherry-pick/ revert sequence; but
5439 * first, make sure that an existing one isn't in
5440 * progress
5443 if (walk_revs_populate_todo(&todo_list, opts) ||
5444 create_seq_dir(r) < 0)
5445 return -1;
5446 if (repo_get_oid(r, "HEAD", &oid) && (opts->action == REPLAY_REVERT))
5447 return error(_("can't revert as initial commit"));
5448 if (save_head(oid_to_hex(&oid)))
5449 return -1;
5450 if (save_opts(opts))
5451 return -1;
5452 update_abort_safety_file();
5453 res = pick_commits(r, &todo_list, opts);
5454 todo_list_release(&todo_list);
5455 return res;
5458 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
5460 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
5461 struct strbuf sob = STRBUF_INIT;
5462 int has_footer;
5464 strbuf_addstr(&sob, sign_off_header);
5465 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
5466 strbuf_addch(&sob, '\n');
5468 if (!ignore_footer)
5469 strbuf_complete_line(msgbuf);
5472 * If the whole message buffer is equal to the sob, pretend that we
5473 * found a conforming footer with a matching sob
5475 if (msgbuf->len - ignore_footer == sob.len &&
5476 !strncmp(msgbuf->buf, sob.buf, sob.len))
5477 has_footer = 3;
5478 else
5479 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
5481 if (!has_footer) {
5482 const char *append_newlines = NULL;
5483 size_t len = msgbuf->len - ignore_footer;
5485 if (!len) {
5487 * The buffer is completely empty. Leave foom for
5488 * the title and body to be filled in by the user.
5490 append_newlines = "\n\n";
5491 } else if (len == 1) {
5493 * Buffer contains a single newline. Add another
5494 * so that we leave room for the title and body.
5496 append_newlines = "\n";
5497 } else if (msgbuf->buf[len - 2] != '\n') {
5499 * Buffer ends with a single newline. Add another
5500 * so that there is an empty line between the message
5501 * body and the sob.
5503 append_newlines = "\n";
5504 } /* else, the buffer already ends with two newlines. */
5506 if (append_newlines)
5507 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5508 append_newlines, strlen(append_newlines));
5511 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
5512 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5513 sob.buf, sob.len);
5515 strbuf_release(&sob);
5518 struct labels_entry {
5519 struct hashmap_entry entry;
5520 char label[FLEX_ARRAY];
5523 static int labels_cmp(const void *fndata UNUSED,
5524 const struct hashmap_entry *eptr,
5525 const struct hashmap_entry *entry_or_key, const void *key)
5527 const struct labels_entry *a, *b;
5529 a = container_of(eptr, const struct labels_entry, entry);
5530 b = container_of(entry_or_key, const struct labels_entry, entry);
5532 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
5535 struct string_entry {
5536 struct oidmap_entry entry;
5537 char string[FLEX_ARRAY];
5540 struct label_state {
5541 struct oidmap commit2label;
5542 struct hashmap labels;
5543 struct strbuf buf;
5544 int max_label_length;
5547 static const char *label_oid(struct object_id *oid, const char *label,
5548 struct label_state *state)
5550 struct labels_entry *labels_entry;
5551 struct string_entry *string_entry;
5552 struct object_id dummy;
5553 int i;
5555 string_entry = oidmap_get(&state->commit2label, oid);
5556 if (string_entry)
5557 return string_entry->string;
5560 * For "uninteresting" commits, i.e. commits that are not to be
5561 * rebased, and which can therefore not be labeled, we use a unique
5562 * abbreviation of the commit name. This is slightly more complicated
5563 * than calling repo_find_unique_abbrev() because we also need to make
5564 * sure that the abbreviation does not conflict with any other
5565 * label.
5567 * We disallow "interesting" commits to be labeled by a string that
5568 * is a valid full-length hash, to ensure that we always can find an
5569 * abbreviation for any uninteresting commit's names that does not
5570 * clash with any other label.
5572 strbuf_reset(&state->buf);
5573 if (!label) {
5574 char *p;
5576 strbuf_grow(&state->buf, GIT_MAX_HEXSZ);
5577 label = p = state->buf.buf;
5579 repo_find_unique_abbrev_r(the_repository, p, oid,
5580 default_abbrev);
5583 * We may need to extend the abbreviated hash so that there is
5584 * no conflicting label.
5586 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
5587 size_t i = strlen(p) + 1;
5589 oid_to_hex_r(p, oid);
5590 for (; i < the_hash_algo->hexsz; i++) {
5591 char save = p[i];
5592 p[i] = '\0';
5593 if (!hashmap_get_from_hash(&state->labels,
5594 strihash(p), p))
5595 break;
5596 p[i] = save;
5599 } else {
5600 struct strbuf *buf = &state->buf;
5601 int label_is_utf8 = 1; /* start with this assumption */
5602 size_t max_len = buf->len + state->max_label_length;
5605 * Sanitize labels by replacing non-alpha-numeric characters
5606 * (including white-space ones) by dashes, as they might be
5607 * illegal in file names (and hence in ref names).
5609 * Note that we retain non-ASCII UTF-8 characters (identified
5610 * via the most significant bit). They should be all acceptable
5611 * in file names.
5613 * As we will use the labels as names of (loose) refs, it is
5614 * vital that the name not be longer than the maximum component
5615 * size of the file system (`NAME_MAX`). We are careful to
5616 * truncate the label accordingly, allowing for the `.lock`
5617 * suffix and for the label to be UTF-8 encoded (i.e. we avoid
5618 * truncating in the middle of a character).
5620 for (; *label && buf->len + 1 < max_len; label++)
5621 if (isalnum(*label) ||
5622 (!label_is_utf8 && (*label & 0x80)))
5623 strbuf_addch(buf, *label);
5624 else if (*label & 0x80) {
5625 const char *p = label;
5627 utf8_width(&p, NULL);
5628 if (p) {
5629 if (buf->len + (p - label) > max_len)
5630 break;
5631 strbuf_add(buf, label, p - label);
5632 label = p - 1;
5633 } else {
5634 label_is_utf8 = 0;
5635 strbuf_addch(buf, *label);
5637 /* avoid leading dash and double-dashes */
5638 } else if (buf->len && buf->buf[buf->len - 1] != '-')
5639 strbuf_addch(buf, '-');
5640 if (!buf->len) {
5641 strbuf_addstr(buf, "rev-");
5642 strbuf_add_unique_abbrev(buf, oid, default_abbrev);
5644 label = buf->buf;
5646 if ((buf->len == the_hash_algo->hexsz &&
5647 !get_oid_hex(label, &dummy)) ||
5648 (buf->len == 1 && *label == '#') ||
5649 hashmap_get_from_hash(&state->labels,
5650 strihash(label), label)) {
5652 * If the label already exists, or if the label is a
5653 * valid full OID, or the label is a '#' (which we use
5654 * as a separator between merge heads and oneline), we
5655 * append a dash and a number to make it unique.
5657 size_t len = buf->len;
5659 for (i = 2; ; i++) {
5660 strbuf_setlen(buf, len);
5661 strbuf_addf(buf, "-%d", i);
5662 if (!hashmap_get_from_hash(&state->labels,
5663 strihash(buf->buf),
5664 buf->buf))
5665 break;
5668 label = buf->buf;
5672 FLEX_ALLOC_STR(labels_entry, label, label);
5673 hashmap_entry_init(&labels_entry->entry, strihash(label));
5674 hashmap_add(&state->labels, &labels_entry->entry);
5676 FLEX_ALLOC_STR(string_entry, string, label);
5677 oidcpy(&string_entry->entry.oid, oid);
5678 oidmap_put(&state->commit2label, string_entry);
5680 return string_entry->string;
5683 static int make_script_with_merges(struct pretty_print_context *pp,
5684 struct rev_info *revs, struct strbuf *out,
5685 unsigned flags)
5687 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
5688 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
5689 int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
5690 int skipped_commit = 0;
5691 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
5692 struct strbuf label = STRBUF_INIT;
5693 struct commit_list *commits = NULL, **tail = &commits, *iter;
5694 struct commit_list *tips = NULL, **tips_tail = &tips;
5695 struct commit *commit;
5696 struct oidmap commit2todo = OIDMAP_INIT;
5697 struct string_entry *entry;
5698 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
5699 shown = OIDSET_INIT;
5700 struct label_state state =
5701 { OIDMAP_INIT, { NULL }, STRBUF_INIT, GIT_MAX_LABEL_LENGTH };
5703 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
5704 const char *cmd_pick = abbr ? "p" : "pick",
5705 *cmd_label = abbr ? "l" : "label",
5706 *cmd_reset = abbr ? "t" : "reset",
5707 *cmd_merge = abbr ? "m" : "merge";
5709 git_config_get_int("rebase.maxlabellength", &state.max_label_length);
5711 oidmap_init(&commit2todo, 0);
5712 oidmap_init(&state.commit2label, 0);
5713 hashmap_init(&state.labels, labels_cmp, NULL, 0);
5714 strbuf_init(&state.buf, 32);
5716 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
5717 struct labels_entry *onto_label_entry;
5718 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
5719 FLEX_ALLOC_STR(entry, string, "onto");
5720 oidcpy(&entry->entry.oid, oid);
5721 oidmap_put(&state.commit2label, entry);
5723 FLEX_ALLOC_STR(onto_label_entry, label, "onto");
5724 hashmap_entry_init(&onto_label_entry->entry, strihash("onto"));
5725 hashmap_add(&state.labels, &onto_label_entry->entry);
5729 * First phase:
5730 * - get onelines for all commits
5731 * - gather all branch tips (i.e. 2nd or later parents of merges)
5732 * - label all branch tips
5734 while ((commit = get_revision(revs))) {
5735 struct commit_list *to_merge;
5736 const char *p1, *p2;
5737 struct object_id *oid;
5738 int is_empty;
5740 tail = &commit_list_insert(commit, tail)->next;
5741 oidset_insert(&interesting, &commit->object.oid);
5743 is_empty = is_original_commit_empty(commit);
5744 if (!is_empty && (commit->object.flags & PATCHSAME)) {
5745 if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
5746 warning(_("skipped previously applied commit %s"),
5747 short_commit_name(the_repository, commit));
5748 skipped_commit = 1;
5749 continue;
5751 if (is_empty && !keep_empty)
5752 continue;
5754 strbuf_reset(&oneline);
5755 pretty_print_commit(pp, commit, &oneline);
5757 to_merge = commit->parents ? commit->parents->next : NULL;
5758 if (!to_merge) {
5759 /* non-merge commit: easy case */
5760 strbuf_reset(&buf);
5761 strbuf_addf(&buf, "%s %s %s", cmd_pick,
5762 oid_to_hex(&commit->object.oid),
5763 oneline.buf);
5764 if (is_empty)
5765 strbuf_addf(&buf, " %s empty",
5766 comment_line_str);
5768 FLEX_ALLOC_STR(entry, string, buf.buf);
5769 oidcpy(&entry->entry.oid, &commit->object.oid);
5770 oidmap_put(&commit2todo, entry);
5772 continue;
5775 /* Create a label */
5776 strbuf_reset(&label);
5777 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
5778 (p1 = strchr(p1, '\'')) &&
5779 (p2 = strchr(++p1, '\'')))
5780 strbuf_add(&label, p1, p2 - p1);
5781 else if (skip_prefix(oneline.buf, "Merge pull request ",
5782 &p1) &&
5783 (p1 = strstr(p1, " from ")))
5784 strbuf_addstr(&label, p1 + strlen(" from "));
5785 else
5786 strbuf_addbuf(&label, &oneline);
5788 strbuf_reset(&buf);
5789 strbuf_addf(&buf, "%s -C %s",
5790 cmd_merge, oid_to_hex(&commit->object.oid));
5792 /* label the tips of merged branches */
5793 for (; to_merge; to_merge = to_merge->next) {
5794 oid = &to_merge->item->object.oid;
5795 strbuf_addch(&buf, ' ');
5797 if (!oidset_contains(&interesting, oid)) {
5798 strbuf_addstr(&buf, label_oid(oid, NULL,
5799 &state));
5800 continue;
5803 tips_tail = &commit_list_insert(to_merge->item,
5804 tips_tail)->next;
5806 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
5808 strbuf_addf(&buf, " # %s", oneline.buf);
5810 FLEX_ALLOC_STR(entry, string, buf.buf);
5811 oidcpy(&entry->entry.oid, &commit->object.oid);
5812 oidmap_put(&commit2todo, entry);
5814 if (skipped_commit)
5815 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
5816 _("use --reapply-cherry-picks to include skipped commits"));
5819 * Second phase:
5820 * - label branch points
5821 * - add HEAD to the branch tips
5823 for (iter = commits; iter; iter = iter->next) {
5824 struct commit_list *parent = iter->item->parents;
5825 for (; parent; parent = parent->next) {
5826 struct object_id *oid = &parent->item->object.oid;
5827 if (!oidset_contains(&interesting, oid))
5828 continue;
5829 if (oidset_insert(&child_seen, oid))
5830 label_oid(oid, "branch-point", &state);
5833 /* Add HEAD as implicit "tip of branch" */
5834 if (!iter->next)
5835 tips_tail = &commit_list_insert(iter->item,
5836 tips_tail)->next;
5840 * Third phase: output the todo list. This is a bit tricky, as we
5841 * want to avoid jumping back and forth between revisions. To
5842 * accomplish that goal, we walk backwards from the branch tips,
5843 * gathering commits not yet shown, reversing the list on the fly,
5844 * then outputting that list (labeling revisions as needed).
5846 strbuf_addf(out, "%s onto\n", cmd_label);
5847 for (iter = tips; iter; iter = iter->next) {
5848 struct commit_list *list = NULL, *iter2;
5850 commit = iter->item;
5851 if (oidset_contains(&shown, &commit->object.oid))
5852 continue;
5853 entry = oidmap_get(&state.commit2label, &commit->object.oid);
5855 if (entry)
5856 strbuf_addf(out, "\n%s Branch %s\n", comment_line_str, entry->string);
5857 else
5858 strbuf_addch(out, '\n');
5860 while (oidset_contains(&interesting, &commit->object.oid) &&
5861 !oidset_contains(&shown, &commit->object.oid)) {
5862 commit_list_insert(commit, &list);
5863 if (!commit->parents) {
5864 commit = NULL;
5865 break;
5867 commit = commit->parents->item;
5870 if (!commit)
5871 strbuf_addf(out, "%s %s\n", cmd_reset,
5872 rebase_cousins || root_with_onto ?
5873 "onto" : "[new root]");
5874 else {
5875 const char *to = NULL;
5877 entry = oidmap_get(&state.commit2label,
5878 &commit->object.oid);
5879 if (entry)
5880 to = entry->string;
5881 else if (!rebase_cousins)
5882 to = label_oid(&commit->object.oid, NULL,
5883 &state);
5885 if (!to || !strcmp(to, "onto"))
5886 strbuf_addf(out, "%s onto\n", cmd_reset);
5887 else {
5888 strbuf_reset(&oneline);
5889 pretty_print_commit(pp, commit, &oneline);
5890 strbuf_addf(out, "%s %s # %s\n",
5891 cmd_reset, to, oneline.buf);
5895 for (iter2 = list; iter2; iter2 = iter2->next) {
5896 struct object_id *oid = &iter2->item->object.oid;
5897 entry = oidmap_get(&commit2todo, oid);
5898 /* only show if not already upstream */
5899 if (entry)
5900 strbuf_addf(out, "%s\n", entry->string);
5901 entry = oidmap_get(&state.commit2label, oid);
5902 if (entry)
5903 strbuf_addf(out, "%s %s\n",
5904 cmd_label, entry->string);
5905 oidset_insert(&shown, oid);
5908 free_commit_list(list);
5911 free_commit_list(commits);
5912 free_commit_list(tips);
5914 strbuf_release(&label);
5915 strbuf_release(&oneline);
5916 strbuf_release(&buf);
5918 oidmap_free(&commit2todo, 1);
5919 oidmap_free(&state.commit2label, 1);
5920 hashmap_clear_and_free(&state.labels, struct labels_entry, entry);
5921 strbuf_release(&state.buf);
5923 return 0;
5926 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
5927 const char **argv, unsigned flags)
5929 char *format = NULL;
5930 struct pretty_print_context pp = {0};
5931 struct rev_info revs;
5932 struct commit *commit;
5933 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
5934 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
5935 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
5936 int reapply_cherry_picks = flags & TODO_LIST_REAPPLY_CHERRY_PICKS;
5937 int skipped_commit = 0;
5938 int ret = 0;
5940 repo_init_revisions(r, &revs, NULL);
5941 revs.verbose_header = 1;
5942 if (!rebase_merges)
5943 revs.max_parents = 1;
5944 revs.cherry_mark = !reapply_cherry_picks;
5945 revs.limited = 1;
5946 revs.reverse = 1;
5947 revs.right_only = 1;
5948 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
5949 revs.topo_order = 1;
5951 revs.pretty_given = 1;
5952 git_config_get_string("rebase.instructionFormat", &format);
5953 if (!format || !*format) {
5954 free(format);
5955 format = xstrdup("%s");
5957 get_commit_format(format, &revs);
5958 free(format);
5959 pp.fmt = revs.commit_format;
5960 pp.output_encoding = get_log_output_encoding();
5962 if (setup_revisions(argc, argv, &revs, NULL) > 1) {
5963 ret = error(_("make_script: unhandled options"));
5964 goto cleanup;
5967 if (prepare_revision_walk(&revs) < 0) {
5968 ret = error(_("make_script: error preparing revisions"));
5969 goto cleanup;
5972 if (rebase_merges) {
5973 ret = make_script_with_merges(&pp, &revs, out, flags);
5974 goto cleanup;
5977 while ((commit = get_revision(&revs))) {
5978 int is_empty = is_original_commit_empty(commit);
5980 if (!is_empty && (commit->object.flags & PATCHSAME)) {
5981 if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
5982 warning(_("skipped previously applied commit %s"),
5983 short_commit_name(r, commit));
5984 skipped_commit = 1;
5985 continue;
5987 if (is_empty && !keep_empty)
5988 continue;
5989 strbuf_addf(out, "%s %s ", insn,
5990 oid_to_hex(&commit->object.oid));
5991 pretty_print_commit(&pp, commit, out);
5992 if (is_empty)
5993 strbuf_addf(out, " %s empty", comment_line_str);
5994 strbuf_addch(out, '\n');
5996 if (skipped_commit)
5997 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
5998 _("use --reapply-cherry-picks to include skipped commits"));
5999 cleanup:
6000 release_revisions(&revs);
6001 return ret;
6005 * Add commands after pick and (series of) squash/fixup commands
6006 * in the todo list.
6008 static void todo_list_add_exec_commands(struct todo_list *todo_list,
6009 struct string_list *commands)
6011 struct strbuf *buf = &todo_list->buf;
6012 size_t base_offset = buf->len;
6013 int i, insert, nr = 0, alloc = 0;
6014 struct todo_item *items = NULL, *base_items = NULL;
6016 CALLOC_ARRAY(base_items, commands->nr);
6017 for (i = 0; i < commands->nr; i++) {
6018 size_t command_len = strlen(commands->items[i].string);
6020 strbuf_addstr(buf, commands->items[i].string);
6021 strbuf_addch(buf, '\n');
6023 base_items[i].command = TODO_EXEC;
6024 base_items[i].offset_in_buf = base_offset;
6025 base_items[i].arg_offset = base_offset;
6026 base_items[i].arg_len = command_len;
6028 base_offset += command_len + 1;
6032 * Insert <commands> after every pick. Here, fixup/squash chains
6033 * are considered part of the pick, so we insert the commands *after*
6034 * those chains if there are any.
6036 * As we insert the exec commands immediately after rearranging
6037 * any fixups and before the user edits the list, a fixup chain
6038 * can never contain comments (any comments are empty picks that
6039 * have been commented out because the user did not specify
6040 * --keep-empty). So, it is safe to insert an exec command
6041 * without looking at the command following a comment.
6043 insert = 0;
6044 for (i = 0; i < todo_list->nr; i++) {
6045 enum todo_command command = todo_list->items[i].command;
6046 if (insert && !is_fixup(command)) {
6047 ALLOC_GROW(items, nr + commands->nr, alloc);
6048 COPY_ARRAY(items + nr, base_items, commands->nr);
6049 nr += commands->nr;
6051 insert = 0;
6054 ALLOC_GROW(items, nr + 1, alloc);
6055 items[nr++] = todo_list->items[i];
6057 if (command == TODO_PICK || command == TODO_MERGE)
6058 insert = 1;
6061 /* insert or append final <commands> */
6062 if (insert) {
6063 ALLOC_GROW(items, nr + commands->nr, alloc);
6064 COPY_ARRAY(items + nr, base_items, commands->nr);
6065 nr += commands->nr;
6068 free(base_items);
6069 FREE_AND_NULL(todo_list->items);
6070 todo_list->items = items;
6071 todo_list->nr = nr;
6072 todo_list->alloc = alloc;
6075 static void todo_list_to_strbuf(struct repository *r,
6076 struct todo_list *todo_list,
6077 struct strbuf *buf, int num, unsigned flags)
6079 struct todo_item *item;
6080 int i, max = todo_list->nr;
6082 if (num > 0 && num < max)
6083 max = num;
6085 for (item = todo_list->items, i = 0; i < max; i++, item++) {
6086 char cmd;
6088 /* if the item is not a command write it and continue */
6089 if (item->command >= TODO_COMMENT) {
6090 strbuf_addf(buf, "%.*s\n", item->arg_len,
6091 todo_item_get_arg(todo_list, item));
6092 continue;
6095 /* add command to the buffer */
6096 cmd = command_to_char(item->command);
6097 if ((flags & TODO_LIST_ABBREVIATE_CMDS) && cmd)
6098 strbuf_addch(buf, cmd);
6099 else
6100 strbuf_addstr(buf, command_to_string(item->command));
6102 /* add commit id */
6103 if (item->commit) {
6104 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
6105 short_commit_name(r, item->commit) :
6106 oid_to_hex(&item->commit->object.oid);
6108 if (item->command == TODO_FIXUP) {
6109 if (item->flags & TODO_EDIT_FIXUP_MSG)
6110 strbuf_addstr(buf, " -c");
6111 else if (item->flags & TODO_REPLACE_FIXUP_MSG) {
6112 strbuf_addstr(buf, " -C");
6116 if (item->command == TODO_MERGE) {
6117 if (item->flags & TODO_EDIT_MERGE_MSG)
6118 strbuf_addstr(buf, " -c");
6119 else
6120 strbuf_addstr(buf, " -C");
6123 strbuf_addf(buf, " %s", oid);
6126 /* add all the rest */
6127 if (!item->arg_len)
6128 strbuf_addch(buf, '\n');
6129 else
6130 strbuf_addf(buf, " %.*s\n", item->arg_len,
6131 todo_item_get_arg(todo_list, item));
6135 int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
6136 const char *file, const char *shortrevisions,
6137 const char *shortonto, int num, unsigned flags)
6139 int res;
6140 struct strbuf buf = STRBUF_INIT;
6142 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
6143 if (flags & TODO_LIST_APPEND_TODO_HELP)
6144 append_todo_help(count_commands(todo_list),
6145 shortrevisions, shortonto, &buf);
6147 res = write_message(buf.buf, buf.len, file, 0);
6148 strbuf_release(&buf);
6150 return res;
6153 /* skip picking commits whose parents are unchanged */
6154 static int skip_unnecessary_picks(struct repository *r,
6155 struct todo_list *todo_list,
6156 struct object_id *base_oid)
6158 struct object_id *parent_oid;
6159 int i;
6161 for (i = 0; i < todo_list->nr; i++) {
6162 struct todo_item *item = todo_list->items + i;
6164 if (item->command >= TODO_NOOP)
6165 continue;
6166 if (item->command != TODO_PICK)
6167 break;
6168 if (repo_parse_commit(r, item->commit)) {
6169 return error(_("could not parse commit '%s'"),
6170 oid_to_hex(&item->commit->object.oid));
6172 if (!item->commit->parents)
6173 break; /* root commit */
6174 if (item->commit->parents->next)
6175 break; /* merge commit */
6176 parent_oid = &item->commit->parents->item->object.oid;
6177 if (!oideq(parent_oid, base_oid))
6178 break;
6179 oidcpy(base_oid, &item->commit->object.oid);
6181 if (i > 0) {
6182 const char *done_path = rebase_path_done();
6184 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
6185 error_errno(_("could not write to '%s'"), done_path);
6186 return -1;
6189 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
6190 todo_list->nr -= i;
6191 todo_list->current = 0;
6192 todo_list->done_nr += i;
6194 if (is_fixup(peek_command(todo_list, 0)))
6195 record_in_rewritten(base_oid, peek_command(todo_list, 0));
6198 return 0;
6201 struct todo_add_branch_context {
6202 struct todo_item *items;
6203 size_t items_nr;
6204 size_t items_alloc;
6205 struct strbuf *buf;
6206 struct commit *commit;
6207 struct string_list refs_to_oids;
6210 static int add_decorations_to_list(const struct commit *commit,
6211 struct todo_add_branch_context *ctx)
6213 const struct name_decoration *decoration = get_name_decoration(&commit->object);
6214 const char *head_ref = refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
6215 "HEAD",
6216 RESOLVE_REF_READING,
6217 NULL,
6218 NULL);
6220 while (decoration) {
6221 struct todo_item *item;
6222 const char *path;
6223 size_t base_offset = ctx->buf->len;
6226 * If the branch is the current HEAD, then it will be
6227 * updated by the default rebase behavior.
6229 if (head_ref && !strcmp(head_ref, decoration->name)) {
6230 decoration = decoration->next;
6231 continue;
6234 ALLOC_GROW(ctx->items,
6235 ctx->items_nr + 1,
6236 ctx->items_alloc);
6237 item = &ctx->items[ctx->items_nr];
6238 memset(item, 0, sizeof(*item));
6240 /* If the branch is checked out, then leave a comment instead. */
6241 if ((path = branch_checked_out(decoration->name))) {
6242 item->command = TODO_COMMENT;
6243 strbuf_addf(ctx->buf, "# Ref %s checked out at '%s'\n",
6244 decoration->name, path);
6245 } else {
6246 struct string_list_item *sti;
6247 item->command = TODO_UPDATE_REF;
6248 strbuf_addf(ctx->buf, "%s\n", decoration->name);
6250 sti = string_list_insert(&ctx->refs_to_oids,
6251 decoration->name);
6252 sti->util = init_update_ref_record(decoration->name);
6255 item->offset_in_buf = base_offset;
6256 item->arg_offset = base_offset;
6257 item->arg_len = ctx->buf->len - base_offset;
6258 ctx->items_nr++;
6260 decoration = decoration->next;
6263 return 0;
6267 * For each 'pick' command, find out if the commit has a decoration in
6268 * refs/heads/. If so, then add a 'label for-update-refs/' command.
6270 static int todo_list_add_update_ref_commands(struct todo_list *todo_list)
6272 int i, res;
6273 static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP;
6274 static struct string_list decorate_refs_exclude_config = STRING_LIST_INIT_NODUP;
6275 static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
6276 struct decoration_filter decoration_filter = {
6277 .include_ref_pattern = &decorate_refs_include,
6278 .exclude_ref_pattern = &decorate_refs_exclude,
6279 .exclude_ref_config_pattern = &decorate_refs_exclude_config,
6281 struct todo_add_branch_context ctx = {
6282 .buf = &todo_list->buf,
6283 .refs_to_oids = STRING_LIST_INIT_DUP,
6286 ctx.items_alloc = 2 * todo_list->nr + 1;
6287 ALLOC_ARRAY(ctx.items, ctx.items_alloc);
6289 string_list_append(&decorate_refs_include, "refs/heads/");
6290 load_ref_decorations(&decoration_filter, 0);
6292 for (i = 0; i < todo_list->nr; ) {
6293 struct todo_item *item = &todo_list->items[i];
6295 /* insert ith item into new list */
6296 ALLOC_GROW(ctx.items,
6297 ctx.items_nr + 1,
6298 ctx.items_alloc);
6300 ctx.items[ctx.items_nr++] = todo_list->items[i++];
6302 if (item->commit) {
6303 ctx.commit = item->commit;
6304 add_decorations_to_list(item->commit, &ctx);
6308 res = write_update_refs_state(&ctx.refs_to_oids);
6310 string_list_clear(&ctx.refs_to_oids, 1);
6312 if (res) {
6313 /* we failed, so clean up the new list. */
6314 free(ctx.items);
6315 return res;
6318 free(todo_list->items);
6319 todo_list->items = ctx.items;
6320 todo_list->nr = ctx.items_nr;
6321 todo_list->alloc = ctx.items_alloc;
6323 return 0;
6326 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
6327 const char *shortrevisions, const char *onto_name,
6328 struct commit *onto, const struct object_id *orig_head,
6329 struct string_list *commands, unsigned autosquash,
6330 unsigned update_refs,
6331 struct todo_list *todo_list)
6333 char shortonto[GIT_MAX_HEXSZ + 1];
6334 const char *todo_file = rebase_path_todo();
6335 struct todo_list new_todo = TODO_LIST_INIT;
6336 struct strbuf *buf = &todo_list->buf, buf2 = STRBUF_INIT;
6337 struct object_id oid = onto->object.oid;
6338 int res;
6340 repo_find_unique_abbrev_r(r, shortonto, &oid,
6341 DEFAULT_ABBREV);
6343 if (buf->len == 0) {
6344 struct todo_item *item = append_new_todo(todo_list);
6345 item->command = TODO_NOOP;
6346 item->commit = NULL;
6347 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
6350 if (update_refs && todo_list_add_update_ref_commands(todo_list))
6351 return -1;
6353 if (autosquash && todo_list_rearrange_squash(todo_list))
6354 return -1;
6356 if (commands->nr)
6357 todo_list_add_exec_commands(todo_list, commands);
6359 if (count_commands(todo_list) == 0) {
6360 apply_autostash(rebase_path_autostash());
6361 sequencer_remove_state(opts);
6363 return error(_("nothing to do"));
6366 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
6367 shortonto, flags);
6368 if (res == -1)
6369 return -1;
6370 else if (res == -2) {
6371 apply_autostash(rebase_path_autostash());
6372 sequencer_remove_state(opts);
6374 return -1;
6375 } else if (res == -3) {
6376 apply_autostash(rebase_path_autostash());
6377 sequencer_remove_state(opts);
6378 todo_list_release(&new_todo);
6380 return error(_("nothing to do"));
6381 } else if (res == -4) {
6382 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
6383 todo_list_release(&new_todo);
6385 return -1;
6388 /* Expand the commit IDs */
6389 todo_list_to_strbuf(r, &new_todo, &buf2, -1, 0);
6390 strbuf_swap(&new_todo.buf, &buf2);
6391 strbuf_release(&buf2);
6392 /* Nothing is done yet, and we're reparsing, so let's reset the count */
6393 new_todo.total_nr = 0;
6394 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) < 0)
6395 BUG("invalid todo list after expanding IDs:\n%s",
6396 new_todo.buf.buf);
6398 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
6399 todo_list_release(&new_todo);
6400 return error(_("could not skip unnecessary pick commands"));
6403 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
6404 flags & ~(TODO_LIST_SHORTEN_IDS))) {
6405 todo_list_release(&new_todo);
6406 return error_errno(_("could not write '%s'"), todo_file);
6409 res = -1;
6411 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
6412 goto cleanup;
6414 if (require_clean_work_tree(r, "rebase", NULL, 1, 1))
6415 goto cleanup;
6417 todo_list_write_total_nr(&new_todo);
6418 res = pick_commits(r, &new_todo, opts);
6420 cleanup:
6421 todo_list_release(&new_todo);
6423 return res;
6426 struct subject2item_entry {
6427 struct hashmap_entry entry;
6428 int i;
6429 char subject[FLEX_ARRAY];
6432 static int subject2item_cmp(const void *fndata UNUSED,
6433 const struct hashmap_entry *eptr,
6434 const struct hashmap_entry *entry_or_key,
6435 const void *key)
6437 const struct subject2item_entry *a, *b;
6439 a = container_of(eptr, const struct subject2item_entry, entry);
6440 b = container_of(entry_or_key, const struct subject2item_entry, entry);
6442 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
6445 define_commit_slab(commit_todo_item, struct todo_item *);
6447 static int skip_fixupish(const char *subject, const char **p) {
6448 return skip_prefix(subject, "fixup! ", p) ||
6449 skip_prefix(subject, "amend! ", p) ||
6450 skip_prefix(subject, "squash! ", p);
6454 * Rearrange the todo list that has both "pick commit-id msg" and "pick
6455 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
6456 * after the former, and change "pick" to "fixup"/"squash".
6458 * Note that if the config has specified a custom instruction format, each log
6459 * message will have to be retrieved from the commit (as the oneline in the
6460 * script cannot be trusted) in order to normalize the autosquash arrangement.
6462 int todo_list_rearrange_squash(struct todo_list *todo_list)
6464 struct hashmap subject2item;
6465 int rearranged = 0, *next, *tail, i, nr = 0;
6466 char **subjects;
6467 struct commit_todo_item commit_todo;
6468 struct todo_item *items = NULL;
6470 init_commit_todo_item(&commit_todo);
6472 * The hashmap maps onelines to the respective todo list index.
6474 * If any items need to be rearranged, the next[i] value will indicate
6475 * which item was moved directly after the i'th.
6477 * In that case, last[i] will indicate the index of the latest item to
6478 * be moved to appear after the i'th.
6480 hashmap_init(&subject2item, subject2item_cmp, NULL, todo_list->nr);
6481 ALLOC_ARRAY(next, todo_list->nr);
6482 ALLOC_ARRAY(tail, todo_list->nr);
6483 ALLOC_ARRAY(subjects, todo_list->nr);
6484 for (i = 0; i < todo_list->nr; i++) {
6485 struct strbuf buf = STRBUF_INIT;
6486 struct todo_item *item = todo_list->items + i;
6487 const char *commit_buffer, *subject, *p;
6488 size_t subject_len;
6489 int i2 = -1;
6490 struct subject2item_entry *entry;
6492 next[i] = tail[i] = -1;
6493 if (!item->commit || item->command == TODO_DROP) {
6494 subjects[i] = NULL;
6495 continue;
6498 if (is_fixup(item->command)) {
6499 clear_commit_todo_item(&commit_todo);
6500 return error(_("the script was already rearranged."));
6503 repo_parse_commit(the_repository, item->commit);
6504 commit_buffer = repo_logmsg_reencode(the_repository,
6505 item->commit, NULL,
6506 "UTF-8");
6507 find_commit_subject(commit_buffer, &subject);
6508 format_subject(&buf, subject, " ");
6509 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
6510 repo_unuse_commit_buffer(the_repository, item->commit,
6511 commit_buffer);
6512 if (skip_fixupish(subject, &p)) {
6513 struct commit *commit2;
6515 for (;;) {
6516 while (isspace(*p))
6517 p++;
6518 if (!skip_fixupish(p, &p))
6519 break;
6522 entry = hashmap_get_entry_from_hash(&subject2item,
6523 strhash(p), p,
6524 struct subject2item_entry,
6525 entry);
6526 if (entry)
6527 /* found by title */
6528 i2 = entry->i;
6529 else if (!strchr(p, ' ') &&
6530 (commit2 =
6531 lookup_commit_reference_by_name(p)) &&
6532 *commit_todo_item_at(&commit_todo, commit2))
6533 /* found by commit name */
6534 i2 = *commit_todo_item_at(&commit_todo, commit2)
6535 - todo_list->items;
6536 else {
6537 /* copy can be a prefix of the commit subject */
6538 for (i2 = 0; i2 < i; i2++)
6539 if (subjects[i2] &&
6540 starts_with(subjects[i2], p))
6541 break;
6542 if (i2 == i)
6543 i2 = -1;
6546 if (i2 >= 0) {
6547 rearranged = 1;
6548 if (starts_with(subject, "fixup!")) {
6549 todo_list->items[i].command = TODO_FIXUP;
6550 } else if (starts_with(subject, "amend!")) {
6551 todo_list->items[i].command = TODO_FIXUP;
6552 todo_list->items[i].flags = TODO_REPLACE_FIXUP_MSG;
6553 } else {
6554 todo_list->items[i].command = TODO_SQUASH;
6556 if (tail[i2] < 0) {
6557 next[i] = next[i2];
6558 next[i2] = i;
6559 } else {
6560 next[i] = next[tail[i2]];
6561 next[tail[i2]] = i;
6563 tail[i2] = i;
6564 } else if (!hashmap_get_from_hash(&subject2item,
6565 strhash(subject), subject)) {
6566 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
6567 entry->i = i;
6568 hashmap_entry_init(&entry->entry,
6569 strhash(entry->subject));
6570 hashmap_put(&subject2item, &entry->entry);
6573 *commit_todo_item_at(&commit_todo, item->commit) = item;
6576 if (rearranged) {
6577 ALLOC_ARRAY(items, todo_list->nr);
6579 for (i = 0; i < todo_list->nr; i++) {
6580 enum todo_command command = todo_list->items[i].command;
6581 int cur = i;
6584 * Initially, all commands are 'pick's. If it is a
6585 * fixup or a squash now, we have rearranged it.
6587 if (is_fixup(command))
6588 continue;
6590 while (cur >= 0) {
6591 items[nr++] = todo_list->items[cur];
6592 cur = next[cur];
6596 assert(nr == todo_list->nr);
6597 todo_list->alloc = nr;
6598 FREE_AND_NULL(todo_list->items);
6599 todo_list->items = items;
6602 free(next);
6603 free(tail);
6604 for (i = 0; i < todo_list->nr; i++)
6605 free(subjects[i]);
6606 free(subjects);
6607 hashmap_clear_and_free(&subject2item, struct subject2item_entry, entry);
6609 clear_commit_todo_item(&commit_todo);
6611 return 0;
6614 int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)
6616 if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
6617 struct object_id cherry_pick_head, rebase_head;
6619 if (file_exists(git_path_seq_dir()))
6620 *whence = FROM_CHERRY_PICK_MULTI;
6621 if (file_exists(rebase_path()) &&
6622 !repo_get_oid(r, "REBASE_HEAD", &rebase_head) &&
6623 !repo_get_oid(r, "CHERRY_PICK_HEAD", &cherry_pick_head) &&
6624 oideq(&rebase_head, &cherry_pick_head))
6625 *whence = FROM_REBASE_PICK;
6626 else
6627 *whence = FROM_CHERRY_PICK_SINGLE;
6629 return 1;
6632 return 0;
6635 int sequencer_get_update_refs_state(const char *wt_dir,
6636 struct string_list *refs)
6638 int result = 0;
6639 FILE *fp = NULL;
6640 struct strbuf ref = STRBUF_INIT;
6641 struct strbuf hash = STRBUF_INIT;
6642 struct update_ref_record *rec = NULL;
6644 char *path = rebase_path_update_refs(wt_dir);
6646 fp = fopen(path, "r");
6647 if (!fp)
6648 goto cleanup;
6650 while (strbuf_getline(&ref, fp) != EOF) {
6651 struct string_list_item *item;
6653 CALLOC_ARRAY(rec, 1);
6655 if (strbuf_getline(&hash, fp) == EOF ||
6656 get_oid_hex(hash.buf, &rec->before)) {
6657 warning(_("update-refs file at '%s' is invalid"),
6658 path);
6659 result = -1;
6660 goto cleanup;
6663 if (strbuf_getline(&hash, fp) == EOF ||
6664 get_oid_hex(hash.buf, &rec->after)) {
6665 warning(_("update-refs file at '%s' is invalid"),
6666 path);
6667 result = -1;
6668 goto cleanup;
6671 item = string_list_insert(refs, ref.buf);
6672 item->util = rec;
6673 rec = NULL;
6676 cleanup:
6677 if (fp)
6678 fclose(fp);
6679 free(path);
6680 free(rec);
6681 strbuf_release(&ref);
6682 strbuf_release(&hash);
6683 return result;