Merge tag 'v2.40.1' into debian-sid
[git/debian.git] / sequencer.c
blob1c96a75b1e9f8bbe9a7a2e40a3d4dd7bb80a9335
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 "hook.h"
12 #include "exec-cmd.h"
13 #include "utf8.h"
14 #include "cache-tree.h"
15 #include "diff.h"
16 #include "revision.h"
17 #include "rerere.h"
18 #include "merge-ort.h"
19 #include "merge-ort-wrappers.h"
20 #include "refs.h"
21 #include "strvec.h"
22 #include "quote.h"
23 #include "trailer.h"
24 #include "log-tree.h"
25 #include "wt-status.h"
26 #include "hashmap.h"
27 #include "notes-utils.h"
28 #include "sigchain.h"
29 #include "unpack-trees.h"
30 #include "worktree.h"
31 #include "oidmap.h"
32 #include "oidset.h"
33 #include "commit-slab.h"
34 #include "alias.h"
35 #include "commit-reach.h"
36 #include "rebase-interactive.h"
37 #include "reset.h"
38 #include "branch.h"
40 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
42 static const char sign_off_header[] = "Signed-off-by: ";
43 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
45 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
47 static GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
49 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
50 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
51 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
52 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
54 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
56 * The file containing rebase commands, comments, and empty lines.
57 * This file is created by "git rebase -i" then edited by the user. As
58 * the lines are processed, they are removed from the front of this
59 * file and written to the tail of 'done'.
61 GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
62 GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
64 GIT_PATH_FUNC(rebase_path_dropped, "rebase-merge/dropped")
67 * The rebase command lines that have already been processed. A line
68 * is moved here when it is first handled, before any associated user
69 * actions.
71 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
73 * The file to keep track of how many commands were already processed (e.g.
74 * for the prompt).
76 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
78 * The file to keep track of how many commands are to be processed in total
79 * (e.g. for the prompt).
81 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
83 * The commit message that is planned to be used for any changes that
84 * need to be committed following a user interaction.
86 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
88 * The file into which is accumulated the suggested commit message for
89 * squash/fixup commands. When the first of a series of squash/fixups
90 * is seen, the file is created and the commit message from the
91 * previous commit and from the first squash/fixup commit are written
92 * to it. The commit message for each subsequent squash/fixup commit
93 * is appended to the file as it is processed.
95 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
97 * If the current series of squash/fixups has not yet included a squash
98 * command, then this file exists and holds the commit message of the
99 * original "pick" commit. (If the series ends without a "squash"
100 * command, then this can be used as the commit message of the combined
101 * commit without opening the editor.)
103 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
105 * This file contains the list fixup/squash commands that have been
106 * accumulated into message-fixup or message-squash so far.
108 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
110 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
111 * GIT_AUTHOR_DATE that will be used for the commit that is currently
112 * being rebased.
114 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
116 * When an "edit" rebase command is being processed, the SHA1 of the
117 * commit to be edited is recorded in this file. When "git rebase
118 * --continue" is executed, if there are any staged changes then they
119 * will be amended to the HEAD commit, but only provided the HEAD
120 * commit is still the commit to be edited. When any other rebase
121 * command is processed, this file is deleted.
123 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
125 * When we stop at a given patch via the "edit" command, this file contains
126 * the commit object name of the corresponding patch.
128 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
130 * For the post-rewrite hook, we make a list of rewritten commits and
131 * their new sha1s. The rewritten-pending list keeps the sha1s of
132 * commits that have been processed, but not committed yet,
133 * e.g. because they are waiting for a 'squash' command.
135 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
136 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
137 "rebase-merge/rewritten-pending")
140 * The path of the file containing the OID of the "squash onto" commit, i.e.
141 * the dummy commit used for `reset [new root]`.
143 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
146 * The path of the file listing refs that need to be deleted after the rebase
147 * finishes. This is used by the `label` command to record the need for cleanup.
149 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
152 * The update-refs file stores a list of refs that will be updated at the end
153 * of the rebase sequence. The 'update-ref <ref>' commands in the todo file
154 * update the OIDs for the refs in this file, but the refs are not updated
155 * until the end of the rebase sequence.
157 * rebase_path_update_refs() returns the path to this file for a given
158 * worktree directory. For the current worktree, pass the_repository->gitdir.
160 static char *rebase_path_update_refs(const char *wt_git_dir)
162 return xstrfmt("%s/rebase-merge/update-refs", wt_git_dir);
166 * The following files are written by git-rebase just after parsing the
167 * command-line.
169 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
170 static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
171 static GIT_PATH_FUNC(rebase_path_ignore_date, "rebase-merge/ignore_date")
172 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
173 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
174 static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
175 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
176 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
177 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
178 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
179 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
180 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
181 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
182 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
183 static GIT_PATH_FUNC(rebase_path_no_reschedule_failed_exec, "rebase-merge/no-reschedule-failed-exec")
184 static GIT_PATH_FUNC(rebase_path_drop_redundant_commits, "rebase-merge/drop_redundant_commits")
185 static GIT_PATH_FUNC(rebase_path_keep_redundant_commits, "rebase-merge/keep_redundant_commits")
188 * A 'struct update_refs_record' represents a value in the update-refs
189 * list. We use a string_list to map refs to these (before, after) pairs.
191 struct update_ref_record {
192 struct object_id before;
193 struct object_id after;
196 static struct update_ref_record *init_update_ref_record(const char *ref)
198 struct update_ref_record *rec;
200 CALLOC_ARRAY(rec, 1);
202 oidcpy(&rec->before, null_oid());
203 oidcpy(&rec->after, null_oid());
205 /* This may fail, but that's fine, we will keep the null OID. */
206 read_ref(ref, &rec->before);
208 return rec;
211 static int git_sequencer_config(const char *k, const char *v, void *cb)
213 struct replay_opts *opts = cb;
214 int status;
216 if (!strcmp(k, "commit.cleanup")) {
217 const char *s;
219 status = git_config_string(&s, k, v);
220 if (status)
221 return status;
223 if (!strcmp(s, "verbatim")) {
224 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
225 opts->explicit_cleanup = 1;
226 } else if (!strcmp(s, "whitespace")) {
227 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
228 opts->explicit_cleanup = 1;
229 } else if (!strcmp(s, "strip")) {
230 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
231 opts->explicit_cleanup = 1;
232 } else if (!strcmp(s, "scissors")) {
233 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
234 opts->explicit_cleanup = 1;
235 } else {
236 warning(_("invalid commit message cleanup mode '%s'"),
240 free((char *)s);
241 return status;
244 if (!strcmp(k, "commit.gpgsign")) {
245 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
246 return 0;
249 if (!opts->default_strategy && !strcmp(k, "pull.twohead")) {
250 int ret = git_config_string((const char**)&opts->default_strategy, k, v);
251 if (ret == 0) {
253 * pull.twohead is allowed to be multi-valued; we only
254 * care about the first value.
256 char *tmp = strchr(opts->default_strategy, ' ');
257 if (tmp)
258 *tmp = '\0';
260 return ret;
263 if (opts->action == REPLAY_REVERT && !strcmp(k, "revert.reference"))
264 opts->commit_use_reference = git_config_bool(k, v);
266 status = git_gpg_config(k, v, NULL);
267 if (status)
268 return status;
270 return git_diff_basic_config(k, v, NULL);
273 void sequencer_init_config(struct replay_opts *opts)
275 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
276 git_config(git_sequencer_config, opts);
279 static inline int is_rebase_i(const struct replay_opts *opts)
281 return opts->action == REPLAY_INTERACTIVE_REBASE;
284 static const char *get_dir(const struct replay_opts *opts)
286 if (is_rebase_i(opts))
287 return rebase_path();
288 return git_path_seq_dir();
291 static const char *get_todo_path(const struct replay_opts *opts)
293 if (is_rebase_i(opts))
294 return rebase_path_todo();
295 return git_path_todo_file();
299 * Returns 0 for non-conforming footer
300 * Returns 1 for conforming footer
301 * Returns 2 when sob exists within conforming footer
302 * Returns 3 when sob exists within conforming footer as last entry
304 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
305 size_t ignore_footer)
307 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
308 struct trailer_info info;
309 size_t i;
310 int found_sob = 0, found_sob_last = 0;
311 char saved_char;
313 opts.no_divider = 1;
315 if (ignore_footer) {
316 saved_char = sb->buf[sb->len - ignore_footer];
317 sb->buf[sb->len - ignore_footer] = '\0';
320 trailer_info_get(&info, sb->buf, &opts);
322 if (ignore_footer)
323 sb->buf[sb->len - ignore_footer] = saved_char;
325 if (info.trailer_start == info.trailer_end)
326 return 0;
328 for (i = 0; i < info.trailer_nr; i++)
329 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
330 found_sob = 1;
331 if (i == info.trailer_nr - 1)
332 found_sob_last = 1;
335 trailer_info_release(&info);
337 if (found_sob_last)
338 return 3;
339 if (found_sob)
340 return 2;
341 return 1;
344 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
346 static struct strbuf buf = STRBUF_INIT;
348 strbuf_reset(&buf);
349 if (opts->gpg_sign)
350 sq_quotef(&buf, "-S%s", opts->gpg_sign);
351 return buf.buf;
354 void replay_opts_release(struct replay_opts *opts)
356 free(opts->gpg_sign);
357 free(opts->reflog_action);
358 free(opts->default_strategy);
359 free(opts->strategy);
360 for (size_t i = 0; i < opts->xopts_nr; i++)
361 free(opts->xopts[i]);
362 free(opts->xopts);
363 strbuf_release(&opts->current_fixups);
364 if (opts->revs)
365 release_revisions(opts->revs);
366 free(opts->revs);
369 int sequencer_remove_state(struct replay_opts *opts)
371 struct strbuf buf = STRBUF_INIT;
372 int ret = 0;
374 if (is_rebase_i(opts) &&
375 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
376 char *p = buf.buf;
377 while (*p) {
378 char *eol = strchr(p, '\n');
379 if (eol)
380 *eol = '\0';
381 if (delete_ref("(rebase) cleanup", p, NULL, 0) < 0) {
382 warning(_("could not delete '%s'"), p);
383 ret = -1;
385 if (!eol)
386 break;
387 p = eol + 1;
391 strbuf_reset(&buf);
392 strbuf_addstr(&buf, get_dir(opts));
393 if (remove_dir_recursively(&buf, 0))
394 ret = error(_("could not remove '%s'"), buf.buf);
395 strbuf_release(&buf);
397 return ret;
400 static const char *action_name(const struct replay_opts *opts)
402 switch (opts->action) {
403 case REPLAY_REVERT:
404 return N_("revert");
405 case REPLAY_PICK:
406 return N_("cherry-pick");
407 case REPLAY_INTERACTIVE_REBASE:
408 return N_("rebase");
410 die(_("unknown action: %d"), opts->action);
413 struct commit_message {
414 char *parent_label;
415 char *label;
416 char *subject;
417 const char *message;
420 static const char *short_commit_name(struct commit *commit)
422 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
425 static int get_message(struct commit *commit, struct commit_message *out)
427 const char *abbrev, *subject;
428 int subject_len;
430 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
431 abbrev = short_commit_name(commit);
433 subject_len = find_commit_subject(out->message, &subject);
435 out->subject = xmemdupz(subject, subject_len);
436 out->label = xstrfmt("%s (%s)", abbrev, out->subject);
437 out->parent_label = xstrfmt("parent of %s", out->label);
439 return 0;
442 static void free_message(struct commit *commit, struct commit_message *msg)
444 free(msg->parent_label);
445 free(msg->label);
446 free(msg->subject);
447 unuse_commit_buffer(commit, msg->message);
450 static void print_advice(struct repository *r, int show_hint,
451 struct replay_opts *opts)
453 char *msg = getenv("GIT_CHERRY_PICK_HELP");
455 if (msg) {
456 advise("%s\n", msg);
458 * A conflict has occurred but the porcelain
459 * (typically rebase --interactive) wants to take care
460 * of the commit itself so remove CHERRY_PICK_HEAD
462 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
463 NULL, 0);
464 return;
467 if (show_hint) {
468 if (opts->no_commit)
469 advise(_("after resolving the conflicts, mark the corrected paths\n"
470 "with 'git add <paths>' or 'git rm <paths>'"));
471 else if (opts->action == REPLAY_PICK)
472 advise(_("After resolving the conflicts, mark them with\n"
473 "\"git add/rm <pathspec>\", then run\n"
474 "\"git cherry-pick --continue\".\n"
475 "You can instead skip this commit with \"git cherry-pick --skip\".\n"
476 "To abort and get back to the state before \"git cherry-pick\",\n"
477 "run \"git cherry-pick --abort\"."));
478 else if (opts->action == REPLAY_REVERT)
479 advise(_("After resolving the conflicts, mark them with\n"
480 "\"git add/rm <pathspec>\", then run\n"
481 "\"git revert --continue\".\n"
482 "You can instead skip this commit with \"git revert --skip\".\n"
483 "To abort and get back to the state before \"git revert\",\n"
484 "run \"git revert --abort\"."));
485 else
486 BUG("unexpected pick action in print_advice()");
490 static int write_message(const void *buf, size_t len, const char *filename,
491 int append_eol)
493 struct lock_file msg_file = LOCK_INIT;
495 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
496 if (msg_fd < 0)
497 return error_errno(_("could not lock '%s'"), filename);
498 if (write_in_full(msg_fd, buf, len) < 0) {
499 error_errno(_("could not write to '%s'"), filename);
500 rollback_lock_file(&msg_file);
501 return -1;
503 if (append_eol && write(msg_fd, "\n", 1) < 0) {
504 error_errno(_("could not write eol to '%s'"), filename);
505 rollback_lock_file(&msg_file);
506 return -1;
508 if (commit_lock_file(&msg_file) < 0)
509 return error(_("failed to finalize '%s'"), filename);
511 return 0;
514 int read_oneliner(struct strbuf *buf,
515 const char *path, unsigned flags)
517 int orig_len = buf->len;
519 if (strbuf_read_file(buf, path, 0) < 0) {
520 if ((flags & READ_ONELINER_WARN_MISSING) ||
521 (errno != ENOENT && errno != ENOTDIR))
522 warning_errno(_("could not read '%s'"), path);
523 return 0;
526 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
527 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
528 --buf->len;
529 buf->buf[buf->len] = '\0';
532 if ((flags & READ_ONELINER_SKIP_IF_EMPTY) && buf->len == orig_len)
533 return 0;
535 return 1;
538 static struct tree *empty_tree(struct repository *r)
540 return lookup_tree(r, the_hash_algo->empty_tree);
543 static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
545 if (repo_read_index_unmerged(repo))
546 return error_resolve_conflict(action_name(opts));
548 error(_("your local changes would be overwritten by %s."),
549 _(action_name(opts)));
551 if (advice_enabled(ADVICE_COMMIT_BEFORE_MERGE))
552 advise(_("commit your changes or stash them to proceed."));
553 return -1;
556 static void update_abort_safety_file(void)
558 struct object_id head;
560 /* Do nothing on a single-pick */
561 if (!file_exists(git_path_seq_dir()))
562 return;
564 if (!get_oid("HEAD", &head))
565 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
566 else
567 write_file(git_path_abort_safety_file(), "%s", "");
570 static int fast_forward_to(struct repository *r,
571 const struct object_id *to,
572 const struct object_id *from,
573 int unborn,
574 struct replay_opts *opts)
576 struct ref_transaction *transaction;
577 struct strbuf sb = STRBUF_INIT;
578 struct strbuf err = STRBUF_INIT;
580 repo_read_index(r);
581 if (checkout_fast_forward(r, from, to, 1))
582 return -1; /* the callee should have complained already */
584 strbuf_addf(&sb, "%s: fast-forward", action_name(opts));
586 transaction = ref_transaction_begin(&err);
587 if (!transaction ||
588 ref_transaction_update(transaction, "HEAD",
589 to, unborn && !is_rebase_i(opts) ?
590 null_oid() : from,
591 0, sb.buf, &err) ||
592 ref_transaction_commit(transaction, &err)) {
593 ref_transaction_free(transaction);
594 error("%s", err.buf);
595 strbuf_release(&sb);
596 strbuf_release(&err);
597 return -1;
600 strbuf_release(&sb);
601 strbuf_release(&err);
602 ref_transaction_free(transaction);
603 update_abort_safety_file();
604 return 0;
607 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
608 int use_editor)
610 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
611 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
612 COMMIT_MSG_CLEANUP_SPACE;
613 else if (!strcmp(cleanup_arg, "verbatim"))
614 return COMMIT_MSG_CLEANUP_NONE;
615 else if (!strcmp(cleanup_arg, "whitespace"))
616 return COMMIT_MSG_CLEANUP_SPACE;
617 else if (!strcmp(cleanup_arg, "strip"))
618 return COMMIT_MSG_CLEANUP_ALL;
619 else if (!strcmp(cleanup_arg, "scissors"))
620 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
621 COMMIT_MSG_CLEANUP_SPACE;
622 else
623 die(_("Invalid cleanup mode %s"), cleanup_arg);
627 * NB using int rather than enum cleanup_mode to stop clang's
628 * -Wtautological-constant-out-of-range-compare complaining that the comparison
629 * is always true.
631 static const char *describe_cleanup_mode(int cleanup_mode)
633 static const char *modes[] = { "whitespace",
634 "verbatim",
635 "scissors",
636 "strip" };
638 if (cleanup_mode < ARRAY_SIZE(modes))
639 return modes[cleanup_mode];
641 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
644 void append_conflicts_hint(struct index_state *istate,
645 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
647 int i;
649 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
650 strbuf_addch(msgbuf, '\n');
651 wt_status_append_cut_line(msgbuf);
652 strbuf_addch(msgbuf, comment_line_char);
655 strbuf_addch(msgbuf, '\n');
656 strbuf_commented_addf(msgbuf, "Conflicts:\n");
657 for (i = 0; i < istate->cache_nr;) {
658 const struct cache_entry *ce = istate->cache[i++];
659 if (ce_stage(ce)) {
660 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
661 while (i < istate->cache_nr &&
662 !strcmp(ce->name, istate->cache[i]->name))
663 i++;
668 static int do_recursive_merge(struct repository *r,
669 struct commit *base, struct commit *next,
670 const char *base_label, const char *next_label,
671 struct object_id *head, struct strbuf *msgbuf,
672 struct replay_opts *opts)
674 struct merge_options o;
675 struct merge_result result;
676 struct tree *next_tree, *base_tree, *head_tree;
677 int clean, show_output;
678 int i;
679 struct lock_file index_lock = LOCK_INIT;
681 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
682 return -1;
684 repo_read_index(r);
686 init_merge_options(&o, r);
687 o.ancestor = base ? base_label : "(empty tree)";
688 o.branch1 = "HEAD";
689 o.branch2 = next ? next_label : "(empty tree)";
690 if (is_rebase_i(opts))
691 o.buffer_output = 2;
692 o.show_rename_progress = 1;
694 head_tree = parse_tree_indirect(head);
695 next_tree = next ? get_commit_tree(next) : empty_tree(r);
696 base_tree = base ? get_commit_tree(base) : empty_tree(r);
698 for (i = 0; i < opts->xopts_nr; i++)
699 parse_merge_opt(&o, opts->xopts[i]);
701 if (!opts->strategy || !strcmp(opts->strategy, "ort")) {
702 memset(&result, 0, sizeof(result));
703 merge_incore_nonrecursive(&o, base_tree, head_tree, next_tree,
704 &result);
705 show_output = !is_rebase_i(opts) || !result.clean;
707 * TODO: merge_switch_to_result will update index/working tree;
708 * we only really want to do that if !result.clean || this is
709 * the final patch to be picked. But determining this is the
710 * final patch would take some work, and "head_tree" would need
711 * to be replace with the tree the index matched before we
712 * started doing any picks.
714 merge_switch_to_result(&o, head_tree, &result, 1, show_output);
715 clean = result.clean;
716 } else {
717 ensure_full_index(r->index);
718 clean = merge_trees(&o, head_tree, next_tree, base_tree);
719 if (is_rebase_i(opts) && clean <= 0)
720 fputs(o.obuf.buf, stdout);
721 strbuf_release(&o.obuf);
723 if (clean < 0) {
724 rollback_lock_file(&index_lock);
725 return clean;
728 if (write_locked_index(r->index, &index_lock,
729 COMMIT_LOCK | SKIP_IF_UNCHANGED))
731 * TRANSLATORS: %s will be "revert", "cherry-pick" or
732 * "rebase".
734 return error(_("%s: Unable to write new index file"),
735 _(action_name(opts)));
737 if (!clean)
738 append_conflicts_hint(r->index, msgbuf,
739 opts->default_msg_cleanup);
741 return !clean;
744 static struct object_id *get_cache_tree_oid(struct index_state *istate)
746 if (!cache_tree_fully_valid(istate->cache_tree))
747 if (cache_tree_update(istate, 0)) {
748 error(_("unable to update cache tree"));
749 return NULL;
752 return &istate->cache_tree->oid;
755 static int is_index_unchanged(struct repository *r)
757 struct object_id head_oid, *cache_tree_oid;
758 struct commit *head_commit;
759 struct index_state *istate = r->index;
761 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
762 return error(_("could not resolve HEAD commit"));
764 head_commit = lookup_commit(r, &head_oid);
767 * If head_commit is NULL, check_commit, called from
768 * lookup_commit, would have indicated that head_commit is not
769 * a commit object already. parse_commit() will return failure
770 * without further complaints in such a case. Otherwise, if
771 * the commit is invalid, parse_commit() will complain. So
772 * there is nothing for us to say here. Just return failure.
774 if (parse_commit(head_commit))
775 return -1;
777 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
778 return -1;
780 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
783 static int write_author_script(const char *message)
785 struct strbuf buf = STRBUF_INIT;
786 const char *eol;
787 int res;
789 for (;;)
790 if (!*message || starts_with(message, "\n")) {
791 missing_author:
792 /* Missing 'author' line? */
793 unlink(rebase_path_author_script());
794 return 0;
795 } else if (skip_prefix(message, "author ", &message))
796 break;
797 else if ((eol = strchr(message, '\n')))
798 message = eol + 1;
799 else
800 goto missing_author;
802 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
803 while (*message && *message != '\n' && *message != '\r')
804 if (skip_prefix(message, " <", &message))
805 break;
806 else if (*message != '\'')
807 strbuf_addch(&buf, *(message++));
808 else
809 strbuf_addf(&buf, "'\\%c'", *(message++));
810 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
811 while (*message && *message != '\n' && *message != '\r')
812 if (skip_prefix(message, "> ", &message))
813 break;
814 else if (*message != '\'')
815 strbuf_addch(&buf, *(message++));
816 else
817 strbuf_addf(&buf, "'\\%c'", *(message++));
818 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
819 while (*message && *message != '\n' && *message != '\r')
820 if (*message != '\'')
821 strbuf_addch(&buf, *(message++));
822 else
823 strbuf_addf(&buf, "'\\%c'", *(message++));
824 strbuf_addch(&buf, '\'');
825 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
826 strbuf_release(&buf);
827 return res;
831 * Take a series of KEY='VALUE' lines where VALUE part is
832 * sq-quoted, and append <KEY, VALUE> at the end of the string list
834 static int parse_key_value_squoted(char *buf, struct string_list *list)
836 while (*buf) {
837 struct string_list_item *item;
838 char *np;
839 char *cp = strchr(buf, '=');
840 if (!cp) {
841 np = strchrnul(buf, '\n');
842 return error(_("no key present in '%.*s'"),
843 (int) (np - buf), buf);
845 np = strchrnul(cp, '\n');
846 *cp++ = '\0';
847 item = string_list_append(list, buf);
849 buf = np + (*np == '\n');
850 *np = '\0';
851 cp = sq_dequote(cp);
852 if (!cp)
853 return error(_("unable to dequote value of '%s'"),
854 item->string);
855 item->util = xstrdup(cp);
857 return 0;
861 * Reads and parses the state directory's "author-script" file, and sets name,
862 * email and date accordingly.
863 * Returns 0 on success, -1 if the file could not be parsed.
865 * The author script is of the format:
867 * GIT_AUTHOR_NAME='$author_name'
868 * GIT_AUTHOR_EMAIL='$author_email'
869 * GIT_AUTHOR_DATE='$author_date'
871 * where $author_name, $author_email and $author_date are quoted. We are strict
872 * with our parsing, as the file was meant to be eval'd in the now-removed
873 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
874 * from what this function expects, it is better to bail out than to do
875 * something that the user does not expect.
877 int read_author_script(const char *path, char **name, char **email, char **date,
878 int allow_missing)
880 struct strbuf buf = STRBUF_INIT;
881 struct string_list kv = STRING_LIST_INIT_DUP;
882 int retval = -1; /* assume failure */
883 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
885 if (strbuf_read_file(&buf, path, 256) <= 0) {
886 strbuf_release(&buf);
887 if (errno == ENOENT && allow_missing)
888 return 0;
889 else
890 return error_errno(_("could not open '%s' for reading"),
891 path);
894 if (parse_key_value_squoted(buf.buf, &kv))
895 goto finish;
897 for (i = 0; i < kv.nr; i++) {
898 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
899 if (name_i != -2)
900 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
901 else
902 name_i = i;
903 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
904 if (email_i != -2)
905 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
906 else
907 email_i = i;
908 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
909 if (date_i != -2)
910 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
911 else
912 date_i = i;
913 } else {
914 err = error(_("unknown variable '%s'"),
915 kv.items[i].string);
918 if (name_i == -2)
919 error(_("missing 'GIT_AUTHOR_NAME'"));
920 if (email_i == -2)
921 error(_("missing 'GIT_AUTHOR_EMAIL'"));
922 if (date_i == -2)
923 error(_("missing 'GIT_AUTHOR_DATE'"));
924 if (name_i < 0 || email_i < 0 || date_i < 0 || err)
925 goto finish;
926 *name = kv.items[name_i].util;
927 *email = kv.items[email_i].util;
928 *date = kv.items[date_i].util;
929 retval = 0;
930 finish:
931 string_list_clear(&kv, !!retval);
932 strbuf_release(&buf);
933 return retval;
937 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
938 * file with shell quoting into struct strvec. Returns -1 on
939 * error, 0 otherwise.
941 static int read_env_script(struct strvec *env)
943 char *name, *email, *date;
945 if (read_author_script(rebase_path_author_script(),
946 &name, &email, &date, 0))
947 return -1;
949 strvec_pushf(env, "GIT_AUTHOR_NAME=%s", name);
950 strvec_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
951 strvec_pushf(env, "GIT_AUTHOR_DATE=%s", date);
952 free(name);
953 free(email);
954 free(date);
956 return 0;
959 static char *get_author(const char *message)
961 size_t len;
962 const char *a;
964 a = find_commit_header(message, "author", &len);
965 if (a)
966 return xmemdupz(a, len);
968 return NULL;
971 static const char *author_date_from_env(const struct strvec *env)
973 int i;
974 const char *date;
976 for (i = 0; i < env->nr; i++)
977 if (skip_prefix(env->v[i],
978 "GIT_AUTHOR_DATE=", &date))
979 return date;
981 * If GIT_AUTHOR_DATE is missing we should have already errored out when
982 * reading the script
984 BUG("GIT_AUTHOR_DATE missing from author script");
987 static const char staged_changes_advice[] =
988 N_("you have staged changes in your working tree\n"
989 "If these changes are meant to be squashed into the previous commit, run:\n"
990 "\n"
991 " git commit --amend %s\n"
992 "\n"
993 "If they are meant to go into a new commit, run:\n"
994 "\n"
995 " git commit %s\n"
996 "\n"
997 "In both cases, once you're done, continue with:\n"
998 "\n"
999 " git rebase --continue\n");
1001 #define ALLOW_EMPTY (1<<0)
1002 #define EDIT_MSG (1<<1)
1003 #define AMEND_MSG (1<<2)
1004 #define CLEANUP_MSG (1<<3)
1005 #define VERIFY_MSG (1<<4)
1006 #define CREATE_ROOT_COMMIT (1<<5)
1007 #define VERBATIM_MSG (1<<6)
1009 static int run_command_silent_on_success(struct child_process *cmd)
1011 struct strbuf buf = STRBUF_INIT;
1012 int rc;
1014 cmd->stdout_to_stderr = 1;
1015 rc = pipe_command(cmd,
1016 NULL, 0,
1017 NULL, 0,
1018 &buf, 0);
1020 if (rc)
1021 fputs(buf.buf, stderr);
1022 strbuf_release(&buf);
1023 return rc;
1027 * If we are cherry-pick, and if the merge did not result in
1028 * hand-editing, we will hit this commit and inherit the original
1029 * author date and name.
1031 * If we are revert, or if our cherry-pick results in a hand merge,
1032 * we had better say that the current user is responsible for that.
1034 * An exception is when run_git_commit() is called during an
1035 * interactive rebase: in that case, we will want to retain the
1036 * author metadata.
1038 static int run_git_commit(const char *defmsg,
1039 struct replay_opts *opts,
1040 unsigned int flags)
1042 struct child_process cmd = CHILD_PROCESS_INIT;
1044 if ((flags & CLEANUP_MSG) && (flags & VERBATIM_MSG))
1045 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1047 cmd.git_cmd = 1;
1049 if (is_rebase_i(opts) &&
1050 ((opts->committer_date_is_author_date && !opts->ignore_date) ||
1051 !(!defmsg && (flags & AMEND_MSG))) &&
1052 read_env_script(&cmd.env)) {
1053 const char *gpg_opt = gpg_sign_opt_quoted(opts);
1055 return error(_(staged_changes_advice),
1056 gpg_opt, gpg_opt);
1059 strvec_pushf(&cmd.env, GIT_REFLOG_ACTION "=%s", opts->reflog_message);
1061 if (opts->committer_date_is_author_date)
1062 strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
1063 opts->ignore_date ?
1064 "" :
1065 author_date_from_env(&cmd.env));
1066 if (opts->ignore_date)
1067 strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
1069 strvec_push(&cmd.args, "commit");
1071 if (!(flags & VERIFY_MSG))
1072 strvec_push(&cmd.args, "-n");
1073 if ((flags & AMEND_MSG))
1074 strvec_push(&cmd.args, "--amend");
1075 if (opts->gpg_sign)
1076 strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
1077 else
1078 strvec_push(&cmd.args, "--no-gpg-sign");
1079 if (defmsg)
1080 strvec_pushl(&cmd.args, "-F", defmsg, NULL);
1081 else if (!(flags & EDIT_MSG))
1082 strvec_pushl(&cmd.args, "-C", "HEAD", NULL);
1083 if ((flags & CLEANUP_MSG))
1084 strvec_push(&cmd.args, "--cleanup=strip");
1085 if ((flags & VERBATIM_MSG))
1086 strvec_push(&cmd.args, "--cleanup=verbatim");
1087 if ((flags & EDIT_MSG))
1088 strvec_push(&cmd.args, "-e");
1089 else if (!(flags & CLEANUP_MSG) &&
1090 !opts->signoff && !opts->record_origin &&
1091 !opts->explicit_cleanup)
1092 strvec_push(&cmd.args, "--cleanup=verbatim");
1094 if ((flags & ALLOW_EMPTY))
1095 strvec_push(&cmd.args, "--allow-empty");
1097 if (!(flags & EDIT_MSG))
1098 strvec_push(&cmd.args, "--allow-empty-message");
1100 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
1101 return run_command_silent_on_success(&cmd);
1102 else
1103 return run_command(&cmd);
1106 static int rest_is_empty(const struct strbuf *sb, int start)
1108 int i, eol;
1109 const char *nl;
1111 /* Check if the rest is just whitespace and Signed-off-by's. */
1112 for (i = start; i < sb->len; i++) {
1113 nl = memchr(sb->buf + i, '\n', sb->len - i);
1114 if (nl)
1115 eol = nl - sb->buf;
1116 else
1117 eol = sb->len;
1119 if (strlen(sign_off_header) <= eol - i &&
1120 starts_with(sb->buf + i, sign_off_header)) {
1121 i = eol;
1122 continue;
1124 while (i < eol)
1125 if (!isspace(sb->buf[i++]))
1126 return 0;
1129 return 1;
1132 void cleanup_message(struct strbuf *msgbuf,
1133 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1135 if (verbose || /* Truncate the message just before the diff, if any. */
1136 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1137 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1138 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1139 strbuf_stripspace(msgbuf, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1143 * Find out if the message in the strbuf contains only whitespace and
1144 * Signed-off-by lines.
1146 int message_is_empty(const struct strbuf *sb,
1147 enum commit_msg_cleanup_mode cleanup_mode)
1149 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1150 return 0;
1151 return rest_is_empty(sb, 0);
1155 * See if the user edited the message in the editor or left what
1156 * was in the template intact
1158 int template_untouched(const struct strbuf *sb, const char *template_file,
1159 enum commit_msg_cleanup_mode cleanup_mode)
1161 struct strbuf tmpl = STRBUF_INIT;
1162 const char *start;
1164 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1165 return 0;
1167 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1168 return 0;
1170 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1171 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1172 start = sb->buf;
1173 strbuf_release(&tmpl);
1174 return rest_is_empty(sb, start - sb->buf);
1177 int update_head_with_reflog(const struct commit *old_head,
1178 const struct object_id *new_head,
1179 const char *action, const struct strbuf *msg,
1180 struct strbuf *err)
1182 struct ref_transaction *transaction;
1183 struct strbuf sb = STRBUF_INIT;
1184 const char *nl;
1185 int ret = 0;
1187 if (action) {
1188 strbuf_addstr(&sb, action);
1189 strbuf_addstr(&sb, ": ");
1192 nl = strchr(msg->buf, '\n');
1193 if (nl) {
1194 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1195 } else {
1196 strbuf_addbuf(&sb, msg);
1197 strbuf_addch(&sb, '\n');
1200 transaction = ref_transaction_begin(err);
1201 if (!transaction ||
1202 ref_transaction_update(transaction, "HEAD", new_head,
1203 old_head ? &old_head->object.oid : null_oid(),
1204 0, sb.buf, err) ||
1205 ref_transaction_commit(transaction, err)) {
1206 ret = -1;
1208 ref_transaction_free(transaction);
1209 strbuf_release(&sb);
1211 return ret;
1214 static int run_rewrite_hook(const struct object_id *oldoid,
1215 const struct object_id *newoid)
1217 struct child_process proc = CHILD_PROCESS_INIT;
1218 int code;
1219 struct strbuf sb = STRBUF_INIT;
1220 const char *hook_path = find_hook("post-rewrite");
1222 if (!hook_path)
1223 return 0;
1225 strvec_pushl(&proc.args, hook_path, "amend", NULL);
1226 proc.in = -1;
1227 proc.stdout_to_stderr = 1;
1228 proc.trace2_hook_name = "post-rewrite";
1230 code = start_command(&proc);
1231 if (code)
1232 return code;
1233 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1234 sigchain_push(SIGPIPE, SIG_IGN);
1235 write_in_full(proc.in, sb.buf, sb.len);
1236 close(proc.in);
1237 strbuf_release(&sb);
1238 sigchain_pop(SIGPIPE);
1239 return finish_command(&proc);
1242 void commit_post_rewrite(struct repository *r,
1243 const struct commit *old_head,
1244 const struct object_id *new_head)
1246 struct notes_rewrite_cfg *cfg;
1248 cfg = init_copy_notes_for_rewrite("amend");
1249 if (cfg) {
1250 /* we are amending, so old_head is not NULL */
1251 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1252 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1254 run_rewrite_hook(&old_head->object.oid, new_head);
1257 static int run_prepare_commit_msg_hook(struct repository *r,
1258 struct strbuf *msg,
1259 const char *commit)
1261 int ret = 0;
1262 const char *name, *arg1 = NULL, *arg2 = NULL;
1264 name = git_path_commit_editmsg();
1265 if (write_message(msg->buf, msg->len, name, 0))
1266 return -1;
1268 if (commit) {
1269 arg1 = "commit";
1270 arg2 = commit;
1271 } else {
1272 arg1 = "message";
1274 if (run_commit_hook(0, r->index_file, NULL, "prepare-commit-msg", name,
1275 arg1, arg2, NULL))
1276 ret = error(_("'prepare-commit-msg' hook failed"));
1278 return ret;
1281 static const char implicit_ident_advice_noconfig[] =
1282 N_("Your name and email address were configured automatically based\n"
1283 "on your username and hostname. Please check that they are accurate.\n"
1284 "You can suppress this message by setting them explicitly. Run the\n"
1285 "following command and follow the instructions in your editor to edit\n"
1286 "your configuration file:\n"
1287 "\n"
1288 " git config --global --edit\n"
1289 "\n"
1290 "After doing this, you may fix the identity used for this commit with:\n"
1291 "\n"
1292 " git commit --amend --reset-author\n");
1294 static const char implicit_ident_advice_config[] =
1295 N_("Your name and email address were configured automatically based\n"
1296 "on your username and hostname. Please check that they are accurate.\n"
1297 "You can suppress this message by setting them explicitly:\n"
1298 "\n"
1299 " git config --global user.name \"Your Name\"\n"
1300 " git config --global user.email you@example.com\n"
1301 "\n"
1302 "After doing this, you may fix the identity used for this commit with:\n"
1303 "\n"
1304 " git commit --amend --reset-author\n");
1306 static const char *implicit_ident_advice(void)
1308 char *user_config = interpolate_path("~/.gitconfig", 0);
1309 char *xdg_config = xdg_config_home("config");
1310 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1312 free(user_config);
1313 free(xdg_config);
1315 if (config_exists)
1316 return _(implicit_ident_advice_config);
1317 else
1318 return _(implicit_ident_advice_noconfig);
1322 void print_commit_summary(struct repository *r,
1323 const char *prefix,
1324 const struct object_id *oid,
1325 unsigned int flags)
1327 struct rev_info rev;
1328 struct commit *commit;
1329 struct strbuf format = STRBUF_INIT;
1330 const char *head;
1331 struct pretty_print_context pctx = {0};
1332 struct strbuf author_ident = STRBUF_INIT;
1333 struct strbuf committer_ident = STRBUF_INIT;
1334 struct ref_store *refs;
1336 commit = lookup_commit(r, oid);
1337 if (!commit)
1338 die(_("couldn't look up newly created commit"));
1339 if (parse_commit(commit))
1340 die(_("could not parse newly created commit"));
1342 strbuf_addstr(&format, "format:%h] %s");
1344 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1345 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1346 if (strbuf_cmp(&author_ident, &committer_ident)) {
1347 strbuf_addstr(&format, "\n Author: ");
1348 strbuf_addbuf_percentquote(&format, &author_ident);
1350 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1351 struct strbuf date = STRBUF_INIT;
1353 format_commit_message(commit, "%ad", &date, &pctx);
1354 strbuf_addstr(&format, "\n Date: ");
1355 strbuf_addbuf_percentquote(&format, &date);
1356 strbuf_release(&date);
1358 if (!committer_ident_sufficiently_given()) {
1359 strbuf_addstr(&format, "\n Committer: ");
1360 strbuf_addbuf_percentquote(&format, &committer_ident);
1361 if (advice_enabled(ADVICE_IMPLICIT_IDENTITY)) {
1362 strbuf_addch(&format, '\n');
1363 strbuf_addstr(&format, implicit_ident_advice());
1366 strbuf_release(&author_ident);
1367 strbuf_release(&committer_ident);
1369 repo_init_revisions(r, &rev, prefix);
1370 setup_revisions(0, NULL, &rev, NULL);
1372 rev.diff = 1;
1373 rev.diffopt.output_format =
1374 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1376 rev.verbose_header = 1;
1377 rev.show_root_diff = 1;
1378 get_commit_format(format.buf, &rev);
1379 rev.always_show_header = 0;
1380 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1381 diff_setup_done(&rev.diffopt);
1383 refs = get_main_ref_store(the_repository);
1384 head = refs_resolve_ref_unsafe(refs, "HEAD", 0, NULL, NULL);
1385 if (!head)
1386 die(_("unable to resolve HEAD after creating commit"));
1387 if (!strcmp(head, "HEAD"))
1388 head = _("detached HEAD");
1389 else
1390 skip_prefix(head, "refs/heads/", &head);
1391 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1392 _(" (root-commit)") : "");
1394 if (!log_tree_commit(&rev, commit)) {
1395 rev.always_show_header = 1;
1396 rev.use_terminator = 1;
1397 log_tree_commit(&rev, commit);
1400 release_revisions(&rev);
1401 strbuf_release(&format);
1404 static int parse_head(struct repository *r, struct commit **head)
1406 struct commit *current_head;
1407 struct object_id oid;
1409 if (get_oid("HEAD", &oid)) {
1410 current_head = NULL;
1411 } else {
1412 current_head = lookup_commit_reference(r, &oid);
1413 if (!current_head)
1414 return error(_("could not parse HEAD"));
1415 if (!oideq(&oid, &current_head->object.oid)) {
1416 warning(_("HEAD %s is not a commit!"),
1417 oid_to_hex(&oid));
1419 if (parse_commit(current_head))
1420 return error(_("could not parse HEAD commit"));
1422 *head = current_head;
1424 return 0;
1428 * Try to commit without forking 'git commit'. In some cases we need
1429 * to run 'git commit' to display an error message
1431 * Returns:
1432 * -1 - error unable to commit
1433 * 0 - success
1434 * 1 - run 'git commit'
1436 static int try_to_commit(struct repository *r,
1437 struct strbuf *msg, const char *author,
1438 struct replay_opts *opts, unsigned int flags,
1439 struct object_id *oid)
1441 struct object_id tree;
1442 struct commit *current_head = NULL;
1443 struct commit_list *parents = NULL;
1444 struct commit_extra_header *extra = NULL;
1445 struct strbuf err = STRBUF_INIT;
1446 struct strbuf commit_msg = STRBUF_INIT;
1447 char *amend_author = NULL;
1448 const char *committer = NULL;
1449 const char *hook_commit = NULL;
1450 enum commit_msg_cleanup_mode cleanup;
1451 int res = 0;
1453 if ((flags & CLEANUP_MSG) && (flags & VERBATIM_MSG))
1454 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1456 if (parse_head(r, &current_head))
1457 return -1;
1459 if (flags & AMEND_MSG) {
1460 const char *exclude_gpgsig[] = { "gpgsig", "gpgsig-sha256", NULL };
1461 const char *out_enc = get_commit_output_encoding();
1462 const char *message = logmsg_reencode(current_head, NULL,
1463 out_enc);
1465 if (!msg) {
1466 const char *orig_message = NULL;
1468 find_commit_subject(message, &orig_message);
1469 msg = &commit_msg;
1470 strbuf_addstr(msg, orig_message);
1471 hook_commit = "HEAD";
1473 author = amend_author = get_author(message);
1474 unuse_commit_buffer(current_head, message);
1475 if (!author) {
1476 res = error(_("unable to parse commit author"));
1477 goto out;
1479 parents = copy_commit_list(current_head->parents);
1480 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1481 } else if (current_head &&
1482 (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1483 commit_list_insert(current_head, &parents);
1486 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1487 res = error(_("git write-tree failed to write a tree"));
1488 goto out;
1491 if (!(flags & ALLOW_EMPTY)) {
1492 struct commit *first_parent = current_head;
1494 if (flags & AMEND_MSG) {
1495 if (current_head->parents) {
1496 first_parent = current_head->parents->item;
1497 if (repo_parse_commit(r, first_parent)) {
1498 res = error(_("could not parse HEAD commit"));
1499 goto out;
1501 } else {
1502 first_parent = NULL;
1505 if (oideq(first_parent
1506 ? get_commit_tree_oid(first_parent)
1507 : the_hash_algo->empty_tree,
1508 &tree)) {
1509 res = 1; /* run 'git commit' to display error message */
1510 goto out;
1514 if (hook_exists("prepare-commit-msg")) {
1515 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1516 if (res)
1517 goto out;
1518 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1519 2048) < 0) {
1520 res = error_errno(_("unable to read commit message "
1521 "from '%s'"),
1522 git_path_commit_editmsg());
1523 goto out;
1525 msg = &commit_msg;
1528 if (flags & CLEANUP_MSG)
1529 cleanup = COMMIT_MSG_CLEANUP_ALL;
1530 else if (flags & VERBATIM_MSG)
1531 cleanup = COMMIT_MSG_CLEANUP_NONE;
1532 else if ((opts->signoff || opts->record_origin) &&
1533 !opts->explicit_cleanup)
1534 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1535 else
1536 cleanup = opts->default_msg_cleanup;
1538 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1539 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1540 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1541 res = 1; /* run 'git commit' to display error message */
1542 goto out;
1545 if (opts->committer_date_is_author_date) {
1546 struct ident_split id;
1547 struct strbuf date = STRBUF_INIT;
1549 if (!opts->ignore_date) {
1550 if (split_ident_line(&id, author, (int)strlen(author)) < 0) {
1551 res = error(_("invalid author identity '%s'"),
1552 author);
1553 goto out;
1555 if (!id.date_begin) {
1556 res = error(_(
1557 "corrupt author: missing date information"));
1558 goto out;
1560 strbuf_addf(&date, "@%.*s %.*s",
1561 (int)(id.date_end - id.date_begin),
1562 id.date_begin,
1563 (int)(id.tz_end - id.tz_begin),
1564 id.tz_begin);
1565 } else {
1566 reset_ident_date();
1568 committer = fmt_ident(getenv("GIT_COMMITTER_NAME"),
1569 getenv("GIT_COMMITTER_EMAIL"),
1570 WANT_COMMITTER_IDENT,
1571 opts->ignore_date ? NULL : date.buf,
1572 IDENT_STRICT);
1573 strbuf_release(&date);
1574 } else {
1575 reset_ident_date();
1578 if (opts->ignore_date) {
1579 struct ident_split id;
1580 char *name, *email;
1582 if (split_ident_line(&id, author, strlen(author)) < 0) {
1583 error(_("invalid author identity '%s'"), author);
1584 goto out;
1586 name = xmemdupz(id.name_begin, id.name_end - id.name_begin);
1587 email = xmemdupz(id.mail_begin, id.mail_end - id.mail_begin);
1588 author = fmt_ident(name, email, WANT_AUTHOR_IDENT, NULL,
1589 IDENT_STRICT);
1590 free(name);
1591 free(email);
1594 if (commit_tree_extended(msg->buf, msg->len, &tree, parents, oid,
1595 author, committer, opts->gpg_sign, extra)) {
1596 res = error(_("failed to write commit object"));
1597 goto out;
1600 if (update_head_with_reflog(current_head, oid, opts->reflog_message,
1601 msg, &err)) {
1602 res = error("%s", err.buf);
1603 goto out;
1606 run_commit_hook(0, r->index_file, NULL, "post-commit", NULL);
1607 if (flags & AMEND_MSG)
1608 commit_post_rewrite(r, current_head, oid);
1610 out:
1611 free_commit_extra_headers(extra);
1612 strbuf_release(&err);
1613 strbuf_release(&commit_msg);
1614 free(amend_author);
1616 return res;
1619 static int write_rebase_head(struct object_id *oid)
1621 if (update_ref("rebase", "REBASE_HEAD", oid,
1622 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1623 return error(_("could not update %s"), "REBASE_HEAD");
1625 return 0;
1628 static int do_commit(struct repository *r,
1629 const char *msg_file, const char *author,
1630 struct replay_opts *opts, unsigned int flags,
1631 struct object_id *oid)
1633 int res = 1;
1635 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1636 struct object_id oid;
1637 struct strbuf sb = STRBUF_INIT;
1639 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1640 return error_errno(_("unable to read commit message "
1641 "from '%s'"),
1642 msg_file);
1644 res = try_to_commit(r, msg_file ? &sb : NULL,
1645 author, opts, flags, &oid);
1646 strbuf_release(&sb);
1647 if (!res) {
1648 refs_delete_ref(get_main_ref_store(r), "",
1649 "CHERRY_PICK_HEAD", NULL, 0);
1650 unlink(git_path_merge_msg(r));
1651 if (!is_rebase_i(opts))
1652 print_commit_summary(r, NULL, &oid,
1653 SUMMARY_SHOW_AUTHOR_DATE);
1654 return res;
1657 if (res == 1) {
1658 if (is_rebase_i(opts) && oid)
1659 if (write_rebase_head(oid))
1660 return -1;
1661 return run_git_commit(msg_file, opts, flags);
1664 return res;
1667 static int is_original_commit_empty(struct commit *commit)
1669 const struct object_id *ptree_oid;
1671 if (parse_commit(commit))
1672 return error(_("could not parse commit %s"),
1673 oid_to_hex(&commit->object.oid));
1674 if (commit->parents) {
1675 struct commit *parent = commit->parents->item;
1676 if (parse_commit(parent))
1677 return error(_("could not parse parent commit %s"),
1678 oid_to_hex(&parent->object.oid));
1679 ptree_oid = get_commit_tree_oid(parent);
1680 } else {
1681 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1684 return oideq(ptree_oid, get_commit_tree_oid(commit));
1688 * Should empty commits be allowed? Return status:
1689 * <0: Error in is_index_unchanged(r) or is_original_commit_empty(commit)
1690 * 0: Halt on empty commit
1691 * 1: Allow empty commit
1692 * 2: Drop empty commit
1694 static int allow_empty(struct repository *r,
1695 struct replay_opts *opts,
1696 struct commit *commit)
1698 int index_unchanged, originally_empty;
1701 * Four cases:
1703 * (1) we do not allow empty at all and error out.
1705 * (2) we allow ones that were initially empty, and
1706 * just drop the ones that become empty
1708 * (3) we allow ones that were initially empty, but
1709 * halt for the ones that become empty;
1711 * (4) we allow both.
1713 if (!opts->allow_empty)
1714 return 0; /* let "git commit" barf as necessary */
1716 index_unchanged = is_index_unchanged(r);
1717 if (index_unchanged < 0)
1718 return index_unchanged;
1719 if (!index_unchanged)
1720 return 0; /* we do not have to say --allow-empty */
1722 if (opts->keep_redundant_commits)
1723 return 1;
1725 originally_empty = is_original_commit_empty(commit);
1726 if (originally_empty < 0)
1727 return originally_empty;
1728 if (originally_empty)
1729 return 1;
1730 else if (opts->drop_redundant_commits)
1731 return 2;
1732 else
1733 return 0;
1736 static struct {
1737 char c;
1738 const char *str;
1739 } todo_command_info[] = {
1740 [TODO_PICK] = { 'p', "pick" },
1741 [TODO_REVERT] = { 0, "revert" },
1742 [TODO_EDIT] = { 'e', "edit" },
1743 [TODO_REWORD] = { 'r', "reword" },
1744 [TODO_FIXUP] = { 'f', "fixup" },
1745 [TODO_SQUASH] = { 's', "squash" },
1746 [TODO_EXEC] = { 'x', "exec" },
1747 [TODO_BREAK] = { 'b', "break" },
1748 [TODO_LABEL] = { 'l', "label" },
1749 [TODO_RESET] = { 't', "reset" },
1750 [TODO_MERGE] = { 'm', "merge" },
1751 [TODO_UPDATE_REF] = { 'u', "update-ref" },
1752 [TODO_NOOP] = { 0, "noop" },
1753 [TODO_DROP] = { 'd', "drop" },
1754 [TODO_COMMENT] = { 0, NULL },
1757 static const char *command_to_string(const enum todo_command command)
1759 if (command < TODO_COMMENT)
1760 return todo_command_info[command].str;
1761 die(_("unknown command: %d"), command);
1764 static char command_to_char(const enum todo_command command)
1766 if (command < TODO_COMMENT)
1767 return todo_command_info[command].c;
1768 return comment_line_char;
1771 static int is_noop(const enum todo_command command)
1773 return TODO_NOOP <= command;
1776 static int is_fixup(enum todo_command command)
1778 return command == TODO_FIXUP || command == TODO_SQUASH;
1781 /* Does this command create a (non-merge) commit? */
1782 static int is_pick_or_similar(enum todo_command command)
1784 switch (command) {
1785 case TODO_PICK:
1786 case TODO_REVERT:
1787 case TODO_EDIT:
1788 case TODO_REWORD:
1789 case TODO_FIXUP:
1790 case TODO_SQUASH:
1791 return 1;
1792 default:
1793 return 0;
1797 enum todo_item_flags {
1798 TODO_EDIT_MERGE_MSG = (1 << 0),
1799 TODO_REPLACE_FIXUP_MSG = (1 << 1),
1800 TODO_EDIT_FIXUP_MSG = (1 << 2),
1803 static const char first_commit_msg_str[] = N_("This is the 1st commit message:");
1804 static const char nth_commit_msg_fmt[] = N_("This is the commit message #%d:");
1805 static const char skip_first_commit_msg_str[] = N_("The 1st commit message will be skipped:");
1806 static const char skip_nth_commit_msg_fmt[] = N_("The commit message #%d will be skipped:");
1807 static const char combined_commit_msg_fmt[] = N_("This is a combination of %d commits.");
1809 static int is_fixup_flag(enum todo_command command, unsigned flag)
1811 return command == TODO_FIXUP && ((flag & TODO_REPLACE_FIXUP_MSG) ||
1812 (flag & TODO_EDIT_FIXUP_MSG));
1816 * Wrapper around strbuf_add_commented_lines() which avoids double
1817 * commenting commit subjects.
1819 static void add_commented_lines(struct strbuf *buf, const void *str, size_t len)
1821 const char *s = str;
1822 while (len > 0 && s[0] == comment_line_char) {
1823 size_t count;
1824 const char *n = memchr(s, '\n', len);
1825 if (!n)
1826 count = len;
1827 else
1828 count = n - s + 1;
1829 strbuf_add(buf, s, count);
1830 s += count;
1831 len -= count;
1833 strbuf_add_commented_lines(buf, s, len);
1836 /* Does the current fixup chain contain a squash command? */
1837 static int seen_squash(struct replay_opts *opts)
1839 return starts_with(opts->current_fixups.buf, "squash") ||
1840 strstr(opts->current_fixups.buf, "\nsquash");
1843 static void update_comment_bufs(struct strbuf *buf1, struct strbuf *buf2, int n)
1845 strbuf_setlen(buf1, 2);
1846 strbuf_addf(buf1, _(nth_commit_msg_fmt), n);
1847 strbuf_addch(buf1, '\n');
1848 strbuf_setlen(buf2, 2);
1849 strbuf_addf(buf2, _(skip_nth_commit_msg_fmt), n);
1850 strbuf_addch(buf2, '\n');
1854 * Comment out any un-commented commit messages, updating the message comments
1855 * to say they will be skipped but do not comment out the empty lines that
1856 * surround commit messages and their comments.
1858 static void update_squash_message_for_fixup(struct strbuf *msg)
1860 void (*copy_lines)(struct strbuf *, const void *, size_t) = strbuf_add;
1861 struct strbuf buf1 = STRBUF_INIT, buf2 = STRBUF_INIT;
1862 const char *s, *start;
1863 char *orig_msg;
1864 size_t orig_msg_len;
1865 int i = 1;
1867 strbuf_addf(&buf1, "# %s\n", _(first_commit_msg_str));
1868 strbuf_addf(&buf2, "# %s\n", _(skip_first_commit_msg_str));
1869 s = start = orig_msg = strbuf_detach(msg, &orig_msg_len);
1870 while (s) {
1871 const char *next;
1872 size_t off;
1873 if (skip_prefix(s, buf1.buf, &next)) {
1875 * Copy the last message, preserving the blank line
1876 * preceding the current line
1878 off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1879 copy_lines(msg, start, s - start - off);
1880 if (off)
1881 strbuf_addch(msg, '\n');
1883 * The next message needs to be commented out but the
1884 * message header is already commented out so just copy
1885 * it and the blank line that follows it.
1887 strbuf_addbuf(msg, &buf2);
1888 if (*next == '\n')
1889 strbuf_addch(msg, *next++);
1890 start = s = next;
1891 copy_lines = add_commented_lines;
1892 update_comment_bufs(&buf1, &buf2, ++i);
1893 } else if (skip_prefix(s, buf2.buf, &next)) {
1894 off = (s > start + 1 && s[-2] == '\n') ? 1 : 0;
1895 copy_lines(msg, start, s - start - off);
1896 start = s - off;
1897 s = next;
1898 copy_lines = strbuf_add;
1899 update_comment_bufs(&buf1, &buf2, ++i);
1900 } else {
1901 s = strchr(s, '\n');
1902 if (s)
1903 s++;
1906 copy_lines(msg, start, orig_msg_len - (start - orig_msg));
1907 free(orig_msg);
1908 strbuf_release(&buf1);
1909 strbuf_release(&buf2);
1912 static int append_squash_message(struct strbuf *buf, const char *body,
1913 enum todo_command command, struct replay_opts *opts,
1914 unsigned flag)
1916 const char *fixup_msg;
1917 size_t commented_len = 0, fixup_off;
1919 * amend is non-interactive and not normally used with fixup!
1920 * or squash! commits, so only comment out those subjects when
1921 * squashing commit messages.
1923 if (starts_with(body, "amend!") ||
1924 ((command == TODO_SQUASH || seen_squash(opts)) &&
1925 (starts_with(body, "squash!") || starts_with(body, "fixup!"))))
1926 commented_len = commit_subject_length(body);
1928 strbuf_addf(buf, "\n%c ", comment_line_char);
1929 strbuf_addf(buf, _(nth_commit_msg_fmt),
1930 ++opts->current_fixup_count + 1);
1931 strbuf_addstr(buf, "\n\n");
1932 strbuf_add_commented_lines(buf, body, commented_len);
1933 /* buf->buf may be reallocated so store an offset into the buffer */
1934 fixup_off = buf->len;
1935 strbuf_addstr(buf, body + commented_len);
1937 /* fixup -C after squash behaves like squash */
1938 if (is_fixup_flag(command, flag) && !seen_squash(opts)) {
1940 * We're replacing the commit message so we need to
1941 * append the Signed-off-by: trailer if the user
1942 * requested '--signoff'.
1944 if (opts->signoff)
1945 append_signoff(buf, 0, 0);
1947 if ((command == TODO_FIXUP) &&
1948 (flag & TODO_REPLACE_FIXUP_MSG) &&
1949 (file_exists(rebase_path_fixup_msg()) ||
1950 !file_exists(rebase_path_squash_msg()))) {
1951 fixup_msg = skip_blank_lines(buf->buf + fixup_off);
1952 if (write_message(fixup_msg, strlen(fixup_msg),
1953 rebase_path_fixup_msg(), 0) < 0)
1954 return error(_("cannot write '%s'"),
1955 rebase_path_fixup_msg());
1956 } else {
1957 unlink(rebase_path_fixup_msg());
1959 } else {
1960 unlink(rebase_path_fixup_msg());
1963 return 0;
1966 static int update_squash_messages(struct repository *r,
1967 enum todo_command command,
1968 struct commit *commit,
1969 struct replay_opts *opts,
1970 unsigned flag)
1972 struct strbuf buf = STRBUF_INIT;
1973 int res = 0;
1974 const char *message, *body;
1975 const char *encoding = get_commit_output_encoding();
1977 if (opts->current_fixup_count > 0) {
1978 struct strbuf header = STRBUF_INIT;
1979 char *eol;
1981 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1982 return error(_("could not read '%s'"),
1983 rebase_path_squash_msg());
1985 eol = buf.buf[0] != comment_line_char ?
1986 buf.buf : strchrnul(buf.buf, '\n');
1988 strbuf_addf(&header, "%c ", comment_line_char);
1989 strbuf_addf(&header, _(combined_commit_msg_fmt),
1990 opts->current_fixup_count + 2);
1991 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1992 strbuf_release(&header);
1993 if (is_fixup_flag(command, flag) && !seen_squash(opts))
1994 update_squash_message_for_fixup(&buf);
1995 } else {
1996 struct object_id head;
1997 struct commit *head_commit;
1998 const char *head_message, *body;
2000 if (get_oid("HEAD", &head))
2001 return error(_("need a HEAD to fixup"));
2002 if (!(head_commit = lookup_commit_reference(r, &head)))
2003 return error(_("could not read HEAD"));
2004 if (!(head_message = logmsg_reencode(head_commit, NULL, encoding)))
2005 return error(_("could not read HEAD's commit message"));
2007 find_commit_subject(head_message, &body);
2008 if (command == TODO_FIXUP && !flag && write_message(body, strlen(body),
2009 rebase_path_fixup_msg(), 0) < 0) {
2010 unuse_commit_buffer(head_commit, head_message);
2011 return error(_("cannot write '%s'"), rebase_path_fixup_msg());
2013 strbuf_addf(&buf, "%c ", comment_line_char);
2014 strbuf_addf(&buf, _(combined_commit_msg_fmt), 2);
2015 strbuf_addf(&buf, "\n%c ", comment_line_char);
2016 strbuf_addstr(&buf, is_fixup_flag(command, flag) ?
2017 _(skip_first_commit_msg_str) :
2018 _(first_commit_msg_str));
2019 strbuf_addstr(&buf, "\n\n");
2020 if (is_fixup_flag(command, flag))
2021 strbuf_add_commented_lines(&buf, body, strlen(body));
2022 else
2023 strbuf_addstr(&buf, body);
2025 unuse_commit_buffer(head_commit, head_message);
2028 if (!(message = logmsg_reencode(commit, NULL, encoding)))
2029 return error(_("could not read commit message of %s"),
2030 oid_to_hex(&commit->object.oid));
2031 find_commit_subject(message, &body);
2033 if (command == TODO_SQUASH || is_fixup_flag(command, flag)) {
2034 res = append_squash_message(&buf, body, command, opts, flag);
2035 } else if (command == TODO_FIXUP) {
2036 strbuf_addf(&buf, "\n%c ", comment_line_char);
2037 strbuf_addf(&buf, _(skip_nth_commit_msg_fmt),
2038 ++opts->current_fixup_count + 1);
2039 strbuf_addstr(&buf, "\n\n");
2040 strbuf_add_commented_lines(&buf, body, strlen(body));
2041 } else
2042 return error(_("unknown command: %d"), command);
2043 unuse_commit_buffer(commit, message);
2045 if (!res)
2046 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(),
2048 strbuf_release(&buf);
2050 if (!res) {
2051 strbuf_addf(&opts->current_fixups, "%s%s %s",
2052 opts->current_fixups.len ? "\n" : "",
2053 command_to_string(command),
2054 oid_to_hex(&commit->object.oid));
2055 res = write_message(opts->current_fixups.buf,
2056 opts->current_fixups.len,
2057 rebase_path_current_fixups(), 0);
2060 return res;
2063 static void flush_rewritten_pending(void)
2065 struct strbuf buf = STRBUF_INIT;
2066 struct object_id newoid;
2067 FILE *out;
2069 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
2070 !get_oid("HEAD", &newoid) &&
2071 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
2072 char *bol = buf.buf, *eol;
2074 while (*bol) {
2075 eol = strchrnul(bol, '\n');
2076 fprintf(out, "%.*s %s\n", (int)(eol - bol),
2077 bol, oid_to_hex(&newoid));
2078 if (!*eol)
2079 break;
2080 bol = eol + 1;
2082 fclose(out);
2083 unlink(rebase_path_rewritten_pending());
2085 strbuf_release(&buf);
2088 static void record_in_rewritten(struct object_id *oid,
2089 enum todo_command next_command)
2091 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
2093 if (!out)
2094 return;
2096 fprintf(out, "%s\n", oid_to_hex(oid));
2097 fclose(out);
2099 if (!is_fixup(next_command))
2100 flush_rewritten_pending();
2103 static int should_edit(struct replay_opts *opts) {
2104 if (opts->edit < 0)
2106 * Note that we only handle the case of non-conflicted
2107 * commits; continue_single_pick() handles the conflicted
2108 * commits itself instead of calling this function.
2110 return (opts->action == REPLAY_REVERT && isatty(0)) ? 1 : 0;
2111 return opts->edit;
2114 static void refer_to_commit(struct replay_opts *opts,
2115 struct strbuf *msgbuf, struct commit *commit)
2117 if (opts->commit_use_reference) {
2118 struct pretty_print_context ctx = {
2119 .abbrev = DEFAULT_ABBREV,
2120 .date_mode.type = DATE_SHORT,
2122 format_commit_message(commit, "%h (%s, %ad)", msgbuf, &ctx);
2123 } else {
2124 strbuf_addstr(msgbuf, oid_to_hex(&commit->object.oid));
2128 static int do_pick_commit(struct repository *r,
2129 struct todo_item *item,
2130 struct replay_opts *opts,
2131 int final_fixup, int *check_todo)
2133 unsigned int flags = should_edit(opts) ? EDIT_MSG : 0;
2134 const char *msg_file = should_edit(opts) ? NULL : git_path_merge_msg(r);
2135 struct object_id head;
2136 struct commit *base, *next, *parent;
2137 const char *base_label, *next_label;
2138 char *author = NULL;
2139 struct commit_message msg = { NULL, NULL, NULL, NULL };
2140 struct strbuf msgbuf = STRBUF_INIT;
2141 int res, unborn = 0, reword = 0, allow, drop_commit;
2142 enum todo_command command = item->command;
2143 struct commit *commit = item->commit;
2145 if (opts->no_commit) {
2147 * We do not intend to commit immediately. We just want to
2148 * merge the differences in, so let's compute the tree
2149 * that represents the "current" state for the merge machinery
2150 * to work on.
2152 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
2153 return error(_("your index file is unmerged."));
2154 } else {
2155 unborn = get_oid("HEAD", &head);
2156 /* Do we want to generate a root commit? */
2157 if (is_pick_or_similar(command) && opts->have_squash_onto &&
2158 oideq(&head, &opts->squash_onto)) {
2159 if (is_fixup(command))
2160 return error(_("cannot fixup root commit"));
2161 flags |= CREATE_ROOT_COMMIT;
2162 unborn = 1;
2163 } else if (unborn)
2164 oidcpy(&head, the_hash_algo->empty_tree);
2165 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
2166 NULL, 0))
2167 return error_dirty_index(r, opts);
2169 discard_index(r->index);
2171 if (!commit->parents)
2172 parent = NULL;
2173 else if (commit->parents->next) {
2174 /* Reverting or cherry-picking a merge commit */
2175 int cnt;
2176 struct commit_list *p;
2178 if (!opts->mainline)
2179 return error(_("commit %s is a merge but no -m option was given."),
2180 oid_to_hex(&commit->object.oid));
2182 for (cnt = 1, p = commit->parents;
2183 cnt != opts->mainline && p;
2184 cnt++)
2185 p = p->next;
2186 if (cnt != opts->mainline || !p)
2187 return error(_("commit %s does not have parent %d"),
2188 oid_to_hex(&commit->object.oid), opts->mainline);
2189 parent = p->item;
2190 } else if (1 < opts->mainline)
2192 * Non-first parent explicitly specified as mainline for
2193 * non-merge commit
2195 return error(_("commit %s does not have parent %d"),
2196 oid_to_hex(&commit->object.oid), opts->mainline);
2197 else
2198 parent = commit->parents->item;
2200 if (get_message(commit, &msg) != 0)
2201 return error(_("cannot get commit message for %s"),
2202 oid_to_hex(&commit->object.oid));
2204 if (opts->allow_ff && !is_fixup(command) &&
2205 ((parent && oideq(&parent->object.oid, &head)) ||
2206 (!parent && unborn))) {
2207 if (is_rebase_i(opts))
2208 write_author_script(msg.message);
2209 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
2210 opts);
2211 if (res || command != TODO_REWORD)
2212 goto leave;
2213 reword = 1;
2214 msg_file = NULL;
2215 goto fast_forward_edit;
2217 if (parent && parse_commit(parent) < 0)
2218 /* TRANSLATORS: The first %s will be a "todo" command like
2219 "revert" or "pick", the second %s a SHA1. */
2220 return error(_("%s: cannot parse parent commit %s"),
2221 command_to_string(command),
2222 oid_to_hex(&parent->object.oid));
2225 * "commit" is an existing commit. We would want to apply
2226 * the difference it introduces since its first parent "prev"
2227 * on top of the current HEAD if we are cherry-pick. Or the
2228 * reverse of it if we are revert.
2231 if (command == TODO_REVERT) {
2232 base = commit;
2233 base_label = msg.label;
2234 next = parent;
2235 next_label = msg.parent_label;
2236 if (opts->commit_use_reference) {
2237 strbuf_addstr(&msgbuf,
2238 "# *** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
2239 } else {
2240 strbuf_addstr(&msgbuf, "Revert \"");
2241 strbuf_addstr(&msgbuf, msg.subject);
2242 strbuf_addstr(&msgbuf, "\"");
2244 strbuf_addstr(&msgbuf, "\n\nThis reverts commit ");
2245 refer_to_commit(opts, &msgbuf, commit);
2247 if (commit->parents && commit->parents->next) {
2248 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
2249 refer_to_commit(opts, &msgbuf, parent);
2251 strbuf_addstr(&msgbuf, ".\n");
2252 } else {
2253 const char *p;
2255 base = parent;
2256 base_label = msg.parent_label;
2257 next = commit;
2258 next_label = msg.label;
2260 /* Append the commit log message to msgbuf. */
2261 if (find_commit_subject(msg.message, &p))
2262 strbuf_addstr(&msgbuf, p);
2264 if (opts->record_origin) {
2265 strbuf_complete_line(&msgbuf);
2266 if (!has_conforming_footer(&msgbuf, NULL, 0))
2267 strbuf_addch(&msgbuf, '\n');
2268 strbuf_addstr(&msgbuf, cherry_picked_prefix);
2269 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
2270 strbuf_addstr(&msgbuf, ")\n");
2272 if (!is_fixup(command))
2273 author = get_author(msg.message);
2276 if (command == TODO_REWORD)
2277 reword = 1;
2278 else if (is_fixup(command)) {
2279 if (update_squash_messages(r, command, commit,
2280 opts, item->flags)) {
2281 res = -1;
2282 goto leave;
2284 flags |= AMEND_MSG;
2285 if (!final_fixup)
2286 msg_file = rebase_path_squash_msg();
2287 else if (file_exists(rebase_path_fixup_msg())) {
2288 flags |= VERBATIM_MSG;
2289 msg_file = rebase_path_fixup_msg();
2290 } else {
2291 const char *dest = git_path_squash_msg(r);
2292 unlink(dest);
2293 if (copy_file(dest, rebase_path_squash_msg(), 0666)) {
2294 res = error(_("could not rename '%s' to '%s'"),
2295 rebase_path_squash_msg(), dest);
2296 goto leave;
2298 unlink(git_path_merge_msg(r));
2299 msg_file = dest;
2300 flags |= EDIT_MSG;
2304 if (opts->signoff && !is_fixup(command))
2305 append_signoff(&msgbuf, 0, 0);
2307 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
2308 res = -1;
2309 else if (!opts->strategy ||
2310 !strcmp(opts->strategy, "recursive") ||
2311 !strcmp(opts->strategy, "ort") ||
2312 command == TODO_REVERT) {
2313 res = do_recursive_merge(r, base, next, base_label, next_label,
2314 &head, &msgbuf, opts);
2315 if (res < 0)
2316 goto leave;
2318 res |= write_message(msgbuf.buf, msgbuf.len,
2319 git_path_merge_msg(r), 0);
2320 } else {
2321 struct commit_list *common = NULL;
2322 struct commit_list *remotes = NULL;
2324 res = write_message(msgbuf.buf, msgbuf.len,
2325 git_path_merge_msg(r), 0);
2327 commit_list_insert(base, &common);
2328 commit_list_insert(next, &remotes);
2329 res |= try_merge_command(r, opts->strategy,
2330 opts->xopts_nr, (const char **)opts->xopts,
2331 common, oid_to_hex(&head), remotes);
2332 free_commit_list(common);
2333 free_commit_list(remotes);
2337 * If the merge was clean or if it failed due to conflict, we write
2338 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2339 * However, if the merge did not even start, then we don't want to
2340 * write it at all.
2342 if ((command == TODO_PICK || command == TODO_REWORD ||
2343 command == TODO_EDIT) && !opts->no_commit &&
2344 (res == 0 || res == 1) &&
2345 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
2346 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2347 res = -1;
2348 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
2349 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
2350 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2351 res = -1;
2353 if (res) {
2354 error(command == TODO_REVERT
2355 ? _("could not revert %s... %s")
2356 : _("could not apply %s... %s"),
2357 short_commit_name(commit), msg.subject);
2358 print_advice(r, res == 1, opts);
2359 repo_rerere(r, opts->allow_rerere_auto);
2360 goto leave;
2363 drop_commit = 0;
2364 allow = allow_empty(r, opts, commit);
2365 if (allow < 0) {
2366 res = allow;
2367 goto leave;
2368 } else if (allow == 1) {
2369 flags |= ALLOW_EMPTY;
2370 } else if (allow == 2) {
2371 drop_commit = 1;
2372 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
2373 NULL, 0);
2374 unlink(git_path_merge_msg(r));
2375 unlink(git_path_auto_merge(r));
2376 fprintf(stderr,
2377 _("dropping %s %s -- patch contents already upstream\n"),
2378 oid_to_hex(&commit->object.oid), msg.subject);
2379 } /* else allow == 0 and there's nothing special to do */
2380 if (!opts->no_commit && !drop_commit) {
2381 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
2382 res = do_commit(r, msg_file, author, opts, flags,
2383 commit? &commit->object.oid : NULL);
2384 else
2385 res = error(_("unable to parse commit author"));
2386 *check_todo = !!(flags & EDIT_MSG);
2387 if (!res && reword) {
2388 fast_forward_edit:
2389 res = run_git_commit(NULL, opts, EDIT_MSG |
2390 VERIFY_MSG | AMEND_MSG |
2391 (flags & ALLOW_EMPTY));
2392 *check_todo = 1;
2397 if (!res && final_fixup) {
2398 unlink(rebase_path_fixup_msg());
2399 unlink(rebase_path_squash_msg());
2400 unlink(rebase_path_current_fixups());
2401 strbuf_reset(&opts->current_fixups);
2402 opts->current_fixup_count = 0;
2405 leave:
2406 free_message(commit, &msg);
2407 free(author);
2408 strbuf_release(&msgbuf);
2409 update_abort_safety_file();
2411 return res;
2414 static int prepare_revs(struct replay_opts *opts)
2417 * picking (but not reverting) ranges (but not individual revisions)
2418 * should be done in reverse
2420 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
2421 opts->revs->reverse ^= 1;
2423 if (prepare_revision_walk(opts->revs))
2424 return error(_("revision walk setup failed"));
2426 return 0;
2429 static int read_and_refresh_cache(struct repository *r,
2430 struct replay_opts *opts)
2432 struct lock_file index_lock = LOCK_INIT;
2433 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
2434 if (repo_read_index(r) < 0) {
2435 rollback_lock_file(&index_lock);
2436 return error(_("git %s: failed to read the index"),
2437 action_name(opts));
2439 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
2441 if (index_fd >= 0) {
2442 if (write_locked_index(r->index, &index_lock,
2443 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
2444 return error(_("git %s: failed to refresh the index"),
2445 action_name(opts));
2450 * If we are resolving merges in any way other than "ort", then
2451 * expand the sparse index.
2453 if (opts->strategy && strcmp(opts->strategy, "ort"))
2454 ensure_full_index(r->index);
2455 return 0;
2458 void todo_list_release(struct todo_list *todo_list)
2460 strbuf_release(&todo_list->buf);
2461 FREE_AND_NULL(todo_list->items);
2462 todo_list->nr = todo_list->alloc = 0;
2465 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2467 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2468 todo_list->total_nr++;
2469 return todo_list->items + todo_list->nr++;
2472 const char *todo_item_get_arg(struct todo_list *todo_list,
2473 struct todo_item *item)
2475 return todo_list->buf.buf + item->arg_offset;
2478 static int is_command(enum todo_command command, const char **bol)
2480 const char *str = todo_command_info[command].str;
2481 const char nick = todo_command_info[command].c;
2482 const char *p = *bol;
2484 return (skip_prefix(p, str, &p) || (nick && *p++ == nick)) &&
2485 (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || !*p) &&
2486 (*bol = p);
2489 static int check_label_or_ref_arg(enum todo_command command, const char *arg)
2491 switch (command) {
2492 case TODO_LABEL:
2494 * '#' is not a valid label as the merge command uses it to
2495 * separate merge parents from the commit subject.
2497 if (!strcmp(arg, "#") ||
2498 check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2499 return error(_("'%s' is not a valid label"), arg);
2500 break;
2502 case TODO_UPDATE_REF:
2503 if (check_refname_format(arg, REFNAME_ALLOW_ONELEVEL))
2504 return error(_("'%s' is not a valid refname"), arg);
2505 if (check_refname_format(arg, 0))
2506 return error(_("update-ref requires a fully qualified "
2507 "refname e.g. refs/heads/%s"), arg);
2508 break;
2510 default:
2511 BUG("unexpected todo_command");
2514 return 0;
2517 static int parse_insn_line(struct repository *r, struct todo_item *item,
2518 const char *buf, const char *bol, char *eol)
2520 struct object_id commit_oid;
2521 char *end_of_object_name;
2522 int i, saved, status, padding;
2524 item->flags = 0;
2526 /* left-trim */
2527 bol += strspn(bol, " \t");
2529 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2530 item->command = TODO_COMMENT;
2531 item->commit = NULL;
2532 item->arg_offset = bol - buf;
2533 item->arg_len = eol - bol;
2534 return 0;
2537 for (i = 0; i < TODO_COMMENT; i++)
2538 if (is_command(i, &bol)) {
2539 item->command = i;
2540 break;
2542 if (i >= TODO_COMMENT)
2543 return error(_("invalid command '%.*s'"),
2544 (int)strcspn(bol, " \t\r\n"), bol);
2546 /* Eat up extra spaces/ tabs before object name */
2547 padding = strspn(bol, " \t");
2548 bol += padding;
2550 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2551 if (bol != eol)
2552 return error(_("%s does not accept arguments: '%s'"),
2553 command_to_string(item->command), bol);
2554 item->commit = NULL;
2555 item->arg_offset = bol - buf;
2556 item->arg_len = eol - bol;
2557 return 0;
2560 if (!padding)
2561 return error(_("missing arguments for %s"),
2562 command_to_string(item->command));
2564 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2565 item->command == TODO_RESET || item->command == TODO_UPDATE_REF) {
2566 int ret = 0;
2568 item->commit = NULL;
2569 item->arg_offset = bol - buf;
2570 item->arg_len = (int)(eol - bol);
2571 if (item->command == TODO_LABEL ||
2572 item->command == TODO_UPDATE_REF) {
2573 saved = *eol;
2574 *eol = '\0';
2575 ret = check_label_or_ref_arg(item->command, bol);
2576 *eol = saved;
2578 return ret;
2581 if (item->command == TODO_FIXUP) {
2582 if (skip_prefix(bol, "-C", &bol)) {
2583 bol += strspn(bol, " \t");
2584 item->flags |= TODO_REPLACE_FIXUP_MSG;
2585 } else if (skip_prefix(bol, "-c", &bol)) {
2586 bol += strspn(bol, " \t");
2587 item->flags |= TODO_EDIT_FIXUP_MSG;
2591 if (item->command == TODO_MERGE) {
2592 if (skip_prefix(bol, "-C", &bol))
2593 bol += strspn(bol, " \t");
2594 else if (skip_prefix(bol, "-c", &bol)) {
2595 bol += strspn(bol, " \t");
2596 item->flags |= TODO_EDIT_MERGE_MSG;
2597 } else {
2598 item->flags |= TODO_EDIT_MERGE_MSG;
2599 item->commit = NULL;
2600 item->arg_offset = bol - buf;
2601 item->arg_len = (int)(eol - bol);
2602 return 0;
2606 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2607 saved = *end_of_object_name;
2608 *end_of_object_name = '\0';
2609 status = get_oid(bol, &commit_oid);
2610 if (status < 0)
2611 error(_("could not parse '%s'"), bol); /* return later */
2612 *end_of_object_name = saved;
2614 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2615 item->arg_offset = bol - buf;
2616 item->arg_len = (int)(eol - bol);
2618 if (status < 0)
2619 return status;
2621 item->commit = lookup_commit_reference(r, &commit_oid);
2622 return item->commit ? 0 : -1;
2625 int sequencer_get_last_command(struct repository *r, enum replay_action *action)
2627 const char *todo_file, *bol;
2628 struct strbuf buf = STRBUF_INIT;
2629 int ret = 0;
2631 todo_file = git_path_todo_file();
2632 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2633 if (errno == ENOENT || errno == ENOTDIR)
2634 return -1;
2635 else
2636 return error_errno("unable to open '%s'", todo_file);
2638 bol = buf.buf + strspn(buf.buf, " \t\r\n");
2639 if (is_command(TODO_PICK, &bol) && (*bol == ' ' || *bol == '\t'))
2640 *action = REPLAY_PICK;
2641 else if (is_command(TODO_REVERT, &bol) &&
2642 (*bol == ' ' || *bol == '\t'))
2643 *action = REPLAY_REVERT;
2644 else
2645 ret = -1;
2647 strbuf_release(&buf);
2649 return ret;
2652 int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2653 struct todo_list *todo_list)
2655 struct todo_item *item;
2656 char *p = buf, *next_p;
2657 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2659 todo_list->current = todo_list->nr = 0;
2661 for (i = 1; *p; i++, p = next_p) {
2662 char *eol = strchrnul(p, '\n');
2664 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2666 if (p != eol && eol[-1] == '\r')
2667 eol--; /* strip Carriage Return */
2669 item = append_new_todo(todo_list);
2670 item->offset_in_buf = p - todo_list->buf.buf;
2671 if (parse_insn_line(r, item, buf, p, eol)) {
2672 res = error(_("invalid line %d: %.*s"),
2673 i, (int)(eol - p), p);
2674 item->command = TODO_COMMENT + 1;
2675 item->arg_offset = p - buf;
2676 item->arg_len = (int)(eol - p);
2677 item->commit = NULL;
2680 if (fixup_okay)
2681 ; /* do nothing */
2682 else if (is_fixup(item->command))
2683 return error(_("cannot '%s' without a previous commit"),
2684 command_to_string(item->command));
2685 else if (!is_noop(item->command))
2686 fixup_okay = 1;
2689 return res;
2692 static int count_commands(struct todo_list *todo_list)
2694 int count = 0, i;
2696 for (i = 0; i < todo_list->nr; i++)
2697 if (todo_list->items[i].command != TODO_COMMENT)
2698 count++;
2700 return count;
2703 static int get_item_line_offset(struct todo_list *todo_list, int index)
2705 return index < todo_list->nr ?
2706 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2709 static const char *get_item_line(struct todo_list *todo_list, int index)
2711 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2714 static int get_item_line_length(struct todo_list *todo_list, int index)
2716 return get_item_line_offset(todo_list, index + 1)
2717 - get_item_line_offset(todo_list, index);
2720 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2722 int fd;
2723 ssize_t len;
2725 fd = open(path, O_RDONLY);
2726 if (fd < 0)
2727 return error_errno(_("could not open '%s'"), path);
2728 len = strbuf_read(sb, fd, 0);
2729 close(fd);
2730 if (len < 0)
2731 return error(_("could not read '%s'."), path);
2732 return len;
2735 static int have_finished_the_last_pick(void)
2737 struct strbuf buf = STRBUF_INIT;
2738 const char *eol;
2739 const char *todo_path = git_path_todo_file();
2740 int ret = 0;
2742 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2743 if (errno == ENOENT) {
2744 return 0;
2745 } else {
2746 error_errno("unable to open '%s'", todo_path);
2747 return 0;
2750 /* If there is only one line then we are done */
2751 eol = strchr(buf.buf, '\n');
2752 if (!eol || !eol[1])
2753 ret = 1;
2755 strbuf_release(&buf);
2757 return ret;
2760 void sequencer_post_commit_cleanup(struct repository *r, int verbose)
2762 struct replay_opts opts = REPLAY_OPTS_INIT;
2763 int need_cleanup = 0;
2765 if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
2766 if (!refs_delete_ref(get_main_ref_store(r), "",
2767 "CHERRY_PICK_HEAD", NULL, 0) &&
2768 verbose)
2769 warning(_("cancelling a cherry picking in progress"));
2770 opts.action = REPLAY_PICK;
2771 need_cleanup = 1;
2774 if (refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
2775 if (!refs_delete_ref(get_main_ref_store(r), "", "REVERT_HEAD",
2776 NULL, 0) &&
2777 verbose)
2778 warning(_("cancelling a revert in progress"));
2779 opts.action = REPLAY_REVERT;
2780 need_cleanup = 1;
2783 unlink(git_path_auto_merge(r));
2785 if (!need_cleanup)
2786 return;
2788 if (!have_finished_the_last_pick())
2789 return;
2791 sequencer_remove_state(&opts);
2794 static void todo_list_write_total_nr(struct todo_list *todo_list)
2796 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2798 if (f) {
2799 fprintf(f, "%d\n", todo_list->total_nr);
2800 fclose(f);
2804 static int read_populate_todo(struct repository *r,
2805 struct todo_list *todo_list,
2806 struct replay_opts *opts)
2808 const char *todo_file = get_todo_path(opts);
2809 int res;
2811 strbuf_reset(&todo_list->buf);
2812 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2813 return -1;
2815 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2816 if (res) {
2817 if (is_rebase_i(opts))
2818 return error(_("please fix this using "
2819 "'git rebase --edit-todo'."));
2820 return error(_("unusable instruction sheet: '%s'"), todo_file);
2823 if (!todo_list->nr &&
2824 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2825 return error(_("no commits parsed."));
2827 if (!is_rebase_i(opts)) {
2828 enum todo_command valid =
2829 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2830 int i;
2832 for (i = 0; i < todo_list->nr; i++)
2833 if (valid == todo_list->items[i].command)
2834 continue;
2835 else if (valid == TODO_PICK)
2836 return error(_("cannot cherry-pick during a revert."));
2837 else
2838 return error(_("cannot revert during a cherry-pick."));
2841 if (is_rebase_i(opts)) {
2842 struct todo_list done = TODO_LIST_INIT;
2844 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2845 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
2846 todo_list->done_nr = count_commands(&done);
2847 else
2848 todo_list->done_nr = 0;
2850 todo_list->total_nr = todo_list->done_nr
2851 + count_commands(todo_list);
2852 todo_list_release(&done);
2854 todo_list_write_total_nr(todo_list);
2857 return 0;
2860 static int git_config_string_dup(char **dest,
2861 const char *var, const char *value)
2863 if (!value)
2864 return config_error_nonbool(var);
2865 free(*dest);
2866 *dest = xstrdup(value);
2867 return 0;
2870 static int populate_opts_cb(const char *key, const char *value, void *data)
2872 struct replay_opts *opts = data;
2873 int error_flag = 1;
2875 if (!value)
2876 error_flag = 0;
2877 else if (!strcmp(key, "options.no-commit"))
2878 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2879 else if (!strcmp(key, "options.edit"))
2880 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2881 else if (!strcmp(key, "options.allow-empty"))
2882 opts->allow_empty =
2883 git_config_bool_or_int(key, value, &error_flag);
2884 else if (!strcmp(key, "options.allow-empty-message"))
2885 opts->allow_empty_message =
2886 git_config_bool_or_int(key, value, &error_flag);
2887 else if (!strcmp(key, "options.keep-redundant-commits"))
2888 opts->keep_redundant_commits =
2889 git_config_bool_or_int(key, value, &error_flag);
2890 else if (!strcmp(key, "options.signoff"))
2891 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2892 else if (!strcmp(key, "options.record-origin"))
2893 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2894 else if (!strcmp(key, "options.allow-ff"))
2895 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2896 else if (!strcmp(key, "options.mainline"))
2897 opts->mainline = git_config_int(key, value);
2898 else if (!strcmp(key, "options.strategy"))
2899 git_config_string_dup(&opts->strategy, key, value);
2900 else if (!strcmp(key, "options.gpg-sign"))
2901 git_config_string_dup(&opts->gpg_sign, key, value);
2902 else if (!strcmp(key, "options.strategy-option")) {
2903 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2904 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2905 } else if (!strcmp(key, "options.allow-rerere-auto"))
2906 opts->allow_rerere_auto =
2907 git_config_bool_or_int(key, value, &error_flag) ?
2908 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2909 else if (!strcmp(key, "options.default-msg-cleanup")) {
2910 opts->explicit_cleanup = 1;
2911 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
2912 } else
2913 return error(_("invalid key: %s"), key);
2915 if (!error_flag)
2916 return error(_("invalid value for '%s': '%s'"), key, value);
2918 return 0;
2921 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2923 int i;
2924 char *strategy_opts_string = raw_opts;
2926 if (*strategy_opts_string == ' ')
2927 strategy_opts_string++;
2929 opts->xopts_nr = split_cmdline(strategy_opts_string,
2930 (const char ***)&opts->xopts);
2931 for (i = 0; i < opts->xopts_nr; i++) {
2932 const char *arg = opts->xopts[i];
2934 skip_prefix(arg, "--", &arg);
2935 opts->xopts[i] = xstrdup(arg);
2939 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2941 strbuf_reset(buf);
2942 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2943 return;
2944 free(opts->strategy);
2945 opts->strategy = strbuf_detach(buf, NULL);
2946 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2947 return;
2949 parse_strategy_opts(opts, buf->buf);
2952 static int read_populate_opts(struct replay_opts *opts)
2954 if (is_rebase_i(opts)) {
2955 struct strbuf buf = STRBUF_INIT;
2956 int ret = 0;
2958 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(),
2959 READ_ONELINER_SKIP_IF_EMPTY)) {
2960 if (!starts_with(buf.buf, "-S"))
2961 strbuf_reset(&buf);
2962 else {
2963 free(opts->gpg_sign);
2964 opts->gpg_sign = xstrdup(buf.buf + 2);
2966 strbuf_reset(&buf);
2969 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(),
2970 READ_ONELINER_SKIP_IF_EMPTY)) {
2971 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2972 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2973 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2974 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2975 strbuf_reset(&buf);
2978 if (file_exists(rebase_path_verbose()))
2979 opts->verbose = 1;
2981 if (file_exists(rebase_path_quiet()))
2982 opts->quiet = 1;
2984 if (file_exists(rebase_path_signoff())) {
2985 opts->allow_ff = 0;
2986 opts->signoff = 1;
2989 if (file_exists(rebase_path_cdate_is_adate())) {
2990 opts->allow_ff = 0;
2991 opts->committer_date_is_author_date = 1;
2994 if (file_exists(rebase_path_ignore_date())) {
2995 opts->allow_ff = 0;
2996 opts->ignore_date = 1;
2999 if (file_exists(rebase_path_reschedule_failed_exec()))
3000 opts->reschedule_failed_exec = 1;
3001 else if (file_exists(rebase_path_no_reschedule_failed_exec()))
3002 opts->reschedule_failed_exec = 0;
3004 if (file_exists(rebase_path_drop_redundant_commits()))
3005 opts->drop_redundant_commits = 1;
3007 if (file_exists(rebase_path_keep_redundant_commits()))
3008 opts->keep_redundant_commits = 1;
3010 read_strategy_opts(opts, &buf);
3011 strbuf_reset(&buf);
3013 if (read_oneliner(&opts->current_fixups,
3014 rebase_path_current_fixups(),
3015 READ_ONELINER_SKIP_IF_EMPTY)) {
3016 const char *p = opts->current_fixups.buf;
3017 opts->current_fixup_count = 1;
3018 while ((p = strchr(p, '\n'))) {
3019 opts->current_fixup_count++;
3020 p++;
3024 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
3025 if (get_oid_committish(buf.buf, &opts->squash_onto) < 0) {
3026 ret = error(_("unusable squash-onto"));
3027 goto done_rebase_i;
3029 opts->have_squash_onto = 1;
3032 done_rebase_i:
3033 strbuf_release(&buf);
3034 return ret;
3037 if (!file_exists(git_path_opts_file()))
3038 return 0;
3040 * The function git_parse_source(), called from git_config_from_file(),
3041 * may die() in case of a syntactically incorrect file. We do not care
3042 * about this case, though, because we wrote that file ourselves, so we
3043 * are pretty certain that it is syntactically correct.
3045 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
3046 return error(_("malformed options sheet: '%s'"),
3047 git_path_opts_file());
3048 return 0;
3051 static void write_strategy_opts(struct replay_opts *opts)
3053 int i;
3054 struct strbuf buf = STRBUF_INIT;
3056 for (i = 0; i < opts->xopts_nr; ++i)
3057 strbuf_addf(&buf, " --%s", opts->xopts[i]);
3059 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
3060 strbuf_release(&buf);
3063 int write_basic_state(struct replay_opts *opts, const char *head_name,
3064 struct commit *onto, const struct object_id *orig_head)
3066 if (head_name)
3067 write_file(rebase_path_head_name(), "%s\n", head_name);
3068 if (onto)
3069 write_file(rebase_path_onto(), "%s\n",
3070 oid_to_hex(&onto->object.oid));
3071 if (orig_head)
3072 write_file(rebase_path_orig_head(), "%s\n",
3073 oid_to_hex(orig_head));
3075 if (opts->quiet)
3076 write_file(rebase_path_quiet(), "%s", "");
3077 if (opts->verbose)
3078 write_file(rebase_path_verbose(), "%s", "");
3079 if (opts->strategy)
3080 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
3081 if (opts->xopts_nr > 0)
3082 write_strategy_opts(opts);
3084 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
3085 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
3086 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
3087 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
3089 if (opts->gpg_sign)
3090 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
3091 if (opts->signoff)
3092 write_file(rebase_path_signoff(), "--signoff\n");
3093 if (opts->drop_redundant_commits)
3094 write_file(rebase_path_drop_redundant_commits(), "%s", "");
3095 if (opts->keep_redundant_commits)
3096 write_file(rebase_path_keep_redundant_commits(), "%s", "");
3097 if (opts->committer_date_is_author_date)
3098 write_file(rebase_path_cdate_is_adate(), "%s", "");
3099 if (opts->ignore_date)
3100 write_file(rebase_path_ignore_date(), "%s", "");
3101 if (opts->reschedule_failed_exec)
3102 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
3103 else
3104 write_file(rebase_path_no_reschedule_failed_exec(), "%s", "");
3106 return 0;
3109 static int walk_revs_populate_todo(struct todo_list *todo_list,
3110 struct replay_opts *opts)
3112 enum todo_command command = opts->action == REPLAY_PICK ?
3113 TODO_PICK : TODO_REVERT;
3114 const char *command_string = todo_command_info[command].str;
3115 const char *encoding;
3116 struct commit *commit;
3118 if (prepare_revs(opts))
3119 return -1;
3121 encoding = get_log_output_encoding();
3123 while ((commit = get_revision(opts->revs))) {
3124 struct todo_item *item = append_new_todo(todo_list);
3125 const char *commit_buffer = logmsg_reencode(commit, NULL, encoding);
3126 const char *subject;
3127 int subject_len;
3129 item->command = command;
3130 item->commit = commit;
3131 item->arg_offset = 0;
3132 item->arg_len = 0;
3133 item->offset_in_buf = todo_list->buf.len;
3134 subject_len = find_commit_subject(commit_buffer, &subject);
3135 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
3136 short_commit_name(commit), subject_len, subject);
3137 unuse_commit_buffer(commit, commit_buffer);
3140 if (!todo_list->nr)
3141 return error(_("empty commit set passed"));
3143 return 0;
3146 static int create_seq_dir(struct repository *r)
3148 enum replay_action action;
3149 const char *in_progress_error = NULL;
3150 const char *in_progress_advice = NULL;
3151 unsigned int advise_skip =
3152 refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD") ||
3153 refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD");
3155 if (!sequencer_get_last_command(r, &action)) {
3156 switch (action) {
3157 case REPLAY_REVERT:
3158 in_progress_error = _("revert is already in progress");
3159 in_progress_advice =
3160 _("try \"git revert (--continue | %s--abort | --quit)\"");
3161 break;
3162 case REPLAY_PICK:
3163 in_progress_error = _("cherry-pick is already in progress");
3164 in_progress_advice =
3165 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
3166 break;
3167 default:
3168 BUG("unexpected action in create_seq_dir");
3171 if (in_progress_error) {
3172 error("%s", in_progress_error);
3173 if (advice_enabled(ADVICE_SEQUENCER_IN_USE))
3174 advise(in_progress_advice,
3175 advise_skip ? "--skip | " : "");
3176 return -1;
3178 if (mkdir(git_path_seq_dir(), 0777) < 0)
3179 return error_errno(_("could not create sequencer directory '%s'"),
3180 git_path_seq_dir());
3182 return 0;
3185 static int save_head(const char *head)
3187 struct lock_file head_lock = LOCK_INIT;
3188 struct strbuf buf = STRBUF_INIT;
3189 int fd;
3190 ssize_t written;
3192 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
3193 if (fd < 0)
3194 return error_errno(_("could not lock HEAD"));
3195 strbuf_addf(&buf, "%s\n", head);
3196 written = write_in_full(fd, buf.buf, buf.len);
3197 strbuf_release(&buf);
3198 if (written < 0) {
3199 error_errno(_("could not write to '%s'"), git_path_head_file());
3200 rollback_lock_file(&head_lock);
3201 return -1;
3203 if (commit_lock_file(&head_lock) < 0)
3204 return error(_("failed to finalize '%s'"), git_path_head_file());
3205 return 0;
3208 static int rollback_is_safe(void)
3210 struct strbuf sb = STRBUF_INIT;
3211 struct object_id expected_head, actual_head;
3213 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
3214 strbuf_trim(&sb);
3215 if (get_oid_hex(sb.buf, &expected_head)) {
3216 strbuf_release(&sb);
3217 die(_("could not parse %s"), git_path_abort_safety_file());
3219 strbuf_release(&sb);
3221 else if (errno == ENOENT)
3222 oidclr(&expected_head);
3223 else
3224 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
3226 if (get_oid("HEAD", &actual_head))
3227 oidclr(&actual_head);
3229 return oideq(&actual_head, &expected_head);
3232 static int reset_merge(const struct object_id *oid)
3234 struct child_process cmd = CHILD_PROCESS_INIT;
3236 cmd.git_cmd = 1;
3237 strvec_pushl(&cmd.args, "reset", "--merge", NULL);
3239 if (!is_null_oid(oid))
3240 strvec_push(&cmd.args, oid_to_hex(oid));
3242 return run_command(&cmd);
3245 static int rollback_single_pick(struct repository *r)
3247 struct object_id head_oid;
3249 if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
3250 !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
3251 return error(_("no cherry-pick or revert in progress"));
3252 if (read_ref_full("HEAD", 0, &head_oid, NULL))
3253 return error(_("cannot resolve HEAD"));
3254 if (is_null_oid(&head_oid))
3255 return error(_("cannot abort from a branch yet to be born"));
3256 return reset_merge(&head_oid);
3259 static int skip_single_pick(void)
3261 struct object_id head;
3263 if (read_ref_full("HEAD", 0, &head, NULL))
3264 return error(_("cannot resolve HEAD"));
3265 return reset_merge(&head);
3268 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
3270 FILE *f;
3271 struct object_id oid;
3272 struct strbuf buf = STRBUF_INIT;
3273 const char *p;
3275 f = fopen(git_path_head_file(), "r");
3276 if (!f && errno == ENOENT) {
3278 * There is no multiple-cherry-pick in progress.
3279 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
3280 * a single-cherry-pick in progress, abort that.
3282 return rollback_single_pick(r);
3284 if (!f)
3285 return error_errno(_("cannot open '%s'"), git_path_head_file());
3286 if (strbuf_getline_lf(&buf, f)) {
3287 error(_("cannot read '%s': %s"), git_path_head_file(),
3288 ferror(f) ? strerror(errno) : _("unexpected end of file"));
3289 fclose(f);
3290 goto fail;
3292 fclose(f);
3293 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
3294 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
3295 git_path_head_file());
3296 goto fail;
3298 if (is_null_oid(&oid)) {
3299 error(_("cannot abort from a branch yet to be born"));
3300 goto fail;
3303 if (!rollback_is_safe()) {
3304 /* Do not error, just do not rollback */
3305 warning(_("You seem to have moved HEAD. "
3306 "Not rewinding, check your HEAD!"));
3307 } else
3308 if (reset_merge(&oid))
3309 goto fail;
3310 strbuf_release(&buf);
3311 return sequencer_remove_state(opts);
3312 fail:
3313 strbuf_release(&buf);
3314 return -1;
3317 int sequencer_skip(struct repository *r, struct replay_opts *opts)
3319 enum replay_action action = -1;
3320 sequencer_get_last_command(r, &action);
3323 * Check whether the subcommand requested to skip the commit is actually
3324 * in progress and that it's safe to skip the commit.
3326 * opts->action tells us which subcommand requested to skip the commit.
3327 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
3328 * action is in progress and we can skip the commit.
3330 * Otherwise we check that the last instruction was related to the
3331 * particular subcommand we're trying to execute and barf if that's not
3332 * the case.
3334 * Finally we check that the rollback is "safe", i.e., has the HEAD
3335 * moved? In this case, it doesn't make sense to "reset the merge" and
3336 * "skip the commit" as the user already handled this by committing. But
3337 * we'd not want to barf here, instead give advice on how to proceed. We
3338 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
3339 * it gets removed when the user commits, so if it still exists we're
3340 * sure the user can't have committed before.
3342 switch (opts->action) {
3343 case REPLAY_REVERT:
3344 if (!refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
3345 if (action != REPLAY_REVERT)
3346 return error(_("no revert in progress"));
3347 if (!rollback_is_safe())
3348 goto give_advice;
3350 break;
3351 case REPLAY_PICK:
3352 if (!refs_ref_exists(get_main_ref_store(r),
3353 "CHERRY_PICK_HEAD")) {
3354 if (action != REPLAY_PICK)
3355 return error(_("no cherry-pick in progress"));
3356 if (!rollback_is_safe())
3357 goto give_advice;
3359 break;
3360 default:
3361 BUG("unexpected action in sequencer_skip");
3364 if (skip_single_pick())
3365 return error(_("failed to skip the commit"));
3366 if (!is_directory(git_path_seq_dir()))
3367 return 0;
3369 return sequencer_continue(r, opts);
3371 give_advice:
3372 error(_("there is nothing to skip"));
3374 if (advice_enabled(ADVICE_RESOLVE_CONFLICT)) {
3375 advise(_("have you committed already?\n"
3376 "try \"git %s --continue\""),
3377 action == REPLAY_REVERT ? "revert" : "cherry-pick");
3379 return -1;
3382 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
3384 struct lock_file todo_lock = LOCK_INIT;
3385 const char *todo_path = get_todo_path(opts);
3386 int next = todo_list->current, offset, fd;
3389 * rebase -i writes "git-rebase-todo" without the currently executing
3390 * command, appending it to "done" instead.
3392 if (is_rebase_i(opts))
3393 next++;
3395 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
3396 if (fd < 0)
3397 return error_errno(_("could not lock '%s'"), todo_path);
3398 offset = get_item_line_offset(todo_list, next);
3399 if (write_in_full(fd, todo_list->buf.buf + offset,
3400 todo_list->buf.len - offset) < 0)
3401 return error_errno(_("could not write to '%s'"), todo_path);
3402 if (commit_lock_file(&todo_lock) < 0)
3403 return error(_("failed to finalize '%s'"), todo_path);
3405 if (is_rebase_i(opts) && next > 0) {
3406 const char *done = rebase_path_done();
3407 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
3408 int ret = 0;
3410 if (fd < 0)
3411 return 0;
3412 if (write_in_full(fd, get_item_line(todo_list, next - 1),
3413 get_item_line_length(todo_list, next - 1))
3414 < 0)
3415 ret = error_errno(_("could not write to '%s'"), done);
3416 if (close(fd) < 0)
3417 ret = error_errno(_("failed to finalize '%s'"), done);
3418 return ret;
3420 return 0;
3423 static int save_opts(struct replay_opts *opts)
3425 const char *opts_file = git_path_opts_file();
3426 int res = 0;
3428 if (opts->no_commit)
3429 res |= git_config_set_in_file_gently(opts_file,
3430 "options.no-commit", "true");
3431 if (opts->edit >= 0)
3432 res |= git_config_set_in_file_gently(opts_file, "options.edit",
3433 opts->edit ? "true" : "false");
3434 if (opts->allow_empty)
3435 res |= git_config_set_in_file_gently(opts_file,
3436 "options.allow-empty", "true");
3437 if (opts->allow_empty_message)
3438 res |= git_config_set_in_file_gently(opts_file,
3439 "options.allow-empty-message", "true");
3440 if (opts->keep_redundant_commits)
3441 res |= git_config_set_in_file_gently(opts_file,
3442 "options.keep-redundant-commits", "true");
3443 if (opts->signoff)
3444 res |= git_config_set_in_file_gently(opts_file,
3445 "options.signoff", "true");
3446 if (opts->record_origin)
3447 res |= git_config_set_in_file_gently(opts_file,
3448 "options.record-origin", "true");
3449 if (opts->allow_ff)
3450 res |= git_config_set_in_file_gently(opts_file,
3451 "options.allow-ff", "true");
3452 if (opts->mainline) {
3453 struct strbuf buf = STRBUF_INIT;
3454 strbuf_addf(&buf, "%d", opts->mainline);
3455 res |= git_config_set_in_file_gently(opts_file,
3456 "options.mainline", buf.buf);
3457 strbuf_release(&buf);
3459 if (opts->strategy)
3460 res |= git_config_set_in_file_gently(opts_file,
3461 "options.strategy", opts->strategy);
3462 if (opts->gpg_sign)
3463 res |= git_config_set_in_file_gently(opts_file,
3464 "options.gpg-sign", opts->gpg_sign);
3465 if (opts->xopts) {
3466 int i;
3467 for (i = 0; i < opts->xopts_nr; i++)
3468 res |= git_config_set_multivar_in_file_gently(opts_file,
3469 "options.strategy-option",
3470 opts->xopts[i], "^$", 0);
3472 if (opts->allow_rerere_auto)
3473 res |= git_config_set_in_file_gently(opts_file,
3474 "options.allow-rerere-auto",
3475 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
3476 "true" : "false");
3478 if (opts->explicit_cleanup)
3479 res |= git_config_set_in_file_gently(opts_file,
3480 "options.default-msg-cleanup",
3481 describe_cleanup_mode(opts->default_msg_cleanup));
3482 return res;
3485 static int make_patch(struct repository *r,
3486 struct commit *commit,
3487 struct replay_opts *opts)
3489 struct strbuf buf = STRBUF_INIT;
3490 struct rev_info log_tree_opt;
3491 const char *subject;
3492 char hex[GIT_MAX_HEXSZ + 1];
3493 int res = 0;
3495 oid_to_hex_r(hex, &commit->object.oid);
3496 if (write_message(hex, strlen(hex), rebase_path_stopped_sha(), 1) < 0)
3497 return -1;
3498 res |= write_rebase_head(&commit->object.oid);
3500 strbuf_addf(&buf, "%s/patch", get_dir(opts));
3501 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3502 repo_init_revisions(r, &log_tree_opt, NULL);
3503 log_tree_opt.abbrev = 0;
3504 log_tree_opt.diff = 1;
3505 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
3506 log_tree_opt.disable_stdin = 1;
3507 log_tree_opt.no_commit_id = 1;
3508 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
3509 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
3510 if (!log_tree_opt.diffopt.file)
3511 res |= error_errno(_("could not open '%s'"), buf.buf);
3512 else {
3513 res |= log_tree_commit(&log_tree_opt, commit);
3514 fclose(log_tree_opt.diffopt.file);
3516 strbuf_reset(&buf);
3518 strbuf_addf(&buf, "%s/message", get_dir(opts));
3519 if (!file_exists(buf.buf)) {
3520 const char *encoding = get_commit_output_encoding();
3521 const char *commit_buffer = logmsg_reencode(commit, NULL, encoding);
3522 find_commit_subject(commit_buffer, &subject);
3523 res |= write_message(subject, strlen(subject), buf.buf, 1);
3524 unuse_commit_buffer(commit, commit_buffer);
3526 strbuf_release(&buf);
3527 release_revisions(&log_tree_opt);
3529 return res;
3532 static int intend_to_amend(void)
3534 struct object_id head;
3535 char *p;
3537 if (get_oid("HEAD", &head))
3538 return error(_("cannot read HEAD"));
3540 p = oid_to_hex(&head);
3541 return write_message(p, strlen(p), rebase_path_amend(), 1);
3544 static int error_with_patch(struct repository *r,
3545 struct commit *commit,
3546 const char *subject, int subject_len,
3547 struct replay_opts *opts,
3548 int exit_code, int to_amend)
3550 if (commit) {
3551 if (make_patch(r, commit, opts))
3552 return -1;
3553 } else if (copy_file(rebase_path_message(),
3554 git_path_merge_msg(r), 0666))
3555 return error(_("unable to copy '%s' to '%s'"),
3556 git_path_merge_msg(r), rebase_path_message());
3558 if (to_amend) {
3559 if (intend_to_amend())
3560 return -1;
3562 fprintf(stderr,
3563 _("You can amend the commit now, with\n"
3564 "\n"
3565 " git commit --amend %s\n"
3566 "\n"
3567 "Once you are satisfied with your changes, run\n"
3568 "\n"
3569 " git rebase --continue\n"),
3570 gpg_sign_opt_quoted(opts));
3571 } else if (exit_code) {
3572 if (commit)
3573 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
3574 short_commit_name(commit), subject_len, subject);
3575 else
3577 * We don't have the hash of the parent so
3578 * just print the line from the todo file.
3580 fprintf_ln(stderr, _("Could not merge %.*s"),
3581 subject_len, subject);
3584 return exit_code;
3587 static int error_failed_squash(struct repository *r,
3588 struct commit *commit,
3589 struct replay_opts *opts,
3590 int subject_len,
3591 const char *subject)
3593 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3594 return error(_("could not copy '%s' to '%s'"),
3595 rebase_path_squash_msg(), rebase_path_message());
3596 unlink(git_path_merge_msg(r));
3597 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
3598 return error(_("could not copy '%s' to '%s'"),
3599 rebase_path_message(),
3600 git_path_merge_msg(r));
3601 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
3604 static int do_exec(struct repository *r, const char *command_line)
3606 struct child_process cmd = CHILD_PROCESS_INIT;
3607 int dirty, status;
3609 fprintf(stderr, _("Executing: %s\n"), command_line);
3610 cmd.use_shell = 1;
3611 strvec_push(&cmd.args, command_line);
3612 status = run_command(&cmd);
3614 /* force re-reading of the cache */
3615 discard_index(r->index);
3616 if (repo_read_index(r) < 0)
3617 return error(_("could not read index"));
3619 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
3621 if (status) {
3622 warning(_("execution failed: %s\n%s"
3623 "You can fix the problem, and then run\n"
3624 "\n"
3625 " git rebase --continue\n"
3626 "\n"),
3627 command_line,
3628 dirty ? N_("and made changes to the index and/or the "
3629 "working tree\n") : "");
3630 if (status == 127)
3631 /* command not found */
3632 status = 1;
3633 } else if (dirty) {
3634 warning(_("execution succeeded: %s\nbut "
3635 "left changes to the index and/or the working tree\n"
3636 "Commit or stash your changes, and then run\n"
3637 "\n"
3638 " git rebase --continue\n"
3639 "\n"), command_line);
3640 status = 1;
3643 return status;
3646 __attribute__((format (printf, 2, 3)))
3647 static int safe_append(const char *filename, const char *fmt, ...)
3649 va_list ap;
3650 struct lock_file lock = LOCK_INIT;
3651 int fd = hold_lock_file_for_update(&lock, filename,
3652 LOCK_REPORT_ON_ERROR);
3653 struct strbuf buf = STRBUF_INIT;
3655 if (fd < 0)
3656 return -1;
3658 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3659 error_errno(_("could not read '%s'"), filename);
3660 rollback_lock_file(&lock);
3661 return -1;
3663 strbuf_complete(&buf, '\n');
3664 va_start(ap, fmt);
3665 strbuf_vaddf(&buf, fmt, ap);
3666 va_end(ap);
3668 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3669 error_errno(_("could not write to '%s'"), filename);
3670 strbuf_release(&buf);
3671 rollback_lock_file(&lock);
3672 return -1;
3674 if (commit_lock_file(&lock) < 0) {
3675 strbuf_release(&buf);
3676 rollback_lock_file(&lock);
3677 return error(_("failed to finalize '%s'"), filename);
3680 strbuf_release(&buf);
3681 return 0;
3684 static int do_label(struct repository *r, const char *name, int len)
3686 struct ref_store *refs = get_main_ref_store(r);
3687 struct ref_transaction *transaction;
3688 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3689 struct strbuf msg = STRBUF_INIT;
3690 int ret = 0;
3691 struct object_id head_oid;
3693 if (len == 1 && *name == '#')
3694 return error(_("illegal label name: '%.*s'"), len, name);
3696 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3697 strbuf_addf(&msg, "rebase (label) '%.*s'", len, name);
3699 transaction = ref_store_transaction_begin(refs, &err);
3700 if (!transaction) {
3701 error("%s", err.buf);
3702 ret = -1;
3703 } else if (get_oid("HEAD", &head_oid)) {
3704 error(_("could not read HEAD"));
3705 ret = -1;
3706 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
3707 NULL, 0, msg.buf, &err) < 0 ||
3708 ref_transaction_commit(transaction, &err)) {
3709 error("%s", err.buf);
3710 ret = -1;
3712 ref_transaction_free(transaction);
3713 strbuf_release(&err);
3714 strbuf_release(&msg);
3716 if (!ret)
3717 ret = safe_append(rebase_path_refs_to_delete(),
3718 "%s\n", ref_name.buf);
3719 strbuf_release(&ref_name);
3721 return ret;
3724 static const char *sequencer_reflog_action(struct replay_opts *opts)
3726 if (!opts->reflog_action) {
3727 opts->reflog_action = getenv(GIT_REFLOG_ACTION);
3728 opts->reflog_action =
3729 xstrdup(opts->reflog_action ? opts->reflog_action
3730 : action_name(opts));
3733 return opts->reflog_action;
3736 __attribute__((format (printf, 3, 4)))
3737 static const char *reflog_message(struct replay_opts *opts,
3738 const char *sub_action, const char *fmt, ...)
3740 va_list ap;
3741 static struct strbuf buf = STRBUF_INIT;
3743 va_start(ap, fmt);
3744 strbuf_reset(&buf);
3745 strbuf_addstr(&buf, sequencer_reflog_action(opts));
3746 if (sub_action)
3747 strbuf_addf(&buf, " (%s)", sub_action);
3748 if (fmt) {
3749 strbuf_addstr(&buf, ": ");
3750 strbuf_vaddf(&buf, fmt, ap);
3752 va_end(ap);
3754 return buf.buf;
3757 static struct commit *lookup_label(struct repository *r, const char *label,
3758 int len, struct strbuf *buf)
3760 struct commit *commit;
3761 struct object_id oid;
3763 strbuf_reset(buf);
3764 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3765 if (!read_ref(buf->buf, &oid)) {
3766 commit = lookup_commit_object(r, &oid);
3767 } else {
3768 /* fall back to non-rewritten ref or commit */
3769 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3770 commit = lookup_commit_reference_by_name(buf->buf);
3773 if (!commit)
3774 error(_("could not resolve '%s'"), buf->buf);
3776 return commit;
3779 static int do_reset(struct repository *r,
3780 const char *name, int len,
3781 struct replay_opts *opts)
3783 struct strbuf ref_name = STRBUF_INIT;
3784 struct object_id oid;
3785 struct lock_file lock = LOCK_INIT;
3786 struct tree_desc desc = { 0 };
3787 struct tree *tree;
3788 struct unpack_trees_options unpack_tree_opts = { 0 };
3789 int ret = 0;
3791 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
3792 return -1;
3794 if (len == 10 && !strncmp("[new root]", name, len)) {
3795 if (!opts->have_squash_onto) {
3796 const char *hex;
3797 if (commit_tree("", 0, the_hash_algo->empty_tree,
3798 NULL, &opts->squash_onto,
3799 NULL, NULL))
3800 return error(_("writing fake root commit"));
3801 opts->have_squash_onto = 1;
3802 hex = oid_to_hex(&opts->squash_onto);
3803 if (write_message(hex, strlen(hex),
3804 rebase_path_squash_onto(), 0))
3805 return error(_("writing squash-onto"));
3807 oidcpy(&oid, &opts->squash_onto);
3808 } else {
3809 int i;
3810 struct commit *commit;
3812 /* Determine the length of the label */
3813 for (i = 0; i < len; i++)
3814 if (isspace(name[i]))
3815 break;
3816 len = i;
3818 commit = lookup_label(r, name, len, &ref_name);
3819 if (!commit) {
3820 ret = -1;
3821 goto cleanup;
3823 oid = commit->object.oid;
3826 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3827 unpack_tree_opts.head_idx = 1;
3828 unpack_tree_opts.src_index = r->index;
3829 unpack_tree_opts.dst_index = r->index;
3830 unpack_tree_opts.fn = oneway_merge;
3831 unpack_tree_opts.merge = 1;
3832 unpack_tree_opts.update = 1;
3833 unpack_tree_opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
3834 unpack_tree_opts.skip_cache_tree_update = 1;
3835 init_checkout_metadata(&unpack_tree_opts.meta, name, &oid, NULL);
3837 if (repo_read_index_unmerged(r)) {
3838 ret = error_resolve_conflict(action_name(opts));
3839 goto cleanup;
3842 if (!fill_tree_descriptor(r, &desc, &oid)) {
3843 ret = error(_("failed to find tree of %s"), oid_to_hex(&oid));
3844 goto cleanup;
3847 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3848 ret = -1;
3849 goto cleanup;
3852 tree = parse_tree_indirect(&oid);
3853 prime_cache_tree(r, r->index, tree);
3855 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3856 ret = error(_("could not write index"));
3858 if (!ret)
3859 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3860 len, name), "HEAD", &oid,
3861 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3862 cleanup:
3863 free((void *)desc.buffer);
3864 if (ret < 0)
3865 rollback_lock_file(&lock);
3866 strbuf_release(&ref_name);
3867 clear_unpack_trees_porcelain(&unpack_tree_opts);
3868 return ret;
3871 static int do_merge(struct repository *r,
3872 struct commit *commit,
3873 const char *arg, int arg_len,
3874 int flags, int *check_todo, struct replay_opts *opts)
3876 int run_commit_flags = 0;
3877 struct strbuf ref_name = STRBUF_INIT;
3878 struct commit *head_commit, *merge_commit, *i;
3879 struct commit_list *bases, *j;
3880 struct commit_list *to_merge = NULL, **tail = &to_merge;
3881 const char *strategy = !opts->xopts_nr &&
3882 (!opts->strategy ||
3883 !strcmp(opts->strategy, "recursive") ||
3884 !strcmp(opts->strategy, "ort")) ?
3885 NULL : opts->strategy;
3886 struct merge_options o;
3887 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3888 static struct lock_file lock;
3889 const char *p;
3891 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
3892 ret = -1;
3893 goto leave_merge;
3896 head_commit = lookup_commit_reference_by_name("HEAD");
3897 if (!head_commit) {
3898 ret = error(_("cannot merge without a current revision"));
3899 goto leave_merge;
3903 * For octopus merges, the arg starts with the list of revisions to be
3904 * merged. The list is optionally followed by '#' and the oneline.
3906 merge_arg_len = oneline_offset = arg_len;
3907 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3908 if (!*p)
3909 break;
3910 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3911 p += 1 + strspn(p + 1, " \t\n");
3912 oneline_offset = p - arg;
3913 break;
3915 k = strcspn(p, " \t\n");
3916 if (!k)
3917 continue;
3918 merge_commit = lookup_label(r, p, k, &ref_name);
3919 if (!merge_commit) {
3920 ret = error(_("unable to parse '%.*s'"), k, p);
3921 goto leave_merge;
3923 tail = &commit_list_insert(merge_commit, tail)->next;
3924 p += k;
3925 merge_arg_len = p - arg;
3928 if (!to_merge) {
3929 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3930 goto leave_merge;
3933 if (opts->have_squash_onto &&
3934 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3936 * When the user tells us to "merge" something into a
3937 * "[new root]", let's simply fast-forward to the merge head.
3939 rollback_lock_file(&lock);
3940 if (to_merge->next)
3941 ret = error(_("octopus merge cannot be executed on "
3942 "top of a [new root]"));
3943 else
3944 ret = fast_forward_to(r, &to_merge->item->object.oid,
3945 &head_commit->object.oid, 0,
3946 opts);
3947 goto leave_merge;
3951 * If HEAD is not identical to the first parent of the original merge
3952 * commit, we cannot fast-forward.
3954 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3955 oideq(&commit->parents->item->object.oid,
3956 &head_commit->object.oid);
3959 * If any merge head is different from the original one, we cannot
3960 * fast-forward.
3962 if (can_fast_forward) {
3963 struct commit_list *p = commit->parents->next;
3965 for (j = to_merge; j && p; j = j->next, p = p->next)
3966 if (!oideq(&j->item->object.oid,
3967 &p->item->object.oid)) {
3968 can_fast_forward = 0;
3969 break;
3972 * If the number of merge heads differs from the original merge
3973 * commit, we cannot fast-forward.
3975 if (j || p)
3976 can_fast_forward = 0;
3979 if (can_fast_forward) {
3980 rollback_lock_file(&lock);
3981 ret = fast_forward_to(r, &commit->object.oid,
3982 &head_commit->object.oid, 0, opts);
3983 if (flags & TODO_EDIT_MERGE_MSG)
3984 goto fast_forward_edit;
3986 goto leave_merge;
3989 if (commit) {
3990 const char *encoding = get_commit_output_encoding();
3991 const char *message = logmsg_reencode(commit, NULL, encoding);
3992 const char *body;
3993 int len;
3995 if (!message) {
3996 ret = error(_("could not get commit message of '%s'"),
3997 oid_to_hex(&commit->object.oid));
3998 goto leave_merge;
4000 write_author_script(message);
4001 find_commit_subject(message, &body);
4002 len = strlen(body);
4003 ret = write_message(body, len, git_path_merge_msg(r), 0);
4004 unuse_commit_buffer(commit, message);
4005 if (ret) {
4006 error_errno(_("could not write '%s'"),
4007 git_path_merge_msg(r));
4008 goto leave_merge;
4010 } else {
4011 struct strbuf buf = STRBUF_INIT;
4012 int len;
4014 strbuf_addf(&buf, "author %s", git_author_info(0));
4015 write_author_script(buf.buf);
4016 strbuf_reset(&buf);
4018 if (oneline_offset < arg_len) {
4019 p = arg + oneline_offset;
4020 len = arg_len - oneline_offset;
4021 } else {
4022 strbuf_addf(&buf, "Merge %s '%.*s'",
4023 to_merge->next ? "branches" : "branch",
4024 merge_arg_len, arg);
4025 p = buf.buf;
4026 len = buf.len;
4029 ret = write_message(p, len, git_path_merge_msg(r), 0);
4030 strbuf_release(&buf);
4031 if (ret) {
4032 error_errno(_("could not write '%s'"),
4033 git_path_merge_msg(r));
4034 goto leave_merge;
4038 if (strategy || to_merge->next) {
4039 /* Octopus merge */
4040 struct child_process cmd = CHILD_PROCESS_INIT;
4042 if (read_env_script(&cmd.env)) {
4043 const char *gpg_opt = gpg_sign_opt_quoted(opts);
4045 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
4046 goto leave_merge;
4049 if (opts->committer_date_is_author_date)
4050 strvec_pushf(&cmd.env, "GIT_COMMITTER_DATE=%s",
4051 opts->ignore_date ?
4052 "" :
4053 author_date_from_env(&cmd.env));
4054 if (opts->ignore_date)
4055 strvec_push(&cmd.env, "GIT_AUTHOR_DATE=");
4057 cmd.git_cmd = 1;
4058 strvec_push(&cmd.args, "merge");
4059 strvec_push(&cmd.args, "-s");
4060 if (!strategy)
4061 strvec_push(&cmd.args, "octopus");
4062 else {
4063 strvec_push(&cmd.args, strategy);
4064 for (k = 0; k < opts->xopts_nr; k++)
4065 strvec_pushf(&cmd.args,
4066 "-X%s", opts->xopts[k]);
4068 if (!(flags & TODO_EDIT_MERGE_MSG))
4069 strvec_push(&cmd.args, "--no-edit");
4070 else
4071 strvec_push(&cmd.args, "--edit");
4072 strvec_push(&cmd.args, "--no-ff");
4073 strvec_push(&cmd.args, "--no-log");
4074 strvec_push(&cmd.args, "--no-stat");
4075 strvec_push(&cmd.args, "-F");
4076 strvec_push(&cmd.args, git_path_merge_msg(r));
4077 if (opts->gpg_sign)
4078 strvec_pushf(&cmd.args, "-S%s", opts->gpg_sign);
4079 else
4080 strvec_push(&cmd.args, "--no-gpg-sign");
4082 /* Add the tips to be merged */
4083 for (j = to_merge; j; j = j->next)
4084 strvec_push(&cmd.args,
4085 oid_to_hex(&j->item->object.oid));
4087 strbuf_release(&ref_name);
4088 refs_delete_ref(get_main_ref_store(r), "", "CHERRY_PICK_HEAD",
4089 NULL, 0);
4090 rollback_lock_file(&lock);
4092 ret = run_command(&cmd);
4094 /* force re-reading of the cache */
4095 if (!ret) {
4096 discard_index(r->index);
4097 if (repo_read_index(r) < 0)
4098 ret = error(_("could not read index"));
4100 goto leave_merge;
4103 merge_commit = to_merge->item;
4104 bases = get_merge_bases(head_commit, merge_commit);
4105 if (bases && oideq(&merge_commit->object.oid,
4106 &bases->item->object.oid)) {
4107 ret = 0;
4108 /* skip merging an ancestor of HEAD */
4109 goto leave_merge;
4112 write_message(oid_to_hex(&merge_commit->object.oid), the_hash_algo->hexsz,
4113 git_path_merge_head(r), 0);
4114 write_message("no-ff", 5, git_path_merge_mode(r), 0);
4116 bases = reverse_commit_list(bases);
4118 repo_read_index(r);
4119 init_merge_options(&o, r);
4120 o.branch1 = "HEAD";
4121 o.branch2 = ref_name.buf;
4122 o.buffer_output = 2;
4124 if (!opts->strategy || !strcmp(opts->strategy, "ort")) {
4126 * TODO: Should use merge_incore_recursive() and
4127 * merge_switch_to_result(), skipping the call to
4128 * merge_switch_to_result() when we don't actually need to
4129 * update the index and working copy immediately.
4131 ret = merge_ort_recursive(&o,
4132 head_commit, merge_commit, bases,
4133 &i);
4134 } else {
4135 ret = merge_recursive(&o, head_commit, merge_commit, bases,
4136 &i);
4138 if (ret <= 0)
4139 fputs(o.obuf.buf, stdout);
4140 strbuf_release(&o.obuf);
4141 if (ret < 0) {
4142 error(_("could not even attempt to merge '%.*s'"),
4143 merge_arg_len, arg);
4144 goto leave_merge;
4147 * The return value of merge_recursive() is 1 on clean, and 0 on
4148 * unclean merge.
4150 * Let's reverse that, so that do_merge() returns 0 upon success and
4151 * 1 upon failed merge (keeping the return value -1 for the cases where
4152 * we will want to reschedule the `merge` command).
4154 ret = !ret;
4156 if (r->index->cache_changed &&
4157 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
4158 ret = error(_("merge: Unable to write new index file"));
4159 goto leave_merge;
4162 rollback_lock_file(&lock);
4163 if (ret)
4164 repo_rerere(r, opts->allow_rerere_auto);
4165 else
4167 * In case of problems, we now want to return a positive
4168 * value (a negative one would indicate that the `merge`
4169 * command needs to be rescheduled).
4171 ret = !!run_git_commit(git_path_merge_msg(r), opts,
4172 run_commit_flags);
4174 if (!ret && flags & TODO_EDIT_MERGE_MSG) {
4175 fast_forward_edit:
4176 *check_todo = 1;
4177 run_commit_flags |= AMEND_MSG | EDIT_MSG | VERIFY_MSG;
4178 ret = !!run_git_commit(NULL, opts, run_commit_flags);
4182 leave_merge:
4183 strbuf_release(&ref_name);
4184 rollback_lock_file(&lock);
4185 free_commit_list(to_merge);
4186 return ret;
4189 static int write_update_refs_state(struct string_list *refs_to_oids)
4191 int result = 0;
4192 struct lock_file lock = LOCK_INIT;
4193 FILE *fp = NULL;
4194 struct string_list_item *item;
4195 char *path;
4197 path = rebase_path_update_refs(the_repository->gitdir);
4199 if (!refs_to_oids->nr) {
4200 if (unlink(path) && errno != ENOENT)
4201 result = error_errno(_("could not unlink: %s"), path);
4202 goto cleanup;
4205 if (safe_create_leading_directories(path)) {
4206 result = error(_("unable to create leading directories of %s"),
4207 path);
4208 goto cleanup;
4211 if (hold_lock_file_for_update(&lock, path, 0) < 0) {
4212 result = error(_("another 'rebase' process appears to be running; "
4213 "'%s.lock' already exists"),
4214 path);
4215 goto cleanup;
4218 fp = fdopen_lock_file(&lock, "w");
4219 if (!fp) {
4220 result = error_errno(_("could not open '%s' for writing"), path);
4221 rollback_lock_file(&lock);
4222 goto cleanup;
4225 for_each_string_list_item(item, refs_to_oids) {
4226 struct update_ref_record *rec = item->util;
4227 fprintf(fp, "%s\n%s\n%s\n", item->string,
4228 oid_to_hex(&rec->before), oid_to_hex(&rec->after));
4231 result = commit_lock_file(&lock);
4233 cleanup:
4234 free(path);
4235 return result;
4239 * Parse the update-refs file for the current rebase, then remove the
4240 * refs that do not appear in the todo_list (and have not had updated
4241 * values stored) and add refs that are in the todo_list but not
4242 * represented in the update-refs file.
4244 * If there are changes to the update-refs list, then write the new state
4245 * to disk.
4247 void todo_list_filter_update_refs(struct repository *r,
4248 struct todo_list *todo_list)
4250 int i;
4251 int updated = 0;
4252 struct string_list update_refs = STRING_LIST_INIT_DUP;
4254 sequencer_get_update_refs_state(r->gitdir, &update_refs);
4257 * For each item in the update_refs list, if it has no updated
4258 * value and does not appear in the todo_list, then remove it
4259 * from the update_refs list.
4261 for (i = 0; i < update_refs.nr; i++) {
4262 int j;
4263 int found = 0;
4264 const char *ref = update_refs.items[i].string;
4265 size_t reflen = strlen(ref);
4266 struct update_ref_record *rec = update_refs.items[i].util;
4268 /* OID already stored as updated. */
4269 if (!is_null_oid(&rec->after))
4270 continue;
4272 for (j = 0; !found && j < todo_list->total_nr; j++) {
4273 struct todo_item *item = &todo_list->items[j];
4274 const char *arg = todo_list->buf.buf + item->arg_offset;
4276 if (item->command != TODO_UPDATE_REF)
4277 continue;
4279 if (item->arg_len != reflen ||
4280 strncmp(arg, ref, reflen))
4281 continue;
4283 found = 1;
4286 if (!found) {
4287 free(update_refs.items[i].string);
4288 free(update_refs.items[i].util);
4290 update_refs.nr--;
4291 MOVE_ARRAY(update_refs.items + i, update_refs.items + i + 1, update_refs.nr - i);
4293 updated = 1;
4294 i--;
4299 * For each todo_item, check if its ref is in the update_refs list.
4300 * If not, then add it as an un-updated ref.
4302 for (i = 0; i < todo_list->total_nr; i++) {
4303 struct todo_item *item = &todo_list->items[i];
4304 const char *arg = todo_list->buf.buf + item->arg_offset;
4305 int j, found = 0;
4307 if (item->command != TODO_UPDATE_REF)
4308 continue;
4310 for (j = 0; !found && j < update_refs.nr; j++) {
4311 const char *ref = update_refs.items[j].string;
4313 found = strlen(ref) == item->arg_len &&
4314 !strncmp(ref, arg, item->arg_len);
4317 if (!found) {
4318 struct string_list_item *inserted;
4319 struct strbuf argref = STRBUF_INIT;
4321 strbuf_add(&argref, arg, item->arg_len);
4322 inserted = string_list_insert(&update_refs, argref.buf);
4323 inserted->util = init_update_ref_record(argref.buf);
4324 strbuf_release(&argref);
4325 updated = 1;
4329 if (updated)
4330 write_update_refs_state(&update_refs);
4331 string_list_clear(&update_refs, 1);
4334 static int do_update_ref(struct repository *r, const char *refname)
4336 struct string_list_item *item;
4337 struct string_list list = STRING_LIST_INIT_DUP;
4339 if (sequencer_get_update_refs_state(r->gitdir, &list))
4340 return -1;
4342 for_each_string_list_item(item, &list) {
4343 if (!strcmp(item->string, refname)) {
4344 struct update_ref_record *rec = item->util;
4345 if (read_ref("HEAD", &rec->after))
4346 return -1;
4347 break;
4351 write_update_refs_state(&list);
4352 string_list_clear(&list, 1);
4353 return 0;
4356 static int do_update_refs(struct repository *r, int quiet)
4358 int res = 0;
4359 struct string_list_item *item;
4360 struct string_list refs_to_oids = STRING_LIST_INIT_DUP;
4361 struct ref_store *refs = get_main_ref_store(r);
4362 struct strbuf update_msg = STRBUF_INIT;
4363 struct strbuf error_msg = STRBUF_INIT;
4365 if ((res = sequencer_get_update_refs_state(r->gitdir, &refs_to_oids)))
4366 return res;
4368 for_each_string_list_item(item, &refs_to_oids) {
4369 struct update_ref_record *rec = item->util;
4370 int loop_res;
4372 loop_res = refs_update_ref(refs, "rewritten during rebase",
4373 item->string,
4374 &rec->after, &rec->before,
4375 0, UPDATE_REFS_MSG_ON_ERR);
4376 res |= loop_res;
4378 if (quiet)
4379 continue;
4381 if (loop_res)
4382 strbuf_addf(&error_msg, "\t%s\n", item->string);
4383 else
4384 strbuf_addf(&update_msg, "\t%s\n", item->string);
4387 if (!quiet &&
4388 (update_msg.len || error_msg.len)) {
4389 fprintf(stderr,
4390 _("Updated the following refs with %s:\n%s"),
4391 "--update-refs",
4392 update_msg.buf);
4394 if (res)
4395 fprintf(stderr,
4396 _("Failed to update the following refs with %s:\n%s"),
4397 "--update-refs",
4398 error_msg.buf);
4401 string_list_clear(&refs_to_oids, 1);
4402 strbuf_release(&update_msg);
4403 strbuf_release(&error_msg);
4404 return res;
4407 static int is_final_fixup(struct todo_list *todo_list)
4409 int i = todo_list->current;
4411 if (!is_fixup(todo_list->items[i].command))
4412 return 0;
4414 while (++i < todo_list->nr)
4415 if (is_fixup(todo_list->items[i].command))
4416 return 0;
4417 else if (!is_noop(todo_list->items[i].command))
4418 break;
4419 return 1;
4422 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
4424 int i;
4426 for (i = todo_list->current + offset; i < todo_list->nr; i++)
4427 if (!is_noop(todo_list->items[i].command))
4428 return todo_list->items[i].command;
4430 return -1;
4433 void create_autostash(struct repository *r, const char *path)
4435 struct strbuf buf = STRBUF_INIT;
4436 struct lock_file lock_file = LOCK_INIT;
4437 int fd;
4439 fd = repo_hold_locked_index(r, &lock_file, 0);
4440 refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
4441 if (0 <= fd)
4442 repo_update_index_if_able(r, &lock_file);
4443 rollback_lock_file(&lock_file);
4445 if (has_unstaged_changes(r, 1) ||
4446 has_uncommitted_changes(r, 1)) {
4447 struct child_process stash = CHILD_PROCESS_INIT;
4448 struct reset_head_opts ropts = { .flags = RESET_HEAD_HARD };
4449 struct object_id oid;
4451 strvec_pushl(&stash.args,
4452 "stash", "create", "autostash", NULL);
4453 stash.git_cmd = 1;
4454 stash.no_stdin = 1;
4455 strbuf_reset(&buf);
4456 if (capture_command(&stash, &buf, GIT_MAX_HEXSZ))
4457 die(_("Cannot autostash"));
4458 strbuf_trim_trailing_newline(&buf);
4459 if (get_oid(buf.buf, &oid))
4460 die(_("Unexpected stash response: '%s'"),
4461 buf.buf);
4462 strbuf_reset(&buf);
4463 strbuf_add_unique_abbrev(&buf, &oid, DEFAULT_ABBREV);
4465 if (safe_create_leading_directories_const(path))
4466 die(_("Could not create directory for '%s'"),
4467 path);
4468 write_file(path, "%s", oid_to_hex(&oid));
4469 printf(_("Created autostash: %s\n"), buf.buf);
4470 if (reset_head(r, &ropts) < 0)
4471 die(_("could not reset --hard"));
4472 discard_index(r->index);
4473 if (repo_read_index(r) < 0)
4474 die(_("could not read index"));
4476 strbuf_release(&buf);
4479 static int apply_save_autostash_oid(const char *stash_oid, int attempt_apply)
4481 struct child_process child = CHILD_PROCESS_INIT;
4482 int ret = 0;
4484 if (attempt_apply) {
4485 child.git_cmd = 1;
4486 child.no_stdout = 1;
4487 child.no_stderr = 1;
4488 strvec_push(&child.args, "stash");
4489 strvec_push(&child.args, "apply");
4490 strvec_push(&child.args, stash_oid);
4491 ret = run_command(&child);
4494 if (attempt_apply && !ret)
4495 fprintf(stderr, _("Applied autostash.\n"));
4496 else {
4497 struct child_process store = CHILD_PROCESS_INIT;
4499 store.git_cmd = 1;
4500 strvec_push(&store.args, "stash");
4501 strvec_push(&store.args, "store");
4502 strvec_push(&store.args, "-m");
4503 strvec_push(&store.args, "autostash");
4504 strvec_push(&store.args, "-q");
4505 strvec_push(&store.args, stash_oid);
4506 if (run_command(&store))
4507 ret = error(_("cannot store %s"), stash_oid);
4508 else
4509 fprintf(stderr,
4510 _("%s\n"
4511 "Your changes are safe in the stash.\n"
4512 "You can run \"git stash pop\" or"
4513 " \"git stash drop\" at any time.\n"),
4514 attempt_apply ?
4515 _("Applying autostash resulted in conflicts.") :
4516 _("Autostash exists; creating a new stash entry."));
4519 return ret;
4522 static int apply_save_autostash(const char *path, int attempt_apply)
4524 struct strbuf stash_oid = STRBUF_INIT;
4525 int ret = 0;
4527 if (!read_oneliner(&stash_oid, path,
4528 READ_ONELINER_SKIP_IF_EMPTY)) {
4529 strbuf_release(&stash_oid);
4530 return 0;
4532 strbuf_trim(&stash_oid);
4534 ret = apply_save_autostash_oid(stash_oid.buf, attempt_apply);
4536 unlink(path);
4537 strbuf_release(&stash_oid);
4538 return ret;
4541 int save_autostash(const char *path)
4543 return apply_save_autostash(path, 0);
4546 int apply_autostash(const char *path)
4548 return apply_save_autostash(path, 1);
4551 int apply_autostash_oid(const char *stash_oid)
4553 return apply_save_autostash_oid(stash_oid, 1);
4556 static int checkout_onto(struct repository *r, struct replay_opts *opts,
4557 const char *onto_name, const struct object_id *onto,
4558 const struct object_id *orig_head)
4560 struct reset_head_opts ropts = {
4561 .oid = onto,
4562 .orig_head = orig_head,
4563 .flags = RESET_HEAD_DETACH | RESET_ORIG_HEAD |
4564 RESET_HEAD_RUN_POST_CHECKOUT_HOOK,
4565 .head_msg = reflog_message(opts, "start", "checkout %s",
4566 onto_name),
4567 .default_reflog_action = sequencer_reflog_action(opts)
4569 if (reset_head(r, &ropts)) {
4570 apply_autostash(rebase_path_autostash());
4571 sequencer_remove_state(opts);
4572 return error(_("could not detach HEAD"));
4575 return 0;
4578 static int stopped_at_head(struct repository *r)
4580 struct object_id head;
4581 struct commit *commit;
4582 struct commit_message message;
4584 if (get_oid("HEAD", &head) ||
4585 !(commit = lookup_commit(r, &head)) ||
4586 parse_commit(commit) || get_message(commit, &message))
4587 fprintf(stderr, _("Stopped at HEAD\n"));
4588 else {
4589 fprintf(stderr, _("Stopped at %s\n"), message.label);
4590 free_message(commit, &message);
4592 return 0;
4596 static int reread_todo_if_changed(struct repository *r,
4597 struct todo_list *todo_list,
4598 struct replay_opts *opts)
4600 int offset;
4601 struct strbuf buf = STRBUF_INIT;
4603 if (strbuf_read_file_or_whine(&buf, get_todo_path(opts)) < 0)
4604 return -1;
4605 offset = get_item_line_offset(todo_list, todo_list->current + 1);
4606 if (buf.len != todo_list->buf.len - offset ||
4607 memcmp(buf.buf, todo_list->buf.buf + offset, buf.len)) {
4608 /* Reread the todo file if it has changed. */
4609 todo_list_release(todo_list);
4610 if (read_populate_todo(r, todo_list, opts))
4611 return -1; /* message was printed */
4612 /* `current` will be incremented on return */
4613 todo_list->current = -1;
4615 strbuf_release(&buf);
4617 return 0;
4620 static const char rescheduled_advice[] =
4621 N_("Could not execute the todo command\n"
4622 "\n"
4623 " %.*s"
4624 "\n"
4625 "It has been rescheduled; To edit the command before continuing, please\n"
4626 "edit the todo list first:\n"
4627 "\n"
4628 " git rebase --edit-todo\n"
4629 " git rebase --continue\n");
4631 static int pick_commits(struct repository *r,
4632 struct todo_list *todo_list,
4633 struct replay_opts *opts)
4635 int res = 0, reschedule = 0;
4637 opts->reflog_message = sequencer_reflog_action(opts);
4638 if (opts->allow_ff)
4639 assert(!(opts->signoff || opts->no_commit ||
4640 opts->record_origin || should_edit(opts) ||
4641 opts->committer_date_is_author_date ||
4642 opts->ignore_date));
4643 if (read_and_refresh_cache(r, opts))
4644 return -1;
4646 while (todo_list->current < todo_list->nr) {
4647 struct todo_item *item = todo_list->items + todo_list->current;
4648 const char *arg = todo_item_get_arg(todo_list, item);
4649 int check_todo = 0;
4651 if (save_todo(todo_list, opts))
4652 return -1;
4653 if (is_rebase_i(opts)) {
4654 if (item->command != TODO_COMMENT) {
4655 FILE *f = fopen(rebase_path_msgnum(), "w");
4657 todo_list->done_nr++;
4659 if (f) {
4660 fprintf(f, "%d\n", todo_list->done_nr);
4661 fclose(f);
4663 if (!opts->quiet)
4664 fprintf(stderr, _("Rebasing (%d/%d)%s"),
4665 todo_list->done_nr,
4666 todo_list->total_nr,
4667 opts->verbose ? "\n" : "\r");
4669 unlink(rebase_path_message());
4670 unlink(rebase_path_author_script());
4671 unlink(rebase_path_stopped_sha());
4672 unlink(rebase_path_amend());
4673 unlink(git_path_merge_head(r));
4674 unlink(git_path_auto_merge(r));
4675 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
4677 if (item->command == TODO_BREAK) {
4678 if (!opts->verbose)
4679 term_clear_line();
4680 return stopped_at_head(r);
4683 if (item->command <= TODO_SQUASH) {
4684 if (is_rebase_i(opts))
4685 opts->reflog_message = reflog_message(opts,
4686 command_to_string(item->command), NULL);
4688 res = do_pick_commit(r, item, opts,
4689 is_final_fixup(todo_list),
4690 &check_todo);
4691 if (is_rebase_i(opts) && res < 0) {
4692 /* Reschedule */
4693 advise(_(rescheduled_advice),
4694 get_item_line_length(todo_list,
4695 todo_list->current),
4696 get_item_line(todo_list,
4697 todo_list->current));
4698 todo_list->current--;
4699 if (save_todo(todo_list, opts))
4700 return -1;
4702 if (item->command == TODO_EDIT) {
4703 struct commit *commit = item->commit;
4704 if (!res) {
4705 if (!opts->verbose)
4706 term_clear_line();
4707 fprintf(stderr,
4708 _("Stopped at %s... %.*s\n"),
4709 short_commit_name(commit),
4710 item->arg_len, arg);
4712 return error_with_patch(r, commit,
4713 arg, item->arg_len, opts, res, !res);
4715 if (is_rebase_i(opts) && !res)
4716 record_in_rewritten(&item->commit->object.oid,
4717 peek_command(todo_list, 1));
4718 if (res && is_fixup(item->command)) {
4719 if (res == 1)
4720 intend_to_amend();
4721 return error_failed_squash(r, item->commit, opts,
4722 item->arg_len, arg);
4723 } else if (res && is_rebase_i(opts) && item->commit) {
4724 int to_amend = 0;
4725 struct object_id oid;
4728 * If we are rewording and have either
4729 * fast-forwarded already, or are about to
4730 * create a new root commit, we want to amend,
4731 * otherwise we do not.
4733 if (item->command == TODO_REWORD &&
4734 !get_oid("HEAD", &oid) &&
4735 (oideq(&item->commit->object.oid, &oid) ||
4736 (opts->have_squash_onto &&
4737 oideq(&opts->squash_onto, &oid))))
4738 to_amend = 1;
4740 return res | error_with_patch(r, item->commit,
4741 arg, item->arg_len, opts,
4742 res, to_amend);
4744 } else if (item->command == TODO_EXEC) {
4745 char *end_of_arg = (char *)(arg + item->arg_len);
4746 int saved = *end_of_arg;
4748 if (!opts->verbose)
4749 term_clear_line();
4750 *end_of_arg = '\0';
4751 res = do_exec(r, arg);
4752 *end_of_arg = saved;
4754 if (res) {
4755 if (opts->reschedule_failed_exec)
4756 reschedule = 1;
4758 check_todo = 1;
4759 } else if (item->command == TODO_LABEL) {
4760 if ((res = do_label(r, arg, item->arg_len)))
4761 reschedule = 1;
4762 } else if (item->command == TODO_RESET) {
4763 if ((res = do_reset(r, arg, item->arg_len, opts)))
4764 reschedule = 1;
4765 } else if (item->command == TODO_MERGE) {
4766 if ((res = do_merge(r, item->commit, arg, item->arg_len,
4767 item->flags, &check_todo, opts)) < 0)
4768 reschedule = 1;
4769 else if (item->commit)
4770 record_in_rewritten(&item->commit->object.oid,
4771 peek_command(todo_list, 1));
4772 if (res > 0)
4773 /* failed with merge conflicts */
4774 return error_with_patch(r, item->commit,
4775 arg, item->arg_len,
4776 opts, res, 0);
4777 } else if (item->command == TODO_UPDATE_REF) {
4778 struct strbuf ref = STRBUF_INIT;
4779 strbuf_add(&ref, arg, item->arg_len);
4780 if ((res = do_update_ref(r, ref.buf)))
4781 reschedule = 1;
4782 strbuf_release(&ref);
4783 } else if (!is_noop(item->command))
4784 return error(_("unknown command %d"), item->command);
4786 if (reschedule) {
4787 advise(_(rescheduled_advice),
4788 get_item_line_length(todo_list,
4789 todo_list->current),
4790 get_item_line(todo_list, todo_list->current));
4791 todo_list->current--;
4792 if (save_todo(todo_list, opts))
4793 return -1;
4794 if (item->commit)
4795 return error_with_patch(r,
4796 item->commit,
4797 arg, item->arg_len,
4798 opts, res, 0);
4799 } else if (is_rebase_i(opts) && check_todo && !res &&
4800 reread_todo_if_changed(r, todo_list, opts)) {
4801 return -1;
4804 todo_list->current++;
4805 if (res)
4806 return res;
4809 if (is_rebase_i(opts)) {
4810 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
4811 struct stat st;
4813 /* Stopped in the middle, as planned? */
4814 if (todo_list->current < todo_list->nr)
4815 return 0;
4817 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
4818 starts_with(head_ref.buf, "refs/")) {
4819 const char *msg;
4820 struct object_id head, orig;
4821 int res;
4823 if (get_oid("HEAD", &head)) {
4824 res = error(_("cannot read HEAD"));
4825 cleanup_head_ref:
4826 strbuf_release(&head_ref);
4827 strbuf_release(&buf);
4828 return res;
4830 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
4831 get_oid_hex(buf.buf, &orig)) {
4832 res = error(_("could not read orig-head"));
4833 goto cleanup_head_ref;
4835 strbuf_reset(&buf);
4836 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
4837 res = error(_("could not read 'onto'"));
4838 goto cleanup_head_ref;
4840 msg = reflog_message(opts, "finish", "%s onto %s",
4841 head_ref.buf, buf.buf);
4842 if (update_ref(msg, head_ref.buf, &head, &orig,
4843 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
4844 res = error(_("could not update %s"),
4845 head_ref.buf);
4846 goto cleanup_head_ref;
4848 msg = reflog_message(opts, "finish", "returning to %s",
4849 head_ref.buf);
4850 if (create_symref("HEAD", head_ref.buf, msg)) {
4851 res = error(_("could not update HEAD to %s"),
4852 head_ref.buf);
4853 goto cleanup_head_ref;
4855 strbuf_reset(&buf);
4858 if (opts->verbose) {
4859 struct rev_info log_tree_opt;
4860 struct object_id orig, head;
4862 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
4863 repo_init_revisions(r, &log_tree_opt, NULL);
4864 log_tree_opt.diff = 1;
4865 log_tree_opt.diffopt.output_format =
4866 DIFF_FORMAT_DIFFSTAT;
4867 log_tree_opt.disable_stdin = 1;
4869 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
4870 !get_oid(buf.buf, &orig) &&
4871 !get_oid("HEAD", &head)) {
4872 diff_tree_oid(&orig, &head, "",
4873 &log_tree_opt.diffopt);
4874 log_tree_diff_flush(&log_tree_opt);
4876 release_revisions(&log_tree_opt);
4878 flush_rewritten_pending();
4879 if (!stat(rebase_path_rewritten_list(), &st) &&
4880 st.st_size > 0) {
4881 struct child_process child = CHILD_PROCESS_INIT;
4882 struct run_hooks_opt hook_opt = RUN_HOOKS_OPT_INIT;
4884 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
4885 child.git_cmd = 1;
4886 strvec_push(&child.args, "notes");
4887 strvec_push(&child.args, "copy");
4888 strvec_push(&child.args, "--for-rewrite=rebase");
4889 /* we don't care if this copying failed */
4890 run_command(&child);
4892 hook_opt.path_to_stdin = rebase_path_rewritten_list();
4893 strvec_push(&hook_opt.args, "rebase");
4894 run_hooks_opt("post-rewrite", &hook_opt);
4896 apply_autostash(rebase_path_autostash());
4898 if (!opts->quiet) {
4899 if (!opts->verbose)
4900 term_clear_line();
4901 fprintf(stderr,
4902 _("Successfully rebased and updated %s.\n"),
4903 head_ref.buf);
4906 strbuf_release(&buf);
4907 strbuf_release(&head_ref);
4909 if (do_update_refs(r, opts->quiet))
4910 return -1;
4914 * Sequence of picks finished successfully; cleanup by
4915 * removing the .git/sequencer directory
4917 return sequencer_remove_state(opts);
4920 static int continue_single_pick(struct repository *r, struct replay_opts *opts)
4922 struct child_process cmd = CHILD_PROCESS_INIT;
4924 if (!refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD") &&
4925 !refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD"))
4926 return error(_("no cherry-pick or revert in progress"));
4928 cmd.git_cmd = 1;
4929 strvec_push(&cmd.args, "commit");
4932 * continue_single_pick() handles the case of recovering from a
4933 * conflict. should_edit() doesn't handle that case; for a conflict,
4934 * we want to edit if the user asked for it, or if they didn't specify
4935 * and stdin is a tty.
4937 if (!opts->edit || (opts->edit < 0 && !isatty(0)))
4939 * Include --cleanup=strip as well because we don't want the
4940 * "# Conflicts:" messages.
4942 strvec_pushl(&cmd.args, "--no-edit", "--cleanup=strip", NULL);
4944 return run_command(&cmd);
4947 static int commit_staged_changes(struct repository *r,
4948 struct replay_opts *opts,
4949 struct todo_list *todo_list)
4951 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
4952 unsigned int final_fixup = 0, is_clean;
4954 if (has_unstaged_changes(r, 1))
4955 return error(_("cannot rebase: You have unstaged changes."));
4957 is_clean = !has_uncommitted_changes(r, 0);
4959 if (file_exists(rebase_path_amend())) {
4960 struct strbuf rev = STRBUF_INIT;
4961 struct object_id head, to_amend;
4963 if (get_oid("HEAD", &head))
4964 return error(_("cannot amend non-existing commit"));
4965 if (!read_oneliner(&rev, rebase_path_amend(), 0))
4966 return error(_("invalid file: '%s'"), rebase_path_amend());
4967 if (get_oid_hex(rev.buf, &to_amend))
4968 return error(_("invalid contents: '%s'"),
4969 rebase_path_amend());
4970 if (!is_clean && !oideq(&head, &to_amend))
4971 return error(_("\nYou have uncommitted changes in your "
4972 "working tree. Please, commit them\n"
4973 "first and then run 'git rebase "
4974 "--continue' again."));
4976 * When skipping a failed fixup/squash, we need to edit the
4977 * commit message, the current fixup list and count, and if it
4978 * was the last fixup/squash in the chain, we need to clean up
4979 * the commit message and if there was a squash, let the user
4980 * edit it.
4982 if (!is_clean || !opts->current_fixup_count)
4983 ; /* this is not the final fixup */
4984 else if (!oideq(&head, &to_amend) ||
4985 !file_exists(rebase_path_stopped_sha())) {
4986 /* was a final fixup or squash done manually? */
4987 if (!is_fixup(peek_command(todo_list, 0))) {
4988 unlink(rebase_path_fixup_msg());
4989 unlink(rebase_path_squash_msg());
4990 unlink(rebase_path_current_fixups());
4991 strbuf_reset(&opts->current_fixups);
4992 opts->current_fixup_count = 0;
4994 } else {
4995 /* we are in a fixup/squash chain */
4996 const char *p = opts->current_fixups.buf;
4997 int len = opts->current_fixups.len;
4999 opts->current_fixup_count--;
5000 if (!len)
5001 BUG("Incorrect current_fixups:\n%s", p);
5002 while (len && p[len - 1] != '\n')
5003 len--;
5004 strbuf_setlen(&opts->current_fixups, len);
5005 if (write_message(p, len, rebase_path_current_fixups(),
5006 0) < 0)
5007 return error(_("could not write file: '%s'"),
5008 rebase_path_current_fixups());
5011 * If a fixup/squash in a fixup/squash chain failed, the
5012 * commit message is already correct, no need to commit
5013 * it again.
5015 * Only if it is the final command in the fixup/squash
5016 * chain, and only if the chain is longer than a single
5017 * fixup/squash command (which was just skipped), do we
5018 * actually need to re-commit with a cleaned up commit
5019 * message.
5021 if (opts->current_fixup_count > 0 &&
5022 !is_fixup(peek_command(todo_list, 0))) {
5023 final_fixup = 1;
5025 * If there was not a single "squash" in the
5026 * chain, we only need to clean up the commit
5027 * message, no need to bother the user with
5028 * opening the commit message in the editor.
5030 if (!starts_with(p, "squash ") &&
5031 !strstr(p, "\nsquash "))
5032 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
5033 } else if (is_fixup(peek_command(todo_list, 0))) {
5035 * We need to update the squash message to skip
5036 * the latest commit message.
5038 struct commit *commit;
5039 const char *path = rebase_path_squash_msg();
5040 const char *encoding = get_commit_output_encoding();
5042 if (parse_head(r, &commit) ||
5043 !(p = logmsg_reencode(commit, NULL, encoding)) ||
5044 write_message(p, strlen(p), path, 0)) {
5045 unuse_commit_buffer(commit, p);
5046 return error(_("could not write file: "
5047 "'%s'"), path);
5049 unuse_commit_buffer(commit, p);
5053 strbuf_release(&rev);
5054 flags |= AMEND_MSG;
5057 if (is_clean) {
5058 if (refs_ref_exists(get_main_ref_store(r),
5059 "CHERRY_PICK_HEAD") &&
5060 refs_delete_ref(get_main_ref_store(r), "",
5061 "CHERRY_PICK_HEAD", NULL, 0))
5062 return error(_("could not remove CHERRY_PICK_HEAD"));
5063 if (unlink(git_path_merge_msg(r)) && errno != ENOENT)
5064 return error_errno(_("could not remove '%s'"),
5065 git_path_merge_msg(r));
5066 if (!final_fixup)
5067 return 0;
5070 if (run_git_commit(final_fixup ? NULL : rebase_path_message(),
5071 opts, flags))
5072 return error(_("could not commit staged changes."));
5073 unlink(rebase_path_amend());
5074 unlink(git_path_merge_head(r));
5075 unlink(git_path_auto_merge(r));
5076 if (final_fixup) {
5077 unlink(rebase_path_fixup_msg());
5078 unlink(rebase_path_squash_msg());
5080 if (opts->current_fixup_count > 0) {
5082 * Whether final fixup or not, we just cleaned up the commit
5083 * message...
5085 unlink(rebase_path_current_fixups());
5086 strbuf_reset(&opts->current_fixups);
5087 opts->current_fixup_count = 0;
5089 return 0;
5092 int sequencer_continue(struct repository *r, struct replay_opts *opts)
5094 struct todo_list todo_list = TODO_LIST_INIT;
5095 int res;
5097 if (read_and_refresh_cache(r, opts))
5098 return -1;
5100 if (read_populate_opts(opts))
5101 return -1;
5102 if (is_rebase_i(opts)) {
5103 if ((res = read_populate_todo(r, &todo_list, opts)))
5104 goto release_todo_list;
5106 if (file_exists(rebase_path_dropped())) {
5107 if ((res = todo_list_check_against_backup(r, &todo_list)))
5108 goto release_todo_list;
5110 unlink(rebase_path_dropped());
5113 opts->reflog_message = reflog_message(opts, "continue", NULL);
5114 if (commit_staged_changes(r, opts, &todo_list)) {
5115 res = -1;
5116 goto release_todo_list;
5118 } else if (!file_exists(get_todo_path(opts)))
5119 return continue_single_pick(r, opts);
5120 else if ((res = read_populate_todo(r, &todo_list, opts)))
5121 goto release_todo_list;
5123 if (!is_rebase_i(opts)) {
5124 /* Verify that the conflict has been resolved */
5125 if (refs_ref_exists(get_main_ref_store(r),
5126 "CHERRY_PICK_HEAD") ||
5127 refs_ref_exists(get_main_ref_store(r), "REVERT_HEAD")) {
5128 res = continue_single_pick(r, opts);
5129 if (res)
5130 goto release_todo_list;
5132 if (index_differs_from(r, "HEAD", NULL, 0)) {
5133 res = error_dirty_index(r, opts);
5134 goto release_todo_list;
5136 todo_list.current++;
5137 } else if (file_exists(rebase_path_stopped_sha())) {
5138 struct strbuf buf = STRBUF_INIT;
5139 struct object_id oid;
5141 if (read_oneliner(&buf, rebase_path_stopped_sha(),
5142 READ_ONELINER_SKIP_IF_EMPTY) &&
5143 !get_oid_hex(buf.buf, &oid))
5144 record_in_rewritten(&oid, peek_command(&todo_list, 0));
5145 strbuf_release(&buf);
5148 res = pick_commits(r, &todo_list, opts);
5149 release_todo_list:
5150 todo_list_release(&todo_list);
5151 return res;
5154 static int single_pick(struct repository *r,
5155 struct commit *cmit,
5156 struct replay_opts *opts)
5158 int check_todo;
5159 struct todo_item item;
5161 item.command = opts->action == REPLAY_PICK ?
5162 TODO_PICK : TODO_REVERT;
5163 item.commit = cmit;
5165 opts->reflog_message = sequencer_reflog_action(opts);
5166 return do_pick_commit(r, &item, opts, 0, &check_todo);
5169 int sequencer_pick_revisions(struct repository *r,
5170 struct replay_opts *opts)
5172 struct todo_list todo_list = TODO_LIST_INIT;
5173 struct object_id oid;
5174 int i, res;
5176 assert(opts->revs);
5177 if (read_and_refresh_cache(r, opts))
5178 return -1;
5180 for (i = 0; i < opts->revs->pending.nr; i++) {
5181 struct object_id oid;
5182 const char *name = opts->revs->pending.objects[i].name;
5184 /* This happens when using --stdin. */
5185 if (!strlen(name))
5186 continue;
5188 if (!get_oid(name, &oid)) {
5189 if (!lookup_commit_reference_gently(r, &oid, 1)) {
5190 enum object_type type = oid_object_info(r,
5191 &oid,
5192 NULL);
5193 return error(_("%s: can't cherry-pick a %s"),
5194 name, type_name(type));
5196 } else
5197 return error(_("%s: bad revision"), name);
5201 * If we were called as "git cherry-pick <commit>", just
5202 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
5203 * REVERT_HEAD, and don't touch the sequencer state.
5204 * This means it is possible to cherry-pick in the middle
5205 * of a cherry-pick sequence.
5207 if (opts->revs->cmdline.nr == 1 &&
5208 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
5209 opts->revs->no_walk &&
5210 !opts->revs->cmdline.rev->flags) {
5211 struct commit *cmit;
5212 if (prepare_revision_walk(opts->revs))
5213 return error(_("revision walk setup failed"));
5214 cmit = get_revision(opts->revs);
5215 if (!cmit)
5216 return error(_("empty commit set passed"));
5217 if (get_revision(opts->revs))
5218 BUG("unexpected extra commit from walk");
5219 return single_pick(r, cmit, opts);
5223 * Start a new cherry-pick/ revert sequence; but
5224 * first, make sure that an existing one isn't in
5225 * progress
5228 if (walk_revs_populate_todo(&todo_list, opts) ||
5229 create_seq_dir(r) < 0)
5230 return -1;
5231 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
5232 return error(_("can't revert as initial commit"));
5233 if (save_head(oid_to_hex(&oid)))
5234 return -1;
5235 if (save_opts(opts))
5236 return -1;
5237 update_abort_safety_file();
5238 res = pick_commits(r, &todo_list, opts);
5239 todo_list_release(&todo_list);
5240 return res;
5243 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
5245 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
5246 struct strbuf sob = STRBUF_INIT;
5247 int has_footer;
5249 strbuf_addstr(&sob, sign_off_header);
5250 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
5251 strbuf_addch(&sob, '\n');
5253 if (!ignore_footer)
5254 strbuf_complete_line(msgbuf);
5257 * If the whole message buffer is equal to the sob, pretend that we
5258 * found a conforming footer with a matching sob
5260 if (msgbuf->len - ignore_footer == sob.len &&
5261 !strncmp(msgbuf->buf, sob.buf, sob.len))
5262 has_footer = 3;
5263 else
5264 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
5266 if (!has_footer) {
5267 const char *append_newlines = NULL;
5268 size_t len = msgbuf->len - ignore_footer;
5270 if (!len) {
5272 * The buffer is completely empty. Leave foom for
5273 * the title and body to be filled in by the user.
5275 append_newlines = "\n\n";
5276 } else if (len == 1) {
5278 * Buffer contains a single newline. Add another
5279 * so that we leave room for the title and body.
5281 append_newlines = "\n";
5282 } else if (msgbuf->buf[len - 2] != '\n') {
5284 * Buffer ends with a single newline. Add another
5285 * so that there is an empty line between the message
5286 * body and the sob.
5288 append_newlines = "\n";
5289 } /* else, the buffer already ends with two newlines. */
5291 if (append_newlines)
5292 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5293 append_newlines, strlen(append_newlines));
5296 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
5297 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
5298 sob.buf, sob.len);
5300 strbuf_release(&sob);
5303 struct labels_entry {
5304 struct hashmap_entry entry;
5305 char label[FLEX_ARRAY];
5308 static int labels_cmp(const void *fndata UNUSED,
5309 const struct hashmap_entry *eptr,
5310 const struct hashmap_entry *entry_or_key, const void *key)
5312 const struct labels_entry *a, *b;
5314 a = container_of(eptr, const struct labels_entry, entry);
5315 b = container_of(entry_or_key, const struct labels_entry, entry);
5317 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
5320 struct string_entry {
5321 struct oidmap_entry entry;
5322 char string[FLEX_ARRAY];
5325 struct label_state {
5326 struct oidmap commit2label;
5327 struct hashmap labels;
5328 struct strbuf buf;
5331 static const char *label_oid(struct object_id *oid, const char *label,
5332 struct label_state *state)
5334 struct labels_entry *labels_entry;
5335 struct string_entry *string_entry;
5336 struct object_id dummy;
5337 int i;
5339 string_entry = oidmap_get(&state->commit2label, oid);
5340 if (string_entry)
5341 return string_entry->string;
5344 * For "uninteresting" commits, i.e. commits that are not to be
5345 * rebased, and which can therefore not be labeled, we use a unique
5346 * abbreviation of the commit name. This is slightly more complicated
5347 * than calling find_unique_abbrev() because we also need to make
5348 * sure that the abbreviation does not conflict with any other
5349 * label.
5351 * We disallow "interesting" commits to be labeled by a string that
5352 * is a valid full-length hash, to ensure that we always can find an
5353 * abbreviation for any uninteresting commit's names that does not
5354 * clash with any other label.
5356 strbuf_reset(&state->buf);
5357 if (!label) {
5358 char *p;
5360 strbuf_grow(&state->buf, GIT_MAX_HEXSZ);
5361 label = p = state->buf.buf;
5363 find_unique_abbrev_r(p, oid, default_abbrev);
5366 * We may need to extend the abbreviated hash so that there is
5367 * no conflicting label.
5369 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
5370 size_t i = strlen(p) + 1;
5372 oid_to_hex_r(p, oid);
5373 for (; i < the_hash_algo->hexsz; i++) {
5374 char save = p[i];
5375 p[i] = '\0';
5376 if (!hashmap_get_from_hash(&state->labels,
5377 strihash(p), p))
5378 break;
5379 p[i] = save;
5382 } else {
5383 struct strbuf *buf = &state->buf;
5386 * Sanitize labels by replacing non-alpha-numeric characters
5387 * (including white-space ones) by dashes, as they might be
5388 * illegal in file names (and hence in ref names).
5390 * Note that we retain non-ASCII UTF-8 characters (identified
5391 * via the most significant bit). They should be all acceptable
5392 * in file names. We do not validate the UTF-8 here, that's not
5393 * the job of this function.
5395 for (; *label; label++)
5396 if ((*label & 0x80) || isalnum(*label))
5397 strbuf_addch(buf, *label);
5398 /* avoid leading dash and double-dashes */
5399 else if (buf->len && buf->buf[buf->len - 1] != '-')
5400 strbuf_addch(buf, '-');
5401 if (!buf->len) {
5402 strbuf_addstr(buf, "rev-");
5403 strbuf_add_unique_abbrev(buf, oid, default_abbrev);
5405 label = buf->buf;
5407 if ((buf->len == the_hash_algo->hexsz &&
5408 !get_oid_hex(label, &dummy)) ||
5409 (buf->len == 1 && *label == '#') ||
5410 hashmap_get_from_hash(&state->labels,
5411 strihash(label), label)) {
5413 * If the label already exists, or if the label is a
5414 * valid full OID, or the label is a '#' (which we use
5415 * as a separator between merge heads and oneline), we
5416 * append a dash and a number to make it unique.
5418 size_t len = buf->len;
5420 for (i = 2; ; i++) {
5421 strbuf_setlen(buf, len);
5422 strbuf_addf(buf, "-%d", i);
5423 if (!hashmap_get_from_hash(&state->labels,
5424 strihash(buf->buf),
5425 buf->buf))
5426 break;
5429 label = buf->buf;
5433 FLEX_ALLOC_STR(labels_entry, label, label);
5434 hashmap_entry_init(&labels_entry->entry, strihash(label));
5435 hashmap_add(&state->labels, &labels_entry->entry);
5437 FLEX_ALLOC_STR(string_entry, string, label);
5438 oidcpy(&string_entry->entry.oid, oid);
5439 oidmap_put(&state->commit2label, string_entry);
5441 return string_entry->string;
5444 static int make_script_with_merges(struct pretty_print_context *pp,
5445 struct rev_info *revs, struct strbuf *out,
5446 unsigned flags)
5448 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
5449 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
5450 int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
5451 int skipped_commit = 0;
5452 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
5453 struct strbuf label = STRBUF_INIT;
5454 struct commit_list *commits = NULL, **tail = &commits, *iter;
5455 struct commit_list *tips = NULL, **tips_tail = &tips;
5456 struct commit *commit;
5457 struct oidmap commit2todo = OIDMAP_INIT;
5458 struct string_entry *entry;
5459 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
5460 shown = OIDSET_INIT;
5461 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
5463 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
5464 const char *cmd_pick = abbr ? "p" : "pick",
5465 *cmd_label = abbr ? "l" : "label",
5466 *cmd_reset = abbr ? "t" : "reset",
5467 *cmd_merge = abbr ? "m" : "merge";
5469 oidmap_init(&commit2todo, 0);
5470 oidmap_init(&state.commit2label, 0);
5471 hashmap_init(&state.labels, labels_cmp, NULL, 0);
5472 strbuf_init(&state.buf, 32);
5474 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
5475 struct labels_entry *onto_label_entry;
5476 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
5477 FLEX_ALLOC_STR(entry, string, "onto");
5478 oidcpy(&entry->entry.oid, oid);
5479 oidmap_put(&state.commit2label, entry);
5481 FLEX_ALLOC_STR(onto_label_entry, label, "onto");
5482 hashmap_entry_init(&onto_label_entry->entry, strihash("onto"));
5483 hashmap_add(&state.labels, &onto_label_entry->entry);
5487 * First phase:
5488 * - get onelines for all commits
5489 * - gather all branch tips (i.e. 2nd or later parents of merges)
5490 * - label all branch tips
5492 while ((commit = get_revision(revs))) {
5493 struct commit_list *to_merge;
5494 const char *p1, *p2;
5495 struct object_id *oid;
5496 int is_empty;
5498 tail = &commit_list_insert(commit, tail)->next;
5499 oidset_insert(&interesting, &commit->object.oid);
5501 is_empty = is_original_commit_empty(commit);
5502 if (!is_empty && (commit->object.flags & PATCHSAME)) {
5503 if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
5504 warning(_("skipped previously applied commit %s"),
5505 short_commit_name(commit));
5506 skipped_commit = 1;
5507 continue;
5509 if (is_empty && !keep_empty)
5510 continue;
5512 strbuf_reset(&oneline);
5513 pretty_print_commit(pp, commit, &oneline);
5515 to_merge = commit->parents ? commit->parents->next : NULL;
5516 if (!to_merge) {
5517 /* non-merge commit: easy case */
5518 strbuf_reset(&buf);
5519 strbuf_addf(&buf, "%s %s %s", cmd_pick,
5520 oid_to_hex(&commit->object.oid),
5521 oneline.buf);
5522 if (is_empty)
5523 strbuf_addf(&buf, " %c empty",
5524 comment_line_char);
5526 FLEX_ALLOC_STR(entry, string, buf.buf);
5527 oidcpy(&entry->entry.oid, &commit->object.oid);
5528 oidmap_put(&commit2todo, entry);
5530 continue;
5533 /* Create a label */
5534 strbuf_reset(&label);
5535 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
5536 (p1 = strchr(p1, '\'')) &&
5537 (p2 = strchr(++p1, '\'')))
5538 strbuf_add(&label, p1, p2 - p1);
5539 else if (skip_prefix(oneline.buf, "Merge pull request ",
5540 &p1) &&
5541 (p1 = strstr(p1, " from ")))
5542 strbuf_addstr(&label, p1 + strlen(" from "));
5543 else
5544 strbuf_addbuf(&label, &oneline);
5546 strbuf_reset(&buf);
5547 strbuf_addf(&buf, "%s -C %s",
5548 cmd_merge, oid_to_hex(&commit->object.oid));
5550 /* label the tips of merged branches */
5551 for (; to_merge; to_merge = to_merge->next) {
5552 oid = &to_merge->item->object.oid;
5553 strbuf_addch(&buf, ' ');
5555 if (!oidset_contains(&interesting, oid)) {
5556 strbuf_addstr(&buf, label_oid(oid, NULL,
5557 &state));
5558 continue;
5561 tips_tail = &commit_list_insert(to_merge->item,
5562 tips_tail)->next;
5564 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
5566 strbuf_addf(&buf, " # %s", oneline.buf);
5568 FLEX_ALLOC_STR(entry, string, buf.buf);
5569 oidcpy(&entry->entry.oid, &commit->object.oid);
5570 oidmap_put(&commit2todo, entry);
5572 if (skipped_commit)
5573 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
5574 _("use --reapply-cherry-picks to include skipped commits"));
5577 * Second phase:
5578 * - label branch points
5579 * - add HEAD to the branch tips
5581 for (iter = commits; iter; iter = iter->next) {
5582 struct commit_list *parent = iter->item->parents;
5583 for (; parent; parent = parent->next) {
5584 struct object_id *oid = &parent->item->object.oid;
5585 if (!oidset_contains(&interesting, oid))
5586 continue;
5587 if (oidset_insert(&child_seen, oid))
5588 label_oid(oid, "branch-point", &state);
5591 /* Add HEAD as implicit "tip of branch" */
5592 if (!iter->next)
5593 tips_tail = &commit_list_insert(iter->item,
5594 tips_tail)->next;
5598 * Third phase: output the todo list. This is a bit tricky, as we
5599 * want to avoid jumping back and forth between revisions. To
5600 * accomplish that goal, we walk backwards from the branch tips,
5601 * gathering commits not yet shown, reversing the list on the fly,
5602 * then outputting that list (labeling revisions as needed).
5604 strbuf_addf(out, "%s onto\n", cmd_label);
5605 for (iter = tips; iter; iter = iter->next) {
5606 struct commit_list *list = NULL, *iter2;
5608 commit = iter->item;
5609 if (oidset_contains(&shown, &commit->object.oid))
5610 continue;
5611 entry = oidmap_get(&state.commit2label, &commit->object.oid);
5613 if (entry)
5614 strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
5615 else
5616 strbuf_addch(out, '\n');
5618 while (oidset_contains(&interesting, &commit->object.oid) &&
5619 !oidset_contains(&shown, &commit->object.oid)) {
5620 commit_list_insert(commit, &list);
5621 if (!commit->parents) {
5622 commit = NULL;
5623 break;
5625 commit = commit->parents->item;
5628 if (!commit)
5629 strbuf_addf(out, "%s %s\n", cmd_reset,
5630 rebase_cousins || root_with_onto ?
5631 "onto" : "[new root]");
5632 else {
5633 const char *to = NULL;
5635 entry = oidmap_get(&state.commit2label,
5636 &commit->object.oid);
5637 if (entry)
5638 to = entry->string;
5639 else if (!rebase_cousins)
5640 to = label_oid(&commit->object.oid, NULL,
5641 &state);
5643 if (!to || !strcmp(to, "onto"))
5644 strbuf_addf(out, "%s onto\n", cmd_reset);
5645 else {
5646 strbuf_reset(&oneline);
5647 pretty_print_commit(pp, commit, &oneline);
5648 strbuf_addf(out, "%s %s # %s\n",
5649 cmd_reset, to, oneline.buf);
5653 for (iter2 = list; iter2; iter2 = iter2->next) {
5654 struct object_id *oid = &iter2->item->object.oid;
5655 entry = oidmap_get(&commit2todo, oid);
5656 /* only show if not already upstream */
5657 if (entry)
5658 strbuf_addf(out, "%s\n", entry->string);
5659 entry = oidmap_get(&state.commit2label, oid);
5660 if (entry)
5661 strbuf_addf(out, "%s %s\n",
5662 cmd_label, entry->string);
5663 oidset_insert(&shown, oid);
5666 free_commit_list(list);
5669 free_commit_list(commits);
5670 free_commit_list(tips);
5672 strbuf_release(&label);
5673 strbuf_release(&oneline);
5674 strbuf_release(&buf);
5676 oidmap_free(&commit2todo, 1);
5677 oidmap_free(&state.commit2label, 1);
5678 hashmap_clear_and_free(&state.labels, struct labels_entry, entry);
5679 strbuf_release(&state.buf);
5681 return 0;
5684 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
5685 const char **argv, unsigned flags)
5687 char *format = NULL;
5688 struct pretty_print_context pp = {0};
5689 struct rev_info revs;
5690 struct commit *commit;
5691 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
5692 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
5693 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
5694 int reapply_cherry_picks = flags & TODO_LIST_REAPPLY_CHERRY_PICKS;
5695 int skipped_commit = 0;
5696 int ret = 0;
5698 repo_init_revisions(r, &revs, NULL);
5699 revs.verbose_header = 1;
5700 if (!rebase_merges)
5701 revs.max_parents = 1;
5702 revs.cherry_mark = !reapply_cherry_picks;
5703 revs.limited = 1;
5704 revs.reverse = 1;
5705 revs.right_only = 1;
5706 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
5707 revs.topo_order = 1;
5709 revs.pretty_given = 1;
5710 git_config_get_string("rebase.instructionFormat", &format);
5711 if (!format || !*format) {
5712 free(format);
5713 format = xstrdup("%s");
5715 get_commit_format(format, &revs);
5716 free(format);
5717 pp.fmt = revs.commit_format;
5718 pp.output_encoding = get_log_output_encoding();
5720 if (setup_revisions(argc, argv, &revs, NULL) > 1) {
5721 ret = error(_("make_script: unhandled options"));
5722 goto cleanup;
5725 if (prepare_revision_walk(&revs) < 0) {
5726 ret = error(_("make_script: error preparing revisions"));
5727 goto cleanup;
5730 if (rebase_merges) {
5731 ret = make_script_with_merges(&pp, &revs, out, flags);
5732 goto cleanup;
5735 while ((commit = get_revision(&revs))) {
5736 int is_empty = is_original_commit_empty(commit);
5738 if (!is_empty && (commit->object.flags & PATCHSAME)) {
5739 if (flags & TODO_LIST_WARN_SKIPPED_CHERRY_PICKS)
5740 warning(_("skipped previously applied commit %s"),
5741 short_commit_name(commit));
5742 skipped_commit = 1;
5743 continue;
5745 if (is_empty && !keep_empty)
5746 continue;
5747 strbuf_addf(out, "%s %s ", insn,
5748 oid_to_hex(&commit->object.oid));
5749 pretty_print_commit(&pp, commit, out);
5750 if (is_empty)
5751 strbuf_addf(out, " %c empty", comment_line_char);
5752 strbuf_addch(out, '\n');
5754 if (skipped_commit)
5755 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS,
5756 _("use --reapply-cherry-picks to include skipped commits"));
5757 cleanup:
5758 release_revisions(&revs);
5759 return ret;
5763 * Add commands after pick and (series of) squash/fixup commands
5764 * in the todo list.
5766 static void todo_list_add_exec_commands(struct todo_list *todo_list,
5767 struct string_list *commands)
5769 struct strbuf *buf = &todo_list->buf;
5770 size_t base_offset = buf->len;
5771 int i, insert, nr = 0, alloc = 0;
5772 struct todo_item *items = NULL, *base_items = NULL;
5774 CALLOC_ARRAY(base_items, commands->nr);
5775 for (i = 0; i < commands->nr; i++) {
5776 size_t command_len = strlen(commands->items[i].string);
5778 strbuf_addstr(buf, commands->items[i].string);
5779 strbuf_addch(buf, '\n');
5781 base_items[i].command = TODO_EXEC;
5782 base_items[i].offset_in_buf = base_offset;
5783 base_items[i].arg_offset = base_offset;
5784 base_items[i].arg_len = command_len;
5786 base_offset += command_len + 1;
5790 * Insert <commands> after every pick. Here, fixup/squash chains
5791 * are considered part of the pick, so we insert the commands *after*
5792 * those chains if there are any.
5794 * As we insert the exec commands immediately after rearranging
5795 * any fixups and before the user edits the list, a fixup chain
5796 * can never contain comments (any comments are empty picks that
5797 * have been commented out because the user did not specify
5798 * --keep-empty). So, it is safe to insert an exec command
5799 * without looking at the command following a comment.
5801 insert = 0;
5802 for (i = 0; i < todo_list->nr; i++) {
5803 enum todo_command command = todo_list->items[i].command;
5804 if (insert && !is_fixup(command)) {
5805 ALLOC_GROW(items, nr + commands->nr, alloc);
5806 COPY_ARRAY(items + nr, base_items, commands->nr);
5807 nr += commands->nr;
5809 insert = 0;
5812 ALLOC_GROW(items, nr + 1, alloc);
5813 items[nr++] = todo_list->items[i];
5815 if (command == TODO_PICK || command == TODO_MERGE)
5816 insert = 1;
5819 /* insert or append final <commands> */
5820 if (insert) {
5821 ALLOC_GROW(items, nr + commands->nr, alloc);
5822 COPY_ARRAY(items + nr, base_items, commands->nr);
5823 nr += commands->nr;
5826 free(base_items);
5827 FREE_AND_NULL(todo_list->items);
5828 todo_list->items = items;
5829 todo_list->nr = nr;
5830 todo_list->alloc = alloc;
5833 static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
5834 struct strbuf *buf, int num, unsigned flags)
5836 struct todo_item *item;
5837 int i, max = todo_list->nr;
5839 if (num > 0 && num < max)
5840 max = num;
5842 for (item = todo_list->items, i = 0; i < max; i++, item++) {
5843 char cmd;
5845 /* if the item is not a command write it and continue */
5846 if (item->command >= TODO_COMMENT) {
5847 strbuf_addf(buf, "%.*s\n", item->arg_len,
5848 todo_item_get_arg(todo_list, item));
5849 continue;
5852 /* add command to the buffer */
5853 cmd = command_to_char(item->command);
5854 if ((flags & TODO_LIST_ABBREVIATE_CMDS) && cmd)
5855 strbuf_addch(buf, cmd);
5856 else
5857 strbuf_addstr(buf, command_to_string(item->command));
5859 /* add commit id */
5860 if (item->commit) {
5861 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
5862 short_commit_name(item->commit) :
5863 oid_to_hex(&item->commit->object.oid);
5865 if (item->command == TODO_FIXUP) {
5866 if (item->flags & TODO_EDIT_FIXUP_MSG)
5867 strbuf_addstr(buf, " -c");
5868 else if (item->flags & TODO_REPLACE_FIXUP_MSG) {
5869 strbuf_addstr(buf, " -C");
5873 if (item->command == TODO_MERGE) {
5874 if (item->flags & TODO_EDIT_MERGE_MSG)
5875 strbuf_addstr(buf, " -c");
5876 else
5877 strbuf_addstr(buf, " -C");
5880 strbuf_addf(buf, " %s", oid);
5883 /* add all the rest */
5884 if (!item->arg_len)
5885 strbuf_addch(buf, '\n');
5886 else
5887 strbuf_addf(buf, " %.*s\n", item->arg_len,
5888 todo_item_get_arg(todo_list, item));
5892 int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
5893 const char *file, const char *shortrevisions,
5894 const char *shortonto, int num, unsigned flags)
5896 int res;
5897 struct strbuf buf = STRBUF_INIT;
5899 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
5900 if (flags & TODO_LIST_APPEND_TODO_HELP)
5901 append_todo_help(count_commands(todo_list),
5902 shortrevisions, shortonto, &buf);
5904 res = write_message(buf.buf, buf.len, file, 0);
5905 strbuf_release(&buf);
5907 return res;
5910 /* skip picking commits whose parents are unchanged */
5911 static int skip_unnecessary_picks(struct repository *r,
5912 struct todo_list *todo_list,
5913 struct object_id *base_oid)
5915 struct object_id *parent_oid;
5916 int i;
5918 for (i = 0; i < todo_list->nr; i++) {
5919 struct todo_item *item = todo_list->items + i;
5921 if (item->command >= TODO_NOOP)
5922 continue;
5923 if (item->command != TODO_PICK)
5924 break;
5925 if (parse_commit(item->commit)) {
5926 return error(_("could not parse commit '%s'"),
5927 oid_to_hex(&item->commit->object.oid));
5929 if (!item->commit->parents)
5930 break; /* root commit */
5931 if (item->commit->parents->next)
5932 break; /* merge commit */
5933 parent_oid = &item->commit->parents->item->object.oid;
5934 if (!oideq(parent_oid, base_oid))
5935 break;
5936 oidcpy(base_oid, &item->commit->object.oid);
5938 if (i > 0) {
5939 const char *done_path = rebase_path_done();
5941 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
5942 error_errno(_("could not write to '%s'"), done_path);
5943 return -1;
5946 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
5947 todo_list->nr -= i;
5948 todo_list->current = 0;
5949 todo_list->done_nr += i;
5951 if (is_fixup(peek_command(todo_list, 0)))
5952 record_in_rewritten(base_oid, peek_command(todo_list, 0));
5955 return 0;
5958 struct todo_add_branch_context {
5959 struct todo_item *items;
5960 size_t items_nr;
5961 size_t items_alloc;
5962 struct strbuf *buf;
5963 struct commit *commit;
5964 struct string_list refs_to_oids;
5967 static int add_decorations_to_list(const struct commit *commit,
5968 struct todo_add_branch_context *ctx)
5970 const struct name_decoration *decoration = get_name_decoration(&commit->object);
5971 const char *head_ref = resolve_ref_unsafe("HEAD",
5972 RESOLVE_REF_READING,
5973 NULL,
5974 NULL);
5976 while (decoration) {
5977 struct todo_item *item;
5978 const char *path;
5979 size_t base_offset = ctx->buf->len;
5982 * If the branch is the current HEAD, then it will be
5983 * updated by the default rebase behavior.
5985 if (head_ref && !strcmp(head_ref, decoration->name)) {
5986 decoration = decoration->next;
5987 continue;
5990 ALLOC_GROW(ctx->items,
5991 ctx->items_nr + 1,
5992 ctx->items_alloc);
5993 item = &ctx->items[ctx->items_nr];
5994 memset(item, 0, sizeof(*item));
5996 /* If the branch is checked out, then leave a comment instead. */
5997 if ((path = branch_checked_out(decoration->name))) {
5998 item->command = TODO_COMMENT;
5999 strbuf_addf(ctx->buf, "# Ref %s checked out at '%s'\n",
6000 decoration->name, path);
6001 } else {
6002 struct string_list_item *sti;
6003 item->command = TODO_UPDATE_REF;
6004 strbuf_addf(ctx->buf, "%s\n", decoration->name);
6006 sti = string_list_insert(&ctx->refs_to_oids,
6007 decoration->name);
6008 sti->util = init_update_ref_record(decoration->name);
6011 item->offset_in_buf = base_offset;
6012 item->arg_offset = base_offset;
6013 item->arg_len = ctx->buf->len - base_offset;
6014 ctx->items_nr++;
6016 decoration = decoration->next;
6019 return 0;
6023 * For each 'pick' command, find out if the commit has a decoration in
6024 * refs/heads/. If so, then add a 'label for-update-refs/' command.
6026 static int todo_list_add_update_ref_commands(struct todo_list *todo_list)
6028 int i, res;
6029 static struct string_list decorate_refs_exclude = STRING_LIST_INIT_NODUP;
6030 static struct string_list decorate_refs_exclude_config = STRING_LIST_INIT_NODUP;
6031 static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
6032 struct decoration_filter decoration_filter = {
6033 .include_ref_pattern = &decorate_refs_include,
6034 .exclude_ref_pattern = &decorate_refs_exclude,
6035 .exclude_ref_config_pattern = &decorate_refs_exclude_config,
6037 struct todo_add_branch_context ctx = {
6038 .buf = &todo_list->buf,
6039 .refs_to_oids = STRING_LIST_INIT_DUP,
6042 ctx.items_alloc = 2 * todo_list->nr + 1;
6043 ALLOC_ARRAY(ctx.items, ctx.items_alloc);
6045 string_list_append(&decorate_refs_include, "refs/heads/");
6046 load_ref_decorations(&decoration_filter, 0);
6048 for (i = 0; i < todo_list->nr; ) {
6049 struct todo_item *item = &todo_list->items[i];
6051 /* insert ith item into new list */
6052 ALLOC_GROW(ctx.items,
6053 ctx.items_nr + 1,
6054 ctx.items_alloc);
6056 ctx.items[ctx.items_nr++] = todo_list->items[i++];
6058 if (item->commit) {
6059 ctx.commit = item->commit;
6060 add_decorations_to_list(item->commit, &ctx);
6064 res = write_update_refs_state(&ctx.refs_to_oids);
6066 string_list_clear(&ctx.refs_to_oids, 1);
6068 if (res) {
6069 /* we failed, so clean up the new list. */
6070 free(ctx.items);
6071 return res;
6074 free(todo_list->items);
6075 todo_list->items = ctx.items;
6076 todo_list->nr = ctx.items_nr;
6077 todo_list->alloc = ctx.items_alloc;
6079 return 0;
6082 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
6083 const char *shortrevisions, const char *onto_name,
6084 struct commit *onto, const struct object_id *orig_head,
6085 struct string_list *commands, unsigned autosquash,
6086 unsigned update_refs,
6087 struct todo_list *todo_list)
6089 char shortonto[GIT_MAX_HEXSZ + 1];
6090 const char *todo_file = rebase_path_todo();
6091 struct todo_list new_todo = TODO_LIST_INIT;
6092 struct strbuf *buf = &todo_list->buf, buf2 = STRBUF_INIT;
6093 struct object_id oid = onto->object.oid;
6094 int res;
6096 find_unique_abbrev_r(shortonto, &oid, DEFAULT_ABBREV);
6098 if (buf->len == 0) {
6099 struct todo_item *item = append_new_todo(todo_list);
6100 item->command = TODO_NOOP;
6101 item->commit = NULL;
6102 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
6105 if (update_refs && todo_list_add_update_ref_commands(todo_list))
6106 return -1;
6108 if (autosquash && todo_list_rearrange_squash(todo_list))
6109 return -1;
6111 if (commands->nr)
6112 todo_list_add_exec_commands(todo_list, commands);
6114 if (count_commands(todo_list) == 0) {
6115 apply_autostash(rebase_path_autostash());
6116 sequencer_remove_state(opts);
6118 return error(_("nothing to do"));
6121 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
6122 shortonto, flags);
6123 if (res == -1)
6124 return -1;
6125 else if (res == -2) {
6126 apply_autostash(rebase_path_autostash());
6127 sequencer_remove_state(opts);
6129 return -1;
6130 } else if (res == -3) {
6131 apply_autostash(rebase_path_autostash());
6132 sequencer_remove_state(opts);
6133 todo_list_release(&new_todo);
6135 return error(_("nothing to do"));
6136 } else if (res == -4) {
6137 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
6138 todo_list_release(&new_todo);
6140 return -1;
6143 /* Expand the commit IDs */
6144 todo_list_to_strbuf(r, &new_todo, &buf2, -1, 0);
6145 strbuf_swap(&new_todo.buf, &buf2);
6146 strbuf_release(&buf2);
6147 new_todo.total_nr -= new_todo.nr;
6148 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) < 0)
6149 BUG("invalid todo list after expanding IDs:\n%s",
6150 new_todo.buf.buf);
6152 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
6153 todo_list_release(&new_todo);
6154 return error(_("could not skip unnecessary pick commands"));
6157 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
6158 flags & ~(TODO_LIST_SHORTEN_IDS))) {
6159 todo_list_release(&new_todo);
6160 return error_errno(_("could not write '%s'"), todo_file);
6163 res = -1;
6165 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
6166 goto cleanup;
6168 if (require_clean_work_tree(r, "rebase", "", 1, 1))
6169 goto cleanup;
6171 todo_list_write_total_nr(&new_todo);
6172 res = pick_commits(r, &new_todo, opts);
6174 cleanup:
6175 todo_list_release(&new_todo);
6177 return res;
6180 struct subject2item_entry {
6181 struct hashmap_entry entry;
6182 int i;
6183 char subject[FLEX_ARRAY];
6186 static int subject2item_cmp(const void *fndata UNUSED,
6187 const struct hashmap_entry *eptr,
6188 const struct hashmap_entry *entry_or_key,
6189 const void *key)
6191 const struct subject2item_entry *a, *b;
6193 a = container_of(eptr, const struct subject2item_entry, entry);
6194 b = container_of(entry_or_key, const struct subject2item_entry, entry);
6196 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
6199 define_commit_slab(commit_todo_item, struct todo_item *);
6201 static int skip_fixupish(const char *subject, const char **p) {
6202 return skip_prefix(subject, "fixup! ", p) ||
6203 skip_prefix(subject, "amend! ", p) ||
6204 skip_prefix(subject, "squash! ", p);
6208 * Rearrange the todo list that has both "pick commit-id msg" and "pick
6209 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
6210 * after the former, and change "pick" to "fixup"/"squash".
6212 * Note that if the config has specified a custom instruction format, each log
6213 * message will have to be retrieved from the commit (as the oneline in the
6214 * script cannot be trusted) in order to normalize the autosquash arrangement.
6216 int todo_list_rearrange_squash(struct todo_list *todo_list)
6218 struct hashmap subject2item;
6219 int rearranged = 0, *next, *tail, i, nr = 0, alloc = 0;
6220 char **subjects;
6221 struct commit_todo_item commit_todo;
6222 struct todo_item *items = NULL;
6224 init_commit_todo_item(&commit_todo);
6226 * The hashmap maps onelines to the respective todo list index.
6228 * If any items need to be rearranged, the next[i] value will indicate
6229 * which item was moved directly after the i'th.
6231 * In that case, last[i] will indicate the index of the latest item to
6232 * be moved to appear after the i'th.
6234 hashmap_init(&subject2item, subject2item_cmp, NULL, todo_list->nr);
6235 ALLOC_ARRAY(next, todo_list->nr);
6236 ALLOC_ARRAY(tail, todo_list->nr);
6237 ALLOC_ARRAY(subjects, todo_list->nr);
6238 for (i = 0; i < todo_list->nr; i++) {
6239 struct strbuf buf = STRBUF_INIT;
6240 struct todo_item *item = todo_list->items + i;
6241 const char *commit_buffer, *subject, *p;
6242 size_t subject_len;
6243 int i2 = -1;
6244 struct subject2item_entry *entry;
6246 next[i] = tail[i] = -1;
6247 if (!item->commit || item->command == TODO_DROP) {
6248 subjects[i] = NULL;
6249 continue;
6252 if (is_fixup(item->command)) {
6253 clear_commit_todo_item(&commit_todo);
6254 return error(_("the script was already rearranged."));
6257 parse_commit(item->commit);
6258 commit_buffer = logmsg_reencode(item->commit, NULL, "UTF-8");
6259 find_commit_subject(commit_buffer, &subject);
6260 format_subject(&buf, subject, " ");
6261 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
6262 unuse_commit_buffer(item->commit, commit_buffer);
6263 if (skip_fixupish(subject, &p)) {
6264 struct commit *commit2;
6266 for (;;) {
6267 while (isspace(*p))
6268 p++;
6269 if (!skip_fixupish(p, &p))
6270 break;
6273 entry = hashmap_get_entry_from_hash(&subject2item,
6274 strhash(p), p,
6275 struct subject2item_entry,
6276 entry);
6277 if (entry)
6278 /* found by title */
6279 i2 = entry->i;
6280 else if (!strchr(p, ' ') &&
6281 (commit2 =
6282 lookup_commit_reference_by_name(p)) &&
6283 *commit_todo_item_at(&commit_todo, commit2))
6284 /* found by commit name */
6285 i2 = *commit_todo_item_at(&commit_todo, commit2)
6286 - todo_list->items;
6287 else {
6288 /* copy can be a prefix of the commit subject */
6289 for (i2 = 0; i2 < i; i2++)
6290 if (subjects[i2] &&
6291 starts_with(subjects[i2], p))
6292 break;
6293 if (i2 == i)
6294 i2 = -1;
6297 if (i2 >= 0) {
6298 rearranged = 1;
6299 if (starts_with(subject, "fixup!")) {
6300 todo_list->items[i].command = TODO_FIXUP;
6301 } else if (starts_with(subject, "amend!")) {
6302 todo_list->items[i].command = TODO_FIXUP;
6303 todo_list->items[i].flags = TODO_REPLACE_FIXUP_MSG;
6304 } else {
6305 todo_list->items[i].command = TODO_SQUASH;
6307 if (tail[i2] < 0) {
6308 next[i] = next[i2];
6309 next[i2] = i;
6310 } else {
6311 next[i] = next[tail[i2]];
6312 next[tail[i2]] = i;
6314 tail[i2] = i;
6315 } else if (!hashmap_get_from_hash(&subject2item,
6316 strhash(subject), subject)) {
6317 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
6318 entry->i = i;
6319 hashmap_entry_init(&entry->entry,
6320 strhash(entry->subject));
6321 hashmap_put(&subject2item, &entry->entry);
6324 *commit_todo_item_at(&commit_todo, item->commit) = item;
6327 if (rearranged) {
6328 for (i = 0; i < todo_list->nr; i++) {
6329 enum todo_command command = todo_list->items[i].command;
6330 int cur = i;
6333 * Initially, all commands are 'pick's. If it is a
6334 * fixup or a squash now, we have rearranged it.
6336 if (is_fixup(command))
6337 continue;
6339 while (cur >= 0) {
6340 ALLOC_GROW(items, nr + 1, alloc);
6341 items[nr++] = todo_list->items[cur];
6342 cur = next[cur];
6346 FREE_AND_NULL(todo_list->items);
6347 todo_list->items = items;
6348 todo_list->nr = nr;
6349 todo_list->alloc = alloc;
6352 free(next);
6353 free(tail);
6354 for (i = 0; i < todo_list->nr; i++)
6355 free(subjects[i]);
6356 free(subjects);
6357 hashmap_clear_and_free(&subject2item, struct subject2item_entry, entry);
6359 clear_commit_todo_item(&commit_todo);
6361 return 0;
6364 int sequencer_determine_whence(struct repository *r, enum commit_whence *whence)
6366 if (refs_ref_exists(get_main_ref_store(r), "CHERRY_PICK_HEAD")) {
6367 struct object_id cherry_pick_head, rebase_head;
6369 if (file_exists(git_path_seq_dir()))
6370 *whence = FROM_CHERRY_PICK_MULTI;
6371 if (file_exists(rebase_path()) &&
6372 !get_oid("REBASE_HEAD", &rebase_head) &&
6373 !get_oid("CHERRY_PICK_HEAD", &cherry_pick_head) &&
6374 oideq(&rebase_head, &cherry_pick_head))
6375 *whence = FROM_REBASE_PICK;
6376 else
6377 *whence = FROM_CHERRY_PICK_SINGLE;
6379 return 1;
6382 return 0;
6385 int sequencer_get_update_refs_state(const char *wt_dir,
6386 struct string_list *refs)
6388 int result = 0;
6389 FILE *fp = NULL;
6390 struct strbuf ref = STRBUF_INIT;
6391 struct strbuf hash = STRBUF_INIT;
6392 struct update_ref_record *rec = NULL;
6394 char *path = rebase_path_update_refs(wt_dir);
6396 fp = fopen(path, "r");
6397 if (!fp)
6398 goto cleanup;
6400 while (strbuf_getline(&ref, fp) != EOF) {
6401 struct string_list_item *item;
6403 CALLOC_ARRAY(rec, 1);
6405 if (strbuf_getline(&hash, fp) == EOF ||
6406 get_oid_hex(hash.buf, &rec->before)) {
6407 warning(_("update-refs file at '%s' is invalid"),
6408 path);
6409 result = -1;
6410 goto cleanup;
6413 if (strbuf_getline(&hash, fp) == EOF ||
6414 get_oid_hex(hash.buf, &rec->after)) {
6415 warning(_("update-refs file at '%s' is invalid"),
6416 path);
6417 result = -1;
6418 goto cleanup;
6421 item = string_list_insert(refs, ref.buf);
6422 item->util = rec;
6423 rec = NULL;
6426 cleanup:
6427 if (fp)
6428 fclose(fp);
6429 free(path);
6430 free(rec);
6431 strbuf_release(&ref);
6432 strbuf_release(&hash);
6433 return result;