Merge branch 'js/range-diff-noprefix'
[alt-git.git] / sequencer.c
blob501921e08c8e050bb10a9772f8dad1a71858683d
1 #include "cache.h"
2 #include "config.h"
3 #include "lockfile.h"
4 #include "dir.h"
5 #include "object-store.h"
6 #include "object.h"
7 #include "commit.h"
8 #include "sequencer.h"
9 #include "tag.h"
10 #include "run-command.h"
11 #include "exec-cmd.h"
12 #include "utf8.h"
13 #include "cache-tree.h"
14 #include "diff.h"
15 #include "revision.h"
16 #include "rerere.h"
17 #include "merge-recursive.h"
18 #include "refs.h"
19 #include "argv-array.h"
20 #include "quote.h"
21 #include "trailer.h"
22 #include "log-tree.h"
23 #include "wt-status.h"
24 #include "hashmap.h"
25 #include "notes-utils.h"
26 #include "sigchain.h"
27 #include "unpack-trees.h"
28 #include "worktree.h"
29 #include "oidmap.h"
30 #include "oidset.h"
31 #include "commit-slab.h"
32 #include "alias.h"
33 #include "commit-reach.h"
34 #include "rebase-interactive.h"
36 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
38 static const char sign_off_header[] = "Signed-off-by: ";
39 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
41 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
43 GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
45 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
46 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
47 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
48 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
50 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
52 * The file containing rebase commands, comments, and empty lines.
53 * This file is created by "git rebase -i" then edited by the user. As
54 * the lines are processed, they are removed from the front of this
55 * file and written to the tail of 'done'.
57 GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
58 GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
61 * The rebase command lines that have already been processed. A line
62 * is moved here when it is first handled, before any associated user
63 * actions.
65 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
67 * The file to keep track of how many commands were already processed (e.g.
68 * for the prompt).
70 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
72 * The file to keep track of how many commands are to be processed in total
73 * (e.g. for the prompt).
75 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
77 * The commit message that is planned to be used for any changes that
78 * need to be committed following a user interaction.
80 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
82 * The file into which is accumulated the suggested commit message for
83 * squash/fixup commands. When the first of a series of squash/fixups
84 * is seen, the file is created and the commit message from the
85 * previous commit and from the first squash/fixup commit are written
86 * to it. The commit message for each subsequent squash/fixup commit
87 * is appended to the file as it is processed.
89 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
91 * If the current series of squash/fixups has not yet included a squash
92 * command, then this file exists and holds the commit message of the
93 * original "pick" commit. (If the series ends without a "squash"
94 * command, then this can be used as the commit message of the combined
95 * commit without opening the editor.)
97 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
99 * This file contains the list fixup/squash commands that have been
100 * accumulated into message-fixup or message-squash so far.
102 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
104 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
105 * GIT_AUTHOR_DATE that will be used for the commit that is currently
106 * being rebased.
108 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
110 * When an "edit" rebase command is being processed, the SHA1 of the
111 * commit to be edited is recorded in this file. When "git rebase
112 * --continue" is executed, if there are any staged changes then they
113 * will be amended to the HEAD commit, but only provided the HEAD
114 * commit is still the commit to be edited. When any other rebase
115 * command is processed, this file is deleted.
117 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
119 * When we stop at a given patch via the "edit" command, this file contains
120 * the abbreviated commit name of the corresponding patch.
122 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
124 * For the post-rewrite hook, we make a list of rewritten commits and
125 * their new sha1s. The rewritten-pending list keeps the sha1s of
126 * commits that have been processed, but not committed yet,
127 * e.g. because they are waiting for a 'squash' command.
129 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
130 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
131 "rebase-merge/rewritten-pending")
134 * The path of the file containig the OID of the "squash onto" commit, i.e.
135 * the dummy commit used for `reset [new root]`.
137 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
140 * The path of the file listing refs that need to be deleted after the rebase
141 * finishes. This is used by the `label` command to record the need for cleanup.
143 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
146 * The following files are written by git-rebase just after parsing the
147 * command-line.
149 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
150 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
151 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
152 static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
153 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
154 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
155 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
156 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
157 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
158 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
159 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
160 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
162 static int git_sequencer_config(const char *k, const char *v, void *cb)
164 struct replay_opts *opts = cb;
165 int status;
167 if (!strcmp(k, "commit.cleanup")) {
168 const char *s;
170 status = git_config_string(&s, k, v);
171 if (status)
172 return status;
174 if (!strcmp(s, "verbatim")) {
175 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
176 opts->explicit_cleanup = 1;
177 } else if (!strcmp(s, "whitespace")) {
178 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
179 opts->explicit_cleanup = 1;
180 } else if (!strcmp(s, "strip")) {
181 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
182 opts->explicit_cleanup = 1;
183 } else if (!strcmp(s, "scissors")) {
184 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
185 opts->explicit_cleanup = 1;
186 } else {
187 warning(_("invalid commit message cleanup mode '%s'"),
191 free((char *)s);
192 return status;
195 if (!strcmp(k, "commit.gpgsign")) {
196 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
197 return 0;
200 status = git_gpg_config(k, v, NULL);
201 if (status)
202 return status;
204 return git_diff_basic_config(k, v, NULL);
207 void sequencer_init_config(struct replay_opts *opts)
209 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
210 git_config(git_sequencer_config, opts);
213 static inline int is_rebase_i(const struct replay_opts *opts)
215 return opts->action == REPLAY_INTERACTIVE_REBASE;
218 static const char *get_dir(const struct replay_opts *opts)
220 if (is_rebase_i(opts))
221 return rebase_path();
222 return git_path_seq_dir();
225 static const char *get_todo_path(const struct replay_opts *opts)
227 if (is_rebase_i(opts))
228 return rebase_path_todo();
229 return git_path_todo_file();
233 * Returns 0 for non-conforming footer
234 * Returns 1 for conforming footer
235 * Returns 2 when sob exists within conforming footer
236 * Returns 3 when sob exists within conforming footer as last entry
238 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
239 size_t ignore_footer)
241 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
242 struct trailer_info info;
243 size_t i;
244 int found_sob = 0, found_sob_last = 0;
246 opts.no_divider = 1;
248 trailer_info_get(&info, sb->buf, &opts);
250 if (info.trailer_start == info.trailer_end)
251 return 0;
253 for (i = 0; i < info.trailer_nr; i++)
254 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
255 found_sob = 1;
256 if (i == info.trailer_nr - 1)
257 found_sob_last = 1;
260 trailer_info_release(&info);
262 if (found_sob_last)
263 return 3;
264 if (found_sob)
265 return 2;
266 return 1;
269 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
271 static struct strbuf buf = STRBUF_INIT;
273 strbuf_reset(&buf);
274 if (opts->gpg_sign)
275 sq_quotef(&buf, "-S%s", opts->gpg_sign);
276 return buf.buf;
279 int sequencer_remove_state(struct replay_opts *opts)
281 struct strbuf buf = STRBUF_INIT;
282 int i, ret = 0;
284 if (is_rebase_i(opts) &&
285 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
286 char *p = buf.buf;
287 while (*p) {
288 char *eol = strchr(p, '\n');
289 if (eol)
290 *eol = '\0';
291 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0) {
292 warning(_("could not delete '%s'"), p);
293 ret = -1;
295 if (!eol)
296 break;
297 p = eol + 1;
301 free(opts->gpg_sign);
302 free(opts->strategy);
303 for (i = 0; i < opts->xopts_nr; i++)
304 free(opts->xopts[i]);
305 free(opts->xopts);
306 strbuf_release(&opts->current_fixups);
308 strbuf_reset(&buf);
309 strbuf_addstr(&buf, get_dir(opts));
310 if (remove_dir_recursively(&buf, 0))
311 ret = error(_("could not remove '%s'"), buf.buf);
312 strbuf_release(&buf);
314 return ret;
317 static const char *action_name(const struct replay_opts *opts)
319 switch (opts->action) {
320 case REPLAY_REVERT:
321 return N_("revert");
322 case REPLAY_PICK:
323 return N_("cherry-pick");
324 case REPLAY_INTERACTIVE_REBASE:
325 return N_("rebase -i");
327 die(_("unknown action: %d"), opts->action);
330 struct commit_message {
331 char *parent_label;
332 char *label;
333 char *subject;
334 const char *message;
337 static const char *short_commit_name(struct commit *commit)
339 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
342 static int get_message(struct commit *commit, struct commit_message *out)
344 const char *abbrev, *subject;
345 int subject_len;
347 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
348 abbrev = short_commit_name(commit);
350 subject_len = find_commit_subject(out->message, &subject);
352 out->subject = xmemdupz(subject, subject_len);
353 out->label = xstrfmt("%s... %s", abbrev, out->subject);
354 out->parent_label = xstrfmt("parent of %s", out->label);
356 return 0;
359 static void free_message(struct commit *commit, struct commit_message *msg)
361 free(msg->parent_label);
362 free(msg->label);
363 free(msg->subject);
364 unuse_commit_buffer(commit, msg->message);
367 static void print_advice(struct repository *r, int show_hint,
368 struct replay_opts *opts)
370 char *msg = getenv("GIT_CHERRY_PICK_HELP");
372 if (msg) {
373 fprintf(stderr, "%s\n", msg);
375 * A conflict has occurred but the porcelain
376 * (typically rebase --interactive) wants to take care
377 * of the commit itself so remove CHERRY_PICK_HEAD
379 unlink(git_path_cherry_pick_head(r));
380 return;
383 if (show_hint) {
384 if (opts->no_commit)
385 advise(_("after resolving the conflicts, mark the corrected paths\n"
386 "with 'git add <paths>' or 'git rm <paths>'"));
387 else
388 advise(_("after resolving the conflicts, mark the corrected paths\n"
389 "with 'git add <paths>' or 'git rm <paths>'\n"
390 "and commit the result with 'git commit'"));
394 static int write_message(const void *buf, size_t len, const char *filename,
395 int append_eol)
397 struct lock_file msg_file = LOCK_INIT;
399 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
400 if (msg_fd < 0)
401 return error_errno(_("could not lock '%s'"), filename);
402 if (write_in_full(msg_fd, buf, len) < 0) {
403 error_errno(_("could not write to '%s'"), filename);
404 rollback_lock_file(&msg_file);
405 return -1;
407 if (append_eol && write(msg_fd, "\n", 1) < 0) {
408 error_errno(_("could not write eol to '%s'"), filename);
409 rollback_lock_file(&msg_file);
410 return -1;
412 if (commit_lock_file(&msg_file) < 0)
413 return error(_("failed to finalize '%s'"), filename);
415 return 0;
419 * Reads a file that was presumably written by a shell script, i.e. with an
420 * end-of-line marker that needs to be stripped.
422 * Note that only the last end-of-line marker is stripped, consistent with the
423 * behavior of "$(cat path)" in a shell script.
425 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
427 static int read_oneliner(struct strbuf *buf,
428 const char *path, int skip_if_empty)
430 int orig_len = buf->len;
432 if (!file_exists(path))
433 return 0;
435 if (strbuf_read_file(buf, path, 0) < 0) {
436 warning_errno(_("could not read '%s'"), path);
437 return 0;
440 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
441 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
442 --buf->len;
443 buf->buf[buf->len] = '\0';
446 if (skip_if_empty && buf->len == orig_len)
447 return 0;
449 return 1;
452 static struct tree *empty_tree(struct repository *r)
454 return lookup_tree(r, the_hash_algo->empty_tree);
457 static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
459 if (repo_read_index_unmerged(repo))
460 return error_resolve_conflict(_(action_name(opts)));
462 error(_("your local changes would be overwritten by %s."),
463 _(action_name(opts)));
465 if (advice_commit_before_merge)
466 advise(_("commit your changes or stash them to proceed."));
467 return -1;
470 static void update_abort_safety_file(void)
472 struct object_id head;
474 /* Do nothing on a single-pick */
475 if (!file_exists(git_path_seq_dir()))
476 return;
478 if (!get_oid("HEAD", &head))
479 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
480 else
481 write_file(git_path_abort_safety_file(), "%s", "");
484 static int fast_forward_to(struct repository *r,
485 const struct object_id *to,
486 const struct object_id *from,
487 int unborn,
488 struct replay_opts *opts)
490 struct ref_transaction *transaction;
491 struct strbuf sb = STRBUF_INIT;
492 struct strbuf err = STRBUF_INIT;
494 repo_read_index(r);
495 if (checkout_fast_forward(r, from, to, 1))
496 return -1; /* the callee should have complained already */
498 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
500 transaction = ref_transaction_begin(&err);
501 if (!transaction ||
502 ref_transaction_update(transaction, "HEAD",
503 to, unborn && !is_rebase_i(opts) ?
504 &null_oid : from,
505 0, sb.buf, &err) ||
506 ref_transaction_commit(transaction, &err)) {
507 ref_transaction_free(transaction);
508 error("%s", err.buf);
509 strbuf_release(&sb);
510 strbuf_release(&err);
511 return -1;
514 strbuf_release(&sb);
515 strbuf_release(&err);
516 ref_transaction_free(transaction);
517 update_abort_safety_file();
518 return 0;
521 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
522 int use_editor)
524 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
525 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
526 COMMIT_MSG_CLEANUP_SPACE;
527 else if (!strcmp(cleanup_arg, "verbatim"))
528 return COMMIT_MSG_CLEANUP_NONE;
529 else if (!strcmp(cleanup_arg, "whitespace"))
530 return COMMIT_MSG_CLEANUP_SPACE;
531 else if (!strcmp(cleanup_arg, "strip"))
532 return COMMIT_MSG_CLEANUP_ALL;
533 else if (!strcmp(cleanup_arg, "scissors"))
534 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
535 COMMIT_MSG_CLEANUP_SPACE;
536 else
537 die(_("Invalid cleanup mode %s"), cleanup_arg);
541 * NB using int rather than enum cleanup_mode to stop clang's
542 * -Wtautological-constant-out-of-range-compare complaining that the comparison
543 * is always true.
545 static const char *describe_cleanup_mode(int cleanup_mode)
547 static const char *modes[] = { "whitespace",
548 "verbatim",
549 "scissors",
550 "strip" };
552 if (cleanup_mode < ARRAY_SIZE(modes))
553 return modes[cleanup_mode];
555 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
558 void append_conflicts_hint(struct index_state *istate,
559 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
561 int i;
563 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
564 strbuf_addch(msgbuf, '\n');
565 wt_status_append_cut_line(msgbuf);
566 strbuf_addch(msgbuf, comment_line_char);
569 strbuf_addch(msgbuf, '\n');
570 strbuf_commented_addf(msgbuf, "Conflicts:\n");
571 for (i = 0; i < istate->cache_nr;) {
572 const struct cache_entry *ce = istate->cache[i++];
573 if (ce_stage(ce)) {
574 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
575 while (i < istate->cache_nr &&
576 !strcmp(ce->name, istate->cache[i]->name))
577 i++;
582 static int do_recursive_merge(struct repository *r,
583 struct commit *base, struct commit *next,
584 const char *base_label, const char *next_label,
585 struct object_id *head, struct strbuf *msgbuf,
586 struct replay_opts *opts)
588 struct merge_options o;
589 struct tree *result, *next_tree, *base_tree, *head_tree;
590 int clean;
591 char **xopt;
592 struct lock_file index_lock = LOCK_INIT;
594 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
595 return -1;
597 repo_read_index(r);
599 init_merge_options(&o, r);
600 o.ancestor = base ? base_label : "(empty tree)";
601 o.branch1 = "HEAD";
602 o.branch2 = next ? next_label : "(empty tree)";
603 if (is_rebase_i(opts))
604 o.buffer_output = 2;
605 o.show_rename_progress = 1;
607 head_tree = parse_tree_indirect(head);
608 next_tree = next ? get_commit_tree(next) : empty_tree(r);
609 base_tree = base ? get_commit_tree(base) : empty_tree(r);
611 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
612 parse_merge_opt(&o, *xopt);
614 clean = merge_trees(&o,
615 head_tree,
616 next_tree, base_tree, &result);
617 if (is_rebase_i(opts) && clean <= 0)
618 fputs(o.obuf.buf, stdout);
619 strbuf_release(&o.obuf);
620 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
621 if (clean < 0) {
622 rollback_lock_file(&index_lock);
623 return clean;
626 if (write_locked_index(r->index, &index_lock,
627 COMMIT_LOCK | SKIP_IF_UNCHANGED))
629 * TRANSLATORS: %s will be "revert", "cherry-pick" or
630 * "rebase -i".
632 return error(_("%s: Unable to write new index file"),
633 _(action_name(opts)));
635 if (!clean)
636 append_conflicts_hint(r->index, msgbuf,
637 opts->default_msg_cleanup);
639 return !clean;
642 static struct object_id *get_cache_tree_oid(struct index_state *istate)
644 if (!istate->cache_tree)
645 istate->cache_tree = cache_tree();
647 if (!cache_tree_fully_valid(istate->cache_tree))
648 if (cache_tree_update(istate, 0)) {
649 error(_("unable to update cache tree"));
650 return NULL;
653 return &istate->cache_tree->oid;
656 static int is_index_unchanged(struct repository *r)
658 struct object_id head_oid, *cache_tree_oid;
659 struct commit *head_commit;
660 struct index_state *istate = r->index;
662 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
663 return error(_("could not resolve HEAD commit"));
665 head_commit = lookup_commit(r, &head_oid);
668 * If head_commit is NULL, check_commit, called from
669 * lookup_commit, would have indicated that head_commit is not
670 * a commit object already. parse_commit() will return failure
671 * without further complaints in such a case. Otherwise, if
672 * the commit is invalid, parse_commit() will complain. So
673 * there is nothing for us to say here. Just return failure.
675 if (parse_commit(head_commit))
676 return -1;
678 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
679 return -1;
681 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
684 static int write_author_script(const char *message)
686 struct strbuf buf = STRBUF_INIT;
687 const char *eol;
688 int res;
690 for (;;)
691 if (!*message || starts_with(message, "\n")) {
692 missing_author:
693 /* Missing 'author' line? */
694 unlink(rebase_path_author_script());
695 return 0;
696 } else if (skip_prefix(message, "author ", &message))
697 break;
698 else if ((eol = strchr(message, '\n')))
699 message = eol + 1;
700 else
701 goto missing_author;
703 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
704 while (*message && *message != '\n' && *message != '\r')
705 if (skip_prefix(message, " <", &message))
706 break;
707 else if (*message != '\'')
708 strbuf_addch(&buf, *(message++));
709 else
710 strbuf_addf(&buf, "'\\%c'", *(message++));
711 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
712 while (*message && *message != '\n' && *message != '\r')
713 if (skip_prefix(message, "> ", &message))
714 break;
715 else if (*message != '\'')
716 strbuf_addch(&buf, *(message++));
717 else
718 strbuf_addf(&buf, "'\\%c'", *(message++));
719 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
720 while (*message && *message != '\n' && *message != '\r')
721 if (*message != '\'')
722 strbuf_addch(&buf, *(message++));
723 else
724 strbuf_addf(&buf, "'\\%c'", *(message++));
725 strbuf_addch(&buf, '\'');
726 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
727 strbuf_release(&buf);
728 return res;
732 * Take a series of KEY='VALUE' lines where VALUE part is
733 * sq-quoted, and append <KEY, VALUE> at the end of the string list
735 static int parse_key_value_squoted(char *buf, struct string_list *list)
737 while (*buf) {
738 struct string_list_item *item;
739 char *np;
740 char *cp = strchr(buf, '=');
741 if (!cp) {
742 np = strchrnul(buf, '\n');
743 return error(_("no key present in '%.*s'"),
744 (int) (np - buf), buf);
746 np = strchrnul(cp, '\n');
747 *cp++ = '\0';
748 item = string_list_append(list, buf);
750 buf = np + (*np == '\n');
751 *np = '\0';
752 cp = sq_dequote(cp);
753 if (!cp)
754 return error(_("unable to dequote value of '%s'"),
755 item->string);
756 item->util = xstrdup(cp);
758 return 0;
762 * Reads and parses the state directory's "author-script" file, and sets name,
763 * email and date accordingly.
764 * Returns 0 on success, -1 if the file could not be parsed.
766 * The author script is of the format:
768 * GIT_AUTHOR_NAME='$author_name'
769 * GIT_AUTHOR_EMAIL='$author_email'
770 * GIT_AUTHOR_DATE='$author_date'
772 * where $author_name, $author_email and $author_date are quoted. We are strict
773 * with our parsing, as the file was meant to be eval'd in the now-removed
774 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
775 * from what this function expects, it is better to bail out than to do
776 * something that the user does not expect.
778 int read_author_script(const char *path, char **name, char **email, char **date,
779 int allow_missing)
781 struct strbuf buf = STRBUF_INIT;
782 struct string_list kv = STRING_LIST_INIT_DUP;
783 int retval = -1; /* assume failure */
784 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
786 if (strbuf_read_file(&buf, path, 256) <= 0) {
787 strbuf_release(&buf);
788 if (errno == ENOENT && allow_missing)
789 return 0;
790 else
791 return error_errno(_("could not open '%s' for reading"),
792 path);
795 if (parse_key_value_squoted(buf.buf, &kv))
796 goto finish;
798 for (i = 0; i < kv.nr; i++) {
799 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
800 if (name_i != -2)
801 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
802 else
803 name_i = i;
804 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
805 if (email_i != -2)
806 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
807 else
808 email_i = i;
809 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
810 if (date_i != -2)
811 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
812 else
813 date_i = i;
814 } else {
815 err = error(_("unknown variable '%s'"),
816 kv.items[i].string);
819 if (name_i == -2)
820 error(_("missing 'GIT_AUTHOR_NAME'"));
821 if (email_i == -2)
822 error(_("missing 'GIT_AUTHOR_EMAIL'"));
823 if (date_i == -2)
824 error(_("missing 'GIT_AUTHOR_DATE'"));
825 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
826 goto finish;
827 *name = kv.items[name_i].util;
828 *email = kv.items[email_i].util;
829 *date = kv.items[date_i].util;
830 retval = 0;
831 finish:
832 string_list_clear(&kv, !!retval);
833 strbuf_release(&buf);
834 return retval;
838 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
839 * file with shell quoting into struct argv_array. Returns -1 on
840 * error, 0 otherwise.
842 static int read_env_script(struct argv_array *env)
844 char *name, *email, *date;
846 if (read_author_script(rebase_path_author_script(),
847 &name, &email, &date, 0))
848 return -1;
850 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
851 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
852 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
853 free(name);
854 free(email);
855 free(date);
857 return 0;
860 static char *get_author(const char *message)
862 size_t len;
863 const char *a;
865 a = find_commit_header(message, "author", &len);
866 if (a)
867 return xmemdupz(a, len);
869 return NULL;
872 static const char staged_changes_advice[] =
873 N_("you have staged changes in your working tree\n"
874 "If these changes are meant to be squashed into the previous commit, run:\n"
875 "\n"
876 " git commit --amend %s\n"
877 "\n"
878 "If they are meant to go into a new commit, run:\n"
879 "\n"
880 " git commit %s\n"
881 "\n"
882 "In both cases, once you're done, continue with:\n"
883 "\n"
884 " git rebase --continue\n");
886 #define ALLOW_EMPTY (1<<0)
887 #define EDIT_MSG (1<<1)
888 #define AMEND_MSG (1<<2)
889 #define CLEANUP_MSG (1<<3)
890 #define VERIFY_MSG (1<<4)
891 #define CREATE_ROOT_COMMIT (1<<5)
893 static int run_command_silent_on_success(struct child_process *cmd)
895 struct strbuf buf = STRBUF_INIT;
896 int rc;
898 cmd->stdout_to_stderr = 1;
899 rc = pipe_command(cmd,
900 NULL, 0,
901 NULL, 0,
902 &buf, 0);
904 if (rc)
905 fputs(buf.buf, stderr);
906 strbuf_release(&buf);
907 return rc;
911 * If we are cherry-pick, and if the merge did not result in
912 * hand-editing, we will hit this commit and inherit the original
913 * author date and name.
915 * If we are revert, or if our cherry-pick results in a hand merge,
916 * we had better say that the current user is responsible for that.
918 * An exception is when run_git_commit() is called during an
919 * interactive rebase: in that case, we will want to retain the
920 * author metadata.
922 static int run_git_commit(struct repository *r,
923 const char *defmsg,
924 struct replay_opts *opts,
925 unsigned int flags)
927 struct child_process cmd = CHILD_PROCESS_INIT;
929 cmd.git_cmd = 1;
931 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
932 const char *gpg_opt = gpg_sign_opt_quoted(opts);
934 return error(_(staged_changes_advice),
935 gpg_opt, gpg_opt);
938 argv_array_push(&cmd.args, "commit");
940 if (!(flags & VERIFY_MSG))
941 argv_array_push(&cmd.args, "-n");
942 if ((flags & AMEND_MSG))
943 argv_array_push(&cmd.args, "--amend");
944 if (opts->gpg_sign)
945 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
946 if (defmsg)
947 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
948 else if (!(flags & EDIT_MSG))
949 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
950 if ((flags & CLEANUP_MSG))
951 argv_array_push(&cmd.args, "--cleanup=strip");
952 if ((flags & EDIT_MSG))
953 argv_array_push(&cmd.args, "-e");
954 else if (!(flags & CLEANUP_MSG) &&
955 !opts->signoff && !opts->record_origin &&
956 !opts->explicit_cleanup)
957 argv_array_push(&cmd.args, "--cleanup=verbatim");
959 if ((flags & ALLOW_EMPTY))
960 argv_array_push(&cmd.args, "--allow-empty");
962 if (!(flags & EDIT_MSG))
963 argv_array_push(&cmd.args, "--allow-empty-message");
965 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
966 return run_command_silent_on_success(&cmd);
967 else
968 return run_command(&cmd);
971 static int rest_is_empty(const struct strbuf *sb, int start)
973 int i, eol;
974 const char *nl;
976 /* Check if the rest is just whitespace and Signed-off-by's. */
977 for (i = start; i < sb->len; i++) {
978 nl = memchr(sb->buf + i, '\n', sb->len - i);
979 if (nl)
980 eol = nl - sb->buf;
981 else
982 eol = sb->len;
984 if (strlen(sign_off_header) <= eol - i &&
985 starts_with(sb->buf + i, sign_off_header)) {
986 i = eol;
987 continue;
989 while (i < eol)
990 if (!isspace(sb->buf[i++]))
991 return 0;
994 return 1;
997 void cleanup_message(struct strbuf *msgbuf,
998 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1000 if (verbose || /* Truncate the message just before the diff, if any. */
1001 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1002 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1003 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1004 strbuf_stripspace(msgbuf, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1008 * Find out if the message in the strbuf contains only whitespace and
1009 * Signed-off-by lines.
1011 int message_is_empty(const struct strbuf *sb,
1012 enum commit_msg_cleanup_mode cleanup_mode)
1014 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1015 return 0;
1016 return rest_is_empty(sb, 0);
1020 * See if the user edited the message in the editor or left what
1021 * was in the template intact
1023 int template_untouched(const struct strbuf *sb, const char *template_file,
1024 enum commit_msg_cleanup_mode cleanup_mode)
1026 struct strbuf tmpl = STRBUF_INIT;
1027 const char *start;
1029 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1030 return 0;
1032 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1033 return 0;
1035 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1036 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1037 start = sb->buf;
1038 strbuf_release(&tmpl);
1039 return rest_is_empty(sb, start - sb->buf);
1042 int update_head_with_reflog(const struct commit *old_head,
1043 const struct object_id *new_head,
1044 const char *action, const struct strbuf *msg,
1045 struct strbuf *err)
1047 struct ref_transaction *transaction;
1048 struct strbuf sb = STRBUF_INIT;
1049 const char *nl;
1050 int ret = 0;
1052 if (action) {
1053 strbuf_addstr(&sb, action);
1054 strbuf_addstr(&sb, ": ");
1057 nl = strchr(msg->buf, '\n');
1058 if (nl) {
1059 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1060 } else {
1061 strbuf_addbuf(&sb, msg);
1062 strbuf_addch(&sb, '\n');
1065 transaction = ref_transaction_begin(err);
1066 if (!transaction ||
1067 ref_transaction_update(transaction, "HEAD", new_head,
1068 old_head ? &old_head->object.oid : &null_oid,
1069 0, sb.buf, err) ||
1070 ref_transaction_commit(transaction, err)) {
1071 ret = -1;
1073 ref_transaction_free(transaction);
1074 strbuf_release(&sb);
1076 return ret;
1079 static int run_rewrite_hook(const struct object_id *oldoid,
1080 const struct object_id *newoid)
1082 struct child_process proc = CHILD_PROCESS_INIT;
1083 const char *argv[3];
1084 int code;
1085 struct strbuf sb = STRBUF_INIT;
1087 argv[0] = find_hook("post-rewrite");
1088 if (!argv[0])
1089 return 0;
1091 argv[1] = "amend";
1092 argv[2] = NULL;
1094 proc.argv = argv;
1095 proc.in = -1;
1096 proc.stdout_to_stderr = 1;
1097 proc.trace2_hook_name = "post-rewrite";
1099 code = start_command(&proc);
1100 if (code)
1101 return code;
1102 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1103 sigchain_push(SIGPIPE, SIG_IGN);
1104 write_in_full(proc.in, sb.buf, sb.len);
1105 close(proc.in);
1106 strbuf_release(&sb);
1107 sigchain_pop(SIGPIPE);
1108 return finish_command(&proc);
1111 void commit_post_rewrite(struct repository *r,
1112 const struct commit *old_head,
1113 const struct object_id *new_head)
1115 struct notes_rewrite_cfg *cfg;
1117 cfg = init_copy_notes_for_rewrite("amend");
1118 if (cfg) {
1119 /* we are amending, so old_head is not NULL */
1120 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1121 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1123 run_rewrite_hook(&old_head->object.oid, new_head);
1126 static int run_prepare_commit_msg_hook(struct repository *r,
1127 struct strbuf *msg,
1128 const char *commit)
1130 struct argv_array hook_env = ARGV_ARRAY_INIT;
1131 int ret;
1132 const char *name;
1134 name = git_path_commit_editmsg();
1135 if (write_message(msg->buf, msg->len, name, 0))
1136 return -1;
1138 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", r->index_file);
1139 argv_array_push(&hook_env, "GIT_EDITOR=:");
1140 if (commit)
1141 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1142 "commit", commit, NULL);
1143 else
1144 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1145 "message", NULL);
1146 if (ret)
1147 ret = error(_("'prepare-commit-msg' hook failed"));
1148 argv_array_clear(&hook_env);
1150 return ret;
1153 static const char implicit_ident_advice_noconfig[] =
1154 N_("Your name and email address were configured automatically based\n"
1155 "on your username and hostname. Please check that they are accurate.\n"
1156 "You can suppress this message by setting them explicitly. Run the\n"
1157 "following command and follow the instructions in your editor to edit\n"
1158 "your configuration file:\n"
1159 "\n"
1160 " git config --global --edit\n"
1161 "\n"
1162 "After doing this, you may fix the identity used for this commit with:\n"
1163 "\n"
1164 " git commit --amend --reset-author\n");
1166 static const char implicit_ident_advice_config[] =
1167 N_("Your name and email address were configured automatically based\n"
1168 "on your username and hostname. Please check that they are accurate.\n"
1169 "You can suppress this message by setting them explicitly:\n"
1170 "\n"
1171 " git config --global user.name \"Your Name\"\n"
1172 " git config --global user.email you@example.com\n"
1173 "\n"
1174 "After doing this, you may fix the identity used for this commit with:\n"
1175 "\n"
1176 " git commit --amend --reset-author\n");
1178 static const char *implicit_ident_advice(void)
1180 char *user_config = expand_user_path("~/.gitconfig", 0);
1181 char *xdg_config = xdg_config_home("config");
1182 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1184 free(user_config);
1185 free(xdg_config);
1187 if (config_exists)
1188 return _(implicit_ident_advice_config);
1189 else
1190 return _(implicit_ident_advice_noconfig);
1194 void print_commit_summary(struct repository *r,
1195 const char *prefix,
1196 const struct object_id *oid,
1197 unsigned int flags)
1199 struct rev_info rev;
1200 struct commit *commit;
1201 struct strbuf format = STRBUF_INIT;
1202 const char *head;
1203 struct pretty_print_context pctx = {0};
1204 struct strbuf author_ident = STRBUF_INIT;
1205 struct strbuf committer_ident = STRBUF_INIT;
1207 commit = lookup_commit(r, oid);
1208 if (!commit)
1209 die(_("couldn't look up newly created commit"));
1210 if (parse_commit(commit))
1211 die(_("could not parse newly created commit"));
1213 strbuf_addstr(&format, "format:%h] %s");
1215 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1216 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1217 if (strbuf_cmp(&author_ident, &committer_ident)) {
1218 strbuf_addstr(&format, "\n Author: ");
1219 strbuf_addbuf_percentquote(&format, &author_ident);
1221 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1222 struct strbuf date = STRBUF_INIT;
1224 format_commit_message(commit, "%ad", &date, &pctx);
1225 strbuf_addstr(&format, "\n Date: ");
1226 strbuf_addbuf_percentquote(&format, &date);
1227 strbuf_release(&date);
1229 if (!committer_ident_sufficiently_given()) {
1230 strbuf_addstr(&format, "\n Committer: ");
1231 strbuf_addbuf_percentquote(&format, &committer_ident);
1232 if (advice_implicit_identity) {
1233 strbuf_addch(&format, '\n');
1234 strbuf_addstr(&format, implicit_ident_advice());
1237 strbuf_release(&author_ident);
1238 strbuf_release(&committer_ident);
1240 repo_init_revisions(r, &rev, prefix);
1241 setup_revisions(0, NULL, &rev, NULL);
1243 rev.diff = 1;
1244 rev.diffopt.output_format =
1245 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1247 rev.verbose_header = 1;
1248 rev.show_root_diff = 1;
1249 get_commit_format(format.buf, &rev);
1250 rev.always_show_header = 0;
1251 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1252 rev.diffopt.break_opt = 0;
1253 diff_setup_done(&rev.diffopt);
1255 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1256 if (!head)
1257 die_errno(_("unable to resolve HEAD after creating commit"));
1258 if (!strcmp(head, "HEAD"))
1259 head = _("detached HEAD");
1260 else
1261 skip_prefix(head, "refs/heads/", &head);
1262 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1263 _(" (root-commit)") : "");
1265 if (!log_tree_commit(&rev, commit)) {
1266 rev.always_show_header = 1;
1267 rev.use_terminator = 1;
1268 log_tree_commit(&rev, commit);
1271 strbuf_release(&format);
1274 static int parse_head(struct repository *r, struct commit **head)
1276 struct commit *current_head;
1277 struct object_id oid;
1279 if (get_oid("HEAD", &oid)) {
1280 current_head = NULL;
1281 } else {
1282 current_head = lookup_commit_reference(r, &oid);
1283 if (!current_head)
1284 return error(_("could not parse HEAD"));
1285 if (!oideq(&oid, &current_head->object.oid)) {
1286 warning(_("HEAD %s is not a commit!"),
1287 oid_to_hex(&oid));
1289 if (parse_commit(current_head))
1290 return error(_("could not parse HEAD commit"));
1292 *head = current_head;
1294 return 0;
1298 * Try to commit without forking 'git commit'. In some cases we need
1299 * to run 'git commit' to display an error message
1301 * Returns:
1302 * -1 - error unable to commit
1303 * 0 - success
1304 * 1 - run 'git commit'
1306 static int try_to_commit(struct repository *r,
1307 struct strbuf *msg, const char *author,
1308 struct replay_opts *opts, unsigned int flags,
1309 struct object_id *oid)
1311 struct object_id tree;
1312 struct commit *current_head = NULL;
1313 struct commit_list *parents = NULL;
1314 struct commit_extra_header *extra = NULL;
1315 struct strbuf err = STRBUF_INIT;
1316 struct strbuf commit_msg = STRBUF_INIT;
1317 char *amend_author = NULL;
1318 const char *hook_commit = NULL;
1319 enum commit_msg_cleanup_mode cleanup;
1320 int res = 0;
1322 if (parse_head(r, &current_head))
1323 return -1;
1325 if (flags & AMEND_MSG) {
1326 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1327 const char *out_enc = get_commit_output_encoding();
1328 const char *message = logmsg_reencode(current_head, NULL,
1329 out_enc);
1331 if (!msg) {
1332 const char *orig_message = NULL;
1334 find_commit_subject(message, &orig_message);
1335 msg = &commit_msg;
1336 strbuf_addstr(msg, orig_message);
1337 hook_commit = "HEAD";
1339 author = amend_author = get_author(message);
1340 unuse_commit_buffer(current_head, message);
1341 if (!author) {
1342 res = error(_("unable to parse commit author"));
1343 goto out;
1345 parents = copy_commit_list(current_head->parents);
1346 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1347 } else if (current_head &&
1348 (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1349 commit_list_insert(current_head, &parents);
1352 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1353 res = error(_("git write-tree failed to write a tree"));
1354 goto out;
1357 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1358 get_commit_tree_oid(current_head) :
1359 the_hash_algo->empty_tree, &tree)) {
1360 res = 1; /* run 'git commit' to display error message */
1361 goto out;
1364 if (find_hook("prepare-commit-msg")) {
1365 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1366 if (res)
1367 goto out;
1368 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1369 2048) < 0) {
1370 res = error_errno(_("unable to read commit message "
1371 "from '%s'"),
1372 git_path_commit_editmsg());
1373 goto out;
1375 msg = &commit_msg;
1378 if (flags & CLEANUP_MSG)
1379 cleanup = COMMIT_MSG_CLEANUP_ALL;
1380 else if ((opts->signoff || opts->record_origin) &&
1381 !opts->explicit_cleanup)
1382 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1383 else
1384 cleanup = opts->default_msg_cleanup;
1386 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1387 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1388 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1389 res = 1; /* run 'git commit' to display error message */
1390 goto out;
1393 reset_ident_date();
1395 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1396 oid, author, opts->gpg_sign, extra)) {
1397 res = error(_("failed to write commit object"));
1398 goto out;
1401 if (update_head_with_reflog(current_head, oid,
1402 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1403 res = error("%s", err.buf);
1404 goto out;
1407 if (flags & AMEND_MSG)
1408 commit_post_rewrite(r, current_head, oid);
1410 out:
1411 free_commit_extra_headers(extra);
1412 strbuf_release(&err);
1413 strbuf_release(&commit_msg);
1414 free(amend_author);
1416 return res;
1419 static int do_commit(struct repository *r,
1420 const char *msg_file, const char *author,
1421 struct replay_opts *opts, unsigned int flags)
1423 int res = 1;
1425 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1426 struct object_id oid;
1427 struct strbuf sb = STRBUF_INIT;
1429 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1430 return error_errno(_("unable to read commit message "
1431 "from '%s'"),
1432 msg_file);
1434 res = try_to_commit(r, msg_file ? &sb : NULL,
1435 author, opts, flags, &oid);
1436 strbuf_release(&sb);
1437 if (!res) {
1438 unlink(git_path_cherry_pick_head(r));
1439 unlink(git_path_merge_msg(r));
1440 if (!is_rebase_i(opts))
1441 print_commit_summary(r, NULL, &oid,
1442 SUMMARY_SHOW_AUTHOR_DATE);
1443 return res;
1446 if (res == 1)
1447 return run_git_commit(r, msg_file, opts, flags);
1449 return res;
1452 static int is_original_commit_empty(struct commit *commit)
1454 const struct object_id *ptree_oid;
1456 if (parse_commit(commit))
1457 return error(_("could not parse commit %s"),
1458 oid_to_hex(&commit->object.oid));
1459 if (commit->parents) {
1460 struct commit *parent = commit->parents->item;
1461 if (parse_commit(parent))
1462 return error(_("could not parse parent commit %s"),
1463 oid_to_hex(&parent->object.oid));
1464 ptree_oid = get_commit_tree_oid(parent);
1465 } else {
1466 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1469 return oideq(ptree_oid, get_commit_tree_oid(commit));
1473 * Do we run "git commit" with "--allow-empty"?
1475 static int allow_empty(struct repository *r,
1476 struct replay_opts *opts,
1477 struct commit *commit)
1479 int index_unchanged, empty_commit;
1482 * Three cases:
1484 * (1) we do not allow empty at all and error out.
1486 * (2) we allow ones that were initially empty, but
1487 * forbid the ones that become empty;
1489 * (3) we allow both.
1491 if (!opts->allow_empty)
1492 return 0; /* let "git commit" barf as necessary */
1494 index_unchanged = is_index_unchanged(r);
1495 if (index_unchanged < 0)
1496 return index_unchanged;
1497 if (!index_unchanged)
1498 return 0; /* we do not have to say --allow-empty */
1500 if (opts->keep_redundant_commits)
1501 return 1;
1503 empty_commit = is_original_commit_empty(commit);
1504 if (empty_commit < 0)
1505 return empty_commit;
1506 if (!empty_commit)
1507 return 0;
1508 else
1509 return 1;
1512 static struct {
1513 char c;
1514 const char *str;
1515 } todo_command_info[] = {
1516 { 'p', "pick" },
1517 { 0, "revert" },
1518 { 'e', "edit" },
1519 { 'r', "reword" },
1520 { 'f', "fixup" },
1521 { 's', "squash" },
1522 { 'x', "exec" },
1523 { 'b', "break" },
1524 { 'l', "label" },
1525 { 't', "reset" },
1526 { 'm', "merge" },
1527 { 0, "noop" },
1528 { 'd', "drop" },
1529 { 0, NULL }
1532 static const char *command_to_string(const enum todo_command command)
1534 if (command < TODO_COMMENT)
1535 return todo_command_info[command].str;
1536 die(_("unknown command: %d"), command);
1539 static char command_to_char(const enum todo_command command)
1541 if (command < TODO_COMMENT && todo_command_info[command].c)
1542 return todo_command_info[command].c;
1543 return comment_line_char;
1546 static int is_noop(const enum todo_command command)
1548 return TODO_NOOP <= command;
1551 static int is_fixup(enum todo_command command)
1553 return command == TODO_FIXUP || command == TODO_SQUASH;
1556 /* Does this command create a (non-merge) commit? */
1557 static int is_pick_or_similar(enum todo_command command)
1559 switch (command) {
1560 case TODO_PICK:
1561 case TODO_REVERT:
1562 case TODO_EDIT:
1563 case TODO_REWORD:
1564 case TODO_FIXUP:
1565 case TODO_SQUASH:
1566 return 1;
1567 default:
1568 return 0;
1572 static int update_squash_messages(struct repository *r,
1573 enum todo_command command,
1574 struct commit *commit,
1575 struct replay_opts *opts)
1577 struct strbuf buf = STRBUF_INIT;
1578 int res;
1579 const char *message, *body;
1581 if (opts->current_fixup_count > 0) {
1582 struct strbuf header = STRBUF_INIT;
1583 char *eol;
1585 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1586 return error(_("could not read '%s'"),
1587 rebase_path_squash_msg());
1589 eol = buf.buf[0] != comment_line_char ?
1590 buf.buf : strchrnul(buf.buf, '\n');
1592 strbuf_addf(&header, "%c ", comment_line_char);
1593 strbuf_addf(&header, _("This is a combination of %d commits."),
1594 opts->current_fixup_count + 2);
1595 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1596 strbuf_release(&header);
1597 } else {
1598 struct object_id head;
1599 struct commit *head_commit;
1600 const char *head_message, *body;
1602 if (get_oid("HEAD", &head))
1603 return error(_("need a HEAD to fixup"));
1604 if (!(head_commit = lookup_commit_reference(r, &head)))
1605 return error(_("could not read HEAD"));
1606 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1607 return error(_("could not read HEAD's commit message"));
1609 find_commit_subject(head_message, &body);
1610 if (write_message(body, strlen(body),
1611 rebase_path_fixup_msg(), 0)) {
1612 unuse_commit_buffer(head_commit, head_message);
1613 return error(_("cannot write '%s'"),
1614 rebase_path_fixup_msg());
1617 strbuf_addf(&buf, "%c ", comment_line_char);
1618 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1619 strbuf_addf(&buf, "\n%c ", comment_line_char);
1620 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1621 strbuf_addstr(&buf, "\n\n");
1622 strbuf_addstr(&buf, body);
1624 unuse_commit_buffer(head_commit, head_message);
1627 if (!(message = get_commit_buffer(commit, NULL)))
1628 return error(_("could not read commit message of %s"),
1629 oid_to_hex(&commit->object.oid));
1630 find_commit_subject(message, &body);
1632 if (command == TODO_SQUASH) {
1633 unlink(rebase_path_fixup_msg());
1634 strbuf_addf(&buf, "\n%c ", comment_line_char);
1635 strbuf_addf(&buf, _("This is the commit message #%d:"),
1636 ++opts->current_fixup_count + 1);
1637 strbuf_addstr(&buf, "\n\n");
1638 strbuf_addstr(&buf, body);
1639 } else if (command == TODO_FIXUP) {
1640 strbuf_addf(&buf, "\n%c ", comment_line_char);
1641 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1642 ++opts->current_fixup_count + 1);
1643 strbuf_addstr(&buf, "\n\n");
1644 strbuf_add_commented_lines(&buf, body, strlen(body));
1645 } else
1646 return error(_("unknown command: %d"), command);
1647 unuse_commit_buffer(commit, message);
1649 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1650 strbuf_release(&buf);
1652 if (!res) {
1653 strbuf_addf(&opts->current_fixups, "%s%s %s",
1654 opts->current_fixups.len ? "\n" : "",
1655 command_to_string(command),
1656 oid_to_hex(&commit->object.oid));
1657 res = write_message(opts->current_fixups.buf,
1658 opts->current_fixups.len,
1659 rebase_path_current_fixups(), 0);
1662 return res;
1665 static void flush_rewritten_pending(void)
1667 struct strbuf buf = STRBUF_INIT;
1668 struct object_id newoid;
1669 FILE *out;
1671 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1672 !get_oid("HEAD", &newoid) &&
1673 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1674 char *bol = buf.buf, *eol;
1676 while (*bol) {
1677 eol = strchrnul(bol, '\n');
1678 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1679 bol, oid_to_hex(&newoid));
1680 if (!*eol)
1681 break;
1682 bol = eol + 1;
1684 fclose(out);
1685 unlink(rebase_path_rewritten_pending());
1687 strbuf_release(&buf);
1690 static void record_in_rewritten(struct object_id *oid,
1691 enum todo_command next_command)
1693 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1695 if (!out)
1696 return;
1698 fprintf(out, "%s\n", oid_to_hex(oid));
1699 fclose(out);
1701 if (!is_fixup(next_command))
1702 flush_rewritten_pending();
1705 static int do_pick_commit(struct repository *r,
1706 enum todo_command command,
1707 struct commit *commit,
1708 struct replay_opts *opts,
1709 int final_fixup, int *check_todo)
1711 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1712 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
1713 struct object_id head;
1714 struct commit *base, *next, *parent;
1715 const char *base_label, *next_label;
1716 char *author = NULL;
1717 struct commit_message msg = { NULL, NULL, NULL, NULL };
1718 struct strbuf msgbuf = STRBUF_INIT;
1719 int res, unborn = 0, reword = 0, allow;
1721 if (opts->no_commit) {
1723 * We do not intend to commit immediately. We just want to
1724 * merge the differences in, so let's compute the tree
1725 * that represents the "current" state for merge-recursive
1726 * to work on.
1728 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
1729 return error(_("your index file is unmerged."));
1730 } else {
1731 unborn = get_oid("HEAD", &head);
1732 /* Do we want to generate a root commit? */
1733 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1734 oideq(&head, &opts->squash_onto)) {
1735 if (is_fixup(command))
1736 return error(_("cannot fixup root commit"));
1737 flags |= CREATE_ROOT_COMMIT;
1738 unborn = 1;
1739 } else if (unborn)
1740 oidcpy(&head, the_hash_algo->empty_tree);
1741 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
1742 NULL, 0))
1743 return error_dirty_index(r, opts);
1745 discard_index(r->index);
1747 if (!commit->parents)
1748 parent = NULL;
1749 else if (commit->parents->next) {
1750 /* Reverting or cherry-picking a merge commit */
1751 int cnt;
1752 struct commit_list *p;
1754 if (!opts->mainline)
1755 return error(_("commit %s is a merge but no -m option was given."),
1756 oid_to_hex(&commit->object.oid));
1758 for (cnt = 1, p = commit->parents;
1759 cnt != opts->mainline && p;
1760 cnt++)
1761 p = p->next;
1762 if (cnt != opts->mainline || !p)
1763 return error(_("commit %s does not have parent %d"),
1764 oid_to_hex(&commit->object.oid), opts->mainline);
1765 parent = p->item;
1766 } else if (1 < opts->mainline)
1768 * Non-first parent explicitly specified as mainline for
1769 * non-merge commit
1771 return error(_("commit %s does not have parent %d"),
1772 oid_to_hex(&commit->object.oid), opts->mainline);
1773 else
1774 parent = commit->parents->item;
1776 if (get_message(commit, &msg) != 0)
1777 return error(_("cannot get commit message for %s"),
1778 oid_to_hex(&commit->object.oid));
1780 if (opts->allow_ff && !is_fixup(command) &&
1781 ((parent && oideq(&parent->object.oid, &head)) ||
1782 (!parent && unborn))) {
1783 if (is_rebase_i(opts))
1784 write_author_script(msg.message);
1785 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
1786 opts);
1787 if (res || command != TODO_REWORD)
1788 goto leave;
1789 reword = 1;
1790 msg_file = NULL;
1791 goto fast_forward_edit;
1793 if (parent && parse_commit(parent) < 0)
1794 /* TRANSLATORS: The first %s will be a "todo" command like
1795 "revert" or "pick", the second %s a SHA1. */
1796 return error(_("%s: cannot parse parent commit %s"),
1797 command_to_string(command),
1798 oid_to_hex(&parent->object.oid));
1801 * "commit" is an existing commit. We would want to apply
1802 * the difference it introduces since its first parent "prev"
1803 * on top of the current HEAD if we are cherry-pick. Or the
1804 * reverse of it if we are revert.
1807 if (command == TODO_REVERT) {
1808 base = commit;
1809 base_label = msg.label;
1810 next = parent;
1811 next_label = msg.parent_label;
1812 strbuf_addstr(&msgbuf, "Revert \"");
1813 strbuf_addstr(&msgbuf, msg.subject);
1814 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1815 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1817 if (commit->parents && commit->parents->next) {
1818 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1819 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1821 strbuf_addstr(&msgbuf, ".\n");
1822 } else {
1823 const char *p;
1825 base = parent;
1826 base_label = msg.parent_label;
1827 next = commit;
1828 next_label = msg.label;
1830 /* Append the commit log message to msgbuf. */
1831 if (find_commit_subject(msg.message, &p))
1832 strbuf_addstr(&msgbuf, p);
1834 if (opts->record_origin) {
1835 strbuf_complete_line(&msgbuf);
1836 if (!has_conforming_footer(&msgbuf, NULL, 0))
1837 strbuf_addch(&msgbuf, '\n');
1838 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1839 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1840 strbuf_addstr(&msgbuf, ")\n");
1842 if (!is_fixup(command))
1843 author = get_author(msg.message);
1846 if (command == TODO_REWORD)
1847 reword = 1;
1848 else if (is_fixup(command)) {
1849 if (update_squash_messages(r, command, commit, opts))
1850 return -1;
1851 flags |= AMEND_MSG;
1852 if (!final_fixup)
1853 msg_file = rebase_path_squash_msg();
1854 else if (file_exists(rebase_path_fixup_msg())) {
1855 flags |= CLEANUP_MSG;
1856 msg_file = rebase_path_fixup_msg();
1857 } else {
1858 const char *dest = git_path_squash_msg(r);
1859 unlink(dest);
1860 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1861 return error(_("could not rename '%s' to '%s'"),
1862 rebase_path_squash_msg(), dest);
1863 unlink(git_path_merge_msg(r));
1864 msg_file = dest;
1865 flags |= EDIT_MSG;
1869 if (opts->signoff && !is_fixup(command))
1870 append_signoff(&msgbuf, 0, 0);
1872 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1873 res = -1;
1874 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1875 res = do_recursive_merge(r, base, next, base_label, next_label,
1876 &head, &msgbuf, opts);
1877 if (res < 0)
1878 goto leave;
1880 res |= write_message(msgbuf.buf, msgbuf.len,
1881 git_path_merge_msg(r), 0);
1882 } else {
1883 struct commit_list *common = NULL;
1884 struct commit_list *remotes = NULL;
1886 res = write_message(msgbuf.buf, msgbuf.len,
1887 git_path_merge_msg(r), 0);
1889 commit_list_insert(base, &common);
1890 commit_list_insert(next, &remotes);
1891 res |= try_merge_command(r, opts->strategy,
1892 opts->xopts_nr, (const char **)opts->xopts,
1893 common, oid_to_hex(&head), remotes);
1894 free_commit_list(common);
1895 free_commit_list(remotes);
1897 strbuf_release(&msgbuf);
1900 * If the merge was clean or if it failed due to conflict, we write
1901 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1902 * However, if the merge did not even start, then we don't want to
1903 * write it at all.
1905 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
1906 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
1907 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1908 res = -1;
1909 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
1910 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
1911 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1912 res = -1;
1914 if (res) {
1915 error(command == TODO_REVERT
1916 ? _("could not revert %s... %s")
1917 : _("could not apply %s... %s"),
1918 short_commit_name(commit), msg.subject);
1919 print_advice(r, res == 1, opts);
1920 repo_rerere(r, opts->allow_rerere_auto);
1921 goto leave;
1924 allow = allow_empty(r, opts, commit);
1925 if (allow < 0) {
1926 res = allow;
1927 goto leave;
1928 } else if (allow)
1929 flags |= ALLOW_EMPTY;
1930 if (!opts->no_commit) {
1931 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1932 res = do_commit(r, msg_file, author, opts, flags);
1933 else
1934 res = error(_("unable to parse commit author"));
1935 *check_todo = !!(flags & EDIT_MSG);
1936 if (!res && reword) {
1937 fast_forward_edit:
1938 res = run_git_commit(r, NULL, opts, EDIT_MSG |
1939 VERIFY_MSG | AMEND_MSG |
1940 (flags & ALLOW_EMPTY));
1941 *check_todo = 1;
1946 if (!res && final_fixup) {
1947 unlink(rebase_path_fixup_msg());
1948 unlink(rebase_path_squash_msg());
1949 unlink(rebase_path_current_fixups());
1950 strbuf_reset(&opts->current_fixups);
1951 opts->current_fixup_count = 0;
1954 leave:
1955 free_message(commit, &msg);
1956 free(author);
1957 update_abort_safety_file();
1959 return res;
1962 static int prepare_revs(struct replay_opts *opts)
1965 * picking (but not reverting) ranges (but not individual revisions)
1966 * should be done in reverse
1968 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1969 opts->revs->reverse ^= 1;
1971 if (prepare_revision_walk(opts->revs))
1972 return error(_("revision walk setup failed"));
1974 return 0;
1977 static int read_and_refresh_cache(struct repository *r,
1978 struct replay_opts *opts)
1980 struct lock_file index_lock = LOCK_INIT;
1981 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
1982 if (repo_read_index(r) < 0) {
1983 rollback_lock_file(&index_lock);
1984 return error(_("git %s: failed to read the index"),
1985 _(action_name(opts)));
1987 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
1988 if (index_fd >= 0) {
1989 if (write_locked_index(r->index, &index_lock,
1990 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
1991 return error(_("git %s: failed to refresh the index"),
1992 _(action_name(opts)));
1995 return 0;
1998 enum todo_item_flags {
1999 TODO_EDIT_MERGE_MSG = 1
2002 void todo_list_release(struct todo_list *todo_list)
2004 strbuf_release(&todo_list->buf);
2005 FREE_AND_NULL(todo_list->items);
2006 todo_list->nr = todo_list->alloc = 0;
2009 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2011 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2012 return todo_list->items + todo_list->nr++;
2015 const char *todo_item_get_arg(struct todo_list *todo_list,
2016 struct todo_item *item)
2018 return todo_list->buf.buf + item->arg_offset;
2021 static int is_command(enum todo_command command, const char **bol)
2023 const char *str = todo_command_info[command].str;
2024 const char nick = todo_command_info[command].c;
2025 const char *p = *bol + 1;
2027 return skip_prefix(*bol, str, bol) ||
2028 ((nick && **bol == nick) &&
2029 (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || !*p) &&
2030 (*bol = p));
2033 static int parse_insn_line(struct repository *r, struct todo_item *item,
2034 const char *buf, const char *bol, char *eol)
2036 struct object_id commit_oid;
2037 char *end_of_object_name;
2038 int i, saved, status, padding;
2040 item->flags = 0;
2042 /* left-trim */
2043 bol += strspn(bol, " \t");
2045 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2046 item->command = TODO_COMMENT;
2047 item->commit = NULL;
2048 item->arg_offset = bol - buf;
2049 item->arg_len = eol - bol;
2050 return 0;
2053 for (i = 0; i < TODO_COMMENT; i++)
2054 if (is_command(i, &bol)) {
2055 item->command = i;
2056 break;
2058 if (i >= TODO_COMMENT)
2059 return -1;
2061 /* Eat up extra spaces/ tabs before object name */
2062 padding = strspn(bol, " \t");
2063 bol += padding;
2065 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2066 if (bol != eol)
2067 return error(_("%s does not accept arguments: '%s'"),
2068 command_to_string(item->command), bol);
2069 item->commit = NULL;
2070 item->arg_offset = bol - buf;
2071 item->arg_len = eol - bol;
2072 return 0;
2075 if (!padding)
2076 return error(_("missing arguments for %s"),
2077 command_to_string(item->command));
2079 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2080 item->command == TODO_RESET) {
2081 item->commit = NULL;
2082 item->arg_offset = bol - buf;
2083 item->arg_len = (int)(eol - bol);
2084 return 0;
2087 if (item->command == TODO_MERGE) {
2088 if (skip_prefix(bol, "-C", &bol))
2089 bol += strspn(bol, " \t");
2090 else if (skip_prefix(bol, "-c", &bol)) {
2091 bol += strspn(bol, " \t");
2092 item->flags |= TODO_EDIT_MERGE_MSG;
2093 } else {
2094 item->flags |= TODO_EDIT_MERGE_MSG;
2095 item->commit = NULL;
2096 item->arg_offset = bol - buf;
2097 item->arg_len = (int)(eol - bol);
2098 return 0;
2102 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2103 saved = *end_of_object_name;
2104 *end_of_object_name = '\0';
2105 status = get_oid(bol, &commit_oid);
2106 *end_of_object_name = saved;
2108 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2109 item->arg_offset = bol - buf;
2110 item->arg_len = (int)(eol - bol);
2112 if (status < 0)
2113 return error(_("could not parse '%.*s'"),
2114 (int)(end_of_object_name - bol), bol);
2116 item->commit = lookup_commit_reference(r, &commit_oid);
2117 return !item->commit;
2120 int sequencer_get_last_command(struct repository *r, enum replay_action *action)
2122 const char *todo_file, *bol;
2123 struct strbuf buf = STRBUF_INIT;
2124 int ret = 0;
2126 todo_file = git_path_todo_file();
2127 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2128 if (errno == ENOENT || errno == ENOTDIR)
2129 return -1;
2130 else
2131 return error_errno("unable to open '%s'", todo_file);
2133 bol = buf.buf + strspn(buf.buf, " \t\r\n");
2134 if (is_command(TODO_PICK, &bol) && (*bol == ' ' || *bol == '\t'))
2135 *action = REPLAY_PICK;
2136 else if (is_command(TODO_REVERT, &bol) &&
2137 (*bol == ' ' || *bol == '\t'))
2138 *action = REPLAY_REVERT;
2139 else
2140 ret = -1;
2142 strbuf_release(&buf);
2144 return ret;
2147 int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2148 struct todo_list *todo_list)
2150 struct todo_item *item;
2151 char *p = buf, *next_p;
2152 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2154 todo_list->current = todo_list->nr = 0;
2156 for (i = 1; *p; i++, p = next_p) {
2157 char *eol = strchrnul(p, '\n');
2159 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2161 if (p != eol && eol[-1] == '\r')
2162 eol--; /* strip Carriage Return */
2164 item = append_new_todo(todo_list);
2165 item->offset_in_buf = p - todo_list->buf.buf;
2166 if (parse_insn_line(r, item, buf, p, eol)) {
2167 res = error(_("invalid line %d: %.*s"),
2168 i, (int)(eol - p), p);
2169 item->command = TODO_COMMENT + 1;
2170 item->arg_offset = p - buf;
2171 item->arg_len = (int)(eol - p);
2172 item->commit = NULL;
2175 if (fixup_okay)
2176 ; /* do nothing */
2177 else if (is_fixup(item->command))
2178 return error(_("cannot '%s' without a previous commit"),
2179 command_to_string(item->command));
2180 else if (!is_noop(item->command))
2181 fixup_okay = 1;
2184 return res;
2187 static int count_commands(struct todo_list *todo_list)
2189 int count = 0, i;
2191 for (i = 0; i < todo_list->nr; i++)
2192 if (todo_list->items[i].command != TODO_COMMENT)
2193 count++;
2195 return count;
2198 static int get_item_line_offset(struct todo_list *todo_list, int index)
2200 return index < todo_list->nr ?
2201 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2204 static const char *get_item_line(struct todo_list *todo_list, int index)
2206 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2209 static int get_item_line_length(struct todo_list *todo_list, int index)
2211 return get_item_line_offset(todo_list, index + 1)
2212 - get_item_line_offset(todo_list, index);
2215 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2217 int fd;
2218 ssize_t len;
2220 fd = open(path, O_RDONLY);
2221 if (fd < 0)
2222 return error_errno(_("could not open '%s'"), path);
2223 len = strbuf_read(sb, fd, 0);
2224 close(fd);
2225 if (len < 0)
2226 return error(_("could not read '%s'."), path);
2227 return len;
2230 static int have_finished_the_last_pick(void)
2232 struct strbuf buf = STRBUF_INIT;
2233 const char *eol;
2234 const char *todo_path = git_path_todo_file();
2235 int ret = 0;
2237 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2238 if (errno == ENOENT) {
2239 return 0;
2240 } else {
2241 error_errno("unable to open '%s'", todo_path);
2242 return 0;
2245 /* If there is only one line then we are done */
2246 eol = strchr(buf.buf, '\n');
2247 if (!eol || !eol[1])
2248 ret = 1;
2250 strbuf_release(&buf);
2252 return ret;
2255 void sequencer_post_commit_cleanup(struct repository *r, int verbose)
2257 struct replay_opts opts = REPLAY_OPTS_INIT;
2258 int need_cleanup = 0;
2260 if (file_exists(git_path_cherry_pick_head(r))) {
2261 if (!unlink(git_path_cherry_pick_head(r)) && verbose)
2262 warning(_("cancelling a cherry picking in progress"));
2263 opts.action = REPLAY_PICK;
2264 need_cleanup = 1;
2267 if (file_exists(git_path_revert_head(r))) {
2268 if (!unlink(git_path_revert_head(r)) && verbose)
2269 warning(_("cancelling a revert in progress"));
2270 opts.action = REPLAY_REVERT;
2271 need_cleanup = 1;
2274 if (!need_cleanup)
2275 return;
2277 if (!have_finished_the_last_pick())
2278 return;
2280 sequencer_remove_state(&opts);
2283 static int read_populate_todo(struct repository *r,
2284 struct todo_list *todo_list,
2285 struct replay_opts *opts)
2287 struct stat st;
2288 const char *todo_file = get_todo_path(opts);
2289 int res;
2291 strbuf_reset(&todo_list->buf);
2292 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2293 return -1;
2295 res = stat(todo_file, &st);
2296 if (res)
2297 return error(_("could not stat '%s'"), todo_file);
2298 fill_stat_data(&todo_list->stat, &st);
2300 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2301 if (res) {
2302 if (is_rebase_i(opts))
2303 return error(_("please fix this using "
2304 "'git rebase --edit-todo'."));
2305 return error(_("unusable instruction sheet: '%s'"), todo_file);
2308 if (!todo_list->nr &&
2309 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2310 return error(_("no commits parsed."));
2312 if (!is_rebase_i(opts)) {
2313 enum todo_command valid =
2314 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2315 int i;
2317 for (i = 0; i < todo_list->nr; i++)
2318 if (valid == todo_list->items[i].command)
2319 continue;
2320 else if (valid == TODO_PICK)
2321 return error(_("cannot cherry-pick during a revert."));
2322 else
2323 return error(_("cannot revert during a cherry-pick."));
2326 if (is_rebase_i(opts)) {
2327 struct todo_list done = TODO_LIST_INIT;
2328 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2330 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2331 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
2332 todo_list->done_nr = count_commands(&done);
2333 else
2334 todo_list->done_nr = 0;
2336 todo_list->total_nr = todo_list->done_nr
2337 + count_commands(todo_list);
2338 todo_list_release(&done);
2340 if (f) {
2341 fprintf(f, "%d\n", todo_list->total_nr);
2342 fclose(f);
2346 return 0;
2349 static int git_config_string_dup(char **dest,
2350 const char *var, const char *value)
2352 if (!value)
2353 return config_error_nonbool(var);
2354 free(*dest);
2355 *dest = xstrdup(value);
2356 return 0;
2359 static int populate_opts_cb(const char *key, const char *value, void *data)
2361 struct replay_opts *opts = data;
2362 int error_flag = 1;
2364 if (!value)
2365 error_flag = 0;
2366 else if (!strcmp(key, "options.no-commit"))
2367 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2368 else if (!strcmp(key, "options.edit"))
2369 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2370 else if (!strcmp(key, "options.allow-empty"))
2371 opts->allow_empty =
2372 git_config_bool_or_int(key, value, &error_flag);
2373 else if (!strcmp(key, "options.allow-empty-message"))
2374 opts->allow_empty_message =
2375 git_config_bool_or_int(key, value, &error_flag);
2376 else if (!strcmp(key, "options.keep-redundant-commits"))
2377 opts->keep_redundant_commits =
2378 git_config_bool_or_int(key, value, &error_flag);
2379 else if (!strcmp(key, "options.signoff"))
2380 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2381 else if (!strcmp(key, "options.record-origin"))
2382 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2383 else if (!strcmp(key, "options.allow-ff"))
2384 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2385 else if (!strcmp(key, "options.mainline"))
2386 opts->mainline = git_config_int(key, value);
2387 else if (!strcmp(key, "options.strategy"))
2388 git_config_string_dup(&opts->strategy, key, value);
2389 else if (!strcmp(key, "options.gpg-sign"))
2390 git_config_string_dup(&opts->gpg_sign, key, value);
2391 else if (!strcmp(key, "options.strategy-option")) {
2392 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2393 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2394 } else if (!strcmp(key, "options.allow-rerere-auto"))
2395 opts->allow_rerere_auto =
2396 git_config_bool_or_int(key, value, &error_flag) ?
2397 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2398 else if (!strcmp(key, "options.default-msg-cleanup")) {
2399 opts->explicit_cleanup = 1;
2400 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
2401 } else
2402 return error(_("invalid key: %s"), key);
2404 if (!error_flag)
2405 return error(_("invalid value for %s: %s"), key, value);
2407 return 0;
2410 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2412 int i;
2413 char *strategy_opts_string = raw_opts;
2415 if (*strategy_opts_string == ' ')
2416 strategy_opts_string++;
2418 opts->xopts_nr = split_cmdline(strategy_opts_string,
2419 (const char ***)&opts->xopts);
2420 for (i = 0; i < opts->xopts_nr; i++) {
2421 const char *arg = opts->xopts[i];
2423 skip_prefix(arg, "--", &arg);
2424 opts->xopts[i] = xstrdup(arg);
2428 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2430 strbuf_reset(buf);
2431 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2432 return;
2433 opts->strategy = strbuf_detach(buf, NULL);
2434 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2435 return;
2437 parse_strategy_opts(opts, buf->buf);
2440 static int read_populate_opts(struct replay_opts *opts)
2442 if (is_rebase_i(opts)) {
2443 struct strbuf buf = STRBUF_INIT;
2445 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2446 if (!starts_with(buf.buf, "-S"))
2447 strbuf_reset(&buf);
2448 else {
2449 free(opts->gpg_sign);
2450 opts->gpg_sign = xstrdup(buf.buf + 2);
2452 strbuf_reset(&buf);
2455 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2456 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2457 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2458 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2459 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2460 strbuf_reset(&buf);
2463 if (file_exists(rebase_path_verbose()))
2464 opts->verbose = 1;
2466 if (file_exists(rebase_path_quiet()))
2467 opts->quiet = 1;
2469 if (file_exists(rebase_path_signoff())) {
2470 opts->allow_ff = 0;
2471 opts->signoff = 1;
2474 if (file_exists(rebase_path_reschedule_failed_exec()))
2475 opts->reschedule_failed_exec = 1;
2477 read_strategy_opts(opts, &buf);
2478 strbuf_release(&buf);
2480 if (read_oneliner(&opts->current_fixups,
2481 rebase_path_current_fixups(), 1)) {
2482 const char *p = opts->current_fixups.buf;
2483 opts->current_fixup_count = 1;
2484 while ((p = strchr(p, '\n'))) {
2485 opts->current_fixup_count++;
2486 p++;
2490 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2491 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2492 return error(_("unusable squash-onto"));
2493 opts->have_squash_onto = 1;
2496 return 0;
2499 if (!file_exists(git_path_opts_file()))
2500 return 0;
2502 * The function git_parse_source(), called from git_config_from_file(),
2503 * may die() in case of a syntactically incorrect file. We do not care
2504 * about this case, though, because we wrote that file ourselves, so we
2505 * are pretty certain that it is syntactically correct.
2507 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2508 return error(_("malformed options sheet: '%s'"),
2509 git_path_opts_file());
2510 return 0;
2513 static void write_strategy_opts(struct replay_opts *opts)
2515 int i;
2516 struct strbuf buf = STRBUF_INIT;
2518 for (i = 0; i < opts->xopts_nr; ++i)
2519 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2521 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2522 strbuf_release(&buf);
2525 int write_basic_state(struct replay_opts *opts, const char *head_name,
2526 struct commit *onto, const char *orig_head)
2528 const char *quiet = getenv("GIT_QUIET");
2530 if (head_name)
2531 write_file(rebase_path_head_name(), "%s\n", head_name);
2532 if (onto)
2533 write_file(rebase_path_onto(), "%s\n",
2534 oid_to_hex(&onto->object.oid));
2535 if (orig_head)
2536 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2538 if (quiet)
2539 write_file(rebase_path_quiet(), "%s\n", quiet);
2540 if (opts->verbose)
2541 write_file(rebase_path_verbose(), "%s", "");
2542 if (opts->strategy)
2543 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2544 if (opts->xopts_nr > 0)
2545 write_strategy_opts(opts);
2547 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2548 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2549 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2550 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2552 if (opts->gpg_sign)
2553 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2554 if (opts->signoff)
2555 write_file(rebase_path_signoff(), "--signoff\n");
2556 if (opts->reschedule_failed_exec)
2557 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
2559 return 0;
2562 static int walk_revs_populate_todo(struct todo_list *todo_list,
2563 struct replay_opts *opts)
2565 enum todo_command command = opts->action == REPLAY_PICK ?
2566 TODO_PICK : TODO_REVERT;
2567 const char *command_string = todo_command_info[command].str;
2568 struct commit *commit;
2570 if (prepare_revs(opts))
2571 return -1;
2573 while ((commit = get_revision(opts->revs))) {
2574 struct todo_item *item = append_new_todo(todo_list);
2575 const char *commit_buffer = get_commit_buffer(commit, NULL);
2576 const char *subject;
2577 int subject_len;
2579 item->command = command;
2580 item->commit = commit;
2581 item->arg_offset = 0;
2582 item->arg_len = 0;
2583 item->offset_in_buf = todo_list->buf.len;
2584 subject_len = find_commit_subject(commit_buffer, &subject);
2585 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2586 short_commit_name(commit), subject_len, subject);
2587 unuse_commit_buffer(commit, commit_buffer);
2590 if (!todo_list->nr)
2591 return error(_("empty commit set passed"));
2593 return 0;
2596 static int create_seq_dir(struct repository *r)
2598 enum replay_action action;
2599 const char *in_progress_error = NULL;
2600 const char *in_progress_advice = NULL;
2601 unsigned int advise_skip = file_exists(git_path_revert_head(r)) ||
2602 file_exists(git_path_cherry_pick_head(r));
2604 if (!sequencer_get_last_command(r, &action)) {
2605 switch (action) {
2606 case REPLAY_REVERT:
2607 in_progress_error = _("revert is already in progress");
2608 in_progress_advice =
2609 _("try \"git revert (--continue | %s--abort | --quit)\"");
2610 break;
2611 case REPLAY_PICK:
2612 in_progress_error = _("cherry-pick is already in progress");
2613 in_progress_advice =
2614 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
2615 break;
2616 default:
2617 BUG("unexpected action in create_seq_dir");
2620 if (in_progress_error) {
2621 error("%s", in_progress_error);
2622 if (advice_sequencer_in_use)
2623 advise(in_progress_advice,
2624 advise_skip ? "--skip | " : "");
2625 return -1;
2627 if (mkdir(git_path_seq_dir(), 0777) < 0)
2628 return error_errno(_("could not create sequencer directory '%s'"),
2629 git_path_seq_dir());
2631 return 0;
2634 static int save_head(const char *head)
2636 struct lock_file head_lock = LOCK_INIT;
2637 struct strbuf buf = STRBUF_INIT;
2638 int fd;
2639 ssize_t written;
2641 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2642 if (fd < 0)
2643 return error_errno(_("could not lock HEAD"));
2644 strbuf_addf(&buf, "%s\n", head);
2645 written = write_in_full(fd, buf.buf, buf.len);
2646 strbuf_release(&buf);
2647 if (written < 0) {
2648 error_errno(_("could not write to '%s'"), git_path_head_file());
2649 rollback_lock_file(&head_lock);
2650 return -1;
2652 if (commit_lock_file(&head_lock) < 0)
2653 return error(_("failed to finalize '%s'"), git_path_head_file());
2654 return 0;
2657 static int rollback_is_safe(void)
2659 struct strbuf sb = STRBUF_INIT;
2660 struct object_id expected_head, actual_head;
2662 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2663 strbuf_trim(&sb);
2664 if (get_oid_hex(sb.buf, &expected_head)) {
2665 strbuf_release(&sb);
2666 die(_("could not parse %s"), git_path_abort_safety_file());
2668 strbuf_release(&sb);
2670 else if (errno == ENOENT)
2671 oidclr(&expected_head);
2672 else
2673 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2675 if (get_oid("HEAD", &actual_head))
2676 oidclr(&actual_head);
2678 return oideq(&actual_head, &expected_head);
2681 static int reset_merge(const struct object_id *oid)
2683 int ret;
2684 struct argv_array argv = ARGV_ARRAY_INIT;
2686 argv_array_pushl(&argv, "reset", "--merge", NULL);
2688 if (!is_null_oid(oid))
2689 argv_array_push(&argv, oid_to_hex(oid));
2691 ret = run_command_v_opt(argv.argv, RUN_GIT_CMD);
2692 argv_array_clear(&argv);
2694 return ret;
2697 static int rollback_single_pick(struct repository *r)
2699 struct object_id head_oid;
2701 if (!file_exists(git_path_cherry_pick_head(r)) &&
2702 !file_exists(git_path_revert_head(r)))
2703 return error(_("no cherry-pick or revert in progress"));
2704 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2705 return error(_("cannot resolve HEAD"));
2706 if (is_null_oid(&head_oid))
2707 return error(_("cannot abort from a branch yet to be born"));
2708 return reset_merge(&head_oid);
2711 static int skip_single_pick(void)
2713 struct object_id head;
2715 if (read_ref_full("HEAD", 0, &head, NULL))
2716 return error(_("cannot resolve HEAD"));
2717 return reset_merge(&head);
2720 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
2722 FILE *f;
2723 struct object_id oid;
2724 struct strbuf buf = STRBUF_INIT;
2725 const char *p;
2727 f = fopen(git_path_head_file(), "r");
2728 if (!f && errno == ENOENT) {
2730 * There is no multiple-cherry-pick in progress.
2731 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2732 * a single-cherry-pick in progress, abort that.
2734 return rollback_single_pick(r);
2736 if (!f)
2737 return error_errno(_("cannot open '%s'"), git_path_head_file());
2738 if (strbuf_getline_lf(&buf, f)) {
2739 error(_("cannot read '%s': %s"), git_path_head_file(),
2740 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2741 fclose(f);
2742 goto fail;
2744 fclose(f);
2745 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2746 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2747 git_path_head_file());
2748 goto fail;
2750 if (is_null_oid(&oid)) {
2751 error(_("cannot abort from a branch yet to be born"));
2752 goto fail;
2755 if (!rollback_is_safe()) {
2756 /* Do not error, just do not rollback */
2757 warning(_("You seem to have moved HEAD. "
2758 "Not rewinding, check your HEAD!"));
2759 } else
2760 if (reset_merge(&oid))
2761 goto fail;
2762 strbuf_release(&buf);
2763 return sequencer_remove_state(opts);
2764 fail:
2765 strbuf_release(&buf);
2766 return -1;
2769 int sequencer_skip(struct repository *r, struct replay_opts *opts)
2771 enum replay_action action = -1;
2772 sequencer_get_last_command(r, &action);
2775 * Check whether the subcommand requested to skip the commit is actually
2776 * in progress and that it's safe to skip the commit.
2778 * opts->action tells us which subcommand requested to skip the commit.
2779 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
2780 * action is in progress and we can skip the commit.
2782 * Otherwise we check that the last instruction was related to the
2783 * particular subcommand we're trying to execute and barf if that's not
2784 * the case.
2786 * Finally we check that the rollback is "safe", i.e., has the HEAD
2787 * moved? In this case, it doesn't make sense to "reset the merge" and
2788 * "skip the commit" as the user already handled this by committing. But
2789 * we'd not want to barf here, instead give advice on how to proceed. We
2790 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
2791 * it gets removed when the user commits, so if it still exists we're
2792 * sure the user can't have committed before.
2794 switch (opts->action) {
2795 case REPLAY_REVERT:
2796 if (!file_exists(git_path_revert_head(r))) {
2797 if (action != REPLAY_REVERT)
2798 return error(_("no revert in progress"));
2799 if (!rollback_is_safe())
2800 goto give_advice;
2802 break;
2803 case REPLAY_PICK:
2804 if (!file_exists(git_path_cherry_pick_head(r))) {
2805 if (action != REPLAY_PICK)
2806 return error(_("no cherry-pick in progress"));
2807 if (!rollback_is_safe())
2808 goto give_advice;
2810 break;
2811 default:
2812 BUG("unexpected action in sequencer_skip");
2815 if (skip_single_pick())
2816 return error(_("failed to skip the commit"));
2817 if (!is_directory(git_path_seq_dir()))
2818 return 0;
2820 return sequencer_continue(r, opts);
2822 give_advice:
2823 error(_("there is nothing to skip"));
2825 if (advice_resolve_conflict) {
2826 advise(_("have you committed already?\n"
2827 "try \"git %s --continue\""),
2828 action == REPLAY_REVERT ? "revert" : "cherry-pick");
2830 return -1;
2833 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2835 struct lock_file todo_lock = LOCK_INIT;
2836 const char *todo_path = get_todo_path(opts);
2837 int next = todo_list->current, offset, fd;
2840 * rebase -i writes "git-rebase-todo" without the currently executing
2841 * command, appending it to "done" instead.
2843 if (is_rebase_i(opts))
2844 next++;
2846 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2847 if (fd < 0)
2848 return error_errno(_("could not lock '%s'"), todo_path);
2849 offset = get_item_line_offset(todo_list, next);
2850 if (write_in_full(fd, todo_list->buf.buf + offset,
2851 todo_list->buf.len - offset) < 0)
2852 return error_errno(_("could not write to '%s'"), todo_path);
2853 if (commit_lock_file(&todo_lock) < 0)
2854 return error(_("failed to finalize '%s'"), todo_path);
2856 if (is_rebase_i(opts) && next > 0) {
2857 const char *done = rebase_path_done();
2858 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2859 int ret = 0;
2861 if (fd < 0)
2862 return 0;
2863 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2864 get_item_line_length(todo_list, next - 1))
2865 < 0)
2866 ret = error_errno(_("could not write to '%s'"), done);
2867 if (close(fd) < 0)
2868 ret = error_errno(_("failed to finalize '%s'"), done);
2869 return ret;
2871 return 0;
2874 static int save_opts(struct replay_opts *opts)
2876 const char *opts_file = git_path_opts_file();
2877 int res = 0;
2879 if (opts->no_commit)
2880 res |= git_config_set_in_file_gently(opts_file,
2881 "options.no-commit", "true");
2882 if (opts->edit)
2883 res |= git_config_set_in_file_gently(opts_file,
2884 "options.edit", "true");
2885 if (opts->allow_empty)
2886 res |= git_config_set_in_file_gently(opts_file,
2887 "options.allow-empty", "true");
2888 if (opts->allow_empty_message)
2889 res |= git_config_set_in_file_gently(opts_file,
2890 "options.allow-empty-message", "true");
2891 if (opts->keep_redundant_commits)
2892 res |= git_config_set_in_file_gently(opts_file,
2893 "options.keep-redundant-commits", "true");
2894 if (opts->signoff)
2895 res |= git_config_set_in_file_gently(opts_file,
2896 "options.signoff", "true");
2897 if (opts->record_origin)
2898 res |= git_config_set_in_file_gently(opts_file,
2899 "options.record-origin", "true");
2900 if (opts->allow_ff)
2901 res |= git_config_set_in_file_gently(opts_file,
2902 "options.allow-ff", "true");
2903 if (opts->mainline) {
2904 struct strbuf buf = STRBUF_INIT;
2905 strbuf_addf(&buf, "%d", opts->mainline);
2906 res |= git_config_set_in_file_gently(opts_file,
2907 "options.mainline", buf.buf);
2908 strbuf_release(&buf);
2910 if (opts->strategy)
2911 res |= git_config_set_in_file_gently(opts_file,
2912 "options.strategy", opts->strategy);
2913 if (opts->gpg_sign)
2914 res |= git_config_set_in_file_gently(opts_file,
2915 "options.gpg-sign", opts->gpg_sign);
2916 if (opts->xopts) {
2917 int i;
2918 for (i = 0; i < opts->xopts_nr; i++)
2919 res |= git_config_set_multivar_in_file_gently(opts_file,
2920 "options.strategy-option",
2921 opts->xopts[i], "^$", 0);
2923 if (opts->allow_rerere_auto)
2924 res |= git_config_set_in_file_gently(opts_file,
2925 "options.allow-rerere-auto",
2926 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2927 "true" : "false");
2929 if (opts->explicit_cleanup)
2930 res |= git_config_set_in_file_gently(opts_file,
2931 "options.default-msg-cleanup",
2932 describe_cleanup_mode(opts->default_msg_cleanup));
2933 return res;
2936 static int make_patch(struct repository *r,
2937 struct commit *commit,
2938 struct replay_opts *opts)
2940 struct strbuf buf = STRBUF_INIT;
2941 struct rev_info log_tree_opt;
2942 const char *subject, *p;
2943 int res = 0;
2945 p = short_commit_name(commit);
2946 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2947 return -1;
2948 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2949 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2950 res |= error(_("could not update %s"), "REBASE_HEAD");
2952 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2953 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2954 repo_init_revisions(r, &log_tree_opt, NULL);
2955 log_tree_opt.abbrev = 0;
2956 log_tree_opt.diff = 1;
2957 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2958 log_tree_opt.disable_stdin = 1;
2959 log_tree_opt.no_commit_id = 1;
2960 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2961 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2962 if (!log_tree_opt.diffopt.file)
2963 res |= error_errno(_("could not open '%s'"), buf.buf);
2964 else {
2965 res |= log_tree_commit(&log_tree_opt, commit);
2966 fclose(log_tree_opt.diffopt.file);
2968 strbuf_reset(&buf);
2970 strbuf_addf(&buf, "%s/message", get_dir(opts));
2971 if (!file_exists(buf.buf)) {
2972 const char *commit_buffer = get_commit_buffer(commit, NULL);
2973 find_commit_subject(commit_buffer, &subject);
2974 res |= write_message(subject, strlen(subject), buf.buf, 1);
2975 unuse_commit_buffer(commit, commit_buffer);
2977 strbuf_release(&buf);
2979 return res;
2982 static int intend_to_amend(void)
2984 struct object_id head;
2985 char *p;
2987 if (get_oid("HEAD", &head))
2988 return error(_("cannot read HEAD"));
2990 p = oid_to_hex(&head);
2991 return write_message(p, strlen(p), rebase_path_amend(), 1);
2994 static int error_with_patch(struct repository *r,
2995 struct commit *commit,
2996 const char *subject, int subject_len,
2997 struct replay_opts *opts,
2998 int exit_code, int to_amend)
3000 if (commit) {
3001 if (make_patch(r, commit, opts))
3002 return -1;
3003 } else if (copy_file(rebase_path_message(),
3004 git_path_merge_msg(r), 0666))
3005 return error(_("unable to copy '%s' to '%s'"),
3006 git_path_merge_msg(r), rebase_path_message());
3008 if (to_amend) {
3009 if (intend_to_amend())
3010 return -1;
3012 fprintf(stderr,
3013 _("You can amend the commit now, with\n"
3014 "\n"
3015 " git commit --amend %s\n"
3016 "\n"
3017 "Once you are satisfied with your changes, run\n"
3018 "\n"
3019 " git rebase --continue\n"),
3020 gpg_sign_opt_quoted(opts));
3021 } else if (exit_code) {
3022 if (commit)
3023 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
3024 short_commit_name(commit), subject_len, subject);
3025 else
3027 * We don't have the hash of the parent so
3028 * just print the line from the todo file.
3030 fprintf_ln(stderr, _("Could not merge %.*s"),
3031 subject_len, subject);
3034 return exit_code;
3037 static int error_failed_squash(struct repository *r,
3038 struct commit *commit,
3039 struct replay_opts *opts,
3040 int subject_len,
3041 const char *subject)
3043 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3044 return error(_("could not copy '%s' to '%s'"),
3045 rebase_path_squash_msg(), rebase_path_message());
3046 unlink(git_path_merge_msg(r));
3047 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
3048 return error(_("could not copy '%s' to '%s'"),
3049 rebase_path_message(),
3050 git_path_merge_msg(r));
3051 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
3054 static int do_exec(struct repository *r, const char *command_line)
3056 struct argv_array child_env = ARGV_ARRAY_INIT;
3057 const char *child_argv[] = { NULL, NULL };
3058 int dirty, status;
3060 fprintf(stderr, "Executing: %s\n", command_line);
3061 child_argv[0] = command_line;
3062 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
3063 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
3064 absolute_path(get_git_work_tree()));
3065 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
3066 child_env.argv);
3068 /* force re-reading of the cache */
3069 if (discard_index(r->index) < 0 || repo_read_index(r) < 0)
3070 return error(_("could not read index"));
3072 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
3074 if (status) {
3075 warning(_("execution failed: %s\n%s"
3076 "You can fix the problem, and then run\n"
3077 "\n"
3078 " git rebase --continue\n"
3079 "\n"),
3080 command_line,
3081 dirty ? N_("and made changes to the index and/or the "
3082 "working tree\n") : "");
3083 if (status == 127)
3084 /* command not found */
3085 status = 1;
3086 } else if (dirty) {
3087 warning(_("execution succeeded: %s\nbut "
3088 "left changes to the index and/or the working tree\n"
3089 "Commit or stash your changes, and then run\n"
3090 "\n"
3091 " git rebase --continue\n"
3092 "\n"), command_line);
3093 status = 1;
3096 argv_array_clear(&child_env);
3098 return status;
3101 static int safe_append(const char *filename, const char *fmt, ...)
3103 va_list ap;
3104 struct lock_file lock = LOCK_INIT;
3105 int fd = hold_lock_file_for_update(&lock, filename,
3106 LOCK_REPORT_ON_ERROR);
3107 struct strbuf buf = STRBUF_INIT;
3109 if (fd < 0)
3110 return -1;
3112 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3113 error_errno(_("could not read '%s'"), filename);
3114 rollback_lock_file(&lock);
3115 return -1;
3117 strbuf_complete(&buf, '\n');
3118 va_start(ap, fmt);
3119 strbuf_vaddf(&buf, fmt, ap);
3120 va_end(ap);
3122 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3123 error_errno(_("could not write to '%s'"), filename);
3124 strbuf_release(&buf);
3125 rollback_lock_file(&lock);
3126 return -1;
3128 if (commit_lock_file(&lock) < 0) {
3129 strbuf_release(&buf);
3130 rollback_lock_file(&lock);
3131 return error(_("failed to finalize '%s'"), filename);
3134 strbuf_release(&buf);
3135 return 0;
3138 static int do_label(struct repository *r, const char *name, int len)
3140 struct ref_store *refs = get_main_ref_store(r);
3141 struct ref_transaction *transaction;
3142 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3143 struct strbuf msg = STRBUF_INIT;
3144 int ret = 0;
3145 struct object_id head_oid;
3147 if (len == 1 && *name == '#')
3148 return error(_("illegal label name: '%.*s'"), len, name);
3150 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3151 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
3153 transaction = ref_store_transaction_begin(refs, &err);
3154 if (!transaction) {
3155 error("%s", err.buf);
3156 ret = -1;
3157 } else if (get_oid("HEAD", &head_oid)) {
3158 error(_("could not read HEAD"));
3159 ret = -1;
3160 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
3161 NULL, 0, msg.buf, &err) < 0 ||
3162 ref_transaction_commit(transaction, &err)) {
3163 error("%s", err.buf);
3164 ret = -1;
3166 ref_transaction_free(transaction);
3167 strbuf_release(&err);
3168 strbuf_release(&msg);
3170 if (!ret)
3171 ret = safe_append(rebase_path_refs_to_delete(),
3172 "%s\n", ref_name.buf);
3173 strbuf_release(&ref_name);
3175 return ret;
3178 static const char *reflog_message(struct replay_opts *opts,
3179 const char *sub_action, const char *fmt, ...);
3181 static int do_reset(struct repository *r,
3182 const char *name, int len,
3183 struct replay_opts *opts)
3185 struct strbuf ref_name = STRBUF_INIT;
3186 struct object_id oid;
3187 struct lock_file lock = LOCK_INIT;
3188 struct tree_desc desc;
3189 struct tree *tree;
3190 struct unpack_trees_options unpack_tree_opts;
3191 int ret = 0;
3193 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
3194 return -1;
3196 if (len == 10 && !strncmp("[new root]", name, len)) {
3197 if (!opts->have_squash_onto) {
3198 const char *hex;
3199 if (commit_tree("", 0, the_hash_algo->empty_tree,
3200 NULL, &opts->squash_onto,
3201 NULL, NULL))
3202 return error(_("writing fake root commit"));
3203 opts->have_squash_onto = 1;
3204 hex = oid_to_hex(&opts->squash_onto);
3205 if (write_message(hex, strlen(hex),
3206 rebase_path_squash_onto(), 0))
3207 return error(_("writing squash-onto"));
3209 oidcpy(&oid, &opts->squash_onto);
3210 } else {
3211 int i;
3213 /* Determine the length of the label */
3214 for (i = 0; i < len; i++)
3215 if (isspace(name[i]))
3216 break;
3217 len = i;
3219 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3220 if (get_oid(ref_name.buf, &oid) &&
3221 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
3222 error(_("could not read '%s'"), ref_name.buf);
3223 rollback_lock_file(&lock);
3224 strbuf_release(&ref_name);
3225 return -1;
3229 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
3230 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3231 unpack_tree_opts.head_idx = 1;
3232 unpack_tree_opts.src_index = r->index;
3233 unpack_tree_opts.dst_index = r->index;
3234 unpack_tree_opts.fn = oneway_merge;
3235 unpack_tree_opts.merge = 1;
3236 unpack_tree_opts.update = 1;
3238 if (repo_read_index_unmerged(r)) {
3239 rollback_lock_file(&lock);
3240 strbuf_release(&ref_name);
3241 return error_resolve_conflict(_(action_name(opts)));
3244 if (!fill_tree_descriptor(r, &desc, &oid)) {
3245 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3246 rollback_lock_file(&lock);
3247 free((void *)desc.buffer);
3248 strbuf_release(&ref_name);
3249 return -1;
3252 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3253 rollback_lock_file(&lock);
3254 free((void *)desc.buffer);
3255 strbuf_release(&ref_name);
3256 return -1;
3259 tree = parse_tree_indirect(&oid);
3260 prime_cache_tree(r, r->index, tree);
3262 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3263 ret = error(_("could not write index"));
3264 free((void *)desc.buffer);
3266 if (!ret)
3267 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3268 len, name), "HEAD", &oid,
3269 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3271 strbuf_release(&ref_name);
3272 return ret;
3275 static struct commit *lookup_label(const char *label, int len,
3276 struct strbuf *buf)
3278 struct commit *commit;
3280 strbuf_reset(buf);
3281 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3282 commit = lookup_commit_reference_by_name(buf->buf);
3283 if (!commit) {
3284 /* fall back to non-rewritten ref or commit */
3285 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3286 commit = lookup_commit_reference_by_name(buf->buf);
3289 if (!commit)
3290 error(_("could not resolve '%s'"), buf->buf);
3292 return commit;
3295 static int do_merge(struct repository *r,
3296 struct commit *commit,
3297 const char *arg, int arg_len,
3298 int flags, struct replay_opts *opts)
3300 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3301 EDIT_MSG | VERIFY_MSG : 0;
3302 struct strbuf ref_name = STRBUF_INIT;
3303 struct commit *head_commit, *merge_commit, *i;
3304 struct commit_list *bases, *j, *reversed = NULL;
3305 struct commit_list *to_merge = NULL, **tail = &to_merge;
3306 const char *strategy = !opts->xopts_nr &&
3307 (!opts->strategy || !strcmp(opts->strategy, "recursive")) ?
3308 NULL : opts->strategy;
3309 struct merge_options o;
3310 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3311 static struct lock_file lock;
3312 const char *p;
3314 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
3315 ret = -1;
3316 goto leave_merge;
3319 head_commit = lookup_commit_reference_by_name("HEAD");
3320 if (!head_commit) {
3321 ret = error(_("cannot merge without a current revision"));
3322 goto leave_merge;
3326 * For octopus merges, the arg starts with the list of revisions to be
3327 * merged. The list is optionally followed by '#' and the oneline.
3329 merge_arg_len = oneline_offset = arg_len;
3330 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3331 if (!*p)
3332 break;
3333 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3334 p += 1 + strspn(p + 1, " \t\n");
3335 oneline_offset = p - arg;
3336 break;
3338 k = strcspn(p, " \t\n");
3339 if (!k)
3340 continue;
3341 merge_commit = lookup_label(p, k, &ref_name);
3342 if (!merge_commit) {
3343 ret = error(_("unable to parse '%.*s'"), k, p);
3344 goto leave_merge;
3346 tail = &commit_list_insert(merge_commit, tail)->next;
3347 p += k;
3348 merge_arg_len = p - arg;
3351 if (!to_merge) {
3352 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3353 goto leave_merge;
3356 if (opts->have_squash_onto &&
3357 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3359 * When the user tells us to "merge" something into a
3360 * "[new root]", let's simply fast-forward to the merge head.
3362 rollback_lock_file(&lock);
3363 if (to_merge->next)
3364 ret = error(_("octopus merge cannot be executed on "
3365 "top of a [new root]"));
3366 else
3367 ret = fast_forward_to(r, &to_merge->item->object.oid,
3368 &head_commit->object.oid, 0,
3369 opts);
3370 goto leave_merge;
3373 if (commit) {
3374 const char *message = get_commit_buffer(commit, NULL);
3375 const char *body;
3376 int len;
3378 if (!message) {
3379 ret = error(_("could not get commit message of '%s'"),
3380 oid_to_hex(&commit->object.oid));
3381 goto leave_merge;
3383 write_author_script(message);
3384 find_commit_subject(message, &body);
3385 len = strlen(body);
3386 ret = write_message(body, len, git_path_merge_msg(r), 0);
3387 unuse_commit_buffer(commit, message);
3388 if (ret) {
3389 error_errno(_("could not write '%s'"),
3390 git_path_merge_msg(r));
3391 goto leave_merge;
3393 } else {
3394 struct strbuf buf = STRBUF_INIT;
3395 int len;
3397 strbuf_addf(&buf, "author %s", git_author_info(0));
3398 write_author_script(buf.buf);
3399 strbuf_reset(&buf);
3401 if (oneline_offset < arg_len) {
3402 p = arg + oneline_offset;
3403 len = arg_len - oneline_offset;
3404 } else {
3405 strbuf_addf(&buf, "Merge %s '%.*s'",
3406 to_merge->next ? "branches" : "branch",
3407 merge_arg_len, arg);
3408 p = buf.buf;
3409 len = buf.len;
3412 ret = write_message(p, len, git_path_merge_msg(r), 0);
3413 strbuf_release(&buf);
3414 if (ret) {
3415 error_errno(_("could not write '%s'"),
3416 git_path_merge_msg(r));
3417 goto leave_merge;
3422 * If HEAD is not identical to the first parent of the original merge
3423 * commit, we cannot fast-forward.
3425 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3426 oideq(&commit->parents->item->object.oid,
3427 &head_commit->object.oid);
3430 * If any merge head is different from the original one, we cannot
3431 * fast-forward.
3433 if (can_fast_forward) {
3434 struct commit_list *p = commit->parents->next;
3436 for (j = to_merge; j && p; j = j->next, p = p->next)
3437 if (!oideq(&j->item->object.oid,
3438 &p->item->object.oid)) {
3439 can_fast_forward = 0;
3440 break;
3443 * If the number of merge heads differs from the original merge
3444 * commit, we cannot fast-forward.
3446 if (j || p)
3447 can_fast_forward = 0;
3450 if (can_fast_forward) {
3451 rollback_lock_file(&lock);
3452 ret = fast_forward_to(r, &commit->object.oid,
3453 &head_commit->object.oid, 0, opts);
3454 if (flags & TODO_EDIT_MERGE_MSG) {
3455 run_commit_flags |= AMEND_MSG;
3456 goto fast_forward_edit;
3458 goto leave_merge;
3461 if (strategy || to_merge->next) {
3462 /* Octopus merge */
3463 struct child_process cmd = CHILD_PROCESS_INIT;
3465 if (read_env_script(&cmd.env_array)) {
3466 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3468 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3469 goto leave_merge;
3472 cmd.git_cmd = 1;
3473 argv_array_push(&cmd.args, "merge");
3474 argv_array_push(&cmd.args, "-s");
3475 if (!strategy)
3476 argv_array_push(&cmd.args, "octopus");
3477 else {
3478 argv_array_push(&cmd.args, strategy);
3479 for (k = 0; k < opts->xopts_nr; k++)
3480 argv_array_pushf(&cmd.args,
3481 "-X%s", opts->xopts[k]);
3483 argv_array_push(&cmd.args, "--no-edit");
3484 argv_array_push(&cmd.args, "--no-ff");
3485 argv_array_push(&cmd.args, "--no-log");
3486 argv_array_push(&cmd.args, "--no-stat");
3487 argv_array_push(&cmd.args, "-F");
3488 argv_array_push(&cmd.args, git_path_merge_msg(r));
3489 if (opts->gpg_sign)
3490 argv_array_push(&cmd.args, opts->gpg_sign);
3492 /* Add the tips to be merged */
3493 for (j = to_merge; j; j = j->next)
3494 argv_array_push(&cmd.args,
3495 oid_to_hex(&j->item->object.oid));
3497 strbuf_release(&ref_name);
3498 unlink(git_path_cherry_pick_head(r));
3499 rollback_lock_file(&lock);
3501 rollback_lock_file(&lock);
3502 ret = run_command(&cmd);
3504 /* force re-reading of the cache */
3505 if (!ret && (discard_index(r->index) < 0 ||
3506 repo_read_index(r) < 0))
3507 ret = error(_("could not read index"));
3508 goto leave_merge;
3511 merge_commit = to_merge->item;
3512 bases = get_merge_bases(head_commit, merge_commit);
3513 if (bases && oideq(&merge_commit->object.oid,
3514 &bases->item->object.oid)) {
3515 ret = 0;
3516 /* skip merging an ancestor of HEAD */
3517 goto leave_merge;
3520 write_message(oid_to_hex(&merge_commit->object.oid), the_hash_algo->hexsz,
3521 git_path_merge_head(r), 0);
3522 write_message("no-ff", 5, git_path_merge_mode(r), 0);
3524 for (j = bases; j; j = j->next)
3525 commit_list_insert(j->item, &reversed);
3526 free_commit_list(bases);
3528 repo_read_index(r);
3529 init_merge_options(&o, r);
3530 o.branch1 = "HEAD";
3531 o.branch2 = ref_name.buf;
3532 o.buffer_output = 2;
3534 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3535 if (ret <= 0)
3536 fputs(o.obuf.buf, stdout);
3537 strbuf_release(&o.obuf);
3538 if (ret < 0) {
3539 error(_("could not even attempt to merge '%.*s'"),
3540 merge_arg_len, arg);
3541 goto leave_merge;
3544 * The return value of merge_recursive() is 1 on clean, and 0 on
3545 * unclean merge.
3547 * Let's reverse that, so that do_merge() returns 0 upon success and
3548 * 1 upon failed merge (keeping the return value -1 for the cases where
3549 * we will want to reschedule the `merge` command).
3551 ret = !ret;
3553 if (r->index->cache_changed &&
3554 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
3555 ret = error(_("merge: Unable to write new index file"));
3556 goto leave_merge;
3559 rollback_lock_file(&lock);
3560 if (ret)
3561 repo_rerere(r, opts->allow_rerere_auto);
3562 else
3564 * In case of problems, we now want to return a positive
3565 * value (a negative one would indicate that the `merge`
3566 * command needs to be rescheduled).
3568 fast_forward_edit:
3569 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3570 run_commit_flags);
3572 leave_merge:
3573 strbuf_release(&ref_name);
3574 rollback_lock_file(&lock);
3575 free_commit_list(to_merge);
3576 return ret;
3579 static int is_final_fixup(struct todo_list *todo_list)
3581 int i = todo_list->current;
3583 if (!is_fixup(todo_list->items[i].command))
3584 return 0;
3586 while (++i < todo_list->nr)
3587 if (is_fixup(todo_list->items[i].command))
3588 return 0;
3589 else if (!is_noop(todo_list->items[i].command))
3590 break;
3591 return 1;
3594 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3596 int i;
3598 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3599 if (!is_noop(todo_list->items[i].command))
3600 return todo_list->items[i].command;
3602 return -1;
3605 static int apply_autostash(struct replay_opts *opts)
3607 struct strbuf stash_sha1 = STRBUF_INIT;
3608 struct child_process child = CHILD_PROCESS_INIT;
3609 int ret = 0;
3611 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3612 strbuf_release(&stash_sha1);
3613 return 0;
3615 strbuf_trim(&stash_sha1);
3617 child.git_cmd = 1;
3618 child.no_stdout = 1;
3619 child.no_stderr = 1;
3620 argv_array_push(&child.args, "stash");
3621 argv_array_push(&child.args, "apply");
3622 argv_array_push(&child.args, stash_sha1.buf);
3623 if (!run_command(&child))
3624 fprintf(stderr, _("Applied autostash.\n"));
3625 else {
3626 struct child_process store = CHILD_PROCESS_INIT;
3628 store.git_cmd = 1;
3629 argv_array_push(&store.args, "stash");
3630 argv_array_push(&store.args, "store");
3631 argv_array_push(&store.args, "-m");
3632 argv_array_push(&store.args, "autostash");
3633 argv_array_push(&store.args, "-q");
3634 argv_array_push(&store.args, stash_sha1.buf);
3635 if (run_command(&store))
3636 ret = error(_("cannot store %s"), stash_sha1.buf);
3637 else
3638 fprintf(stderr,
3639 _("Applying autostash resulted in conflicts.\n"
3640 "Your changes are safe in the stash.\n"
3641 "You can run \"git stash pop\" or"
3642 " \"git stash drop\" at any time.\n"));
3645 strbuf_release(&stash_sha1);
3646 return ret;
3649 static const char *reflog_message(struct replay_opts *opts,
3650 const char *sub_action, const char *fmt, ...)
3652 va_list ap;
3653 static struct strbuf buf = STRBUF_INIT;
3655 va_start(ap, fmt);
3656 strbuf_reset(&buf);
3657 strbuf_addstr(&buf, action_name(opts));
3658 if (sub_action)
3659 strbuf_addf(&buf, " (%s)", sub_action);
3660 if (fmt) {
3661 strbuf_addstr(&buf, ": ");
3662 strbuf_vaddf(&buf, fmt, ap);
3664 va_end(ap);
3666 return buf.buf;
3669 static int run_git_checkout(struct repository *r, struct replay_opts *opts,
3670 const char *commit, const char *action)
3672 struct child_process cmd = CHILD_PROCESS_INIT;
3673 int ret;
3675 cmd.git_cmd = 1;
3677 argv_array_push(&cmd.args, "checkout");
3678 argv_array_push(&cmd.args, commit);
3679 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3681 if (opts->verbose)
3682 ret = run_command(&cmd);
3683 else
3684 ret = run_command_silent_on_success(&cmd);
3686 if (!ret)
3687 discard_index(r->index);
3689 return ret;
3692 int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
3693 const char *commit)
3695 const char *action;
3697 if (commit && *commit) {
3698 action = reflog_message(opts, "start", "checkout %s", commit);
3699 if (run_git_checkout(r, opts, commit, action))
3700 return error(_("could not checkout %s"), commit);
3703 return 0;
3706 static int checkout_onto(struct repository *r, struct replay_opts *opts,
3707 const char *onto_name, const struct object_id *onto,
3708 const char *orig_head)
3710 struct object_id oid;
3711 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3713 if (get_oid(orig_head, &oid))
3714 return error(_("%s: not a valid OID"), orig_head);
3716 if (run_git_checkout(r, opts, oid_to_hex(onto), action)) {
3717 apply_autostash(opts);
3718 sequencer_remove_state(opts);
3719 return error(_("could not detach HEAD"));
3722 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3725 static int stopped_at_head(struct repository *r)
3727 struct object_id head;
3728 struct commit *commit;
3729 struct commit_message message;
3731 if (get_oid("HEAD", &head) ||
3732 !(commit = lookup_commit(r, &head)) ||
3733 parse_commit(commit) || get_message(commit, &message))
3734 fprintf(stderr, _("Stopped at HEAD\n"));
3735 else {
3736 fprintf(stderr, _("Stopped at %s\n"), message.label);
3737 free_message(commit, &message);
3739 return 0;
3743 static const char rescheduled_advice[] =
3744 N_("Could not execute the todo command\n"
3745 "\n"
3746 " %.*s"
3747 "\n"
3748 "It has been rescheduled; To edit the command before continuing, please\n"
3749 "edit the todo list first:\n"
3750 "\n"
3751 " git rebase --edit-todo\n"
3752 " git rebase --continue\n");
3754 static int pick_commits(struct repository *r,
3755 struct todo_list *todo_list,
3756 struct replay_opts *opts)
3758 int res = 0, reschedule = 0;
3760 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3761 if (opts->allow_ff)
3762 assert(!(opts->signoff || opts->no_commit ||
3763 opts->record_origin || opts->edit));
3764 if (read_and_refresh_cache(r, opts))
3765 return -1;
3767 while (todo_list->current < todo_list->nr) {
3768 struct todo_item *item = todo_list->items + todo_list->current;
3769 const char *arg = todo_item_get_arg(todo_list, item);
3770 int check_todo = 0;
3772 if (save_todo(todo_list, opts))
3773 return -1;
3774 if (is_rebase_i(opts)) {
3775 if (item->command != TODO_COMMENT) {
3776 FILE *f = fopen(rebase_path_msgnum(), "w");
3778 todo_list->done_nr++;
3780 if (f) {
3781 fprintf(f, "%d\n", todo_list->done_nr);
3782 fclose(f);
3784 if (!opts->quiet)
3785 fprintf(stderr, "Rebasing (%d/%d)%s",
3786 todo_list->done_nr,
3787 todo_list->total_nr,
3788 opts->verbose ? "\n" : "\r");
3790 unlink(rebase_path_message());
3791 unlink(rebase_path_author_script());
3792 unlink(rebase_path_stopped_sha());
3793 unlink(rebase_path_amend());
3794 unlink(git_path_merge_head(r));
3795 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3797 if (item->command == TODO_BREAK) {
3798 if (!opts->verbose)
3799 term_clear_line();
3800 return stopped_at_head(r);
3803 if (item->command <= TODO_SQUASH) {
3804 if (is_rebase_i(opts))
3805 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3806 command_to_string(item->command), NULL),
3808 res = do_pick_commit(r, item->command, item->commit,
3809 opts, is_final_fixup(todo_list),
3810 &check_todo);
3811 if (is_rebase_i(opts) && res < 0) {
3812 /* Reschedule */
3813 advise(_(rescheduled_advice),
3814 get_item_line_length(todo_list,
3815 todo_list->current),
3816 get_item_line(todo_list,
3817 todo_list->current));
3818 todo_list->current--;
3819 if (save_todo(todo_list, opts))
3820 return -1;
3822 if (item->command == TODO_EDIT) {
3823 struct commit *commit = item->commit;
3824 if (!res) {
3825 if (!opts->verbose)
3826 term_clear_line();
3827 fprintf(stderr,
3828 _("Stopped at %s... %.*s\n"),
3829 short_commit_name(commit),
3830 item->arg_len, arg);
3832 return error_with_patch(r, commit,
3833 arg, item->arg_len, opts, res, !res);
3835 if (is_rebase_i(opts) && !res)
3836 record_in_rewritten(&item->commit->object.oid,
3837 peek_command(todo_list, 1));
3838 if (res && is_fixup(item->command)) {
3839 if (res == 1)
3840 intend_to_amend();
3841 return error_failed_squash(r, item->commit, opts,
3842 item->arg_len, arg);
3843 } else if (res && is_rebase_i(opts) && item->commit) {
3844 int to_amend = 0;
3845 struct object_id oid;
3848 * If we are rewording and have either
3849 * fast-forwarded already, or are about to
3850 * create a new root commit, we want to amend,
3851 * otherwise we do not.
3853 if (item->command == TODO_REWORD &&
3854 !get_oid("HEAD", &oid) &&
3855 (oideq(&item->commit->object.oid, &oid) ||
3856 (opts->have_squash_onto &&
3857 oideq(&opts->squash_onto, &oid))))
3858 to_amend = 1;
3860 return res | error_with_patch(r, item->commit,
3861 arg, item->arg_len, opts,
3862 res, to_amend);
3864 } else if (item->command == TODO_EXEC) {
3865 char *end_of_arg = (char *)(arg + item->arg_len);
3866 int saved = *end_of_arg;
3868 if (!opts->verbose)
3869 term_clear_line();
3870 *end_of_arg = '\0';
3871 res = do_exec(r, arg);
3872 *end_of_arg = saved;
3874 if (res) {
3875 if (opts->reschedule_failed_exec)
3876 reschedule = 1;
3878 check_todo = 1;
3879 } else if (item->command == TODO_LABEL) {
3880 if ((res = do_label(r, arg, item->arg_len)))
3881 reschedule = 1;
3882 } else if (item->command == TODO_RESET) {
3883 if ((res = do_reset(r, arg, item->arg_len, opts)))
3884 reschedule = 1;
3885 } else if (item->command == TODO_MERGE) {
3886 if ((res = do_merge(r, item->commit,
3887 arg, item->arg_len,
3888 item->flags, opts)) < 0)
3889 reschedule = 1;
3890 else if (item->commit)
3891 record_in_rewritten(&item->commit->object.oid,
3892 peek_command(todo_list, 1));
3893 if (res > 0)
3894 /* failed with merge conflicts */
3895 return error_with_patch(r, item->commit,
3896 arg, item->arg_len,
3897 opts, res, 0);
3898 } else if (!is_noop(item->command))
3899 return error(_("unknown command %d"), item->command);
3901 if (reschedule) {
3902 advise(_(rescheduled_advice),
3903 get_item_line_length(todo_list,
3904 todo_list->current),
3905 get_item_line(todo_list, todo_list->current));
3906 todo_list->current--;
3907 if (save_todo(todo_list, opts))
3908 return -1;
3909 if (item->commit)
3910 return error_with_patch(r,
3911 item->commit,
3912 arg, item->arg_len,
3913 opts, res, 0);
3914 } else if (check_todo && !res) {
3915 struct stat st;
3917 if (stat(get_todo_path(opts), &st)) {
3918 res = error_errno(_("could not stat '%s'"),
3919 get_todo_path(opts));
3920 } else if (match_stat_data(&todo_list->stat, &st)) {
3921 /* Reread the todo file if it has changed. */
3922 todo_list_release(todo_list);
3923 if (read_populate_todo(r, todo_list, opts))
3924 res = -1; /* message was printed */
3925 /* `current` will be incremented below */
3926 todo_list->current = -1;
3930 todo_list->current++;
3931 if (res)
3932 return res;
3935 if (is_rebase_i(opts)) {
3936 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
3937 struct stat st;
3939 /* Stopped in the middle, as planned? */
3940 if (todo_list->current < todo_list->nr)
3941 return 0;
3943 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3944 starts_with(head_ref.buf, "refs/")) {
3945 const char *msg;
3946 struct object_id head, orig;
3947 int res;
3949 if (get_oid("HEAD", &head)) {
3950 res = error(_("cannot read HEAD"));
3951 cleanup_head_ref:
3952 strbuf_release(&head_ref);
3953 strbuf_release(&buf);
3954 return res;
3956 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
3957 get_oid_hex(buf.buf, &orig)) {
3958 res = error(_("could not read orig-head"));
3959 goto cleanup_head_ref;
3961 strbuf_reset(&buf);
3962 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3963 res = error(_("could not read 'onto'"));
3964 goto cleanup_head_ref;
3966 msg = reflog_message(opts, "finish", "%s onto %s",
3967 head_ref.buf, buf.buf);
3968 if (update_ref(msg, head_ref.buf, &head, &orig,
3969 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
3970 res = error(_("could not update %s"),
3971 head_ref.buf);
3972 goto cleanup_head_ref;
3974 msg = reflog_message(opts, "finish", "returning to %s",
3975 head_ref.buf);
3976 if (create_symref("HEAD", head_ref.buf, msg)) {
3977 res = error(_("could not update HEAD to %s"),
3978 head_ref.buf);
3979 goto cleanup_head_ref;
3981 strbuf_reset(&buf);
3984 if (opts->verbose) {
3985 struct rev_info log_tree_opt;
3986 struct object_id orig, head;
3988 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3989 repo_init_revisions(r, &log_tree_opt, NULL);
3990 log_tree_opt.diff = 1;
3991 log_tree_opt.diffopt.output_format =
3992 DIFF_FORMAT_DIFFSTAT;
3993 log_tree_opt.disable_stdin = 1;
3995 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
3996 !get_oid(buf.buf, &orig) &&
3997 !get_oid("HEAD", &head)) {
3998 diff_tree_oid(&orig, &head, "",
3999 &log_tree_opt.diffopt);
4000 log_tree_diff_flush(&log_tree_opt);
4003 flush_rewritten_pending();
4004 if (!stat(rebase_path_rewritten_list(), &st) &&
4005 st.st_size > 0) {
4006 struct child_process child = CHILD_PROCESS_INIT;
4007 const char *post_rewrite_hook =
4008 find_hook("post-rewrite");
4010 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
4011 child.git_cmd = 1;
4012 argv_array_push(&child.args, "notes");
4013 argv_array_push(&child.args, "copy");
4014 argv_array_push(&child.args, "--for-rewrite=rebase");
4015 /* we don't care if this copying failed */
4016 run_command(&child);
4018 if (post_rewrite_hook) {
4019 struct child_process hook = CHILD_PROCESS_INIT;
4021 hook.in = open(rebase_path_rewritten_list(),
4022 O_RDONLY);
4023 hook.stdout_to_stderr = 1;
4024 hook.trace2_hook_name = "post-rewrite";
4025 argv_array_push(&hook.args, post_rewrite_hook);
4026 argv_array_push(&hook.args, "rebase");
4027 /* we don't care if this hook failed */
4028 run_command(&hook);
4031 apply_autostash(opts);
4033 if (!opts->quiet) {
4034 if (!opts->verbose)
4035 term_clear_line();
4036 fprintf(stderr,
4037 "Successfully rebased and updated %s.\n",
4038 head_ref.buf);
4041 strbuf_release(&buf);
4042 strbuf_release(&head_ref);
4046 * Sequence of picks finished successfully; cleanup by
4047 * removing the .git/sequencer directory
4049 return sequencer_remove_state(opts);
4052 static int continue_single_pick(struct repository *r)
4054 const char *argv[] = { "commit", NULL };
4056 if (!file_exists(git_path_cherry_pick_head(r)) &&
4057 !file_exists(git_path_revert_head(r)))
4058 return error(_("no cherry-pick or revert in progress"));
4059 return run_command_v_opt(argv, RUN_GIT_CMD);
4062 static int commit_staged_changes(struct repository *r,
4063 struct replay_opts *opts,
4064 struct todo_list *todo_list)
4066 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
4067 unsigned int final_fixup = 0, is_clean;
4069 if (has_unstaged_changes(r, 1))
4070 return error(_("cannot rebase: You have unstaged changes."));
4072 is_clean = !has_uncommitted_changes(r, 0);
4074 if (file_exists(rebase_path_amend())) {
4075 struct strbuf rev = STRBUF_INIT;
4076 struct object_id head, to_amend;
4078 if (get_oid("HEAD", &head))
4079 return error(_("cannot amend non-existing commit"));
4080 if (!read_oneliner(&rev, rebase_path_amend(), 0))
4081 return error(_("invalid file: '%s'"), rebase_path_amend());
4082 if (get_oid_hex(rev.buf, &to_amend))
4083 return error(_("invalid contents: '%s'"),
4084 rebase_path_amend());
4085 if (!is_clean && !oideq(&head, &to_amend))
4086 return error(_("\nYou have uncommitted changes in your "
4087 "working tree. Please, commit them\n"
4088 "first and then run 'git rebase "
4089 "--continue' again."));
4091 * When skipping a failed fixup/squash, we need to edit the
4092 * commit message, the current fixup list and count, and if it
4093 * was the last fixup/squash in the chain, we need to clean up
4094 * the commit message and if there was a squash, let the user
4095 * edit it.
4097 if (!is_clean || !opts->current_fixup_count)
4098 ; /* this is not the final fixup */
4099 else if (!oideq(&head, &to_amend) ||
4100 !file_exists(rebase_path_stopped_sha())) {
4101 /* was a final fixup or squash done manually? */
4102 if (!is_fixup(peek_command(todo_list, 0))) {
4103 unlink(rebase_path_fixup_msg());
4104 unlink(rebase_path_squash_msg());
4105 unlink(rebase_path_current_fixups());
4106 strbuf_reset(&opts->current_fixups);
4107 opts->current_fixup_count = 0;
4109 } else {
4110 /* we are in a fixup/squash chain */
4111 const char *p = opts->current_fixups.buf;
4112 int len = opts->current_fixups.len;
4114 opts->current_fixup_count--;
4115 if (!len)
4116 BUG("Incorrect current_fixups:\n%s", p);
4117 while (len && p[len - 1] != '\n')
4118 len--;
4119 strbuf_setlen(&opts->current_fixups, len);
4120 if (write_message(p, len, rebase_path_current_fixups(),
4121 0) < 0)
4122 return error(_("could not write file: '%s'"),
4123 rebase_path_current_fixups());
4126 * If a fixup/squash in a fixup/squash chain failed, the
4127 * commit message is already correct, no need to commit
4128 * it again.
4130 * Only if it is the final command in the fixup/squash
4131 * chain, and only if the chain is longer than a single
4132 * fixup/squash command (which was just skipped), do we
4133 * actually need to re-commit with a cleaned up commit
4134 * message.
4136 if (opts->current_fixup_count > 0 &&
4137 !is_fixup(peek_command(todo_list, 0))) {
4138 final_fixup = 1;
4140 * If there was not a single "squash" in the
4141 * chain, we only need to clean up the commit
4142 * message, no need to bother the user with
4143 * opening the commit message in the editor.
4145 if (!starts_with(p, "squash ") &&
4146 !strstr(p, "\nsquash "))
4147 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
4148 } else if (is_fixup(peek_command(todo_list, 0))) {
4150 * We need to update the squash message to skip
4151 * the latest commit message.
4153 struct commit *commit;
4154 const char *path = rebase_path_squash_msg();
4156 if (parse_head(r, &commit) ||
4157 !(p = get_commit_buffer(commit, NULL)) ||
4158 write_message(p, strlen(p), path, 0)) {
4159 unuse_commit_buffer(commit, p);
4160 return error(_("could not write file: "
4161 "'%s'"), path);
4163 unuse_commit_buffer(commit, p);
4167 strbuf_release(&rev);
4168 flags |= AMEND_MSG;
4171 if (is_clean) {
4172 const char *cherry_pick_head = git_path_cherry_pick_head(r);
4174 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
4175 return error(_("could not remove CHERRY_PICK_HEAD"));
4176 if (!final_fixup)
4177 return 0;
4180 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
4181 opts, flags))
4182 return error(_("could not commit staged changes."));
4183 unlink(rebase_path_amend());
4184 unlink(git_path_merge_head(r));
4185 if (final_fixup) {
4186 unlink(rebase_path_fixup_msg());
4187 unlink(rebase_path_squash_msg());
4189 if (opts->current_fixup_count > 0) {
4191 * Whether final fixup or not, we just cleaned up the commit
4192 * message...
4194 unlink(rebase_path_current_fixups());
4195 strbuf_reset(&opts->current_fixups);
4196 opts->current_fixup_count = 0;
4198 return 0;
4201 int sequencer_continue(struct repository *r, struct replay_opts *opts)
4203 struct todo_list todo_list = TODO_LIST_INIT;
4204 int res;
4206 if (read_and_refresh_cache(r, opts))
4207 return -1;
4209 if (read_populate_opts(opts))
4210 return -1;
4211 if (is_rebase_i(opts)) {
4212 if ((res = read_populate_todo(r, &todo_list, opts)))
4213 goto release_todo_list;
4214 if (commit_staged_changes(r, opts, &todo_list))
4215 return -1;
4216 } else if (!file_exists(get_todo_path(opts)))
4217 return continue_single_pick(r);
4218 else if ((res = read_populate_todo(r, &todo_list, opts)))
4219 goto release_todo_list;
4221 if (!is_rebase_i(opts)) {
4222 /* Verify that the conflict has been resolved */
4223 if (file_exists(git_path_cherry_pick_head(r)) ||
4224 file_exists(git_path_revert_head(r))) {
4225 res = continue_single_pick(r);
4226 if (res)
4227 goto release_todo_list;
4229 if (index_differs_from(r, "HEAD", NULL, 0)) {
4230 res = error_dirty_index(r, opts);
4231 goto release_todo_list;
4233 todo_list.current++;
4234 } else if (file_exists(rebase_path_stopped_sha())) {
4235 struct strbuf buf = STRBUF_INIT;
4236 struct object_id oid;
4238 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
4239 !get_oid_committish(buf.buf, &oid))
4240 record_in_rewritten(&oid, peek_command(&todo_list, 0));
4241 strbuf_release(&buf);
4244 res = pick_commits(r, &todo_list, opts);
4245 release_todo_list:
4246 todo_list_release(&todo_list);
4247 return res;
4250 static int single_pick(struct repository *r,
4251 struct commit *cmit,
4252 struct replay_opts *opts)
4254 int check_todo;
4256 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
4257 return do_pick_commit(r, opts->action == REPLAY_PICK ?
4258 TODO_PICK : TODO_REVERT, cmit, opts, 0,
4259 &check_todo);
4262 int sequencer_pick_revisions(struct repository *r,
4263 struct replay_opts *opts)
4265 struct todo_list todo_list = TODO_LIST_INIT;
4266 struct object_id oid;
4267 int i, res;
4269 assert(opts->revs);
4270 if (read_and_refresh_cache(r, opts))
4271 return -1;
4273 for (i = 0; i < opts->revs->pending.nr; i++) {
4274 struct object_id oid;
4275 const char *name = opts->revs->pending.objects[i].name;
4277 /* This happens when using --stdin. */
4278 if (!strlen(name))
4279 continue;
4281 if (!get_oid(name, &oid)) {
4282 if (!lookup_commit_reference_gently(r, &oid, 1)) {
4283 enum object_type type = oid_object_info(r,
4284 &oid,
4285 NULL);
4286 return error(_("%s: can't cherry-pick a %s"),
4287 name, type_name(type));
4289 } else
4290 return error(_("%s: bad revision"), name);
4294 * If we were called as "git cherry-pick <commit>", just
4295 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4296 * REVERT_HEAD, and don't touch the sequencer state.
4297 * This means it is possible to cherry-pick in the middle
4298 * of a cherry-pick sequence.
4300 if (opts->revs->cmdline.nr == 1 &&
4301 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4302 opts->revs->no_walk &&
4303 !opts->revs->cmdline.rev->flags) {
4304 struct commit *cmit;
4305 if (prepare_revision_walk(opts->revs))
4306 return error(_("revision walk setup failed"));
4307 cmit = get_revision(opts->revs);
4308 if (!cmit)
4309 return error(_("empty commit set passed"));
4310 if (get_revision(opts->revs))
4311 BUG("unexpected extra commit from walk");
4312 return single_pick(r, cmit, opts);
4316 * Start a new cherry-pick/ revert sequence; but
4317 * first, make sure that an existing one isn't in
4318 * progress
4321 if (walk_revs_populate_todo(&todo_list, opts) ||
4322 create_seq_dir(r) < 0)
4323 return -1;
4324 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4325 return error(_("can't revert as initial commit"));
4326 if (save_head(oid_to_hex(&oid)))
4327 return -1;
4328 if (save_opts(opts))
4329 return -1;
4330 update_abort_safety_file();
4331 res = pick_commits(r, &todo_list, opts);
4332 todo_list_release(&todo_list);
4333 return res;
4336 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4338 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4339 struct strbuf sob = STRBUF_INIT;
4340 int has_footer;
4342 strbuf_addstr(&sob, sign_off_header);
4343 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
4344 strbuf_addch(&sob, '\n');
4346 if (!ignore_footer)
4347 strbuf_complete_line(msgbuf);
4350 * If the whole message buffer is equal to the sob, pretend that we
4351 * found a conforming footer with a matching sob
4353 if (msgbuf->len - ignore_footer == sob.len &&
4354 !strncmp(msgbuf->buf, sob.buf, sob.len))
4355 has_footer = 3;
4356 else
4357 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4359 if (!has_footer) {
4360 const char *append_newlines = NULL;
4361 size_t len = msgbuf->len - ignore_footer;
4363 if (!len) {
4365 * The buffer is completely empty. Leave foom for
4366 * the title and body to be filled in by the user.
4368 append_newlines = "\n\n";
4369 } else if (len == 1) {
4371 * Buffer contains a single newline. Add another
4372 * so that we leave room for the title and body.
4374 append_newlines = "\n";
4375 } else if (msgbuf->buf[len - 2] != '\n') {
4377 * Buffer ends with a single newline. Add another
4378 * so that there is an empty line between the message
4379 * body and the sob.
4381 append_newlines = "\n";
4382 } /* else, the buffer already ends with two newlines. */
4384 if (append_newlines)
4385 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4386 append_newlines, strlen(append_newlines));
4389 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4390 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4391 sob.buf, sob.len);
4393 strbuf_release(&sob);
4396 struct labels_entry {
4397 struct hashmap_entry entry;
4398 char label[FLEX_ARRAY];
4401 static int labels_cmp(const void *fndata, const struct labels_entry *a,
4402 const struct labels_entry *b, const void *key)
4404 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4407 struct string_entry {
4408 struct oidmap_entry entry;
4409 char string[FLEX_ARRAY];
4412 struct label_state {
4413 struct oidmap commit2label;
4414 struct hashmap labels;
4415 struct strbuf buf;
4418 static const char *label_oid(struct object_id *oid, const char *label,
4419 struct label_state *state)
4421 struct labels_entry *labels_entry;
4422 struct string_entry *string_entry;
4423 struct object_id dummy;
4424 size_t len;
4425 int i;
4427 string_entry = oidmap_get(&state->commit2label, oid);
4428 if (string_entry)
4429 return string_entry->string;
4432 * For "uninteresting" commits, i.e. commits that are not to be
4433 * rebased, and which can therefore not be labeled, we use a unique
4434 * abbreviation of the commit name. This is slightly more complicated
4435 * than calling find_unique_abbrev() because we also need to make
4436 * sure that the abbreviation does not conflict with any other
4437 * label.
4439 * We disallow "interesting" commits to be labeled by a string that
4440 * is a valid full-length hash, to ensure that we always can find an
4441 * abbreviation for any uninteresting commit's names that does not
4442 * clash with any other label.
4444 if (!label) {
4445 char *p;
4447 strbuf_reset(&state->buf);
4448 strbuf_grow(&state->buf, GIT_MAX_HEXSZ);
4449 label = p = state->buf.buf;
4451 find_unique_abbrev_r(p, oid, default_abbrev);
4454 * We may need to extend the abbreviated hash so that there is
4455 * no conflicting label.
4457 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4458 size_t i = strlen(p) + 1;
4460 oid_to_hex_r(p, oid);
4461 for (; i < the_hash_algo->hexsz; i++) {
4462 char save = p[i];
4463 p[i] = '\0';
4464 if (!hashmap_get_from_hash(&state->labels,
4465 strihash(p), p))
4466 break;
4467 p[i] = save;
4470 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
4471 !get_oid_hex(label, &dummy)) ||
4472 (len == 1 && *label == '#') ||
4473 hashmap_get_from_hash(&state->labels,
4474 strihash(label), label)) {
4476 * If the label already exists, or if the label is a valid full
4477 * OID, or the label is a '#' (which we use as a separator
4478 * between merge heads and oneline), we append a dash and a
4479 * number to make it unique.
4481 struct strbuf *buf = &state->buf;
4483 strbuf_reset(buf);
4484 strbuf_add(buf, label, len);
4486 for (i = 2; ; i++) {
4487 strbuf_setlen(buf, len);
4488 strbuf_addf(buf, "-%d", i);
4489 if (!hashmap_get_from_hash(&state->labels,
4490 strihash(buf->buf),
4491 buf->buf))
4492 break;
4495 label = buf->buf;
4498 FLEX_ALLOC_STR(labels_entry, label, label);
4499 hashmap_entry_init(labels_entry, strihash(label));
4500 hashmap_add(&state->labels, labels_entry);
4502 FLEX_ALLOC_STR(string_entry, string, label);
4503 oidcpy(&string_entry->entry.oid, oid);
4504 oidmap_put(&state->commit2label, string_entry);
4506 return string_entry->string;
4509 static int make_script_with_merges(struct pretty_print_context *pp,
4510 struct rev_info *revs, struct strbuf *out,
4511 unsigned flags)
4513 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4514 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4515 int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
4516 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4517 struct strbuf label = STRBUF_INIT;
4518 struct commit_list *commits = NULL, **tail = &commits, *iter;
4519 struct commit_list *tips = NULL, **tips_tail = &tips;
4520 struct commit *commit;
4521 struct oidmap commit2todo = OIDMAP_INIT;
4522 struct string_entry *entry;
4523 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4524 shown = OIDSET_INIT;
4525 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4527 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4528 const char *cmd_pick = abbr ? "p" : "pick",
4529 *cmd_label = abbr ? "l" : "label",
4530 *cmd_reset = abbr ? "t" : "reset",
4531 *cmd_merge = abbr ? "m" : "merge";
4533 oidmap_init(&commit2todo, 0);
4534 oidmap_init(&state.commit2label, 0);
4535 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4536 strbuf_init(&state.buf, 32);
4538 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4539 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4540 FLEX_ALLOC_STR(entry, string, "onto");
4541 oidcpy(&entry->entry.oid, oid);
4542 oidmap_put(&state.commit2label, entry);
4546 * First phase:
4547 * - get onelines for all commits
4548 * - gather all branch tips (i.e. 2nd or later parents of merges)
4549 * - label all branch tips
4551 while ((commit = get_revision(revs))) {
4552 struct commit_list *to_merge;
4553 const char *p1, *p2;
4554 struct object_id *oid;
4555 int is_empty;
4557 tail = &commit_list_insert(commit, tail)->next;
4558 oidset_insert(&interesting, &commit->object.oid);
4560 is_empty = is_original_commit_empty(commit);
4561 if (!is_empty && (commit->object.flags & PATCHSAME))
4562 continue;
4564 strbuf_reset(&oneline);
4565 pretty_print_commit(pp, commit, &oneline);
4567 to_merge = commit->parents ? commit->parents->next : NULL;
4568 if (!to_merge) {
4569 /* non-merge commit: easy case */
4570 strbuf_reset(&buf);
4571 if (!keep_empty && is_empty)
4572 strbuf_addf(&buf, "%c ", comment_line_char);
4573 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4574 oid_to_hex(&commit->object.oid),
4575 oneline.buf);
4577 FLEX_ALLOC_STR(entry, string, buf.buf);
4578 oidcpy(&entry->entry.oid, &commit->object.oid);
4579 oidmap_put(&commit2todo, entry);
4581 continue;
4584 /* Create a label */
4585 strbuf_reset(&label);
4586 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4587 (p1 = strchr(p1, '\'')) &&
4588 (p2 = strchr(++p1, '\'')))
4589 strbuf_add(&label, p1, p2 - p1);
4590 else if (skip_prefix(oneline.buf, "Merge pull request ",
4591 &p1) &&
4592 (p1 = strstr(p1, " from ")))
4593 strbuf_addstr(&label, p1 + strlen(" from "));
4594 else
4595 strbuf_addbuf(&label, &oneline);
4597 for (p1 = label.buf; *p1; p1++)
4598 if (isspace(*p1))
4599 *(char *)p1 = '-';
4601 strbuf_reset(&buf);
4602 strbuf_addf(&buf, "%s -C %s",
4603 cmd_merge, oid_to_hex(&commit->object.oid));
4605 /* label the tips of merged branches */
4606 for (; to_merge; to_merge = to_merge->next) {
4607 oid = &to_merge->item->object.oid;
4608 strbuf_addch(&buf, ' ');
4610 if (!oidset_contains(&interesting, oid)) {
4611 strbuf_addstr(&buf, label_oid(oid, NULL,
4612 &state));
4613 continue;
4616 tips_tail = &commit_list_insert(to_merge->item,
4617 tips_tail)->next;
4619 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4621 strbuf_addf(&buf, " # %s", oneline.buf);
4623 FLEX_ALLOC_STR(entry, string, buf.buf);
4624 oidcpy(&entry->entry.oid, &commit->object.oid);
4625 oidmap_put(&commit2todo, entry);
4629 * Second phase:
4630 * - label branch points
4631 * - add HEAD to the branch tips
4633 for (iter = commits; iter; iter = iter->next) {
4634 struct commit_list *parent = iter->item->parents;
4635 for (; parent; parent = parent->next) {
4636 struct object_id *oid = &parent->item->object.oid;
4637 if (!oidset_contains(&interesting, oid))
4638 continue;
4639 if (oidset_insert(&child_seen, oid))
4640 label_oid(oid, "branch-point", &state);
4643 /* Add HEAD as implict "tip of branch" */
4644 if (!iter->next)
4645 tips_tail = &commit_list_insert(iter->item,
4646 tips_tail)->next;
4650 * Third phase: output the todo list. This is a bit tricky, as we
4651 * want to avoid jumping back and forth between revisions. To
4652 * accomplish that goal, we walk backwards from the branch tips,
4653 * gathering commits not yet shown, reversing the list on the fly,
4654 * then outputting that list (labeling revisions as needed).
4656 strbuf_addf(out, "%s onto\n", cmd_label);
4657 for (iter = tips; iter; iter = iter->next) {
4658 struct commit_list *list = NULL, *iter2;
4660 commit = iter->item;
4661 if (oidset_contains(&shown, &commit->object.oid))
4662 continue;
4663 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4665 if (entry)
4666 strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4667 else
4668 strbuf_addch(out, '\n');
4670 while (oidset_contains(&interesting, &commit->object.oid) &&
4671 !oidset_contains(&shown, &commit->object.oid)) {
4672 commit_list_insert(commit, &list);
4673 if (!commit->parents) {
4674 commit = NULL;
4675 break;
4677 commit = commit->parents->item;
4680 if (!commit)
4681 strbuf_addf(out, "%s %s\n", cmd_reset,
4682 rebase_cousins || root_with_onto ?
4683 "onto" : "[new root]");
4684 else {
4685 const char *to = NULL;
4687 entry = oidmap_get(&state.commit2label,
4688 &commit->object.oid);
4689 if (entry)
4690 to = entry->string;
4691 else if (!rebase_cousins)
4692 to = label_oid(&commit->object.oid, NULL,
4693 &state);
4695 if (!to || !strcmp(to, "onto"))
4696 strbuf_addf(out, "%s onto\n", cmd_reset);
4697 else {
4698 strbuf_reset(&oneline);
4699 pretty_print_commit(pp, commit, &oneline);
4700 strbuf_addf(out, "%s %s # %s\n",
4701 cmd_reset, to, oneline.buf);
4705 for (iter2 = list; iter2; iter2 = iter2->next) {
4706 struct object_id *oid = &iter2->item->object.oid;
4707 entry = oidmap_get(&commit2todo, oid);
4708 /* only show if not already upstream */
4709 if (entry)
4710 strbuf_addf(out, "%s\n", entry->string);
4711 entry = oidmap_get(&state.commit2label, oid);
4712 if (entry)
4713 strbuf_addf(out, "%s %s\n",
4714 cmd_label, entry->string);
4715 oidset_insert(&shown, oid);
4718 free_commit_list(list);
4721 free_commit_list(commits);
4722 free_commit_list(tips);
4724 strbuf_release(&label);
4725 strbuf_release(&oneline);
4726 strbuf_release(&buf);
4728 oidmap_free(&commit2todo, 1);
4729 oidmap_free(&state.commit2label, 1);
4730 hashmap_free(&state.labels, 1);
4731 strbuf_release(&state.buf);
4733 return 0;
4736 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
4737 const char **argv, unsigned flags)
4739 char *format = NULL;
4740 struct pretty_print_context pp = {0};
4741 struct rev_info revs;
4742 struct commit *commit;
4743 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4744 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4745 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4747 repo_init_revisions(r, &revs, NULL);
4748 revs.verbose_header = 1;
4749 if (!rebase_merges)
4750 revs.max_parents = 1;
4751 revs.cherry_mark = 1;
4752 revs.limited = 1;
4753 revs.reverse = 1;
4754 revs.right_only = 1;
4755 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4756 revs.topo_order = 1;
4758 revs.pretty_given = 1;
4759 git_config_get_string("rebase.instructionFormat", &format);
4760 if (!format || !*format) {
4761 free(format);
4762 format = xstrdup("%s");
4764 get_commit_format(format, &revs);
4765 free(format);
4766 pp.fmt = revs.commit_format;
4767 pp.output_encoding = get_log_output_encoding();
4769 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4770 return error(_("make_script: unhandled options"));
4772 if (prepare_revision_walk(&revs) < 0)
4773 return error(_("make_script: error preparing revisions"));
4775 if (rebase_merges)
4776 return make_script_with_merges(&pp, &revs, out, flags);
4778 while ((commit = get_revision(&revs))) {
4779 int is_empty = is_original_commit_empty(commit);
4781 if (!is_empty && (commit->object.flags & PATCHSAME))
4782 continue;
4783 if (!keep_empty && is_empty)
4784 strbuf_addf(out, "%c ", comment_line_char);
4785 strbuf_addf(out, "%s %s ", insn,
4786 oid_to_hex(&commit->object.oid));
4787 pretty_print_commit(&pp, commit, out);
4788 strbuf_addch(out, '\n');
4790 return 0;
4794 * Add commands after pick and (series of) squash/fixup commands
4795 * in the todo list.
4797 void todo_list_add_exec_commands(struct todo_list *todo_list,
4798 struct string_list *commands)
4800 struct strbuf *buf = &todo_list->buf;
4801 size_t base_offset = buf->len;
4802 int i, insert, nr = 0, alloc = 0;
4803 struct todo_item *items = NULL, *base_items = NULL;
4805 base_items = xcalloc(commands->nr, sizeof(struct todo_item));
4806 for (i = 0; i < commands->nr; i++) {
4807 size_t command_len = strlen(commands->items[i].string);
4809 strbuf_addstr(buf, commands->items[i].string);
4810 strbuf_addch(buf, '\n');
4812 base_items[i].command = TODO_EXEC;
4813 base_items[i].offset_in_buf = base_offset;
4814 base_items[i].arg_offset = base_offset + strlen("exec ");
4815 base_items[i].arg_len = command_len - strlen("exec ");
4817 base_offset += command_len + 1;
4821 * Insert <commands> after every pick. Here, fixup/squash chains
4822 * are considered part of the pick, so we insert the commands *after*
4823 * those chains if there are any.
4825 * As we insert the exec commands immediatly after rearranging
4826 * any fixups and before the user edits the list, a fixup chain
4827 * can never contain comments (any comments are empty picks that
4828 * have been commented out because the user did not specify
4829 * --keep-empty). So, it is safe to insert an exec command
4830 * without looking at the command following a comment.
4832 insert = 0;
4833 for (i = 0; i < todo_list->nr; i++) {
4834 enum todo_command command = todo_list->items[i].command;
4835 if (insert && !is_fixup(command)) {
4836 ALLOC_GROW(items, nr + commands->nr, alloc);
4837 COPY_ARRAY(items + nr, base_items, commands->nr);
4838 nr += commands->nr;
4840 insert = 0;
4843 ALLOC_GROW(items, nr + 1, alloc);
4844 items[nr++] = todo_list->items[i];
4846 if (command == TODO_PICK || command == TODO_MERGE)
4847 insert = 1;
4850 /* insert or append final <commands> */
4851 if (insert || nr == todo_list->nr) {
4852 ALLOC_GROW(items, nr + commands->nr, alloc);
4853 COPY_ARRAY(items + nr, base_items, commands->nr);
4854 nr += commands->nr;
4857 free(base_items);
4858 FREE_AND_NULL(todo_list->items);
4859 todo_list->items = items;
4860 todo_list->nr = nr;
4861 todo_list->alloc = alloc;
4864 static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
4865 struct strbuf *buf, int num, unsigned flags)
4867 struct todo_item *item;
4868 int i, max = todo_list->nr;
4870 if (num > 0 && num < max)
4871 max = num;
4873 for (item = todo_list->items, i = 0; i < max; i++, item++) {
4874 /* if the item is not a command write it and continue */
4875 if (item->command >= TODO_COMMENT) {
4876 strbuf_addf(buf, "%.*s\n", item->arg_len,
4877 todo_item_get_arg(todo_list, item));
4878 continue;
4881 /* add command to the buffer */
4882 if (flags & TODO_LIST_ABBREVIATE_CMDS)
4883 strbuf_addch(buf, command_to_char(item->command));
4884 else
4885 strbuf_addstr(buf, command_to_string(item->command));
4887 /* add commit id */
4888 if (item->commit) {
4889 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
4890 short_commit_name(item->commit) :
4891 oid_to_hex(&item->commit->object.oid);
4893 if (item->command == TODO_MERGE) {
4894 if (item->flags & TODO_EDIT_MERGE_MSG)
4895 strbuf_addstr(buf, " -c");
4896 else
4897 strbuf_addstr(buf, " -C");
4900 strbuf_addf(buf, " %s", oid);
4903 /* add all the rest */
4904 if (!item->arg_len)
4905 strbuf_addch(buf, '\n');
4906 else
4907 strbuf_addf(buf, " %.*s\n", item->arg_len,
4908 todo_item_get_arg(todo_list, item));
4912 int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
4913 const char *file, const char *shortrevisions,
4914 const char *shortonto, int num, unsigned flags)
4916 int res;
4917 struct strbuf buf = STRBUF_INIT;
4919 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
4920 if (flags & TODO_LIST_APPEND_TODO_HELP)
4921 append_todo_help(flags & TODO_LIST_KEEP_EMPTY, count_commands(todo_list),
4922 shortrevisions, shortonto, &buf);
4924 res = write_message(buf.buf, buf.len, file, 0);
4925 strbuf_release(&buf);
4927 return res;
4930 static const char edit_todo_list_advice[] =
4931 N_("You can fix this with 'git rebase --edit-todo' "
4932 "and then run 'git rebase --continue'.\n"
4933 "Or you can abort the rebase with 'git rebase"
4934 " --abort'.\n");
4936 int check_todo_list_from_file(struct repository *r)
4938 struct todo_list old_todo = TODO_LIST_INIT, new_todo = TODO_LIST_INIT;
4939 int res = 0;
4941 if (strbuf_read_file_or_whine(&new_todo.buf, rebase_path_todo()) < 0) {
4942 res = -1;
4943 goto out;
4946 if (strbuf_read_file_or_whine(&old_todo.buf, rebase_path_todo_backup()) < 0) {
4947 res = -1;
4948 goto out;
4951 res = todo_list_parse_insn_buffer(r, old_todo.buf.buf, &old_todo);
4952 if (!res)
4953 res = todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo);
4954 if (!res)
4955 res = todo_list_check(&old_todo, &new_todo);
4956 if (res)
4957 fprintf(stderr, _(edit_todo_list_advice));
4958 out:
4959 todo_list_release(&old_todo);
4960 todo_list_release(&new_todo);
4962 return res;
4965 /* skip picking commits whose parents are unchanged */
4966 static int skip_unnecessary_picks(struct repository *r,
4967 struct todo_list *todo_list,
4968 struct object_id *base_oid)
4970 struct object_id *parent_oid;
4971 int i;
4973 for (i = 0; i < todo_list->nr; i++) {
4974 struct todo_item *item = todo_list->items + i;
4976 if (item->command >= TODO_NOOP)
4977 continue;
4978 if (item->command != TODO_PICK)
4979 break;
4980 if (parse_commit(item->commit)) {
4981 return error(_("could not parse commit '%s'"),
4982 oid_to_hex(&item->commit->object.oid));
4984 if (!item->commit->parents)
4985 break; /* root commit */
4986 if (item->commit->parents->next)
4987 break; /* merge commit */
4988 parent_oid = &item->commit->parents->item->object.oid;
4989 if (!oideq(parent_oid, base_oid))
4990 break;
4991 oidcpy(base_oid, &item->commit->object.oid);
4993 if (i > 0) {
4994 const char *done_path = rebase_path_done();
4996 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
4997 error_errno(_("could not write to '%s'"), done_path);
4998 return -1;
5001 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
5002 todo_list->nr -= i;
5003 todo_list->current = 0;
5005 if (is_fixup(peek_command(todo_list, 0)))
5006 record_in_rewritten(base_oid, peek_command(todo_list, 0));
5009 return 0;
5012 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
5013 const char *shortrevisions, const char *onto_name,
5014 struct commit *onto, const char *orig_head,
5015 struct string_list *commands, unsigned autosquash,
5016 struct todo_list *todo_list)
5018 const char *shortonto, *todo_file = rebase_path_todo();
5019 struct todo_list new_todo = TODO_LIST_INIT;
5020 struct strbuf *buf = &todo_list->buf;
5021 struct object_id oid = onto->object.oid;
5022 int res;
5024 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
5026 if (buf->len == 0) {
5027 struct todo_item *item = append_new_todo(todo_list);
5028 item->command = TODO_NOOP;
5029 item->commit = NULL;
5030 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
5033 if (autosquash && todo_list_rearrange_squash(todo_list))
5034 return -1;
5036 if (commands->nr)
5037 todo_list_add_exec_commands(todo_list, commands);
5039 if (count_commands(todo_list) == 0) {
5040 apply_autostash(opts);
5041 sequencer_remove_state(opts);
5043 return error(_("nothing to do"));
5046 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
5047 shortonto, flags);
5048 if (res == -1)
5049 return -1;
5050 else if (res == -2) {
5051 apply_autostash(opts);
5052 sequencer_remove_state(opts);
5054 return -1;
5055 } else if (res == -3) {
5056 apply_autostash(opts);
5057 sequencer_remove_state(opts);
5058 todo_list_release(&new_todo);
5060 return error(_("nothing to do"));
5063 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) ||
5064 todo_list_check(todo_list, &new_todo)) {
5065 fprintf(stderr, _(edit_todo_list_advice));
5066 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
5067 todo_list_release(&new_todo);
5069 return -1;
5072 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
5073 todo_list_release(&new_todo);
5074 return error(_("could not skip unnecessary pick commands"));
5077 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
5078 flags & ~(TODO_LIST_SHORTEN_IDS))) {
5079 todo_list_release(&new_todo);
5080 return error_errno(_("could not write '%s'"), todo_file);
5083 todo_list_release(&new_todo);
5085 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
5086 return -1;
5088 if (require_clean_work_tree(r, "rebase", "", 1, 1))
5089 return -1;
5091 return sequencer_continue(r, opts);
5094 struct subject2item_entry {
5095 struct hashmap_entry entry;
5096 int i;
5097 char subject[FLEX_ARRAY];
5100 static int subject2item_cmp(const void *fndata,
5101 const struct subject2item_entry *a,
5102 const struct subject2item_entry *b, const void *key)
5104 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
5107 define_commit_slab(commit_todo_item, struct todo_item *);
5110 * Rearrange the todo list that has both "pick commit-id msg" and "pick
5111 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
5112 * after the former, and change "pick" to "fixup"/"squash".
5114 * Note that if the config has specified a custom instruction format, each log
5115 * message will have to be retrieved from the commit (as the oneline in the
5116 * script cannot be trusted) in order to normalize the autosquash arrangement.
5118 int todo_list_rearrange_squash(struct todo_list *todo_list)
5120 struct hashmap subject2item;
5121 int rearranged = 0, *next, *tail, i, nr = 0, alloc = 0;
5122 char **subjects;
5123 struct commit_todo_item commit_todo;
5124 struct todo_item *items = NULL;
5126 init_commit_todo_item(&commit_todo);
5128 * The hashmap maps onelines to the respective todo list index.
5130 * If any items need to be rearranged, the next[i] value will indicate
5131 * which item was moved directly after the i'th.
5133 * In that case, last[i] will indicate the index of the latest item to
5134 * be moved to appear after the i'th.
5136 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
5137 NULL, todo_list->nr);
5138 ALLOC_ARRAY(next, todo_list->nr);
5139 ALLOC_ARRAY(tail, todo_list->nr);
5140 ALLOC_ARRAY(subjects, todo_list->nr);
5141 for (i = 0; i < todo_list->nr; i++) {
5142 struct strbuf buf = STRBUF_INIT;
5143 struct todo_item *item = todo_list->items + i;
5144 const char *commit_buffer, *subject, *p;
5145 size_t subject_len;
5146 int i2 = -1;
5147 struct subject2item_entry *entry;
5149 next[i] = tail[i] = -1;
5150 if (!item->commit || item->command == TODO_DROP) {
5151 subjects[i] = NULL;
5152 continue;
5155 if (is_fixup(item->command)) {
5156 clear_commit_todo_item(&commit_todo);
5157 return error(_("the script was already rearranged."));
5160 *commit_todo_item_at(&commit_todo, item->commit) = item;
5162 parse_commit(item->commit);
5163 commit_buffer = get_commit_buffer(item->commit, NULL);
5164 find_commit_subject(commit_buffer, &subject);
5165 format_subject(&buf, subject, " ");
5166 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5167 unuse_commit_buffer(item->commit, commit_buffer);
5168 if ((skip_prefix(subject, "fixup! ", &p) ||
5169 skip_prefix(subject, "squash! ", &p))) {
5170 struct commit *commit2;
5172 for (;;) {
5173 while (isspace(*p))
5174 p++;
5175 if (!skip_prefix(p, "fixup! ", &p) &&
5176 !skip_prefix(p, "squash! ", &p))
5177 break;
5180 if ((entry = hashmap_get_from_hash(&subject2item,
5181 strhash(p), p)))
5182 /* found by title */
5183 i2 = entry->i;
5184 else if (!strchr(p, ' ') &&
5185 (commit2 =
5186 lookup_commit_reference_by_name(p)) &&
5187 *commit_todo_item_at(&commit_todo, commit2))
5188 /* found by commit name */
5189 i2 = *commit_todo_item_at(&commit_todo, commit2)
5190 - todo_list->items;
5191 else {
5192 /* copy can be a prefix of the commit subject */
5193 for (i2 = 0; i2 < i; i2++)
5194 if (subjects[i2] &&
5195 starts_with(subjects[i2], p))
5196 break;
5197 if (i2 == i)
5198 i2 = -1;
5201 if (i2 >= 0) {
5202 rearranged = 1;
5203 todo_list->items[i].command =
5204 starts_with(subject, "fixup!") ?
5205 TODO_FIXUP : TODO_SQUASH;
5206 if (next[i2] < 0)
5207 next[i2] = i;
5208 else
5209 next[tail[i2]] = i;
5210 tail[i2] = i;
5211 } else if (!hashmap_get_from_hash(&subject2item,
5212 strhash(subject), subject)) {
5213 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5214 entry->i = i;
5215 hashmap_entry_init(entry, strhash(entry->subject));
5216 hashmap_put(&subject2item, entry);
5220 if (rearranged) {
5221 for (i = 0; i < todo_list->nr; i++) {
5222 enum todo_command command = todo_list->items[i].command;
5223 int cur = i;
5226 * Initially, all commands are 'pick's. If it is a
5227 * fixup or a squash now, we have rearranged it.
5229 if (is_fixup(command))
5230 continue;
5232 while (cur >= 0) {
5233 ALLOC_GROW(items, nr + 1, alloc);
5234 items[nr++] = todo_list->items[cur];
5235 cur = next[cur];
5239 FREE_AND_NULL(todo_list->items);
5240 todo_list->items = items;
5241 todo_list->nr = nr;
5242 todo_list->alloc = alloc;
5245 free(next);
5246 free(tail);
5247 for (i = 0; i < todo_list->nr; i++)
5248 free(subjects[i]);
5249 free(subjects);
5250 hashmap_free(&subject2item, 1);
5252 clear_commit_todo_item(&commit_todo);
5254 return 0;