Merge branch 'jk/perf-wo-git-dot-pm'
[alt-git.git] / sequencer.c
blob8a51c9042b73db5f21ff63559200d1fce25841af
1 #include "cache.h"
2 #include "config.h"
3 #include "lockfile.h"
4 #include "dir.h"
5 #include "object-store.h"
6 #include "object.h"
7 #include "commit.h"
8 #include "sequencer.h"
9 #include "tag.h"
10 #include "run-command.h"
11 #include "exec-cmd.h"
12 #include "utf8.h"
13 #include "cache-tree.h"
14 #include "diff.h"
15 #include "revision.h"
16 #include "rerere.h"
17 #include "merge-recursive.h"
18 #include "refs.h"
19 #include "argv-array.h"
20 #include "quote.h"
21 #include "trailer.h"
22 #include "log-tree.h"
23 #include "wt-status.h"
24 #include "hashmap.h"
25 #include "notes-utils.h"
26 #include "sigchain.h"
27 #include "unpack-trees.h"
28 #include "worktree.h"
29 #include "oidmap.h"
30 #include "oidset.h"
31 #include "commit-slab.h"
32 #include "alias.h"
33 #include "commit-reach.h"
34 #include "rebase-interactive.h"
36 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
38 static const char sign_off_header[] = "Signed-off-by: ";
39 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
41 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
43 GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
45 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
46 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
47 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
48 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
50 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
52 * The file containing rebase commands, comments, and empty lines.
53 * This file is created by "git rebase -i" then edited by the user. As
54 * the lines are processed, they are removed from the front of this
55 * file and written to the tail of 'done'.
57 GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
58 GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
61 * The rebase command lines that have already been processed. A line
62 * is moved here when it is first handled, before any associated user
63 * actions.
65 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
67 * The file to keep track of how many commands were already processed (e.g.
68 * for the prompt).
70 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
72 * The file to keep track of how many commands are to be processed in total
73 * (e.g. for the prompt).
75 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
77 * The commit message that is planned to be used for any changes that
78 * need to be committed following a user interaction.
80 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
82 * The file into which is accumulated the suggested commit message for
83 * squash/fixup commands. When the first of a series of squash/fixups
84 * is seen, the file is created and the commit message from the
85 * previous commit and from the first squash/fixup commit are written
86 * to it. The commit message for each subsequent squash/fixup commit
87 * is appended to the file as it is processed.
89 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
91 * If the current series of squash/fixups has not yet included a squash
92 * command, then this file exists and holds the commit message of the
93 * original "pick" commit. (If the series ends without a "squash"
94 * command, then this can be used as the commit message of the combined
95 * commit without opening the editor.)
97 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
99 * This file contains the list fixup/squash commands that have been
100 * accumulated into message-fixup or message-squash so far.
102 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
104 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
105 * GIT_AUTHOR_DATE that will be used for the commit that is currently
106 * being rebased.
108 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
110 * When an "edit" rebase command is being processed, the SHA1 of the
111 * commit to be edited is recorded in this file. When "git rebase
112 * --continue" is executed, if there are any staged changes then they
113 * will be amended to the HEAD commit, but only provided the HEAD
114 * commit is still the commit to be edited. When any other rebase
115 * command is processed, this file is deleted.
117 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
119 * When we stop at a given patch via the "edit" command, this file contains
120 * the abbreviated commit name of the corresponding patch.
122 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
124 * For the post-rewrite hook, we make a list of rewritten commits and
125 * their new sha1s. The rewritten-pending list keeps the sha1s of
126 * commits that have been processed, but not committed yet,
127 * e.g. because they are waiting for a 'squash' command.
129 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
130 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
131 "rebase-merge/rewritten-pending")
134 * The path of the file containing the OID of the "squash onto" commit, i.e.
135 * the dummy commit used for `reset [new root]`.
137 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
140 * The path of the file listing refs that need to be deleted after the rebase
141 * finishes. This is used by the `label` command to record the need for cleanup.
143 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
146 * The following files are written by git-rebase just after parsing the
147 * command-line.
149 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
150 static GIT_PATH_FUNC(rebase_path_cdate_is_adate, "rebase-merge/cdate_is_adate")
151 static GIT_PATH_FUNC(rebase_path_ignore_date, "rebase-merge/ignore_date")
152 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
153 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
154 static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
155 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
156 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
157 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
158 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
159 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
160 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
161 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
162 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
164 static int git_sequencer_config(const char *k, const char *v, void *cb)
166 struct replay_opts *opts = cb;
167 int status;
169 if (!strcmp(k, "commit.cleanup")) {
170 const char *s;
172 status = git_config_string(&s, k, v);
173 if (status)
174 return status;
176 if (!strcmp(s, "verbatim")) {
177 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
178 opts->explicit_cleanup = 1;
179 } else if (!strcmp(s, "whitespace")) {
180 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
181 opts->explicit_cleanup = 1;
182 } else if (!strcmp(s, "strip")) {
183 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
184 opts->explicit_cleanup = 1;
185 } else if (!strcmp(s, "scissors")) {
186 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
187 opts->explicit_cleanup = 1;
188 } else {
189 warning(_("invalid commit message cleanup mode '%s'"),
193 free((char *)s);
194 return status;
197 if (!strcmp(k, "commit.gpgsign")) {
198 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
199 return 0;
202 status = git_gpg_config(k, v, NULL);
203 if (status)
204 return status;
206 return git_diff_basic_config(k, v, NULL);
209 void sequencer_init_config(struct replay_opts *opts)
211 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
212 git_config(git_sequencer_config, opts);
215 static inline int is_rebase_i(const struct replay_opts *opts)
217 return opts->action == REPLAY_INTERACTIVE_REBASE;
220 static const char *get_dir(const struct replay_opts *opts)
222 if (is_rebase_i(opts))
223 return rebase_path();
224 return git_path_seq_dir();
227 static const char *get_todo_path(const struct replay_opts *opts)
229 if (is_rebase_i(opts))
230 return rebase_path_todo();
231 return git_path_todo_file();
235 * Returns 0 for non-conforming footer
236 * Returns 1 for conforming footer
237 * Returns 2 when sob exists within conforming footer
238 * Returns 3 when sob exists within conforming footer as last entry
240 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
241 size_t ignore_footer)
243 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
244 struct trailer_info info;
245 size_t i;
246 int found_sob = 0, found_sob_last = 0;
248 opts.no_divider = 1;
250 trailer_info_get(&info, sb->buf, &opts);
252 if (info.trailer_start == info.trailer_end)
253 return 0;
255 for (i = 0; i < info.trailer_nr; i++)
256 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
257 found_sob = 1;
258 if (i == info.trailer_nr - 1)
259 found_sob_last = 1;
262 trailer_info_release(&info);
264 if (found_sob_last)
265 return 3;
266 if (found_sob)
267 return 2;
268 return 1;
271 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
273 static struct strbuf buf = STRBUF_INIT;
275 strbuf_reset(&buf);
276 if (opts->gpg_sign)
277 sq_quotef(&buf, "-S%s", opts->gpg_sign);
278 return buf.buf;
281 int sequencer_remove_state(struct replay_opts *opts)
283 struct strbuf buf = STRBUF_INIT;
284 int i, ret = 0;
286 if (is_rebase_i(opts) &&
287 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
288 char *p = buf.buf;
289 while (*p) {
290 char *eol = strchr(p, '\n');
291 if (eol)
292 *eol = '\0';
293 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0) {
294 warning(_("could not delete '%s'"), p);
295 ret = -1;
297 if (!eol)
298 break;
299 p = eol + 1;
303 free(opts->gpg_sign);
304 free(opts->strategy);
305 for (i = 0; i < opts->xopts_nr; i++)
306 free(opts->xopts[i]);
307 free(opts->xopts);
308 strbuf_release(&opts->current_fixups);
310 strbuf_reset(&buf);
311 strbuf_addstr(&buf, get_dir(opts));
312 if (remove_dir_recursively(&buf, 0))
313 ret = error(_("could not remove '%s'"), buf.buf);
314 strbuf_release(&buf);
316 return ret;
319 static const char *action_name(const struct replay_opts *opts)
321 switch (opts->action) {
322 case REPLAY_REVERT:
323 return N_("revert");
324 case REPLAY_PICK:
325 return N_("cherry-pick");
326 case REPLAY_INTERACTIVE_REBASE:
327 return N_("rebase -i");
329 die(_("unknown action: %d"), opts->action);
332 struct commit_message {
333 char *parent_label;
334 char *label;
335 char *subject;
336 const char *message;
339 static const char *short_commit_name(struct commit *commit)
341 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
344 static int get_message(struct commit *commit, struct commit_message *out)
346 const char *abbrev, *subject;
347 int subject_len;
349 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
350 abbrev = short_commit_name(commit);
352 subject_len = find_commit_subject(out->message, &subject);
354 out->subject = xmemdupz(subject, subject_len);
355 out->label = xstrfmt("%s... %s", abbrev, out->subject);
356 out->parent_label = xstrfmt("parent of %s", out->label);
358 return 0;
361 static void free_message(struct commit *commit, struct commit_message *msg)
363 free(msg->parent_label);
364 free(msg->label);
365 free(msg->subject);
366 unuse_commit_buffer(commit, msg->message);
369 static void print_advice(struct repository *r, int show_hint,
370 struct replay_opts *opts)
372 char *msg = getenv("GIT_CHERRY_PICK_HELP");
374 if (msg) {
375 fprintf(stderr, "%s\n", msg);
377 * A conflict has occurred but the porcelain
378 * (typically rebase --interactive) wants to take care
379 * of the commit itself so remove CHERRY_PICK_HEAD
381 unlink(git_path_cherry_pick_head(r));
382 return;
385 if (show_hint) {
386 if (opts->no_commit)
387 advise(_("after resolving the conflicts, mark the corrected paths\n"
388 "with 'git add <paths>' or 'git rm <paths>'"));
389 else
390 advise(_("after resolving the conflicts, mark the corrected paths\n"
391 "with 'git add <paths>' or 'git rm <paths>'\n"
392 "and commit the result with 'git commit'"));
396 static int write_message(const void *buf, size_t len, const char *filename,
397 int append_eol)
399 struct lock_file msg_file = LOCK_INIT;
401 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
402 if (msg_fd < 0)
403 return error_errno(_("could not lock '%s'"), filename);
404 if (write_in_full(msg_fd, buf, len) < 0) {
405 error_errno(_("could not write to '%s'"), filename);
406 rollback_lock_file(&msg_file);
407 return -1;
409 if (append_eol && write(msg_fd, "\n", 1) < 0) {
410 error_errno(_("could not write eol to '%s'"), filename);
411 rollback_lock_file(&msg_file);
412 return -1;
414 if (commit_lock_file(&msg_file) < 0)
415 return error(_("failed to finalize '%s'"), filename);
417 return 0;
421 * Reads a file that was presumably written by a shell script, i.e. with an
422 * end-of-line marker that needs to be stripped.
424 * Note that only the last end-of-line marker is stripped, consistent with the
425 * behavior of "$(cat path)" in a shell script.
427 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
429 static int read_oneliner(struct strbuf *buf,
430 const char *path, int skip_if_empty)
432 int orig_len = buf->len;
434 if (!file_exists(path))
435 return 0;
437 if (strbuf_read_file(buf, path, 0) < 0) {
438 warning_errno(_("could not read '%s'"), path);
439 return 0;
442 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
443 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
444 --buf->len;
445 buf->buf[buf->len] = '\0';
448 if (skip_if_empty && buf->len == orig_len)
449 return 0;
451 return 1;
454 static struct tree *empty_tree(struct repository *r)
456 return lookup_tree(r, the_hash_algo->empty_tree);
459 static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
461 if (repo_read_index_unmerged(repo))
462 return error_resolve_conflict(_(action_name(opts)));
464 error(_("your local changes would be overwritten by %s."),
465 _(action_name(opts)));
467 if (advice_commit_before_merge)
468 advise(_("commit your changes or stash them to proceed."));
469 return -1;
472 static void update_abort_safety_file(void)
474 struct object_id head;
476 /* Do nothing on a single-pick */
477 if (!file_exists(git_path_seq_dir()))
478 return;
480 if (!get_oid("HEAD", &head))
481 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
482 else
483 write_file(git_path_abort_safety_file(), "%s", "");
486 static int fast_forward_to(struct repository *r,
487 const struct object_id *to,
488 const struct object_id *from,
489 int unborn,
490 struct replay_opts *opts)
492 struct ref_transaction *transaction;
493 struct strbuf sb = STRBUF_INIT;
494 struct strbuf err = STRBUF_INIT;
496 repo_read_index(r);
497 if (checkout_fast_forward(r, from, to, 1))
498 return -1; /* the callee should have complained already */
500 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
502 transaction = ref_transaction_begin(&err);
503 if (!transaction ||
504 ref_transaction_update(transaction, "HEAD",
505 to, unborn && !is_rebase_i(opts) ?
506 &null_oid : from,
507 0, sb.buf, &err) ||
508 ref_transaction_commit(transaction, &err)) {
509 ref_transaction_free(transaction);
510 error("%s", err.buf);
511 strbuf_release(&sb);
512 strbuf_release(&err);
513 return -1;
516 strbuf_release(&sb);
517 strbuf_release(&err);
518 ref_transaction_free(transaction);
519 update_abort_safety_file();
520 return 0;
523 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
524 int use_editor)
526 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
527 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
528 COMMIT_MSG_CLEANUP_SPACE;
529 else if (!strcmp(cleanup_arg, "verbatim"))
530 return COMMIT_MSG_CLEANUP_NONE;
531 else if (!strcmp(cleanup_arg, "whitespace"))
532 return COMMIT_MSG_CLEANUP_SPACE;
533 else if (!strcmp(cleanup_arg, "strip"))
534 return COMMIT_MSG_CLEANUP_ALL;
535 else if (!strcmp(cleanup_arg, "scissors"))
536 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
537 COMMIT_MSG_CLEANUP_SPACE;
538 else
539 die(_("Invalid cleanup mode %s"), cleanup_arg);
543 * NB using int rather than enum cleanup_mode to stop clang's
544 * -Wtautological-constant-out-of-range-compare complaining that the comparison
545 * is always true.
547 static const char *describe_cleanup_mode(int cleanup_mode)
549 static const char *modes[] = { "whitespace",
550 "verbatim",
551 "scissors",
552 "strip" };
554 if (cleanup_mode < ARRAY_SIZE(modes))
555 return modes[cleanup_mode];
557 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
560 void append_conflicts_hint(struct index_state *istate,
561 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
563 int i;
565 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
566 strbuf_addch(msgbuf, '\n');
567 wt_status_append_cut_line(msgbuf);
568 strbuf_addch(msgbuf, comment_line_char);
571 strbuf_addch(msgbuf, '\n');
572 strbuf_commented_addf(msgbuf, "Conflicts:\n");
573 for (i = 0; i < istate->cache_nr;) {
574 const struct cache_entry *ce = istate->cache[i++];
575 if (ce_stage(ce)) {
576 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
577 while (i < istate->cache_nr &&
578 !strcmp(ce->name, istate->cache[i]->name))
579 i++;
584 static int do_recursive_merge(struct repository *r,
585 struct commit *base, struct commit *next,
586 const char *base_label, const char *next_label,
587 struct object_id *head, struct strbuf *msgbuf,
588 struct replay_opts *opts)
590 struct merge_options o;
591 struct tree *next_tree, *base_tree, *head_tree;
592 int clean;
593 char **xopt;
594 struct lock_file index_lock = LOCK_INIT;
596 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
597 return -1;
599 repo_read_index(r);
601 init_merge_options(&o, r);
602 o.ancestor = base ? base_label : "(empty tree)";
603 o.branch1 = "HEAD";
604 o.branch2 = next ? next_label : "(empty tree)";
605 if (is_rebase_i(opts))
606 o.buffer_output = 2;
607 o.show_rename_progress = 1;
609 head_tree = parse_tree_indirect(head);
610 next_tree = next ? get_commit_tree(next) : empty_tree(r);
611 base_tree = base ? get_commit_tree(base) : empty_tree(r);
613 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
614 parse_merge_opt(&o, *xopt);
616 clean = merge_trees(&o,
617 head_tree,
618 next_tree, base_tree);
619 if (is_rebase_i(opts) && clean <= 0)
620 fputs(o.obuf.buf, stdout);
621 strbuf_release(&o.obuf);
622 if (clean < 0) {
623 rollback_lock_file(&index_lock);
624 return clean;
627 if (write_locked_index(r->index, &index_lock,
628 COMMIT_LOCK | SKIP_IF_UNCHANGED))
630 * TRANSLATORS: %s will be "revert", "cherry-pick" or
631 * "rebase -i".
633 return error(_("%s: Unable to write new index file"),
634 _(action_name(opts)));
636 if (!clean)
637 append_conflicts_hint(r->index, msgbuf,
638 opts->default_msg_cleanup);
640 return !clean;
643 static struct object_id *get_cache_tree_oid(struct index_state *istate)
645 if (!istate->cache_tree)
646 istate->cache_tree = cache_tree();
648 if (!cache_tree_fully_valid(istate->cache_tree))
649 if (cache_tree_update(istate, 0)) {
650 error(_("unable to update cache tree"));
651 return NULL;
654 return &istate->cache_tree->oid;
657 static int is_index_unchanged(struct repository *r)
659 struct object_id head_oid, *cache_tree_oid;
660 struct commit *head_commit;
661 struct index_state *istate = r->index;
663 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
664 return error(_("could not resolve HEAD commit"));
666 head_commit = lookup_commit(r, &head_oid);
669 * If head_commit is NULL, check_commit, called from
670 * lookup_commit, would have indicated that head_commit is not
671 * a commit object already. parse_commit() will return failure
672 * without further complaints in such a case. Otherwise, if
673 * the commit is invalid, parse_commit() will complain. So
674 * there is nothing for us to say here. Just return failure.
676 if (parse_commit(head_commit))
677 return -1;
679 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
680 return -1;
682 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
685 static int write_author_script(const char *message)
687 struct strbuf buf = STRBUF_INIT;
688 const char *eol;
689 int res;
691 for (;;)
692 if (!*message || starts_with(message, "\n")) {
693 missing_author:
694 /* Missing 'author' line? */
695 unlink(rebase_path_author_script());
696 return 0;
697 } else if (skip_prefix(message, "author ", &message))
698 break;
699 else if ((eol = strchr(message, '\n')))
700 message = eol + 1;
701 else
702 goto missing_author;
704 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
705 while (*message && *message != '\n' && *message != '\r')
706 if (skip_prefix(message, " <", &message))
707 break;
708 else if (*message != '\'')
709 strbuf_addch(&buf, *(message++));
710 else
711 strbuf_addf(&buf, "'\\%c'", *(message++));
712 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
713 while (*message && *message != '\n' && *message != '\r')
714 if (skip_prefix(message, "> ", &message))
715 break;
716 else if (*message != '\'')
717 strbuf_addch(&buf, *(message++));
718 else
719 strbuf_addf(&buf, "'\\%c'", *(message++));
720 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
721 while (*message && *message != '\n' && *message != '\r')
722 if (*message != '\'')
723 strbuf_addch(&buf, *(message++));
724 else
725 strbuf_addf(&buf, "'\\%c'", *(message++));
726 strbuf_addch(&buf, '\'');
727 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
728 strbuf_release(&buf);
729 return res;
733 * Take a series of KEY='VALUE' lines where VALUE part is
734 * sq-quoted, and append <KEY, VALUE> at the end of the string list
736 static int parse_key_value_squoted(char *buf, struct string_list *list)
738 while (*buf) {
739 struct string_list_item *item;
740 char *np;
741 char *cp = strchr(buf, '=');
742 if (!cp) {
743 np = strchrnul(buf, '\n');
744 return error(_("no key present in '%.*s'"),
745 (int) (np - buf), buf);
747 np = strchrnul(cp, '\n');
748 *cp++ = '\0';
749 item = string_list_append(list, buf);
751 buf = np + (*np == '\n');
752 *np = '\0';
753 cp = sq_dequote(cp);
754 if (!cp)
755 return error(_("unable to dequote value of '%s'"),
756 item->string);
757 item->util = xstrdup(cp);
759 return 0;
763 * Reads and parses the state directory's "author-script" file, and sets name,
764 * email and date accordingly.
765 * Returns 0 on success, -1 if the file could not be parsed.
767 * The author script is of the format:
769 * GIT_AUTHOR_NAME='$author_name'
770 * GIT_AUTHOR_EMAIL='$author_email'
771 * GIT_AUTHOR_DATE='$author_date'
773 * where $author_name, $author_email and $author_date are quoted. We are strict
774 * with our parsing, as the file was meant to be eval'd in the now-removed
775 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
776 * from what this function expects, it is better to bail out than to do
777 * something that the user does not expect.
779 int read_author_script(const char *path, char **name, char **email, char **date,
780 int allow_missing)
782 struct strbuf buf = STRBUF_INIT;
783 struct string_list kv = STRING_LIST_INIT_DUP;
784 int retval = -1; /* assume failure */
785 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
787 if (strbuf_read_file(&buf, path, 256) <= 0) {
788 strbuf_release(&buf);
789 if (errno == ENOENT && allow_missing)
790 return 0;
791 else
792 return error_errno(_("could not open '%s' for reading"),
793 path);
796 if (parse_key_value_squoted(buf.buf, &kv))
797 goto finish;
799 for (i = 0; i < kv.nr; i++) {
800 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
801 if (name_i != -2)
802 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
803 else
804 name_i = i;
805 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
806 if (email_i != -2)
807 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
808 else
809 email_i = i;
810 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
811 if (date_i != -2)
812 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
813 else
814 date_i = i;
815 } else {
816 err = error(_("unknown variable '%s'"),
817 kv.items[i].string);
820 if (name_i == -2)
821 error(_("missing 'GIT_AUTHOR_NAME'"));
822 if (email_i == -2)
823 error(_("missing 'GIT_AUTHOR_EMAIL'"));
824 if (date_i == -2)
825 error(_("missing 'GIT_AUTHOR_DATE'"));
826 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
827 goto finish;
829 if (name)
830 *name = kv.items[name_i].util;
831 else
832 free(kv.items[name_i].util);
833 if (email)
834 *email = kv.items[email_i].util;
835 else
836 free(kv.items[email_i].util);
837 if (date)
838 *date = kv.items[date_i].util;
839 else
840 free(kv.items[date_i].util);
841 retval = 0;
842 finish:
843 string_list_clear(&kv, !!retval);
844 strbuf_release(&buf);
845 return retval;
849 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
850 * file with shell quoting into struct argv_array. Returns -1 on
851 * error, 0 otherwise.
853 static int read_env_script(struct argv_array *env)
855 char *name, *email, *date;
857 if (read_author_script(rebase_path_author_script(),
858 &name, &email, &date, 0))
859 return -1;
861 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
862 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
863 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
864 free(name);
865 free(email);
866 free(date);
868 return 0;
871 static char *get_author(const char *message)
873 size_t len;
874 const char *a;
876 a = find_commit_header(message, "author", &len);
877 if (a)
878 return xmemdupz(a, len);
880 return NULL;
883 /* Returns a "date" string that needs to be free()'d by the caller */
884 static char *read_author_date_or_null(void)
886 char *date;
888 if (read_author_script(rebase_path_author_script(),
889 NULL, NULL, &date, 0))
890 return NULL;
891 return date;
894 /* Construct a free()able author string with current time as the author date */
895 static char *ignore_author_date(const char *author)
897 int len = strlen(author);
898 struct ident_split ident;
899 struct strbuf new_author = STRBUF_INIT;
901 if (split_ident_line(&ident, author, len) < 0) {
902 error(_("malformed ident line"));
903 return NULL;
905 len = ident.mail_end - ident.name_begin + 1;
907 strbuf_addf(&new_author, "%.*s ", len, ident.name_begin);
908 datestamp(&new_author);
909 return strbuf_detach(&new_author, NULL);
912 static void push_dates(struct child_process *child, int change_committer_date)
914 time_t now = time(NULL);
915 struct strbuf date = STRBUF_INIT;
917 strbuf_addf(&date, "@%"PRIuMAX, (uintmax_t)now);
918 argv_array_pushf(&child->env_array, "GIT_AUTHOR_DATE=%s", date.buf);
919 if (change_committer_date)
920 argv_array_pushf(&child->env_array, "GIT_COMMITTER_DATE=%s", date.buf);
921 strbuf_release(&date);
924 static const char staged_changes_advice[] =
925 N_("you have staged changes in your working tree\n"
926 "If these changes are meant to be squashed into the previous commit, run:\n"
927 "\n"
928 " git commit --amend %s\n"
929 "\n"
930 "If they are meant to go into a new commit, run:\n"
931 "\n"
932 " git commit %s\n"
933 "\n"
934 "In both cases, once you're done, continue with:\n"
935 "\n"
936 " git rebase --continue\n");
938 #define ALLOW_EMPTY (1<<0)
939 #define EDIT_MSG (1<<1)
940 #define AMEND_MSG (1<<2)
941 #define CLEANUP_MSG (1<<3)
942 #define VERIFY_MSG (1<<4)
943 #define CREATE_ROOT_COMMIT (1<<5)
945 static int run_command_silent_on_success(struct child_process *cmd)
947 struct strbuf buf = STRBUF_INIT;
948 int rc;
950 cmd->stdout_to_stderr = 1;
951 rc = pipe_command(cmd,
952 NULL, 0,
953 NULL, 0,
954 &buf, 0);
956 if (rc)
957 fputs(buf.buf, stderr);
958 strbuf_release(&buf);
959 return rc;
963 * If we are cherry-pick, and if the merge did not result in
964 * hand-editing, we will hit this commit and inherit the original
965 * author date and name.
967 * If we are revert, or if our cherry-pick results in a hand merge,
968 * we had better say that the current user is responsible for that.
970 * An exception is when run_git_commit() is called during an
971 * interactive rebase: in that case, we will want to retain the
972 * author metadata.
974 static int run_git_commit(struct repository *r,
975 const char *defmsg,
976 struct replay_opts *opts,
977 unsigned int flags)
979 struct child_process cmd = CHILD_PROCESS_INIT;
981 cmd.git_cmd = 1;
983 if (opts->committer_date_is_author_date) {
984 int res = -1;
985 struct strbuf datebuf = STRBUF_INIT;
986 char *date = read_author_date_or_null();
988 if (!date)
989 return -1;
991 strbuf_addf(&datebuf, "@%s", date);
992 res = setenv("GIT_COMMITTER_DATE",
993 opts->ignore_date ? "" : datebuf.buf, 1);
995 strbuf_release(&datebuf);
996 free(date);
998 if (res)
999 return -1;
1002 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
1003 const char *gpg_opt = gpg_sign_opt_quoted(opts);
1005 return error(_(staged_changes_advice),
1006 gpg_opt, gpg_opt);
1009 argv_array_push(&cmd.args, "commit");
1011 if (!(flags & VERIFY_MSG))
1012 argv_array_push(&cmd.args, "-n");
1013 if ((flags & AMEND_MSG))
1014 argv_array_push(&cmd.args, "--amend");
1015 if (opts->gpg_sign)
1016 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
1017 if (opts->ignore_date)
1018 push_dates(&cmd, opts->committer_date_is_author_date);
1019 if (defmsg)
1020 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
1021 else if (!(flags & EDIT_MSG))
1022 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
1023 if ((flags & CLEANUP_MSG))
1024 argv_array_push(&cmd.args, "--cleanup=strip");
1025 if ((flags & EDIT_MSG))
1026 argv_array_push(&cmd.args, "-e");
1027 else if (!(flags & CLEANUP_MSG) &&
1028 !opts->signoff && !opts->record_origin &&
1029 !opts->explicit_cleanup)
1030 argv_array_push(&cmd.args, "--cleanup=verbatim");
1032 if ((flags & ALLOW_EMPTY))
1033 argv_array_push(&cmd.args, "--allow-empty");
1035 if (!(flags & EDIT_MSG))
1036 argv_array_push(&cmd.args, "--allow-empty-message");
1038 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
1039 return run_command_silent_on_success(&cmd);
1040 else
1041 return run_command(&cmd);
1044 static int rest_is_empty(const struct strbuf *sb, int start)
1046 int i, eol;
1047 const char *nl;
1049 /* Check if the rest is just whitespace and Signed-off-by's. */
1050 for (i = start; i < sb->len; i++) {
1051 nl = memchr(sb->buf + i, '\n', sb->len - i);
1052 if (nl)
1053 eol = nl - sb->buf;
1054 else
1055 eol = sb->len;
1057 if (strlen(sign_off_header) <= eol - i &&
1058 starts_with(sb->buf + i, sign_off_header)) {
1059 i = eol;
1060 continue;
1062 while (i < eol)
1063 if (!isspace(sb->buf[i++]))
1064 return 0;
1067 return 1;
1070 void cleanup_message(struct strbuf *msgbuf,
1071 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1073 if (verbose || /* Truncate the message just before the diff, if any. */
1074 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1075 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1076 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1077 strbuf_stripspace(msgbuf, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1081 * Find out if the message in the strbuf contains only whitespace and
1082 * Signed-off-by lines.
1084 int message_is_empty(const struct strbuf *sb,
1085 enum commit_msg_cleanup_mode cleanup_mode)
1087 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1088 return 0;
1089 return rest_is_empty(sb, 0);
1093 * See if the user edited the message in the editor or left what
1094 * was in the template intact
1096 int template_untouched(const struct strbuf *sb, const char *template_file,
1097 enum commit_msg_cleanup_mode cleanup_mode)
1099 struct strbuf tmpl = STRBUF_INIT;
1100 const char *start;
1102 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1103 return 0;
1105 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1106 return 0;
1108 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1109 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1110 start = sb->buf;
1111 strbuf_release(&tmpl);
1112 return rest_is_empty(sb, start - sb->buf);
1115 int update_head_with_reflog(const struct commit *old_head,
1116 const struct object_id *new_head,
1117 const char *action, const struct strbuf *msg,
1118 struct strbuf *err)
1120 struct ref_transaction *transaction;
1121 struct strbuf sb = STRBUF_INIT;
1122 const char *nl;
1123 int ret = 0;
1125 if (action) {
1126 strbuf_addstr(&sb, action);
1127 strbuf_addstr(&sb, ": ");
1130 nl = strchr(msg->buf, '\n');
1131 if (nl) {
1132 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1133 } else {
1134 strbuf_addbuf(&sb, msg);
1135 strbuf_addch(&sb, '\n');
1138 transaction = ref_transaction_begin(err);
1139 if (!transaction ||
1140 ref_transaction_update(transaction, "HEAD", new_head,
1141 old_head ? &old_head->object.oid : &null_oid,
1142 0, sb.buf, err) ||
1143 ref_transaction_commit(transaction, err)) {
1144 ret = -1;
1146 ref_transaction_free(transaction);
1147 strbuf_release(&sb);
1149 return ret;
1152 static int run_rewrite_hook(const struct object_id *oldoid,
1153 const struct object_id *newoid)
1155 struct child_process proc = CHILD_PROCESS_INIT;
1156 const char *argv[3];
1157 int code;
1158 struct strbuf sb = STRBUF_INIT;
1160 argv[0] = find_hook("post-rewrite");
1161 if (!argv[0])
1162 return 0;
1164 argv[1] = "amend";
1165 argv[2] = NULL;
1167 proc.argv = argv;
1168 proc.in = -1;
1169 proc.stdout_to_stderr = 1;
1170 proc.trace2_hook_name = "post-rewrite";
1172 code = start_command(&proc);
1173 if (code)
1174 return code;
1175 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1176 sigchain_push(SIGPIPE, SIG_IGN);
1177 write_in_full(proc.in, sb.buf, sb.len);
1178 close(proc.in);
1179 strbuf_release(&sb);
1180 sigchain_pop(SIGPIPE);
1181 return finish_command(&proc);
1184 void commit_post_rewrite(struct repository *r,
1185 const struct commit *old_head,
1186 const struct object_id *new_head)
1188 struct notes_rewrite_cfg *cfg;
1190 cfg = init_copy_notes_for_rewrite("amend");
1191 if (cfg) {
1192 /* we are amending, so old_head is not NULL */
1193 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1194 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1196 run_rewrite_hook(&old_head->object.oid, new_head);
1199 static int run_prepare_commit_msg_hook(struct repository *r,
1200 struct strbuf *msg,
1201 const char *commit)
1203 int ret = 0;
1204 const char *name, *arg1 = NULL, *arg2 = NULL;
1206 name = git_path_commit_editmsg();
1207 if (write_message(msg->buf, msg->len, name, 0))
1208 return -1;
1210 if (commit) {
1211 arg1 = "commit";
1212 arg2 = commit;
1213 } else {
1214 arg1 = "message";
1216 if (run_commit_hook(0, r->index_file, "prepare-commit-msg", name,
1217 arg1, arg2, NULL))
1218 ret = error(_("'prepare-commit-msg' hook failed"));
1220 return ret;
1223 static const char implicit_ident_advice_noconfig[] =
1224 N_("Your name and email address were configured automatically based\n"
1225 "on your username and hostname. Please check that they are accurate.\n"
1226 "You can suppress this message by setting them explicitly. Run the\n"
1227 "following command and follow the instructions in your editor to edit\n"
1228 "your configuration file:\n"
1229 "\n"
1230 " git config --global --edit\n"
1231 "\n"
1232 "After doing this, you may fix the identity used for this commit with:\n"
1233 "\n"
1234 " git commit --amend --reset-author\n");
1236 static const char implicit_ident_advice_config[] =
1237 N_("Your name and email address were configured automatically based\n"
1238 "on your username and hostname. Please check that they are accurate.\n"
1239 "You can suppress this message by setting them explicitly:\n"
1240 "\n"
1241 " git config --global user.name \"Your Name\"\n"
1242 " git config --global user.email you@example.com\n"
1243 "\n"
1244 "After doing this, you may fix the identity used for this commit with:\n"
1245 "\n"
1246 " git commit --amend --reset-author\n");
1248 static const char *implicit_ident_advice(void)
1250 char *user_config = expand_user_path("~/.gitconfig", 0);
1251 char *xdg_config = xdg_config_home("config");
1252 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1254 free(user_config);
1255 free(xdg_config);
1257 if (config_exists)
1258 return _(implicit_ident_advice_config);
1259 else
1260 return _(implicit_ident_advice_noconfig);
1264 void print_commit_summary(struct repository *r,
1265 const char *prefix,
1266 const struct object_id *oid,
1267 unsigned int flags)
1269 struct rev_info rev;
1270 struct commit *commit;
1271 struct strbuf format = STRBUF_INIT;
1272 const char *head;
1273 struct pretty_print_context pctx = {0};
1274 struct strbuf author_ident = STRBUF_INIT;
1275 struct strbuf committer_ident = STRBUF_INIT;
1277 commit = lookup_commit(r, oid);
1278 if (!commit)
1279 die(_("couldn't look up newly created commit"));
1280 if (parse_commit(commit))
1281 die(_("could not parse newly created commit"));
1283 strbuf_addstr(&format, "format:%h] %s");
1285 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1286 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1287 if (strbuf_cmp(&author_ident, &committer_ident)) {
1288 strbuf_addstr(&format, "\n Author: ");
1289 strbuf_addbuf_percentquote(&format, &author_ident);
1291 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1292 struct strbuf date = STRBUF_INIT;
1294 format_commit_message(commit, "%ad", &date, &pctx);
1295 strbuf_addstr(&format, "\n Date: ");
1296 strbuf_addbuf_percentquote(&format, &date);
1297 strbuf_release(&date);
1299 if (!committer_ident_sufficiently_given()) {
1300 strbuf_addstr(&format, "\n Committer: ");
1301 strbuf_addbuf_percentquote(&format, &committer_ident);
1302 if (advice_implicit_identity) {
1303 strbuf_addch(&format, '\n');
1304 strbuf_addstr(&format, implicit_ident_advice());
1307 strbuf_release(&author_ident);
1308 strbuf_release(&committer_ident);
1310 repo_init_revisions(r, &rev, prefix);
1311 setup_revisions(0, NULL, &rev, NULL);
1313 rev.diff = 1;
1314 rev.diffopt.output_format =
1315 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1317 rev.verbose_header = 1;
1318 rev.show_root_diff = 1;
1319 get_commit_format(format.buf, &rev);
1320 rev.always_show_header = 0;
1321 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1322 rev.diffopt.break_opt = 0;
1323 diff_setup_done(&rev.diffopt);
1325 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1326 if (!head)
1327 die_errno(_("unable to resolve HEAD after creating commit"));
1328 if (!strcmp(head, "HEAD"))
1329 head = _("detached HEAD");
1330 else
1331 skip_prefix(head, "refs/heads/", &head);
1332 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1333 _(" (root-commit)") : "");
1335 if (!log_tree_commit(&rev, commit)) {
1336 rev.always_show_header = 1;
1337 rev.use_terminator = 1;
1338 log_tree_commit(&rev, commit);
1341 strbuf_release(&format);
1344 static int parse_head(struct repository *r, struct commit **head)
1346 struct commit *current_head;
1347 struct object_id oid;
1349 if (get_oid("HEAD", &oid)) {
1350 current_head = NULL;
1351 } else {
1352 current_head = lookup_commit_reference(r, &oid);
1353 if (!current_head)
1354 return error(_("could not parse HEAD"));
1355 if (!oideq(&oid, &current_head->object.oid)) {
1356 warning(_("HEAD %s is not a commit!"),
1357 oid_to_hex(&oid));
1359 if (parse_commit(current_head))
1360 return error(_("could not parse HEAD commit"));
1362 *head = current_head;
1364 return 0;
1368 * Try to commit without forking 'git commit'. In some cases we need
1369 * to run 'git commit' to display an error message
1371 * Returns:
1372 * -1 - error unable to commit
1373 * 0 - success
1374 * 1 - run 'git commit'
1376 static int try_to_commit(struct repository *r,
1377 struct strbuf *msg, const char *author,
1378 struct replay_opts *opts, unsigned int flags,
1379 struct object_id *oid)
1381 struct object_id tree;
1382 struct commit *current_head = NULL;
1383 struct commit_list *parents = NULL;
1384 struct commit_extra_header *extra = NULL;
1385 struct strbuf err = STRBUF_INIT;
1386 struct strbuf commit_msg = STRBUF_INIT;
1387 char *author_to_free = NULL;
1388 const char *hook_commit = NULL;
1389 enum commit_msg_cleanup_mode cleanup;
1390 int res = 0;
1392 if (parse_head(r, &current_head))
1393 return -1;
1394 if (flags & AMEND_MSG) {
1395 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1396 const char *out_enc = get_commit_output_encoding();
1397 const char *message = logmsg_reencode(current_head, NULL,
1398 out_enc);
1400 if (!msg) {
1401 const char *orig_message = NULL;
1403 find_commit_subject(message, &orig_message);
1404 msg = &commit_msg;
1405 strbuf_addstr(msg, orig_message);
1406 hook_commit = "HEAD";
1408 author = author_to_free = get_author(message);
1409 unuse_commit_buffer(current_head, message);
1410 if (!author) {
1411 res = error(_("unable to parse commit author"));
1412 goto out;
1414 parents = copy_commit_list(current_head->parents);
1415 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1416 } else if (current_head &&
1417 (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1418 commit_list_insert(current_head, &parents);
1421 if (opts->committer_date_is_author_date) {
1422 int len = strlen(author);
1423 struct ident_split ident;
1424 struct strbuf date = STRBUF_INIT;
1426 if (split_ident_line(&ident, author, len) < 0) {
1427 res = error(_("malformed ident line"));
1428 goto out;
1430 if (!ident.date_begin) {
1431 res = error(_("corrupted author without date information"));
1432 goto out;
1435 strbuf_addf(&date, "@%.*s %.*s",
1436 (int)(ident.date_end - ident.date_begin), ident.date_begin,
1437 (int)(ident.tz_end - ident.tz_begin), ident.tz_begin);
1438 res = setenv("GIT_COMMITTER_DATE",
1439 opts->ignore_date ? "" : date.buf, 1);
1440 strbuf_release(&date);
1442 if (res)
1443 goto out;
1446 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1447 res = error(_("git write-tree failed to write a tree"));
1448 goto out;
1451 if (!(flags & ALLOW_EMPTY)) {
1452 struct commit *first_parent = current_head;
1454 if (flags & AMEND_MSG) {
1455 if (current_head->parents) {
1456 first_parent = current_head->parents->item;
1457 if (repo_parse_commit(r, first_parent)) {
1458 res = error(_("could not parse HEAD commit"));
1459 goto out;
1461 } else {
1462 first_parent = NULL;
1465 if (oideq(first_parent
1466 ? get_commit_tree_oid(first_parent)
1467 : the_hash_algo->empty_tree,
1468 &tree)) {
1469 res = 1; /* run 'git commit' to display error message */
1470 goto out;
1474 if (find_hook("prepare-commit-msg")) {
1475 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1476 if (res)
1477 goto out;
1478 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1479 2048) < 0) {
1480 res = error_errno(_("unable to read commit message "
1481 "from '%s'"),
1482 git_path_commit_editmsg());
1483 goto out;
1485 msg = &commit_msg;
1488 if (flags & CLEANUP_MSG)
1489 cleanup = COMMIT_MSG_CLEANUP_ALL;
1490 else if ((opts->signoff || opts->record_origin) &&
1491 !opts->explicit_cleanup)
1492 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1493 else
1494 cleanup = opts->default_msg_cleanup;
1496 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1497 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1498 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1499 res = 1; /* run 'git commit' to display error message */
1500 goto out;
1503 reset_ident_date();
1505 if (opts->ignore_date) {
1506 author = ignore_author_date(author);
1507 if (!author) {
1508 res = -1;
1509 goto out;
1511 free(author_to_free);
1512 author_to_free = (char *)author;
1514 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1515 oid, author, opts->gpg_sign, extra)) {
1516 res = error(_("failed to write commit object"));
1517 goto out;
1520 if (update_head_with_reflog(current_head, oid,
1521 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1522 res = error("%s", err.buf);
1523 goto out;
1526 run_commit_hook(0, r->index_file, "post-commit", NULL);
1527 if (flags & AMEND_MSG)
1528 commit_post_rewrite(r, current_head, oid);
1530 out:
1531 free_commit_extra_headers(extra);
1532 strbuf_release(&err);
1533 strbuf_release(&commit_msg);
1534 free(author_to_free);
1536 return res;
1539 static int do_commit(struct repository *r,
1540 const char *msg_file, const char *author,
1541 struct replay_opts *opts, unsigned int flags)
1543 int res = 1;
1545 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1546 struct object_id oid;
1547 struct strbuf sb = STRBUF_INIT;
1549 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1550 return error_errno(_("unable to read commit message "
1551 "from '%s'"),
1552 msg_file);
1554 res = try_to_commit(r, msg_file ? &sb : NULL,
1555 author, opts, flags, &oid);
1556 strbuf_release(&sb);
1557 if (!res) {
1558 unlink(git_path_cherry_pick_head(r));
1559 unlink(git_path_merge_msg(r));
1560 if (!is_rebase_i(opts))
1561 print_commit_summary(r, NULL, &oid,
1562 SUMMARY_SHOW_AUTHOR_DATE);
1563 return res;
1566 if (res == 1)
1567 return run_git_commit(r, msg_file, opts, flags);
1569 return res;
1572 static int is_original_commit_empty(struct commit *commit)
1574 const struct object_id *ptree_oid;
1576 if (parse_commit(commit))
1577 return error(_("could not parse commit %s"),
1578 oid_to_hex(&commit->object.oid));
1579 if (commit->parents) {
1580 struct commit *parent = commit->parents->item;
1581 if (parse_commit(parent))
1582 return error(_("could not parse parent commit %s"),
1583 oid_to_hex(&parent->object.oid));
1584 ptree_oid = get_commit_tree_oid(parent);
1585 } else {
1586 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1589 return oideq(ptree_oid, get_commit_tree_oid(commit));
1593 * Do we run "git commit" with "--allow-empty"?
1595 static int allow_empty(struct repository *r,
1596 struct replay_opts *opts,
1597 struct commit *commit)
1599 int index_unchanged, empty_commit;
1602 * Three cases:
1604 * (1) we do not allow empty at all and error out.
1606 * (2) we allow ones that were initially empty, but
1607 * forbid the ones that become empty;
1609 * (3) we allow both.
1611 if (!opts->allow_empty)
1612 return 0; /* let "git commit" barf as necessary */
1614 index_unchanged = is_index_unchanged(r);
1615 if (index_unchanged < 0)
1616 return index_unchanged;
1617 if (!index_unchanged)
1618 return 0; /* we do not have to say --allow-empty */
1620 if (opts->keep_redundant_commits)
1621 return 1;
1623 empty_commit = is_original_commit_empty(commit);
1624 if (empty_commit < 0)
1625 return empty_commit;
1626 if (!empty_commit)
1627 return 0;
1628 else
1629 return 1;
1632 static struct {
1633 char c;
1634 const char *str;
1635 } todo_command_info[] = {
1636 { 'p', "pick" },
1637 { 0, "revert" },
1638 { 'e', "edit" },
1639 { 'r', "reword" },
1640 { 'f', "fixup" },
1641 { 's', "squash" },
1642 { 'x', "exec" },
1643 { 'b', "break" },
1644 { 'l', "label" },
1645 { 't', "reset" },
1646 { 'm', "merge" },
1647 { 0, "noop" },
1648 { 'd', "drop" },
1649 { 0, NULL }
1652 static const char *command_to_string(const enum todo_command command)
1654 if (command < TODO_COMMENT)
1655 return todo_command_info[command].str;
1656 die(_("unknown command: %d"), command);
1659 static char command_to_char(const enum todo_command command)
1661 if (command < TODO_COMMENT && todo_command_info[command].c)
1662 return todo_command_info[command].c;
1663 return comment_line_char;
1666 static int is_noop(const enum todo_command command)
1668 return TODO_NOOP <= command;
1671 static int is_fixup(enum todo_command command)
1673 return command == TODO_FIXUP || command == TODO_SQUASH;
1676 /* Does this command create a (non-merge) commit? */
1677 static int is_pick_or_similar(enum todo_command command)
1679 switch (command) {
1680 case TODO_PICK:
1681 case TODO_REVERT:
1682 case TODO_EDIT:
1683 case TODO_REWORD:
1684 case TODO_FIXUP:
1685 case TODO_SQUASH:
1686 return 1;
1687 default:
1688 return 0;
1692 static int update_squash_messages(struct repository *r,
1693 enum todo_command command,
1694 struct commit *commit,
1695 struct replay_opts *opts)
1697 struct strbuf buf = STRBUF_INIT;
1698 int res;
1699 const char *message, *body;
1700 const char *encoding = get_commit_output_encoding();
1702 if (opts->current_fixup_count > 0) {
1703 struct strbuf header = STRBUF_INIT;
1704 char *eol;
1706 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1707 return error(_("could not read '%s'"),
1708 rebase_path_squash_msg());
1710 eol = buf.buf[0] != comment_line_char ?
1711 buf.buf : strchrnul(buf.buf, '\n');
1713 strbuf_addf(&header, "%c ", comment_line_char);
1714 strbuf_addf(&header, _("This is a combination of %d commits."),
1715 opts->current_fixup_count + 2);
1716 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1717 strbuf_release(&header);
1718 } else {
1719 struct object_id head;
1720 struct commit *head_commit;
1721 const char *head_message, *body;
1723 if (get_oid("HEAD", &head))
1724 return error(_("need a HEAD to fixup"));
1725 if (!(head_commit = lookup_commit_reference(r, &head)))
1726 return error(_("could not read HEAD"));
1727 if (!(head_message = logmsg_reencode(head_commit, NULL, encoding)))
1728 return error(_("could not read HEAD's commit message"));
1730 find_commit_subject(head_message, &body);
1731 if (write_message(body, strlen(body),
1732 rebase_path_fixup_msg(), 0)) {
1733 unuse_commit_buffer(head_commit, head_message);
1734 return error(_("cannot write '%s'"),
1735 rebase_path_fixup_msg());
1738 strbuf_addf(&buf, "%c ", comment_line_char);
1739 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1740 strbuf_addf(&buf, "\n%c ", comment_line_char);
1741 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1742 strbuf_addstr(&buf, "\n\n");
1743 strbuf_addstr(&buf, body);
1745 unuse_commit_buffer(head_commit, head_message);
1748 if (!(message = logmsg_reencode(commit, NULL, encoding)))
1749 return error(_("could not read commit message of %s"),
1750 oid_to_hex(&commit->object.oid));
1751 find_commit_subject(message, &body);
1753 if (command == TODO_SQUASH) {
1754 unlink(rebase_path_fixup_msg());
1755 strbuf_addf(&buf, "\n%c ", comment_line_char);
1756 strbuf_addf(&buf, _("This is the commit message #%d:"),
1757 ++opts->current_fixup_count + 1);
1758 strbuf_addstr(&buf, "\n\n");
1759 strbuf_addstr(&buf, body);
1760 } else if (command == TODO_FIXUP) {
1761 strbuf_addf(&buf, "\n%c ", comment_line_char);
1762 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1763 ++opts->current_fixup_count + 1);
1764 strbuf_addstr(&buf, "\n\n");
1765 strbuf_add_commented_lines(&buf, body, strlen(body));
1766 } else
1767 return error(_("unknown command: %d"), command);
1768 unuse_commit_buffer(commit, message);
1770 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1771 strbuf_release(&buf);
1773 if (!res) {
1774 strbuf_addf(&opts->current_fixups, "%s%s %s",
1775 opts->current_fixups.len ? "\n" : "",
1776 command_to_string(command),
1777 oid_to_hex(&commit->object.oid));
1778 res = write_message(opts->current_fixups.buf,
1779 opts->current_fixups.len,
1780 rebase_path_current_fixups(), 0);
1783 return res;
1786 static void flush_rewritten_pending(void)
1788 struct strbuf buf = STRBUF_INIT;
1789 struct object_id newoid;
1790 FILE *out;
1792 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1793 !get_oid("HEAD", &newoid) &&
1794 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1795 char *bol = buf.buf, *eol;
1797 while (*bol) {
1798 eol = strchrnul(bol, '\n');
1799 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1800 bol, oid_to_hex(&newoid));
1801 if (!*eol)
1802 break;
1803 bol = eol + 1;
1805 fclose(out);
1806 unlink(rebase_path_rewritten_pending());
1808 strbuf_release(&buf);
1811 static void record_in_rewritten(struct object_id *oid,
1812 enum todo_command next_command)
1814 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1816 if (!out)
1817 return;
1819 fprintf(out, "%s\n", oid_to_hex(oid));
1820 fclose(out);
1822 if (!is_fixup(next_command))
1823 flush_rewritten_pending();
1826 static int do_pick_commit(struct repository *r,
1827 enum todo_command command,
1828 struct commit *commit,
1829 struct replay_opts *opts,
1830 int final_fixup, int *check_todo)
1832 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1833 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
1834 struct object_id head;
1835 struct commit *base, *next, *parent;
1836 const char *base_label, *next_label;
1837 char *author = NULL;
1838 struct commit_message msg = { NULL, NULL, NULL, NULL };
1839 struct strbuf msgbuf = STRBUF_INIT;
1840 int res, unborn = 0, reword = 0, allow;
1842 if (opts->no_commit) {
1844 * We do not intend to commit immediately. We just want to
1845 * merge the differences in, so let's compute the tree
1846 * that represents the "current" state for merge-recursive
1847 * to work on.
1849 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
1850 return error(_("your index file is unmerged."));
1851 } else {
1852 unborn = get_oid("HEAD", &head);
1853 /* Do we want to generate a root commit? */
1854 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1855 oideq(&head, &opts->squash_onto)) {
1856 if (is_fixup(command))
1857 return error(_("cannot fixup root commit"));
1858 flags |= CREATE_ROOT_COMMIT;
1859 unborn = 1;
1860 } else if (unborn)
1861 oidcpy(&head, the_hash_algo->empty_tree);
1862 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
1863 NULL, 0))
1864 return error_dirty_index(r, opts);
1866 discard_index(r->index);
1868 if (!commit->parents)
1869 parent = NULL;
1870 else if (commit->parents->next) {
1871 /* Reverting or cherry-picking a merge commit */
1872 int cnt;
1873 struct commit_list *p;
1875 if (!opts->mainline)
1876 return error(_("commit %s is a merge but no -m option was given."),
1877 oid_to_hex(&commit->object.oid));
1879 for (cnt = 1, p = commit->parents;
1880 cnt != opts->mainline && p;
1881 cnt++)
1882 p = p->next;
1883 if (cnt != opts->mainline || !p)
1884 return error(_("commit %s does not have parent %d"),
1885 oid_to_hex(&commit->object.oid), opts->mainline);
1886 parent = p->item;
1887 } else if (1 < opts->mainline)
1889 * Non-first parent explicitly specified as mainline for
1890 * non-merge commit
1892 return error(_("commit %s does not have parent %d"),
1893 oid_to_hex(&commit->object.oid), opts->mainline);
1894 else
1895 parent = commit->parents->item;
1897 if (get_message(commit, &msg) != 0)
1898 return error(_("cannot get commit message for %s"),
1899 oid_to_hex(&commit->object.oid));
1901 if (opts->allow_ff && !is_fixup(command) &&
1902 ((parent && oideq(&parent->object.oid, &head)) ||
1903 (!parent && unborn))) {
1904 if (is_rebase_i(opts))
1905 write_author_script(msg.message);
1906 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
1907 opts);
1908 if (res || command != TODO_REWORD)
1909 goto leave;
1910 reword = 1;
1911 msg_file = NULL;
1912 goto fast_forward_edit;
1914 if (parent && parse_commit(parent) < 0)
1915 /* TRANSLATORS: The first %s will be a "todo" command like
1916 "revert" or "pick", the second %s a SHA1. */
1917 return error(_("%s: cannot parse parent commit %s"),
1918 command_to_string(command),
1919 oid_to_hex(&parent->object.oid));
1922 * "commit" is an existing commit. We would want to apply
1923 * the difference it introduces since its first parent "prev"
1924 * on top of the current HEAD if we are cherry-pick. Or the
1925 * reverse of it if we are revert.
1928 if (command == TODO_REVERT) {
1929 base = commit;
1930 base_label = msg.label;
1931 next = parent;
1932 next_label = msg.parent_label;
1933 strbuf_addstr(&msgbuf, "Revert \"");
1934 strbuf_addstr(&msgbuf, msg.subject);
1935 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1936 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1938 if (commit->parents && commit->parents->next) {
1939 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1940 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1942 strbuf_addstr(&msgbuf, ".\n");
1943 } else {
1944 const char *p;
1946 base = parent;
1947 base_label = msg.parent_label;
1948 next = commit;
1949 next_label = msg.label;
1951 /* Append the commit log message to msgbuf. */
1952 if (find_commit_subject(msg.message, &p))
1953 strbuf_addstr(&msgbuf, p);
1955 if (opts->record_origin) {
1956 strbuf_complete_line(&msgbuf);
1957 if (!has_conforming_footer(&msgbuf, NULL, 0))
1958 strbuf_addch(&msgbuf, '\n');
1959 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1960 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1961 strbuf_addstr(&msgbuf, ")\n");
1963 if (!is_fixup(command))
1964 author = get_author(msg.message);
1967 if (command == TODO_REWORD)
1968 reword = 1;
1969 else if (is_fixup(command)) {
1970 if (update_squash_messages(r, command, commit, opts))
1971 return -1;
1972 flags |= AMEND_MSG;
1973 if (!final_fixup)
1974 msg_file = rebase_path_squash_msg();
1975 else if (file_exists(rebase_path_fixup_msg())) {
1976 flags |= CLEANUP_MSG;
1977 msg_file = rebase_path_fixup_msg();
1978 } else {
1979 const char *dest = git_path_squash_msg(r);
1980 unlink(dest);
1981 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1982 return error(_("could not rename '%s' to '%s'"),
1983 rebase_path_squash_msg(), dest);
1984 unlink(git_path_merge_msg(r));
1985 msg_file = dest;
1986 flags |= EDIT_MSG;
1990 if (opts->signoff && !is_fixup(command))
1991 append_signoff(&msgbuf, 0, 0);
1993 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1994 res = -1;
1995 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1996 res = do_recursive_merge(r, base, next, base_label, next_label,
1997 &head, &msgbuf, opts);
1998 if (res < 0)
1999 goto leave;
2001 res |= write_message(msgbuf.buf, msgbuf.len,
2002 git_path_merge_msg(r), 0);
2003 } else {
2004 struct commit_list *common = NULL;
2005 struct commit_list *remotes = NULL;
2007 res = write_message(msgbuf.buf, msgbuf.len,
2008 git_path_merge_msg(r), 0);
2010 commit_list_insert(base, &common);
2011 commit_list_insert(next, &remotes);
2012 res |= try_merge_command(r, opts->strategy,
2013 opts->xopts_nr, (const char **)opts->xopts,
2014 common, oid_to_hex(&head), remotes);
2015 free_commit_list(common);
2016 free_commit_list(remotes);
2018 strbuf_release(&msgbuf);
2021 * If the merge was clean or if it failed due to conflict, we write
2022 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2023 * However, if the merge did not even start, then we don't want to
2024 * write it at all.
2026 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
2027 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
2028 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2029 res = -1;
2030 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
2031 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
2032 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2033 res = -1;
2035 if (res) {
2036 error(command == TODO_REVERT
2037 ? _("could not revert %s... %s")
2038 : _("could not apply %s... %s"),
2039 short_commit_name(commit), msg.subject);
2040 print_advice(r, res == 1, opts);
2041 repo_rerere(r, opts->allow_rerere_auto);
2042 goto leave;
2045 allow = allow_empty(r, opts, commit);
2046 if (allow < 0) {
2047 res = allow;
2048 goto leave;
2049 } else if (allow)
2050 flags |= ALLOW_EMPTY;
2051 if (!opts->no_commit) {
2052 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
2053 res = do_commit(r, msg_file, author, opts, flags);
2054 else
2055 res = error(_("unable to parse commit author"));
2056 *check_todo = !!(flags & EDIT_MSG);
2057 if (!res && reword) {
2058 fast_forward_edit:
2059 res = run_git_commit(r, NULL, opts, EDIT_MSG |
2060 VERIFY_MSG | AMEND_MSG |
2061 (flags & ALLOW_EMPTY));
2062 *check_todo = 1;
2067 if (!res && final_fixup) {
2068 unlink(rebase_path_fixup_msg());
2069 unlink(rebase_path_squash_msg());
2070 unlink(rebase_path_current_fixups());
2071 strbuf_reset(&opts->current_fixups);
2072 opts->current_fixup_count = 0;
2075 leave:
2076 free_message(commit, &msg);
2077 free(author);
2078 update_abort_safety_file();
2080 return res;
2083 static int prepare_revs(struct replay_opts *opts)
2086 * picking (but not reverting) ranges (but not individual revisions)
2087 * should be done in reverse
2089 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
2090 opts->revs->reverse ^= 1;
2092 if (prepare_revision_walk(opts->revs))
2093 return error(_("revision walk setup failed"));
2095 return 0;
2098 static int read_and_refresh_cache(struct repository *r,
2099 struct replay_opts *opts)
2101 struct lock_file index_lock = LOCK_INIT;
2102 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
2103 if (repo_read_index(r) < 0) {
2104 rollback_lock_file(&index_lock);
2105 return error(_("git %s: failed to read the index"),
2106 _(action_name(opts)));
2108 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
2109 if (index_fd >= 0) {
2110 if (write_locked_index(r->index, &index_lock,
2111 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
2112 return error(_("git %s: failed to refresh the index"),
2113 _(action_name(opts)));
2116 return 0;
2119 enum todo_item_flags {
2120 TODO_EDIT_MERGE_MSG = 1
2123 void todo_list_release(struct todo_list *todo_list)
2125 strbuf_release(&todo_list->buf);
2126 FREE_AND_NULL(todo_list->items);
2127 todo_list->nr = todo_list->alloc = 0;
2130 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2132 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2133 return todo_list->items + todo_list->nr++;
2136 const char *todo_item_get_arg(struct todo_list *todo_list,
2137 struct todo_item *item)
2139 return todo_list->buf.buf + item->arg_offset;
2142 static int is_command(enum todo_command command, const char **bol)
2144 const char *str = todo_command_info[command].str;
2145 const char nick = todo_command_info[command].c;
2146 const char *p = *bol + 1;
2148 return skip_prefix(*bol, str, bol) ||
2149 ((nick && **bol == nick) &&
2150 (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r' || !*p) &&
2151 (*bol = p));
2154 static int parse_insn_line(struct repository *r, struct todo_item *item,
2155 const char *buf, const char *bol, char *eol)
2157 struct object_id commit_oid;
2158 char *end_of_object_name;
2159 int i, saved, status, padding;
2161 item->flags = 0;
2163 /* left-trim */
2164 bol += strspn(bol, " \t");
2166 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2167 item->command = TODO_COMMENT;
2168 item->commit = NULL;
2169 item->arg_offset = bol - buf;
2170 item->arg_len = eol - bol;
2171 return 0;
2174 for (i = 0; i < TODO_COMMENT; i++)
2175 if (is_command(i, &bol)) {
2176 item->command = i;
2177 break;
2179 if (i >= TODO_COMMENT)
2180 return -1;
2182 /* Eat up extra spaces/ tabs before object name */
2183 padding = strspn(bol, " \t");
2184 bol += padding;
2186 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2187 if (bol != eol)
2188 return error(_("%s does not accept arguments: '%s'"),
2189 command_to_string(item->command), bol);
2190 item->commit = NULL;
2191 item->arg_offset = bol - buf;
2192 item->arg_len = eol - bol;
2193 return 0;
2196 if (!padding)
2197 return error(_("missing arguments for %s"),
2198 command_to_string(item->command));
2200 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2201 item->command == TODO_RESET) {
2202 item->commit = NULL;
2203 item->arg_offset = bol - buf;
2204 item->arg_len = (int)(eol - bol);
2205 return 0;
2208 if (item->command == TODO_MERGE) {
2209 if (skip_prefix(bol, "-C", &bol))
2210 bol += strspn(bol, " \t");
2211 else if (skip_prefix(bol, "-c", &bol)) {
2212 bol += strspn(bol, " \t");
2213 item->flags |= TODO_EDIT_MERGE_MSG;
2214 } else {
2215 item->flags |= TODO_EDIT_MERGE_MSG;
2216 item->commit = NULL;
2217 item->arg_offset = bol - buf;
2218 item->arg_len = (int)(eol - bol);
2219 return 0;
2223 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2224 saved = *end_of_object_name;
2225 *end_of_object_name = '\0';
2226 status = get_oid(bol, &commit_oid);
2227 *end_of_object_name = saved;
2229 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2230 item->arg_offset = bol - buf;
2231 item->arg_len = (int)(eol - bol);
2233 if (status < 0)
2234 return error(_("could not parse '%.*s'"),
2235 (int)(end_of_object_name - bol), bol);
2237 item->commit = lookup_commit_reference(r, &commit_oid);
2238 return !item->commit;
2241 int sequencer_get_last_command(struct repository *r, enum replay_action *action)
2243 const char *todo_file, *bol;
2244 struct strbuf buf = STRBUF_INIT;
2245 int ret = 0;
2247 todo_file = git_path_todo_file();
2248 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2249 if (errno == ENOENT || errno == ENOTDIR)
2250 return -1;
2251 else
2252 return error_errno("unable to open '%s'", todo_file);
2254 bol = buf.buf + strspn(buf.buf, " \t\r\n");
2255 if (is_command(TODO_PICK, &bol) && (*bol == ' ' || *bol == '\t'))
2256 *action = REPLAY_PICK;
2257 else if (is_command(TODO_REVERT, &bol) &&
2258 (*bol == ' ' || *bol == '\t'))
2259 *action = REPLAY_REVERT;
2260 else
2261 ret = -1;
2263 strbuf_release(&buf);
2265 return ret;
2268 int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2269 struct todo_list *todo_list)
2271 struct todo_item *item;
2272 char *p = buf, *next_p;
2273 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2275 todo_list->current = todo_list->nr = 0;
2277 for (i = 1; *p; i++, p = next_p) {
2278 char *eol = strchrnul(p, '\n');
2280 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2282 if (p != eol && eol[-1] == '\r')
2283 eol--; /* strip Carriage Return */
2285 item = append_new_todo(todo_list);
2286 item->offset_in_buf = p - todo_list->buf.buf;
2287 if (parse_insn_line(r, item, buf, p, eol)) {
2288 res = error(_("invalid line %d: %.*s"),
2289 i, (int)(eol - p), p);
2290 item->command = TODO_COMMENT + 1;
2291 item->arg_offset = p - buf;
2292 item->arg_len = (int)(eol - p);
2293 item->commit = NULL;
2296 if (fixup_okay)
2297 ; /* do nothing */
2298 else if (is_fixup(item->command))
2299 return error(_("cannot '%s' without a previous commit"),
2300 command_to_string(item->command));
2301 else if (!is_noop(item->command))
2302 fixup_okay = 1;
2305 return res;
2308 static int count_commands(struct todo_list *todo_list)
2310 int count = 0, i;
2312 for (i = 0; i < todo_list->nr; i++)
2313 if (todo_list->items[i].command != TODO_COMMENT)
2314 count++;
2316 return count;
2319 static int get_item_line_offset(struct todo_list *todo_list, int index)
2321 return index < todo_list->nr ?
2322 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2325 static const char *get_item_line(struct todo_list *todo_list, int index)
2327 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2330 static int get_item_line_length(struct todo_list *todo_list, int index)
2332 return get_item_line_offset(todo_list, index + 1)
2333 - get_item_line_offset(todo_list, index);
2336 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2338 int fd;
2339 ssize_t len;
2341 fd = open(path, O_RDONLY);
2342 if (fd < 0)
2343 return error_errno(_("could not open '%s'"), path);
2344 len = strbuf_read(sb, fd, 0);
2345 close(fd);
2346 if (len < 0)
2347 return error(_("could not read '%s'."), path);
2348 return len;
2351 static int have_finished_the_last_pick(void)
2353 struct strbuf buf = STRBUF_INIT;
2354 const char *eol;
2355 const char *todo_path = git_path_todo_file();
2356 int ret = 0;
2358 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2359 if (errno == ENOENT) {
2360 return 0;
2361 } else {
2362 error_errno("unable to open '%s'", todo_path);
2363 return 0;
2366 /* If there is only one line then we are done */
2367 eol = strchr(buf.buf, '\n');
2368 if (!eol || !eol[1])
2369 ret = 1;
2371 strbuf_release(&buf);
2373 return ret;
2376 void sequencer_post_commit_cleanup(struct repository *r, int verbose)
2378 struct replay_opts opts = REPLAY_OPTS_INIT;
2379 int need_cleanup = 0;
2381 if (file_exists(git_path_cherry_pick_head(r))) {
2382 if (!unlink(git_path_cherry_pick_head(r)) && verbose)
2383 warning(_("cancelling a cherry picking in progress"));
2384 opts.action = REPLAY_PICK;
2385 need_cleanup = 1;
2388 if (file_exists(git_path_revert_head(r))) {
2389 if (!unlink(git_path_revert_head(r)) && verbose)
2390 warning(_("cancelling a revert in progress"));
2391 opts.action = REPLAY_REVERT;
2392 need_cleanup = 1;
2395 if (!need_cleanup)
2396 return;
2398 if (!have_finished_the_last_pick())
2399 return;
2401 sequencer_remove_state(&opts);
2404 static int read_populate_todo(struct repository *r,
2405 struct todo_list *todo_list,
2406 struct replay_opts *opts)
2408 struct stat st;
2409 const char *todo_file = get_todo_path(opts);
2410 int res;
2412 strbuf_reset(&todo_list->buf);
2413 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2414 return -1;
2416 res = stat(todo_file, &st);
2417 if (res)
2418 return error(_("could not stat '%s'"), todo_file);
2419 fill_stat_data(&todo_list->stat, &st);
2421 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2422 if (res) {
2423 if (is_rebase_i(opts))
2424 return error(_("please fix this using "
2425 "'git rebase --edit-todo'."));
2426 return error(_("unusable instruction sheet: '%s'"), todo_file);
2429 if (!todo_list->nr &&
2430 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2431 return error(_("no commits parsed."));
2433 if (!is_rebase_i(opts)) {
2434 enum todo_command valid =
2435 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2436 int i;
2438 for (i = 0; i < todo_list->nr; i++)
2439 if (valid == todo_list->items[i].command)
2440 continue;
2441 else if (valid == TODO_PICK)
2442 return error(_("cannot cherry-pick during a revert."));
2443 else
2444 return error(_("cannot revert during a cherry-pick."));
2447 if (is_rebase_i(opts)) {
2448 struct todo_list done = TODO_LIST_INIT;
2449 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2451 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2452 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
2453 todo_list->done_nr = count_commands(&done);
2454 else
2455 todo_list->done_nr = 0;
2457 todo_list->total_nr = todo_list->done_nr
2458 + count_commands(todo_list);
2459 todo_list_release(&done);
2461 if (f) {
2462 fprintf(f, "%d\n", todo_list->total_nr);
2463 fclose(f);
2467 return 0;
2470 static int git_config_string_dup(char **dest,
2471 const char *var, const char *value)
2473 if (!value)
2474 return config_error_nonbool(var);
2475 free(*dest);
2476 *dest = xstrdup(value);
2477 return 0;
2480 static int populate_opts_cb(const char *key, const char *value, void *data)
2482 struct replay_opts *opts = data;
2483 int error_flag = 1;
2485 if (!value)
2486 error_flag = 0;
2487 else if (!strcmp(key, "options.no-commit"))
2488 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2489 else if (!strcmp(key, "options.edit"))
2490 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2491 else if (!strcmp(key, "options.allow-empty"))
2492 opts->allow_empty =
2493 git_config_bool_or_int(key, value, &error_flag);
2494 else if (!strcmp(key, "options.allow-empty-message"))
2495 opts->allow_empty_message =
2496 git_config_bool_or_int(key, value, &error_flag);
2497 else if (!strcmp(key, "options.keep-redundant-commits"))
2498 opts->keep_redundant_commits =
2499 git_config_bool_or_int(key, value, &error_flag);
2500 else if (!strcmp(key, "options.signoff"))
2501 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2502 else if (!strcmp(key, "options.record-origin"))
2503 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2504 else if (!strcmp(key, "options.allow-ff"))
2505 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2506 else if (!strcmp(key, "options.mainline"))
2507 opts->mainline = git_config_int(key, value);
2508 else if (!strcmp(key, "options.strategy"))
2509 git_config_string_dup(&opts->strategy, key, value);
2510 else if (!strcmp(key, "options.gpg-sign"))
2511 git_config_string_dup(&opts->gpg_sign, key, value);
2512 else if (!strcmp(key, "options.strategy-option")) {
2513 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2514 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2515 } else if (!strcmp(key, "options.allow-rerere-auto"))
2516 opts->allow_rerere_auto =
2517 git_config_bool_or_int(key, value, &error_flag) ?
2518 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2519 else if (!strcmp(key, "options.default-msg-cleanup")) {
2520 opts->explicit_cleanup = 1;
2521 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
2522 } else
2523 return error(_("invalid key: %s"), key);
2525 if (!error_flag)
2526 return error(_("invalid value for %s: %s"), key, value);
2528 return 0;
2531 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2533 int i;
2534 char *strategy_opts_string = raw_opts;
2536 if (*strategy_opts_string == ' ')
2537 strategy_opts_string++;
2539 opts->xopts_nr = split_cmdline(strategy_opts_string,
2540 (const char ***)&opts->xopts);
2541 for (i = 0; i < opts->xopts_nr; i++) {
2542 const char *arg = opts->xopts[i];
2544 skip_prefix(arg, "--", &arg);
2545 opts->xopts[i] = xstrdup(arg);
2549 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2551 strbuf_reset(buf);
2552 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2553 return;
2554 opts->strategy = strbuf_detach(buf, NULL);
2555 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2556 return;
2558 parse_strategy_opts(opts, buf->buf);
2561 static int read_populate_opts(struct replay_opts *opts)
2563 if (is_rebase_i(opts)) {
2564 struct strbuf buf = STRBUF_INIT;
2566 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2567 if (!starts_with(buf.buf, "-S"))
2568 strbuf_reset(&buf);
2569 else {
2570 free(opts->gpg_sign);
2571 opts->gpg_sign = xstrdup(buf.buf + 2);
2573 strbuf_reset(&buf);
2576 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2577 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2578 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2579 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2580 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2581 strbuf_reset(&buf);
2584 if (file_exists(rebase_path_verbose()))
2585 opts->verbose = 1;
2587 if (file_exists(rebase_path_quiet()))
2588 opts->quiet = 1;
2590 if (file_exists(rebase_path_signoff())) {
2591 opts->allow_ff = 0;
2592 opts->signoff = 1;
2595 if (file_exists(rebase_path_cdate_is_adate())) {
2596 opts->allow_ff = 0;
2597 opts->committer_date_is_author_date = 1;
2600 if (file_exists(rebase_path_ignore_date())) {
2601 opts->allow_ff = 0;
2602 opts->ignore_date = 1;
2605 if (file_exists(rebase_path_reschedule_failed_exec()))
2606 opts->reschedule_failed_exec = 1;
2608 read_strategy_opts(opts, &buf);
2609 strbuf_release(&buf);
2611 if (read_oneliner(&opts->current_fixups,
2612 rebase_path_current_fixups(), 1)) {
2613 const char *p = opts->current_fixups.buf;
2614 opts->current_fixup_count = 1;
2615 while ((p = strchr(p, '\n'))) {
2616 opts->current_fixup_count++;
2617 p++;
2621 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2622 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2623 return error(_("unusable squash-onto"));
2624 opts->have_squash_onto = 1;
2627 return 0;
2630 if (!file_exists(git_path_opts_file()))
2631 return 0;
2633 * The function git_parse_source(), called from git_config_from_file(),
2634 * may die() in case of a syntactically incorrect file. We do not care
2635 * about this case, though, because we wrote that file ourselves, so we
2636 * are pretty certain that it is syntactically correct.
2638 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2639 return error(_("malformed options sheet: '%s'"),
2640 git_path_opts_file());
2641 return 0;
2644 static void write_strategy_opts(struct replay_opts *opts)
2646 int i;
2647 struct strbuf buf = STRBUF_INIT;
2649 for (i = 0; i < opts->xopts_nr; ++i)
2650 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2652 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2653 strbuf_release(&buf);
2656 int write_basic_state(struct replay_opts *opts, const char *head_name,
2657 struct commit *onto, const char *orig_head)
2659 const char *quiet = getenv("GIT_QUIET");
2661 if (head_name)
2662 write_file(rebase_path_head_name(), "%s\n", head_name);
2663 if (onto)
2664 write_file(rebase_path_onto(), "%s\n",
2665 oid_to_hex(&onto->object.oid));
2666 if (orig_head)
2667 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2669 if (quiet)
2670 write_file(rebase_path_quiet(), "%s\n", quiet);
2671 if (opts->verbose)
2672 write_file(rebase_path_verbose(), "%s", "");
2673 if (opts->strategy)
2674 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2675 if (opts->xopts_nr > 0)
2676 write_strategy_opts(opts);
2678 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2679 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2680 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2681 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2683 if (opts->gpg_sign)
2684 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2685 if (opts->signoff)
2686 write_file(rebase_path_signoff(), "--signoff\n");
2687 if (opts->committer_date_is_author_date)
2688 write_file(rebase_path_cdate_is_adate(), "%s", "");
2689 if (opts->ignore_date)
2690 write_file(rebase_path_ignore_date(), "%s", "");
2691 if (opts->reschedule_failed_exec)
2692 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
2694 return 0;
2697 static int walk_revs_populate_todo(struct todo_list *todo_list,
2698 struct replay_opts *opts)
2700 enum todo_command command = opts->action == REPLAY_PICK ?
2701 TODO_PICK : TODO_REVERT;
2702 const char *command_string = todo_command_info[command].str;
2703 const char *encoding;
2704 struct commit *commit;
2706 if (prepare_revs(opts))
2707 return -1;
2709 encoding = get_log_output_encoding();
2711 while ((commit = get_revision(opts->revs))) {
2712 struct todo_item *item = append_new_todo(todo_list);
2713 const char *commit_buffer = logmsg_reencode(commit, NULL, encoding);
2714 const char *subject;
2715 int subject_len;
2717 item->command = command;
2718 item->commit = commit;
2719 item->arg_offset = 0;
2720 item->arg_len = 0;
2721 item->offset_in_buf = todo_list->buf.len;
2722 subject_len = find_commit_subject(commit_buffer, &subject);
2723 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2724 short_commit_name(commit), subject_len, subject);
2725 unuse_commit_buffer(commit, commit_buffer);
2728 if (!todo_list->nr)
2729 return error(_("empty commit set passed"));
2731 return 0;
2734 static int create_seq_dir(struct repository *r)
2736 enum replay_action action;
2737 const char *in_progress_error = NULL;
2738 const char *in_progress_advice = NULL;
2739 unsigned int advise_skip = file_exists(git_path_revert_head(r)) ||
2740 file_exists(git_path_cherry_pick_head(r));
2742 if (!sequencer_get_last_command(r, &action)) {
2743 switch (action) {
2744 case REPLAY_REVERT:
2745 in_progress_error = _("revert is already in progress");
2746 in_progress_advice =
2747 _("try \"git revert (--continue | %s--abort | --quit)\"");
2748 break;
2749 case REPLAY_PICK:
2750 in_progress_error = _("cherry-pick is already in progress");
2751 in_progress_advice =
2752 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
2753 break;
2754 default:
2755 BUG("unexpected action in create_seq_dir");
2758 if (in_progress_error) {
2759 error("%s", in_progress_error);
2760 if (advice_sequencer_in_use)
2761 advise(in_progress_advice,
2762 advise_skip ? "--skip | " : "");
2763 return -1;
2765 if (mkdir(git_path_seq_dir(), 0777) < 0)
2766 return error_errno(_("could not create sequencer directory '%s'"),
2767 git_path_seq_dir());
2769 return 0;
2772 static int save_head(const char *head)
2774 struct lock_file head_lock = LOCK_INIT;
2775 struct strbuf buf = STRBUF_INIT;
2776 int fd;
2777 ssize_t written;
2779 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2780 if (fd < 0)
2781 return error_errno(_("could not lock HEAD"));
2782 strbuf_addf(&buf, "%s\n", head);
2783 written = write_in_full(fd, buf.buf, buf.len);
2784 strbuf_release(&buf);
2785 if (written < 0) {
2786 error_errno(_("could not write to '%s'"), git_path_head_file());
2787 rollback_lock_file(&head_lock);
2788 return -1;
2790 if (commit_lock_file(&head_lock) < 0)
2791 return error(_("failed to finalize '%s'"), git_path_head_file());
2792 return 0;
2795 static int rollback_is_safe(void)
2797 struct strbuf sb = STRBUF_INIT;
2798 struct object_id expected_head, actual_head;
2800 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2801 strbuf_trim(&sb);
2802 if (get_oid_hex(sb.buf, &expected_head)) {
2803 strbuf_release(&sb);
2804 die(_("could not parse %s"), git_path_abort_safety_file());
2806 strbuf_release(&sb);
2808 else if (errno == ENOENT)
2809 oidclr(&expected_head);
2810 else
2811 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2813 if (get_oid("HEAD", &actual_head))
2814 oidclr(&actual_head);
2816 return oideq(&actual_head, &expected_head);
2819 static int reset_merge(const struct object_id *oid)
2821 int ret;
2822 struct argv_array argv = ARGV_ARRAY_INIT;
2824 argv_array_pushl(&argv, "reset", "--merge", NULL);
2826 if (!is_null_oid(oid))
2827 argv_array_push(&argv, oid_to_hex(oid));
2829 ret = run_command_v_opt(argv.argv, RUN_GIT_CMD);
2830 argv_array_clear(&argv);
2832 return ret;
2835 static int rollback_single_pick(struct repository *r)
2837 struct object_id head_oid;
2839 if (!file_exists(git_path_cherry_pick_head(r)) &&
2840 !file_exists(git_path_revert_head(r)))
2841 return error(_("no cherry-pick or revert in progress"));
2842 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2843 return error(_("cannot resolve HEAD"));
2844 if (is_null_oid(&head_oid))
2845 return error(_("cannot abort from a branch yet to be born"));
2846 return reset_merge(&head_oid);
2849 static int skip_single_pick(void)
2851 struct object_id head;
2853 if (read_ref_full("HEAD", 0, &head, NULL))
2854 return error(_("cannot resolve HEAD"));
2855 return reset_merge(&head);
2858 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
2860 FILE *f;
2861 struct object_id oid;
2862 struct strbuf buf = STRBUF_INIT;
2863 const char *p;
2865 f = fopen(git_path_head_file(), "r");
2866 if (!f && errno == ENOENT) {
2868 * There is no multiple-cherry-pick in progress.
2869 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2870 * a single-cherry-pick in progress, abort that.
2872 return rollback_single_pick(r);
2874 if (!f)
2875 return error_errno(_("cannot open '%s'"), git_path_head_file());
2876 if (strbuf_getline_lf(&buf, f)) {
2877 error(_("cannot read '%s': %s"), git_path_head_file(),
2878 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2879 fclose(f);
2880 goto fail;
2882 fclose(f);
2883 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2884 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2885 git_path_head_file());
2886 goto fail;
2888 if (is_null_oid(&oid)) {
2889 error(_("cannot abort from a branch yet to be born"));
2890 goto fail;
2893 if (!rollback_is_safe()) {
2894 /* Do not error, just do not rollback */
2895 warning(_("You seem to have moved HEAD. "
2896 "Not rewinding, check your HEAD!"));
2897 } else
2898 if (reset_merge(&oid))
2899 goto fail;
2900 strbuf_release(&buf);
2901 return sequencer_remove_state(opts);
2902 fail:
2903 strbuf_release(&buf);
2904 return -1;
2907 int sequencer_skip(struct repository *r, struct replay_opts *opts)
2909 enum replay_action action = -1;
2910 sequencer_get_last_command(r, &action);
2913 * Check whether the subcommand requested to skip the commit is actually
2914 * in progress and that it's safe to skip the commit.
2916 * opts->action tells us which subcommand requested to skip the commit.
2917 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
2918 * action is in progress and we can skip the commit.
2920 * Otherwise we check that the last instruction was related to the
2921 * particular subcommand we're trying to execute and barf if that's not
2922 * the case.
2924 * Finally we check that the rollback is "safe", i.e., has the HEAD
2925 * moved? In this case, it doesn't make sense to "reset the merge" and
2926 * "skip the commit" as the user already handled this by committing. But
2927 * we'd not want to barf here, instead give advice on how to proceed. We
2928 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
2929 * it gets removed when the user commits, so if it still exists we're
2930 * sure the user can't have committed before.
2932 switch (opts->action) {
2933 case REPLAY_REVERT:
2934 if (!file_exists(git_path_revert_head(r))) {
2935 if (action != REPLAY_REVERT)
2936 return error(_("no revert in progress"));
2937 if (!rollback_is_safe())
2938 goto give_advice;
2940 break;
2941 case REPLAY_PICK:
2942 if (!file_exists(git_path_cherry_pick_head(r))) {
2943 if (action != REPLAY_PICK)
2944 return error(_("no cherry-pick in progress"));
2945 if (!rollback_is_safe())
2946 goto give_advice;
2948 break;
2949 default:
2950 BUG("unexpected action in sequencer_skip");
2953 if (skip_single_pick())
2954 return error(_("failed to skip the commit"));
2955 if (!is_directory(git_path_seq_dir()))
2956 return 0;
2958 return sequencer_continue(r, opts);
2960 give_advice:
2961 error(_("there is nothing to skip"));
2963 if (advice_resolve_conflict) {
2964 advise(_("have you committed already?\n"
2965 "try \"git %s --continue\""),
2966 action == REPLAY_REVERT ? "revert" : "cherry-pick");
2968 return -1;
2971 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2973 struct lock_file todo_lock = LOCK_INIT;
2974 const char *todo_path = get_todo_path(opts);
2975 int next = todo_list->current, offset, fd;
2978 * rebase -i writes "git-rebase-todo" without the currently executing
2979 * command, appending it to "done" instead.
2981 if (is_rebase_i(opts))
2982 next++;
2984 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2985 if (fd < 0)
2986 return error_errno(_("could not lock '%s'"), todo_path);
2987 offset = get_item_line_offset(todo_list, next);
2988 if (write_in_full(fd, todo_list->buf.buf + offset,
2989 todo_list->buf.len - offset) < 0)
2990 return error_errno(_("could not write to '%s'"), todo_path);
2991 if (commit_lock_file(&todo_lock) < 0)
2992 return error(_("failed to finalize '%s'"), todo_path);
2994 if (is_rebase_i(opts) && next > 0) {
2995 const char *done = rebase_path_done();
2996 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2997 int ret = 0;
2999 if (fd < 0)
3000 return 0;
3001 if (write_in_full(fd, get_item_line(todo_list, next - 1),
3002 get_item_line_length(todo_list, next - 1))
3003 < 0)
3004 ret = error_errno(_("could not write to '%s'"), done);
3005 if (close(fd) < 0)
3006 ret = error_errno(_("failed to finalize '%s'"), done);
3007 return ret;
3009 return 0;
3012 static int save_opts(struct replay_opts *opts)
3014 const char *opts_file = git_path_opts_file();
3015 int res = 0;
3017 if (opts->no_commit)
3018 res |= git_config_set_in_file_gently(opts_file,
3019 "options.no-commit", "true");
3020 if (opts->edit)
3021 res |= git_config_set_in_file_gently(opts_file,
3022 "options.edit", "true");
3023 if (opts->allow_empty)
3024 res |= git_config_set_in_file_gently(opts_file,
3025 "options.allow-empty", "true");
3026 if (opts->allow_empty_message)
3027 res |= git_config_set_in_file_gently(opts_file,
3028 "options.allow-empty-message", "true");
3029 if (opts->keep_redundant_commits)
3030 res |= git_config_set_in_file_gently(opts_file,
3031 "options.keep-redundant-commits", "true");
3032 if (opts->signoff)
3033 res |= git_config_set_in_file_gently(opts_file,
3034 "options.signoff", "true");
3035 if (opts->record_origin)
3036 res |= git_config_set_in_file_gently(opts_file,
3037 "options.record-origin", "true");
3038 if (opts->allow_ff)
3039 res |= git_config_set_in_file_gently(opts_file,
3040 "options.allow-ff", "true");
3041 if (opts->mainline) {
3042 struct strbuf buf = STRBUF_INIT;
3043 strbuf_addf(&buf, "%d", opts->mainline);
3044 res |= git_config_set_in_file_gently(opts_file,
3045 "options.mainline", buf.buf);
3046 strbuf_release(&buf);
3048 if (opts->strategy)
3049 res |= git_config_set_in_file_gently(opts_file,
3050 "options.strategy", opts->strategy);
3051 if (opts->gpg_sign)
3052 res |= git_config_set_in_file_gently(opts_file,
3053 "options.gpg-sign", opts->gpg_sign);
3054 if (opts->xopts) {
3055 int i;
3056 for (i = 0; i < opts->xopts_nr; i++)
3057 res |= git_config_set_multivar_in_file_gently(opts_file,
3058 "options.strategy-option",
3059 opts->xopts[i], "^$", 0);
3061 if (opts->allow_rerere_auto)
3062 res |= git_config_set_in_file_gently(opts_file,
3063 "options.allow-rerere-auto",
3064 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
3065 "true" : "false");
3067 if (opts->explicit_cleanup)
3068 res |= git_config_set_in_file_gently(opts_file,
3069 "options.default-msg-cleanup",
3070 describe_cleanup_mode(opts->default_msg_cleanup));
3071 return res;
3074 static int make_patch(struct repository *r,
3075 struct commit *commit,
3076 struct replay_opts *opts)
3078 struct strbuf buf = STRBUF_INIT;
3079 struct rev_info log_tree_opt;
3080 const char *subject, *p;
3081 int res = 0;
3083 p = short_commit_name(commit);
3084 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
3085 return -1;
3086 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
3087 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
3088 res |= error(_("could not update %s"), "REBASE_HEAD");
3090 strbuf_addf(&buf, "%s/patch", get_dir(opts));
3091 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3092 repo_init_revisions(r, &log_tree_opt, NULL);
3093 log_tree_opt.abbrev = 0;
3094 log_tree_opt.diff = 1;
3095 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
3096 log_tree_opt.disable_stdin = 1;
3097 log_tree_opt.no_commit_id = 1;
3098 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
3099 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
3100 if (!log_tree_opt.diffopt.file)
3101 res |= error_errno(_("could not open '%s'"), buf.buf);
3102 else {
3103 res |= log_tree_commit(&log_tree_opt, commit);
3104 fclose(log_tree_opt.diffopt.file);
3106 strbuf_reset(&buf);
3108 strbuf_addf(&buf, "%s/message", get_dir(opts));
3109 if (!file_exists(buf.buf)) {
3110 const char *encoding = get_commit_output_encoding();
3111 const char *commit_buffer = logmsg_reencode(commit, NULL, encoding);
3112 find_commit_subject(commit_buffer, &subject);
3113 res |= write_message(subject, strlen(subject), buf.buf, 1);
3114 unuse_commit_buffer(commit, commit_buffer);
3116 strbuf_release(&buf);
3118 return res;
3121 static int intend_to_amend(void)
3123 struct object_id head;
3124 char *p;
3126 if (get_oid("HEAD", &head))
3127 return error(_("cannot read HEAD"));
3129 p = oid_to_hex(&head);
3130 return write_message(p, strlen(p), rebase_path_amend(), 1);
3133 static int error_with_patch(struct repository *r,
3134 struct commit *commit,
3135 const char *subject, int subject_len,
3136 struct replay_opts *opts,
3137 int exit_code, int to_amend)
3139 if (commit) {
3140 if (make_patch(r, commit, opts))
3141 return -1;
3142 } else if (copy_file(rebase_path_message(),
3143 git_path_merge_msg(r), 0666))
3144 return error(_("unable to copy '%s' to '%s'"),
3145 git_path_merge_msg(r), rebase_path_message());
3147 if (to_amend) {
3148 if (intend_to_amend())
3149 return -1;
3151 fprintf(stderr,
3152 _("You can amend the commit now, with\n"
3153 "\n"
3154 " git commit --amend %s\n"
3155 "\n"
3156 "Once you are satisfied with your changes, run\n"
3157 "\n"
3158 " git rebase --continue\n"),
3159 gpg_sign_opt_quoted(opts));
3160 } else if (exit_code) {
3161 if (commit)
3162 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
3163 short_commit_name(commit), subject_len, subject);
3164 else
3166 * We don't have the hash of the parent so
3167 * just print the line from the todo file.
3169 fprintf_ln(stderr, _("Could not merge %.*s"),
3170 subject_len, subject);
3173 return exit_code;
3176 static int error_failed_squash(struct repository *r,
3177 struct commit *commit,
3178 struct replay_opts *opts,
3179 int subject_len,
3180 const char *subject)
3182 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3183 return error(_("could not copy '%s' to '%s'"),
3184 rebase_path_squash_msg(), rebase_path_message());
3185 unlink(git_path_merge_msg(r));
3186 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
3187 return error(_("could not copy '%s' to '%s'"),
3188 rebase_path_message(),
3189 git_path_merge_msg(r));
3190 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
3193 static int do_exec(struct repository *r, const char *command_line)
3195 struct argv_array child_env = ARGV_ARRAY_INIT;
3196 const char *child_argv[] = { NULL, NULL };
3197 int dirty, status;
3199 fprintf(stderr, "Executing: %s\n", command_line);
3200 child_argv[0] = command_line;
3201 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
3202 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
3203 absolute_path(get_git_work_tree()));
3204 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
3205 child_env.argv);
3207 /* force re-reading of the cache */
3208 if (discard_index(r->index) < 0 || repo_read_index(r) < 0)
3209 return error(_("could not read index"));
3211 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
3213 if (status) {
3214 warning(_("execution failed: %s\n%s"
3215 "You can fix the problem, and then run\n"
3216 "\n"
3217 " git rebase --continue\n"
3218 "\n"),
3219 command_line,
3220 dirty ? N_("and made changes to the index and/or the "
3221 "working tree\n") : "");
3222 if (status == 127)
3223 /* command not found */
3224 status = 1;
3225 } else if (dirty) {
3226 warning(_("execution succeeded: %s\nbut "
3227 "left changes to the index and/or the working tree\n"
3228 "Commit or stash your changes, and then run\n"
3229 "\n"
3230 " git rebase --continue\n"
3231 "\n"), command_line);
3232 status = 1;
3235 argv_array_clear(&child_env);
3237 return status;
3240 static int safe_append(const char *filename, const char *fmt, ...)
3242 va_list ap;
3243 struct lock_file lock = LOCK_INIT;
3244 int fd = hold_lock_file_for_update(&lock, filename,
3245 LOCK_REPORT_ON_ERROR);
3246 struct strbuf buf = STRBUF_INIT;
3248 if (fd < 0)
3249 return -1;
3251 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3252 error_errno(_("could not read '%s'"), filename);
3253 rollback_lock_file(&lock);
3254 return -1;
3256 strbuf_complete(&buf, '\n');
3257 va_start(ap, fmt);
3258 strbuf_vaddf(&buf, fmt, ap);
3259 va_end(ap);
3261 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3262 error_errno(_("could not write to '%s'"), filename);
3263 strbuf_release(&buf);
3264 rollback_lock_file(&lock);
3265 return -1;
3267 if (commit_lock_file(&lock) < 0) {
3268 strbuf_release(&buf);
3269 rollback_lock_file(&lock);
3270 return error(_("failed to finalize '%s'"), filename);
3273 strbuf_release(&buf);
3274 return 0;
3277 static int do_label(struct repository *r, const char *name, int len)
3279 struct ref_store *refs = get_main_ref_store(r);
3280 struct ref_transaction *transaction;
3281 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3282 struct strbuf msg = STRBUF_INIT;
3283 int ret = 0;
3284 struct object_id head_oid;
3286 if (len == 1 && *name == '#')
3287 return error(_("illegal label name: '%.*s'"), len, name);
3289 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3290 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
3292 transaction = ref_store_transaction_begin(refs, &err);
3293 if (!transaction) {
3294 error("%s", err.buf);
3295 ret = -1;
3296 } else if (get_oid("HEAD", &head_oid)) {
3297 error(_("could not read HEAD"));
3298 ret = -1;
3299 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
3300 NULL, 0, msg.buf, &err) < 0 ||
3301 ref_transaction_commit(transaction, &err)) {
3302 error("%s", err.buf);
3303 ret = -1;
3305 ref_transaction_free(transaction);
3306 strbuf_release(&err);
3307 strbuf_release(&msg);
3309 if (!ret)
3310 ret = safe_append(rebase_path_refs_to_delete(),
3311 "%s\n", ref_name.buf);
3312 strbuf_release(&ref_name);
3314 return ret;
3317 static const char *reflog_message(struct replay_opts *opts,
3318 const char *sub_action, const char *fmt, ...);
3320 static int do_reset(struct repository *r,
3321 const char *name, int len,
3322 struct replay_opts *opts)
3324 struct strbuf ref_name = STRBUF_INIT;
3325 struct object_id oid;
3326 struct lock_file lock = LOCK_INIT;
3327 struct tree_desc desc;
3328 struct tree *tree;
3329 struct unpack_trees_options unpack_tree_opts;
3330 int ret = 0;
3332 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
3333 return -1;
3335 if (len == 10 && !strncmp("[new root]", name, len)) {
3336 if (!opts->have_squash_onto) {
3337 const char *hex;
3338 if (commit_tree("", 0, the_hash_algo->empty_tree,
3339 NULL, &opts->squash_onto,
3340 NULL, NULL))
3341 return error(_("writing fake root commit"));
3342 opts->have_squash_onto = 1;
3343 hex = oid_to_hex(&opts->squash_onto);
3344 if (write_message(hex, strlen(hex),
3345 rebase_path_squash_onto(), 0))
3346 return error(_("writing squash-onto"));
3348 oidcpy(&oid, &opts->squash_onto);
3349 } else {
3350 int i;
3352 /* Determine the length of the label */
3353 for (i = 0; i < len; i++)
3354 if (isspace(name[i]))
3355 break;
3356 len = i;
3358 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3359 if (get_oid(ref_name.buf, &oid) &&
3360 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
3361 error(_("could not read '%s'"), ref_name.buf);
3362 rollback_lock_file(&lock);
3363 strbuf_release(&ref_name);
3364 return -1;
3368 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
3369 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3370 unpack_tree_opts.head_idx = 1;
3371 unpack_tree_opts.src_index = r->index;
3372 unpack_tree_opts.dst_index = r->index;
3373 unpack_tree_opts.fn = oneway_merge;
3374 unpack_tree_opts.merge = 1;
3375 unpack_tree_opts.update = 1;
3377 if (repo_read_index_unmerged(r)) {
3378 rollback_lock_file(&lock);
3379 strbuf_release(&ref_name);
3380 return error_resolve_conflict(_(action_name(opts)));
3383 if (!fill_tree_descriptor(r, &desc, &oid)) {
3384 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3385 rollback_lock_file(&lock);
3386 free((void *)desc.buffer);
3387 strbuf_release(&ref_name);
3388 return -1;
3391 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3392 rollback_lock_file(&lock);
3393 free((void *)desc.buffer);
3394 strbuf_release(&ref_name);
3395 return -1;
3398 tree = parse_tree_indirect(&oid);
3399 prime_cache_tree(r, r->index, tree);
3401 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3402 ret = error(_("could not write index"));
3403 free((void *)desc.buffer);
3405 if (!ret)
3406 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3407 len, name), "HEAD", &oid,
3408 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3410 strbuf_release(&ref_name);
3411 return ret;
3414 static struct commit *lookup_label(const char *label, int len,
3415 struct strbuf *buf)
3417 struct commit *commit;
3419 strbuf_reset(buf);
3420 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3421 commit = lookup_commit_reference_by_name(buf->buf);
3422 if (!commit) {
3423 /* fall back to non-rewritten ref or commit */
3424 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3425 commit = lookup_commit_reference_by_name(buf->buf);
3428 if (!commit)
3429 error(_("could not resolve '%s'"), buf->buf);
3431 return commit;
3434 static int do_merge(struct repository *r,
3435 struct commit *commit,
3436 const char *arg, int arg_len,
3437 int flags, struct replay_opts *opts)
3439 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3440 EDIT_MSG | VERIFY_MSG : 0;
3441 struct strbuf ref_name = STRBUF_INIT;
3442 struct commit *head_commit, *merge_commit, *i;
3443 struct commit_list *bases, *j, *reversed = NULL;
3444 struct commit_list *to_merge = NULL, **tail = &to_merge;
3445 const char *strategy = !opts->xopts_nr &&
3446 (!opts->strategy || !strcmp(opts->strategy, "recursive")) ?
3447 NULL : opts->strategy;
3448 struct merge_options o;
3449 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3450 static struct lock_file lock;
3451 const char *p;
3453 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
3454 ret = -1;
3455 goto leave_merge;
3458 head_commit = lookup_commit_reference_by_name("HEAD");
3459 if (!head_commit) {
3460 ret = error(_("cannot merge without a current revision"));
3461 goto leave_merge;
3465 * For octopus merges, the arg starts with the list of revisions to be
3466 * merged. The list is optionally followed by '#' and the oneline.
3468 merge_arg_len = oneline_offset = arg_len;
3469 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3470 if (!*p)
3471 break;
3472 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3473 p += 1 + strspn(p + 1, " \t\n");
3474 oneline_offset = p - arg;
3475 break;
3477 k = strcspn(p, " \t\n");
3478 if (!k)
3479 continue;
3480 merge_commit = lookup_label(p, k, &ref_name);
3481 if (!merge_commit) {
3482 ret = error(_("unable to parse '%.*s'"), k, p);
3483 goto leave_merge;
3485 tail = &commit_list_insert(merge_commit, tail)->next;
3486 p += k;
3487 merge_arg_len = p - arg;
3490 if (!to_merge) {
3491 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3492 goto leave_merge;
3495 if (opts->have_squash_onto &&
3496 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3498 * When the user tells us to "merge" something into a
3499 * "[new root]", let's simply fast-forward to the merge head.
3501 rollback_lock_file(&lock);
3502 if (to_merge->next)
3503 ret = error(_("octopus merge cannot be executed on "
3504 "top of a [new root]"));
3505 else
3506 ret = fast_forward_to(r, &to_merge->item->object.oid,
3507 &head_commit->object.oid, 0,
3508 opts);
3509 goto leave_merge;
3512 if (commit) {
3513 const char *encoding = get_commit_output_encoding();
3514 const char *message = logmsg_reencode(commit, NULL, encoding);
3515 const char *body;
3516 int len;
3518 if (!message) {
3519 ret = error(_("could not get commit message of '%s'"),
3520 oid_to_hex(&commit->object.oid));
3521 goto leave_merge;
3523 write_author_script(message);
3524 find_commit_subject(message, &body);
3525 len = strlen(body);
3526 ret = write_message(body, len, git_path_merge_msg(r), 0);
3527 unuse_commit_buffer(commit, message);
3528 if (ret) {
3529 error_errno(_("could not write '%s'"),
3530 git_path_merge_msg(r));
3531 goto leave_merge;
3533 } else {
3534 struct strbuf buf = STRBUF_INIT;
3535 int len;
3537 strbuf_addf(&buf, "author %s", git_author_info(0));
3538 write_author_script(buf.buf);
3539 strbuf_reset(&buf);
3541 if (oneline_offset < arg_len) {
3542 p = arg + oneline_offset;
3543 len = arg_len - oneline_offset;
3544 } else {
3545 strbuf_addf(&buf, "Merge %s '%.*s'",
3546 to_merge->next ? "branches" : "branch",
3547 merge_arg_len, arg);
3548 p = buf.buf;
3549 len = buf.len;
3552 ret = write_message(p, len, git_path_merge_msg(r), 0);
3553 strbuf_release(&buf);
3554 if (ret) {
3555 error_errno(_("could not write '%s'"),
3556 git_path_merge_msg(r));
3557 goto leave_merge;
3562 * If HEAD is not identical to the first parent of the original merge
3563 * commit, we cannot fast-forward.
3565 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3566 oideq(&commit->parents->item->object.oid,
3567 &head_commit->object.oid);
3570 * If any merge head is different from the original one, we cannot
3571 * fast-forward.
3573 if (can_fast_forward) {
3574 struct commit_list *p = commit->parents->next;
3576 for (j = to_merge; j && p; j = j->next, p = p->next)
3577 if (!oideq(&j->item->object.oid,
3578 &p->item->object.oid)) {
3579 can_fast_forward = 0;
3580 break;
3583 * If the number of merge heads differs from the original merge
3584 * commit, we cannot fast-forward.
3586 if (j || p)
3587 can_fast_forward = 0;
3590 if (can_fast_forward) {
3591 rollback_lock_file(&lock);
3592 ret = fast_forward_to(r, &commit->object.oid,
3593 &head_commit->object.oid, 0, opts);
3594 if (flags & TODO_EDIT_MERGE_MSG) {
3595 run_commit_flags |= AMEND_MSG;
3596 goto fast_forward_edit;
3598 goto leave_merge;
3601 if (strategy || to_merge->next) {
3602 /* Octopus merge */
3603 struct child_process cmd = CHILD_PROCESS_INIT;
3605 if (read_env_script(&cmd.env_array)) {
3606 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3608 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3609 goto leave_merge;
3612 cmd.git_cmd = 1;
3613 argv_array_push(&cmd.args, "merge");
3614 argv_array_push(&cmd.args, "-s");
3615 if (!strategy)
3616 argv_array_push(&cmd.args, "octopus");
3617 else {
3618 argv_array_push(&cmd.args, strategy);
3619 for (k = 0; k < opts->xopts_nr; k++)
3620 argv_array_pushf(&cmd.args,
3621 "-X%s", opts->xopts[k]);
3623 argv_array_push(&cmd.args, "--no-edit");
3624 argv_array_push(&cmd.args, "--no-ff");
3625 argv_array_push(&cmd.args, "--no-log");
3626 argv_array_push(&cmd.args, "--no-stat");
3627 argv_array_push(&cmd.args, "-F");
3628 argv_array_push(&cmd.args, git_path_merge_msg(r));
3629 if (opts->gpg_sign)
3630 argv_array_push(&cmd.args, opts->gpg_sign);
3631 if (opts->ignore_date)
3632 push_dates(&cmd, opts->committer_date_is_author_date);
3634 /* Add the tips to be merged */
3635 for (j = to_merge; j; j = j->next)
3636 argv_array_push(&cmd.args,
3637 oid_to_hex(&j->item->object.oid));
3639 strbuf_release(&ref_name);
3640 unlink(git_path_cherry_pick_head(r));
3641 rollback_lock_file(&lock);
3643 rollback_lock_file(&lock);
3644 ret = run_command(&cmd);
3646 /* force re-reading of the cache */
3647 if (!ret && (discard_index(r->index) < 0 ||
3648 repo_read_index(r) < 0))
3649 ret = error(_("could not read index"));
3650 goto leave_merge;
3653 merge_commit = to_merge->item;
3654 bases = get_merge_bases(head_commit, merge_commit);
3655 if (bases && oideq(&merge_commit->object.oid,
3656 &bases->item->object.oid)) {
3657 ret = 0;
3658 /* skip merging an ancestor of HEAD */
3659 goto leave_merge;
3662 write_message(oid_to_hex(&merge_commit->object.oid), the_hash_algo->hexsz,
3663 git_path_merge_head(r), 0);
3664 write_message("no-ff", 5, git_path_merge_mode(r), 0);
3666 for (j = bases; j; j = j->next)
3667 commit_list_insert(j->item, &reversed);
3668 free_commit_list(bases);
3670 repo_read_index(r);
3671 init_merge_options(&o, r);
3672 o.branch1 = "HEAD";
3673 o.branch2 = ref_name.buf;
3674 o.buffer_output = 2;
3676 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3677 if (ret <= 0)
3678 fputs(o.obuf.buf, stdout);
3679 strbuf_release(&o.obuf);
3680 if (ret < 0) {
3681 error(_("could not even attempt to merge '%.*s'"),
3682 merge_arg_len, arg);
3683 goto leave_merge;
3686 * The return value of merge_recursive() is 1 on clean, and 0 on
3687 * unclean merge.
3689 * Let's reverse that, so that do_merge() returns 0 upon success and
3690 * 1 upon failed merge (keeping the return value -1 for the cases where
3691 * we will want to reschedule the `merge` command).
3693 ret = !ret;
3695 if (r->index->cache_changed &&
3696 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
3697 ret = error(_("merge: Unable to write new index file"));
3698 goto leave_merge;
3701 rollback_lock_file(&lock);
3702 if (ret)
3703 repo_rerere(r, opts->allow_rerere_auto);
3704 else
3706 * In case of problems, we now want to return a positive
3707 * value (a negative one would indicate that the `merge`
3708 * command needs to be rescheduled).
3710 fast_forward_edit:
3711 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3712 run_commit_flags);
3714 leave_merge:
3715 strbuf_release(&ref_name);
3716 rollback_lock_file(&lock);
3717 free_commit_list(to_merge);
3718 return ret;
3721 static int is_final_fixup(struct todo_list *todo_list)
3723 int i = todo_list->current;
3725 if (!is_fixup(todo_list->items[i].command))
3726 return 0;
3728 while (++i < todo_list->nr)
3729 if (is_fixup(todo_list->items[i].command))
3730 return 0;
3731 else if (!is_noop(todo_list->items[i].command))
3732 break;
3733 return 1;
3736 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3738 int i;
3740 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3741 if (!is_noop(todo_list->items[i].command))
3742 return todo_list->items[i].command;
3744 return -1;
3747 static int apply_autostash(struct replay_opts *opts)
3749 struct strbuf stash_sha1 = STRBUF_INIT;
3750 struct child_process child = CHILD_PROCESS_INIT;
3751 int ret = 0;
3753 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3754 strbuf_release(&stash_sha1);
3755 return 0;
3757 strbuf_trim(&stash_sha1);
3759 child.git_cmd = 1;
3760 child.no_stdout = 1;
3761 child.no_stderr = 1;
3762 argv_array_push(&child.args, "stash");
3763 argv_array_push(&child.args, "apply");
3764 argv_array_push(&child.args, stash_sha1.buf);
3765 if (!run_command(&child))
3766 fprintf(stderr, _("Applied autostash.\n"));
3767 else {
3768 struct child_process store = CHILD_PROCESS_INIT;
3770 store.git_cmd = 1;
3771 argv_array_push(&store.args, "stash");
3772 argv_array_push(&store.args, "store");
3773 argv_array_push(&store.args, "-m");
3774 argv_array_push(&store.args, "autostash");
3775 argv_array_push(&store.args, "-q");
3776 argv_array_push(&store.args, stash_sha1.buf);
3777 if (run_command(&store))
3778 ret = error(_("cannot store %s"), stash_sha1.buf);
3779 else
3780 fprintf(stderr,
3781 _("Applying autostash resulted in conflicts.\n"
3782 "Your changes are safe in the stash.\n"
3783 "You can run \"git stash pop\" or"
3784 " \"git stash drop\" at any time.\n"));
3787 strbuf_release(&stash_sha1);
3788 return ret;
3791 static const char *reflog_message(struct replay_opts *opts,
3792 const char *sub_action, const char *fmt, ...)
3794 va_list ap;
3795 static struct strbuf buf = STRBUF_INIT;
3797 va_start(ap, fmt);
3798 strbuf_reset(&buf);
3799 strbuf_addstr(&buf, action_name(opts));
3800 if (sub_action)
3801 strbuf_addf(&buf, " (%s)", sub_action);
3802 if (fmt) {
3803 strbuf_addstr(&buf, ": ");
3804 strbuf_vaddf(&buf, fmt, ap);
3806 va_end(ap);
3808 return buf.buf;
3811 static int run_git_checkout(struct repository *r, struct replay_opts *opts,
3812 const char *commit, const char *action)
3814 struct child_process cmd = CHILD_PROCESS_INIT;
3815 int ret;
3817 cmd.git_cmd = 1;
3819 argv_array_push(&cmd.args, "checkout");
3820 argv_array_push(&cmd.args, commit);
3821 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3823 if (opts->verbose)
3824 ret = run_command(&cmd);
3825 else
3826 ret = run_command_silent_on_success(&cmd);
3828 if (!ret)
3829 discard_index(r->index);
3831 return ret;
3834 int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
3835 const char *commit)
3837 const char *action;
3839 if (commit && *commit) {
3840 action = reflog_message(opts, "start", "checkout %s", commit);
3841 if (run_git_checkout(r, opts, commit, action))
3842 return error(_("could not checkout %s"), commit);
3845 return 0;
3848 static int checkout_onto(struct repository *r, struct replay_opts *opts,
3849 const char *onto_name, const struct object_id *onto,
3850 const char *orig_head)
3852 struct object_id oid;
3853 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3855 if (get_oid(orig_head, &oid))
3856 return error(_("%s: not a valid OID"), orig_head);
3858 if (run_git_checkout(r, opts, oid_to_hex(onto), action)) {
3859 apply_autostash(opts);
3860 sequencer_remove_state(opts);
3861 return error(_("could not detach HEAD"));
3864 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3867 static int stopped_at_head(struct repository *r)
3869 struct object_id head;
3870 struct commit *commit;
3871 struct commit_message message;
3873 if (get_oid("HEAD", &head) ||
3874 !(commit = lookup_commit(r, &head)) ||
3875 parse_commit(commit) || get_message(commit, &message))
3876 fprintf(stderr, _("Stopped at HEAD\n"));
3877 else {
3878 fprintf(stderr, _("Stopped at %s\n"), message.label);
3879 free_message(commit, &message);
3881 return 0;
3885 static const char rescheduled_advice[] =
3886 N_("Could not execute the todo command\n"
3887 "\n"
3888 " %.*s"
3889 "\n"
3890 "It has been rescheduled; To edit the command before continuing, please\n"
3891 "edit the todo list first:\n"
3892 "\n"
3893 " git rebase --edit-todo\n"
3894 " git rebase --continue\n");
3896 static int pick_commits(struct repository *r,
3897 struct todo_list *todo_list,
3898 struct replay_opts *opts)
3900 int res = 0, reschedule = 0;
3902 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3903 if (opts->allow_ff)
3904 assert(!(opts->signoff || opts->no_commit ||
3905 opts->record_origin || opts->edit ||
3906 opts->committer_date_is_author_date ||
3907 opts->ignore_date));
3908 if (read_and_refresh_cache(r, opts))
3909 return -1;
3911 while (todo_list->current < todo_list->nr) {
3912 struct todo_item *item = todo_list->items + todo_list->current;
3913 const char *arg = todo_item_get_arg(todo_list, item);
3914 int check_todo = 0;
3916 if (save_todo(todo_list, opts))
3917 return -1;
3918 if (is_rebase_i(opts)) {
3919 if (item->command != TODO_COMMENT) {
3920 FILE *f = fopen(rebase_path_msgnum(), "w");
3922 todo_list->done_nr++;
3924 if (f) {
3925 fprintf(f, "%d\n", todo_list->done_nr);
3926 fclose(f);
3928 if (!opts->quiet)
3929 fprintf(stderr, "Rebasing (%d/%d)%s",
3930 todo_list->done_nr,
3931 todo_list->total_nr,
3932 opts->verbose ? "\n" : "\r");
3934 unlink(rebase_path_message());
3935 unlink(rebase_path_author_script());
3936 unlink(rebase_path_stopped_sha());
3937 unlink(rebase_path_amend());
3938 unlink(git_path_merge_head(r));
3939 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3941 if (item->command == TODO_BREAK) {
3942 if (!opts->verbose)
3943 term_clear_line();
3944 return stopped_at_head(r);
3947 if (item->command <= TODO_SQUASH) {
3948 if (is_rebase_i(opts))
3949 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3950 command_to_string(item->command), NULL),
3952 res = do_pick_commit(r, item->command, item->commit,
3953 opts, is_final_fixup(todo_list),
3954 &check_todo);
3955 if (is_rebase_i(opts) && res < 0) {
3956 /* Reschedule */
3957 advise(_(rescheduled_advice),
3958 get_item_line_length(todo_list,
3959 todo_list->current),
3960 get_item_line(todo_list,
3961 todo_list->current));
3962 todo_list->current--;
3963 if (save_todo(todo_list, opts))
3964 return -1;
3966 if (item->command == TODO_EDIT) {
3967 struct commit *commit = item->commit;
3968 if (!res) {
3969 if (!opts->verbose)
3970 term_clear_line();
3971 fprintf(stderr,
3972 _("Stopped at %s... %.*s\n"),
3973 short_commit_name(commit),
3974 item->arg_len, arg);
3976 return error_with_patch(r, commit,
3977 arg, item->arg_len, opts, res, !res);
3979 if (is_rebase_i(opts) && !res)
3980 record_in_rewritten(&item->commit->object.oid,
3981 peek_command(todo_list, 1));
3982 if (res && is_fixup(item->command)) {
3983 if (res == 1)
3984 intend_to_amend();
3985 return error_failed_squash(r, item->commit, opts,
3986 item->arg_len, arg);
3987 } else if (res && is_rebase_i(opts) && item->commit) {
3988 int to_amend = 0;
3989 struct object_id oid;
3992 * If we are rewording and have either
3993 * fast-forwarded already, or are about to
3994 * create a new root commit, we want to amend,
3995 * otherwise we do not.
3997 if (item->command == TODO_REWORD &&
3998 !get_oid("HEAD", &oid) &&
3999 (oideq(&item->commit->object.oid, &oid) ||
4000 (opts->have_squash_onto &&
4001 oideq(&opts->squash_onto, &oid))))
4002 to_amend = 1;
4004 return res | error_with_patch(r, item->commit,
4005 arg, item->arg_len, opts,
4006 res, to_amend);
4008 } else if (item->command == TODO_EXEC) {
4009 char *end_of_arg = (char *)(arg + item->arg_len);
4010 int saved = *end_of_arg;
4012 if (!opts->verbose)
4013 term_clear_line();
4014 *end_of_arg = '\0';
4015 res = do_exec(r, arg);
4016 *end_of_arg = saved;
4018 if (res) {
4019 if (opts->reschedule_failed_exec)
4020 reschedule = 1;
4022 check_todo = 1;
4023 } else if (item->command == TODO_LABEL) {
4024 if ((res = do_label(r, arg, item->arg_len)))
4025 reschedule = 1;
4026 } else if (item->command == TODO_RESET) {
4027 if ((res = do_reset(r, arg, item->arg_len, opts)))
4028 reschedule = 1;
4029 } else if (item->command == TODO_MERGE) {
4030 if ((res = do_merge(r, item->commit,
4031 arg, item->arg_len,
4032 item->flags, opts)) < 0)
4033 reschedule = 1;
4034 else if (item->commit)
4035 record_in_rewritten(&item->commit->object.oid,
4036 peek_command(todo_list, 1));
4037 if (res > 0)
4038 /* failed with merge conflicts */
4039 return error_with_patch(r, item->commit,
4040 arg, item->arg_len,
4041 opts, res, 0);
4042 } else if (!is_noop(item->command))
4043 return error(_("unknown command %d"), item->command);
4045 if (reschedule) {
4046 advise(_(rescheduled_advice),
4047 get_item_line_length(todo_list,
4048 todo_list->current),
4049 get_item_line(todo_list, todo_list->current));
4050 todo_list->current--;
4051 if (save_todo(todo_list, opts))
4052 return -1;
4053 if (item->commit)
4054 return error_with_patch(r,
4055 item->commit,
4056 arg, item->arg_len,
4057 opts, res, 0);
4058 } else if (is_rebase_i(opts) && check_todo && !res) {
4059 struct stat st;
4061 if (stat(get_todo_path(opts), &st)) {
4062 res = error_errno(_("could not stat '%s'"),
4063 get_todo_path(opts));
4064 } else if (match_stat_data(&todo_list->stat, &st)) {
4065 /* Reread the todo file if it has changed. */
4066 todo_list_release(todo_list);
4067 if (read_populate_todo(r, todo_list, opts))
4068 res = -1; /* message was printed */
4069 /* `current` will be incremented below */
4070 todo_list->current = -1;
4074 todo_list->current++;
4075 if (res)
4076 return res;
4079 if (is_rebase_i(opts)) {
4080 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
4081 struct stat st;
4083 /* Stopped in the middle, as planned? */
4084 if (todo_list->current < todo_list->nr)
4085 return 0;
4087 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
4088 starts_with(head_ref.buf, "refs/")) {
4089 const char *msg;
4090 struct object_id head, orig;
4091 int res;
4093 if (get_oid("HEAD", &head)) {
4094 res = error(_("cannot read HEAD"));
4095 cleanup_head_ref:
4096 strbuf_release(&head_ref);
4097 strbuf_release(&buf);
4098 return res;
4100 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
4101 get_oid_hex(buf.buf, &orig)) {
4102 res = error(_("could not read orig-head"));
4103 goto cleanup_head_ref;
4105 strbuf_reset(&buf);
4106 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
4107 res = error(_("could not read 'onto'"));
4108 goto cleanup_head_ref;
4110 msg = reflog_message(opts, "finish", "%s onto %s",
4111 head_ref.buf, buf.buf);
4112 if (update_ref(msg, head_ref.buf, &head, &orig,
4113 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
4114 res = error(_("could not update %s"),
4115 head_ref.buf);
4116 goto cleanup_head_ref;
4118 msg = reflog_message(opts, "finish", "returning to %s",
4119 head_ref.buf);
4120 if (create_symref("HEAD", head_ref.buf, msg)) {
4121 res = error(_("could not update HEAD to %s"),
4122 head_ref.buf);
4123 goto cleanup_head_ref;
4125 strbuf_reset(&buf);
4128 if (opts->verbose) {
4129 struct rev_info log_tree_opt;
4130 struct object_id orig, head;
4132 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
4133 repo_init_revisions(r, &log_tree_opt, NULL);
4134 log_tree_opt.diff = 1;
4135 log_tree_opt.diffopt.output_format =
4136 DIFF_FORMAT_DIFFSTAT;
4137 log_tree_opt.disable_stdin = 1;
4139 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
4140 !get_oid(buf.buf, &orig) &&
4141 !get_oid("HEAD", &head)) {
4142 diff_tree_oid(&orig, &head, "",
4143 &log_tree_opt.diffopt);
4144 log_tree_diff_flush(&log_tree_opt);
4147 flush_rewritten_pending();
4148 if (!stat(rebase_path_rewritten_list(), &st) &&
4149 st.st_size > 0) {
4150 struct child_process child = CHILD_PROCESS_INIT;
4151 const char *post_rewrite_hook =
4152 find_hook("post-rewrite");
4154 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
4155 child.git_cmd = 1;
4156 argv_array_push(&child.args, "notes");
4157 argv_array_push(&child.args, "copy");
4158 argv_array_push(&child.args, "--for-rewrite=rebase");
4159 /* we don't care if this copying failed */
4160 run_command(&child);
4162 if (post_rewrite_hook) {
4163 struct child_process hook = CHILD_PROCESS_INIT;
4165 hook.in = open(rebase_path_rewritten_list(),
4166 O_RDONLY);
4167 hook.stdout_to_stderr = 1;
4168 hook.trace2_hook_name = "post-rewrite";
4169 argv_array_push(&hook.args, post_rewrite_hook);
4170 argv_array_push(&hook.args, "rebase");
4171 /* we don't care if this hook failed */
4172 run_command(&hook);
4175 apply_autostash(opts);
4177 if (!opts->quiet) {
4178 if (!opts->verbose)
4179 term_clear_line();
4180 fprintf(stderr,
4181 "Successfully rebased and updated %s.\n",
4182 head_ref.buf);
4185 strbuf_release(&buf);
4186 strbuf_release(&head_ref);
4190 * Sequence of picks finished successfully; cleanup by
4191 * removing the .git/sequencer directory
4193 return sequencer_remove_state(opts);
4196 static int continue_single_pick(struct repository *r)
4198 const char *argv[] = { "commit", NULL };
4200 if (!file_exists(git_path_cherry_pick_head(r)) &&
4201 !file_exists(git_path_revert_head(r)))
4202 return error(_("no cherry-pick or revert in progress"));
4203 return run_command_v_opt(argv, RUN_GIT_CMD);
4206 static int commit_staged_changes(struct repository *r,
4207 struct replay_opts *opts,
4208 struct todo_list *todo_list)
4210 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
4211 unsigned int final_fixup = 0, is_clean;
4213 if (has_unstaged_changes(r, 1))
4214 return error(_("cannot rebase: You have unstaged changes."));
4216 is_clean = !has_uncommitted_changes(r, 0);
4218 if (file_exists(rebase_path_amend())) {
4219 struct strbuf rev = STRBUF_INIT;
4220 struct object_id head, to_amend;
4222 if (get_oid("HEAD", &head))
4223 return error(_("cannot amend non-existing commit"));
4224 if (!read_oneliner(&rev, rebase_path_amend(), 0))
4225 return error(_("invalid file: '%s'"), rebase_path_amend());
4226 if (get_oid_hex(rev.buf, &to_amend))
4227 return error(_("invalid contents: '%s'"),
4228 rebase_path_amend());
4229 if (!is_clean && !oideq(&head, &to_amend))
4230 return error(_("\nYou have uncommitted changes in your "
4231 "working tree. Please, commit them\n"
4232 "first and then run 'git rebase "
4233 "--continue' again."));
4235 * When skipping a failed fixup/squash, we need to edit the
4236 * commit message, the current fixup list and count, and if it
4237 * was the last fixup/squash in the chain, we need to clean up
4238 * the commit message and if there was a squash, let the user
4239 * edit it.
4241 if (!is_clean || !opts->current_fixup_count)
4242 ; /* this is not the final fixup */
4243 else if (!oideq(&head, &to_amend) ||
4244 !file_exists(rebase_path_stopped_sha())) {
4245 /* was a final fixup or squash done manually? */
4246 if (!is_fixup(peek_command(todo_list, 0))) {
4247 unlink(rebase_path_fixup_msg());
4248 unlink(rebase_path_squash_msg());
4249 unlink(rebase_path_current_fixups());
4250 strbuf_reset(&opts->current_fixups);
4251 opts->current_fixup_count = 0;
4253 } else {
4254 /* we are in a fixup/squash chain */
4255 const char *p = opts->current_fixups.buf;
4256 int len = opts->current_fixups.len;
4258 opts->current_fixup_count--;
4259 if (!len)
4260 BUG("Incorrect current_fixups:\n%s", p);
4261 while (len && p[len - 1] != '\n')
4262 len--;
4263 strbuf_setlen(&opts->current_fixups, len);
4264 if (write_message(p, len, rebase_path_current_fixups(),
4265 0) < 0)
4266 return error(_("could not write file: '%s'"),
4267 rebase_path_current_fixups());
4270 * If a fixup/squash in a fixup/squash chain failed, the
4271 * commit message is already correct, no need to commit
4272 * it again.
4274 * Only if it is the final command in the fixup/squash
4275 * chain, and only if the chain is longer than a single
4276 * fixup/squash command (which was just skipped), do we
4277 * actually need to re-commit with a cleaned up commit
4278 * message.
4280 if (opts->current_fixup_count > 0 &&
4281 !is_fixup(peek_command(todo_list, 0))) {
4282 final_fixup = 1;
4284 * If there was not a single "squash" in the
4285 * chain, we only need to clean up the commit
4286 * message, no need to bother the user with
4287 * opening the commit message in the editor.
4289 if (!starts_with(p, "squash ") &&
4290 !strstr(p, "\nsquash "))
4291 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
4292 } else if (is_fixup(peek_command(todo_list, 0))) {
4294 * We need to update the squash message to skip
4295 * the latest commit message.
4297 struct commit *commit;
4298 const char *path = rebase_path_squash_msg();
4299 const char *encoding = get_commit_output_encoding();
4301 if (parse_head(r, &commit) ||
4302 !(p = logmsg_reencode(commit, NULL, encoding)) ||
4303 write_message(p, strlen(p), path, 0)) {
4304 unuse_commit_buffer(commit, p);
4305 return error(_("could not write file: "
4306 "'%s'"), path);
4308 unuse_commit_buffer(commit, p);
4312 strbuf_release(&rev);
4313 flags |= AMEND_MSG;
4316 if (is_clean) {
4317 const char *cherry_pick_head = git_path_cherry_pick_head(r);
4319 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
4320 return error(_("could not remove CHERRY_PICK_HEAD"));
4321 if (!final_fixup)
4322 return 0;
4325 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
4326 opts, flags))
4327 return error(_("could not commit staged changes."));
4328 unlink(rebase_path_amend());
4329 unlink(git_path_merge_head(r));
4330 if (final_fixup) {
4331 unlink(rebase_path_fixup_msg());
4332 unlink(rebase_path_squash_msg());
4334 if (opts->current_fixup_count > 0) {
4336 * Whether final fixup or not, we just cleaned up the commit
4337 * message...
4339 unlink(rebase_path_current_fixups());
4340 strbuf_reset(&opts->current_fixups);
4341 opts->current_fixup_count = 0;
4343 return 0;
4346 int sequencer_continue(struct repository *r, struct replay_opts *opts)
4348 struct todo_list todo_list = TODO_LIST_INIT;
4349 int res;
4351 if (read_and_refresh_cache(r, opts))
4352 return -1;
4354 if (read_populate_opts(opts))
4355 return -1;
4356 if (is_rebase_i(opts)) {
4357 if ((res = read_populate_todo(r, &todo_list, opts)))
4358 goto release_todo_list;
4359 if (commit_staged_changes(r, opts, &todo_list))
4360 return -1;
4361 } else if (!file_exists(get_todo_path(opts)))
4362 return continue_single_pick(r);
4363 else if ((res = read_populate_todo(r, &todo_list, opts)))
4364 goto release_todo_list;
4366 if (!is_rebase_i(opts)) {
4367 /* Verify that the conflict has been resolved */
4368 if (file_exists(git_path_cherry_pick_head(r)) ||
4369 file_exists(git_path_revert_head(r))) {
4370 res = continue_single_pick(r);
4371 if (res)
4372 goto release_todo_list;
4374 if (index_differs_from(r, "HEAD", NULL, 0)) {
4375 res = error_dirty_index(r, opts);
4376 goto release_todo_list;
4378 todo_list.current++;
4379 } else if (file_exists(rebase_path_stopped_sha())) {
4380 struct strbuf buf = STRBUF_INIT;
4381 struct object_id oid;
4383 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
4384 !get_oid_committish(buf.buf, &oid))
4385 record_in_rewritten(&oid, peek_command(&todo_list, 0));
4386 strbuf_release(&buf);
4389 res = pick_commits(r, &todo_list, opts);
4390 release_todo_list:
4391 todo_list_release(&todo_list);
4392 return res;
4395 static int single_pick(struct repository *r,
4396 struct commit *cmit,
4397 struct replay_opts *opts)
4399 int check_todo;
4401 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
4402 return do_pick_commit(r, opts->action == REPLAY_PICK ?
4403 TODO_PICK : TODO_REVERT, cmit, opts, 0,
4404 &check_todo);
4407 int sequencer_pick_revisions(struct repository *r,
4408 struct replay_opts *opts)
4410 struct todo_list todo_list = TODO_LIST_INIT;
4411 struct object_id oid;
4412 int i, res;
4414 assert(opts->revs);
4415 if (read_and_refresh_cache(r, opts))
4416 return -1;
4418 for (i = 0; i < opts->revs->pending.nr; i++) {
4419 struct object_id oid;
4420 const char *name = opts->revs->pending.objects[i].name;
4422 /* This happens when using --stdin. */
4423 if (!strlen(name))
4424 continue;
4426 if (!get_oid(name, &oid)) {
4427 if (!lookup_commit_reference_gently(r, &oid, 1)) {
4428 enum object_type type = oid_object_info(r,
4429 &oid,
4430 NULL);
4431 return error(_("%s: can't cherry-pick a %s"),
4432 name, type_name(type));
4434 } else
4435 return error(_("%s: bad revision"), name);
4439 * If we were called as "git cherry-pick <commit>", just
4440 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4441 * REVERT_HEAD, and don't touch the sequencer state.
4442 * This means it is possible to cherry-pick in the middle
4443 * of a cherry-pick sequence.
4445 if (opts->revs->cmdline.nr == 1 &&
4446 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4447 opts->revs->no_walk &&
4448 !opts->revs->cmdline.rev->flags) {
4449 struct commit *cmit;
4450 if (prepare_revision_walk(opts->revs))
4451 return error(_("revision walk setup failed"));
4452 cmit = get_revision(opts->revs);
4453 if (!cmit)
4454 return error(_("empty commit set passed"));
4455 if (get_revision(opts->revs))
4456 BUG("unexpected extra commit from walk");
4457 return single_pick(r, cmit, opts);
4461 * Start a new cherry-pick/ revert sequence; but
4462 * first, make sure that an existing one isn't in
4463 * progress
4466 if (walk_revs_populate_todo(&todo_list, opts) ||
4467 create_seq_dir(r) < 0)
4468 return -1;
4469 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4470 return error(_("can't revert as initial commit"));
4471 if (save_head(oid_to_hex(&oid)))
4472 return -1;
4473 if (save_opts(opts))
4474 return -1;
4475 update_abort_safety_file();
4476 res = pick_commits(r, &todo_list, opts);
4477 todo_list_release(&todo_list);
4478 return res;
4481 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4483 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4484 struct strbuf sob = STRBUF_INIT;
4485 int has_footer;
4487 strbuf_addstr(&sob, sign_off_header);
4488 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
4489 strbuf_addch(&sob, '\n');
4491 if (!ignore_footer)
4492 strbuf_complete_line(msgbuf);
4495 * If the whole message buffer is equal to the sob, pretend that we
4496 * found a conforming footer with a matching sob
4498 if (msgbuf->len - ignore_footer == sob.len &&
4499 !strncmp(msgbuf->buf, sob.buf, sob.len))
4500 has_footer = 3;
4501 else
4502 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4504 if (!has_footer) {
4505 const char *append_newlines = NULL;
4506 size_t len = msgbuf->len - ignore_footer;
4508 if (!len) {
4510 * The buffer is completely empty. Leave foom for
4511 * the title and body to be filled in by the user.
4513 append_newlines = "\n\n";
4514 } else if (len == 1) {
4516 * Buffer contains a single newline. Add another
4517 * so that we leave room for the title and body.
4519 append_newlines = "\n";
4520 } else if (msgbuf->buf[len - 2] != '\n') {
4522 * Buffer ends with a single newline. Add another
4523 * so that there is an empty line between the message
4524 * body and the sob.
4526 append_newlines = "\n";
4527 } /* else, the buffer already ends with two newlines. */
4529 if (append_newlines)
4530 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4531 append_newlines, strlen(append_newlines));
4534 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4535 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4536 sob.buf, sob.len);
4538 strbuf_release(&sob);
4541 struct labels_entry {
4542 struct hashmap_entry entry;
4543 char label[FLEX_ARRAY];
4546 static int labels_cmp(const void *fndata, const struct hashmap_entry *eptr,
4547 const struct hashmap_entry *entry_or_key, const void *key)
4549 const struct labels_entry *a, *b;
4551 a = container_of(eptr, const struct labels_entry, entry);
4552 b = container_of(entry_or_key, const struct labels_entry, entry);
4554 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4557 struct string_entry {
4558 struct oidmap_entry entry;
4559 char string[FLEX_ARRAY];
4562 struct label_state {
4563 struct oidmap commit2label;
4564 struct hashmap labels;
4565 struct strbuf buf;
4568 static const char *label_oid(struct object_id *oid, const char *label,
4569 struct label_state *state)
4571 struct labels_entry *labels_entry;
4572 struct string_entry *string_entry;
4573 struct object_id dummy;
4574 int i;
4576 string_entry = oidmap_get(&state->commit2label, oid);
4577 if (string_entry)
4578 return string_entry->string;
4581 * For "uninteresting" commits, i.e. commits that are not to be
4582 * rebased, and which can therefore not be labeled, we use a unique
4583 * abbreviation of the commit name. This is slightly more complicated
4584 * than calling find_unique_abbrev() because we also need to make
4585 * sure that the abbreviation does not conflict with any other
4586 * label.
4588 * We disallow "interesting" commits to be labeled by a string that
4589 * is a valid full-length hash, to ensure that we always can find an
4590 * abbreviation for any uninteresting commit's names that does not
4591 * clash with any other label.
4593 strbuf_reset(&state->buf);
4594 if (!label) {
4595 char *p;
4597 strbuf_grow(&state->buf, GIT_MAX_HEXSZ);
4598 label = p = state->buf.buf;
4600 find_unique_abbrev_r(p, oid, default_abbrev);
4603 * We may need to extend the abbreviated hash so that there is
4604 * no conflicting label.
4606 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4607 size_t i = strlen(p) + 1;
4609 oid_to_hex_r(p, oid);
4610 for (; i < the_hash_algo->hexsz; i++) {
4611 char save = p[i];
4612 p[i] = '\0';
4613 if (!hashmap_get_from_hash(&state->labels,
4614 strihash(p), p))
4615 break;
4616 p[i] = save;
4619 } else {
4620 struct strbuf *buf = &state->buf;
4623 * Sanitize labels by replacing non-alpha-numeric characters
4624 * (including white-space ones) by dashes, as they might be
4625 * illegal in file names (and hence in ref names).
4627 * Note that we retain non-ASCII UTF-8 characters (identified
4628 * via the most significant bit). They should be all acceptable
4629 * in file names. We do not validate the UTF-8 here, that's not
4630 * the job of this function.
4632 for (; *label; label++)
4633 if ((*label & 0x80) || isalnum(*label))
4634 strbuf_addch(buf, *label);
4635 /* avoid leading dash and double-dashes */
4636 else if (buf->len && buf->buf[buf->len - 1] != '-')
4637 strbuf_addch(buf, '-');
4638 if (!buf->len) {
4639 strbuf_addstr(buf, "rev-");
4640 strbuf_add_unique_abbrev(buf, oid, default_abbrev);
4642 label = buf->buf;
4644 if ((buf->len == the_hash_algo->hexsz &&
4645 !get_oid_hex(label, &dummy)) ||
4646 (buf->len == 1 && *label == '#') ||
4647 hashmap_get_from_hash(&state->labels,
4648 strihash(label), label)) {
4650 * If the label already exists, or if the label is a
4651 * valid full OID, or the label is a '#' (which we use
4652 * as a separator between merge heads and oneline), we
4653 * append a dash and a number to make it unique.
4655 size_t len = buf->len;
4657 for (i = 2; ; i++) {
4658 strbuf_setlen(buf, len);
4659 strbuf_addf(buf, "-%d", i);
4660 if (!hashmap_get_from_hash(&state->labels,
4661 strihash(buf->buf),
4662 buf->buf))
4663 break;
4666 label = buf->buf;
4670 FLEX_ALLOC_STR(labels_entry, label, label);
4671 hashmap_entry_init(&labels_entry->entry, strihash(label));
4672 hashmap_add(&state->labels, &labels_entry->entry);
4674 FLEX_ALLOC_STR(string_entry, string, label);
4675 oidcpy(&string_entry->entry.oid, oid);
4676 oidmap_put(&state->commit2label, string_entry);
4678 return string_entry->string;
4681 static int make_script_with_merges(struct pretty_print_context *pp,
4682 struct rev_info *revs, struct strbuf *out,
4683 unsigned flags)
4685 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4686 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4687 int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
4688 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4689 struct strbuf label = STRBUF_INIT;
4690 struct commit_list *commits = NULL, **tail = &commits, *iter;
4691 struct commit_list *tips = NULL, **tips_tail = &tips;
4692 struct commit *commit;
4693 struct oidmap commit2todo = OIDMAP_INIT;
4694 struct string_entry *entry;
4695 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4696 shown = OIDSET_INIT;
4697 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4699 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4700 const char *cmd_pick = abbr ? "p" : "pick",
4701 *cmd_label = abbr ? "l" : "label",
4702 *cmd_reset = abbr ? "t" : "reset",
4703 *cmd_merge = abbr ? "m" : "merge";
4705 oidmap_init(&commit2todo, 0);
4706 oidmap_init(&state.commit2label, 0);
4707 hashmap_init(&state.labels, labels_cmp, NULL, 0);
4708 strbuf_init(&state.buf, 32);
4710 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4711 struct labels_entry *onto_label_entry;
4712 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4713 FLEX_ALLOC_STR(entry, string, "onto");
4714 oidcpy(&entry->entry.oid, oid);
4715 oidmap_put(&state.commit2label, entry);
4717 FLEX_ALLOC_STR(onto_label_entry, label, "onto");
4718 hashmap_entry_init(&onto_label_entry->entry, strihash("onto"));
4719 hashmap_add(&state.labels, &onto_label_entry->entry);
4723 * First phase:
4724 * - get onelines for all commits
4725 * - gather all branch tips (i.e. 2nd or later parents of merges)
4726 * - label all branch tips
4728 while ((commit = get_revision(revs))) {
4729 struct commit_list *to_merge;
4730 const char *p1, *p2;
4731 struct object_id *oid;
4732 int is_empty;
4734 tail = &commit_list_insert(commit, tail)->next;
4735 oidset_insert(&interesting, &commit->object.oid);
4737 is_empty = is_original_commit_empty(commit);
4738 if (!is_empty && (commit->object.flags & PATCHSAME))
4739 continue;
4741 strbuf_reset(&oneline);
4742 pretty_print_commit(pp, commit, &oneline);
4744 to_merge = commit->parents ? commit->parents->next : NULL;
4745 if (!to_merge) {
4746 /* non-merge commit: easy case */
4747 strbuf_reset(&buf);
4748 if (!keep_empty && is_empty)
4749 strbuf_addf(&buf, "%c ", comment_line_char);
4750 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4751 oid_to_hex(&commit->object.oid),
4752 oneline.buf);
4754 FLEX_ALLOC_STR(entry, string, buf.buf);
4755 oidcpy(&entry->entry.oid, &commit->object.oid);
4756 oidmap_put(&commit2todo, entry);
4758 continue;
4761 /* Create a label */
4762 strbuf_reset(&label);
4763 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4764 (p1 = strchr(p1, '\'')) &&
4765 (p2 = strchr(++p1, '\'')))
4766 strbuf_add(&label, p1, p2 - p1);
4767 else if (skip_prefix(oneline.buf, "Merge pull request ",
4768 &p1) &&
4769 (p1 = strstr(p1, " from ")))
4770 strbuf_addstr(&label, p1 + strlen(" from "));
4771 else
4772 strbuf_addbuf(&label, &oneline);
4774 strbuf_reset(&buf);
4775 strbuf_addf(&buf, "%s -C %s",
4776 cmd_merge, oid_to_hex(&commit->object.oid));
4778 /* label the tips of merged branches */
4779 for (; to_merge; to_merge = to_merge->next) {
4780 oid = &to_merge->item->object.oid;
4781 strbuf_addch(&buf, ' ');
4783 if (!oidset_contains(&interesting, oid)) {
4784 strbuf_addstr(&buf, label_oid(oid, NULL,
4785 &state));
4786 continue;
4789 tips_tail = &commit_list_insert(to_merge->item,
4790 tips_tail)->next;
4792 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4794 strbuf_addf(&buf, " # %s", oneline.buf);
4796 FLEX_ALLOC_STR(entry, string, buf.buf);
4797 oidcpy(&entry->entry.oid, &commit->object.oid);
4798 oidmap_put(&commit2todo, entry);
4802 * Second phase:
4803 * - label branch points
4804 * - add HEAD to the branch tips
4806 for (iter = commits; iter; iter = iter->next) {
4807 struct commit_list *parent = iter->item->parents;
4808 for (; parent; parent = parent->next) {
4809 struct object_id *oid = &parent->item->object.oid;
4810 if (!oidset_contains(&interesting, oid))
4811 continue;
4812 if (oidset_insert(&child_seen, oid))
4813 label_oid(oid, "branch-point", &state);
4816 /* Add HEAD as implicit "tip of branch" */
4817 if (!iter->next)
4818 tips_tail = &commit_list_insert(iter->item,
4819 tips_tail)->next;
4823 * Third phase: output the todo list. This is a bit tricky, as we
4824 * want to avoid jumping back and forth between revisions. To
4825 * accomplish that goal, we walk backwards from the branch tips,
4826 * gathering commits not yet shown, reversing the list on the fly,
4827 * then outputting that list (labeling revisions as needed).
4829 strbuf_addf(out, "%s onto\n", cmd_label);
4830 for (iter = tips; iter; iter = iter->next) {
4831 struct commit_list *list = NULL, *iter2;
4833 commit = iter->item;
4834 if (oidset_contains(&shown, &commit->object.oid))
4835 continue;
4836 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4838 if (entry)
4839 strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4840 else
4841 strbuf_addch(out, '\n');
4843 while (oidset_contains(&interesting, &commit->object.oid) &&
4844 !oidset_contains(&shown, &commit->object.oid)) {
4845 commit_list_insert(commit, &list);
4846 if (!commit->parents) {
4847 commit = NULL;
4848 break;
4850 commit = commit->parents->item;
4853 if (!commit)
4854 strbuf_addf(out, "%s %s\n", cmd_reset,
4855 rebase_cousins || root_with_onto ?
4856 "onto" : "[new root]");
4857 else {
4858 const char *to = NULL;
4860 entry = oidmap_get(&state.commit2label,
4861 &commit->object.oid);
4862 if (entry)
4863 to = entry->string;
4864 else if (!rebase_cousins)
4865 to = label_oid(&commit->object.oid, NULL,
4866 &state);
4868 if (!to || !strcmp(to, "onto"))
4869 strbuf_addf(out, "%s onto\n", cmd_reset);
4870 else {
4871 strbuf_reset(&oneline);
4872 pretty_print_commit(pp, commit, &oneline);
4873 strbuf_addf(out, "%s %s # %s\n",
4874 cmd_reset, to, oneline.buf);
4878 for (iter2 = list; iter2; iter2 = iter2->next) {
4879 struct object_id *oid = &iter2->item->object.oid;
4880 entry = oidmap_get(&commit2todo, oid);
4881 /* only show if not already upstream */
4882 if (entry)
4883 strbuf_addf(out, "%s\n", entry->string);
4884 entry = oidmap_get(&state.commit2label, oid);
4885 if (entry)
4886 strbuf_addf(out, "%s %s\n",
4887 cmd_label, entry->string);
4888 oidset_insert(&shown, oid);
4891 free_commit_list(list);
4894 free_commit_list(commits);
4895 free_commit_list(tips);
4897 strbuf_release(&label);
4898 strbuf_release(&oneline);
4899 strbuf_release(&buf);
4901 oidmap_free(&commit2todo, 1);
4902 oidmap_free(&state.commit2label, 1);
4903 hashmap_free_entries(&state.labels, struct labels_entry, entry);
4904 strbuf_release(&state.buf);
4906 return 0;
4909 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
4910 const char **argv, unsigned flags)
4912 char *format = NULL;
4913 struct pretty_print_context pp = {0};
4914 struct rev_info revs;
4915 struct commit *commit;
4916 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4917 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4918 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4920 repo_init_revisions(r, &revs, NULL);
4921 revs.verbose_header = 1;
4922 if (!rebase_merges)
4923 revs.max_parents = 1;
4924 revs.cherry_mark = 1;
4925 revs.limited = 1;
4926 revs.reverse = 1;
4927 revs.right_only = 1;
4928 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4929 revs.topo_order = 1;
4931 revs.pretty_given = 1;
4932 git_config_get_string("rebase.instructionFormat", &format);
4933 if (!format || !*format) {
4934 free(format);
4935 format = xstrdup("%s");
4937 get_commit_format(format, &revs);
4938 free(format);
4939 pp.fmt = revs.commit_format;
4940 pp.output_encoding = get_log_output_encoding();
4942 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4943 return error(_("make_script: unhandled options"));
4945 if (prepare_revision_walk(&revs) < 0)
4946 return error(_("make_script: error preparing revisions"));
4948 if (rebase_merges)
4949 return make_script_with_merges(&pp, &revs, out, flags);
4951 while ((commit = get_revision(&revs))) {
4952 int is_empty = is_original_commit_empty(commit);
4954 if (!is_empty && (commit->object.flags & PATCHSAME))
4955 continue;
4956 if (!keep_empty && is_empty)
4957 strbuf_addf(out, "%c ", comment_line_char);
4958 strbuf_addf(out, "%s %s ", insn,
4959 oid_to_hex(&commit->object.oid));
4960 pretty_print_commit(&pp, commit, out);
4961 strbuf_addch(out, '\n');
4963 return 0;
4967 * Add commands after pick and (series of) squash/fixup commands
4968 * in the todo list.
4970 void todo_list_add_exec_commands(struct todo_list *todo_list,
4971 struct string_list *commands)
4973 struct strbuf *buf = &todo_list->buf;
4974 size_t base_offset = buf->len;
4975 int i, insert, nr = 0, alloc = 0;
4976 struct todo_item *items = NULL, *base_items = NULL;
4978 base_items = xcalloc(commands->nr, sizeof(struct todo_item));
4979 for (i = 0; i < commands->nr; i++) {
4980 size_t command_len = strlen(commands->items[i].string);
4982 strbuf_addstr(buf, commands->items[i].string);
4983 strbuf_addch(buf, '\n');
4985 base_items[i].command = TODO_EXEC;
4986 base_items[i].offset_in_buf = base_offset;
4987 base_items[i].arg_offset = base_offset + strlen("exec ");
4988 base_items[i].arg_len = command_len - strlen("exec ");
4990 base_offset += command_len + 1;
4994 * Insert <commands> after every pick. Here, fixup/squash chains
4995 * are considered part of the pick, so we insert the commands *after*
4996 * those chains if there are any.
4998 * As we insert the exec commands immediately after rearranging
4999 * any fixups and before the user edits the list, a fixup chain
5000 * can never contain comments (any comments are empty picks that
5001 * have been commented out because the user did not specify
5002 * --keep-empty). So, it is safe to insert an exec command
5003 * without looking at the command following a comment.
5005 insert = 0;
5006 for (i = 0; i < todo_list->nr; i++) {
5007 enum todo_command command = todo_list->items[i].command;
5008 if (insert && !is_fixup(command)) {
5009 ALLOC_GROW(items, nr + commands->nr, alloc);
5010 COPY_ARRAY(items + nr, base_items, commands->nr);
5011 nr += commands->nr;
5013 insert = 0;
5016 ALLOC_GROW(items, nr + 1, alloc);
5017 items[nr++] = todo_list->items[i];
5019 if (command == TODO_PICK || command == TODO_MERGE)
5020 insert = 1;
5023 /* insert or append final <commands> */
5024 if (insert || nr == todo_list->nr) {
5025 ALLOC_GROW(items, nr + commands->nr, alloc);
5026 COPY_ARRAY(items + nr, base_items, commands->nr);
5027 nr += commands->nr;
5030 free(base_items);
5031 FREE_AND_NULL(todo_list->items);
5032 todo_list->items = items;
5033 todo_list->nr = nr;
5034 todo_list->alloc = alloc;
5037 static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
5038 struct strbuf *buf, int num, unsigned flags)
5040 struct todo_item *item;
5041 int i, max = todo_list->nr;
5043 if (num > 0 && num < max)
5044 max = num;
5046 for (item = todo_list->items, i = 0; i < max; i++, item++) {
5047 /* if the item is not a command write it and continue */
5048 if (item->command >= TODO_COMMENT) {
5049 strbuf_addf(buf, "%.*s\n", item->arg_len,
5050 todo_item_get_arg(todo_list, item));
5051 continue;
5054 /* add command to the buffer */
5055 if (flags & TODO_LIST_ABBREVIATE_CMDS)
5056 strbuf_addch(buf, command_to_char(item->command));
5057 else
5058 strbuf_addstr(buf, command_to_string(item->command));
5060 /* add commit id */
5061 if (item->commit) {
5062 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
5063 short_commit_name(item->commit) :
5064 oid_to_hex(&item->commit->object.oid);
5066 if (item->command == TODO_MERGE) {
5067 if (item->flags & TODO_EDIT_MERGE_MSG)
5068 strbuf_addstr(buf, " -c");
5069 else
5070 strbuf_addstr(buf, " -C");
5073 strbuf_addf(buf, " %s", oid);
5076 /* add all the rest */
5077 if (!item->arg_len)
5078 strbuf_addch(buf, '\n');
5079 else
5080 strbuf_addf(buf, " %.*s\n", item->arg_len,
5081 todo_item_get_arg(todo_list, item));
5085 int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
5086 const char *file, const char *shortrevisions,
5087 const char *shortonto, int num, unsigned flags)
5089 int res;
5090 struct strbuf buf = STRBUF_INIT;
5092 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
5093 if (flags & TODO_LIST_APPEND_TODO_HELP)
5094 append_todo_help(flags & TODO_LIST_KEEP_EMPTY, count_commands(todo_list),
5095 shortrevisions, shortonto, &buf);
5097 res = write_message(buf.buf, buf.len, file, 0);
5098 strbuf_release(&buf);
5100 return res;
5103 static const char edit_todo_list_advice[] =
5104 N_("You can fix this with 'git rebase --edit-todo' "
5105 "and then run 'git rebase --continue'.\n"
5106 "Or you can abort the rebase with 'git rebase"
5107 " --abort'.\n");
5109 int check_todo_list_from_file(struct repository *r)
5111 struct todo_list old_todo = TODO_LIST_INIT, new_todo = TODO_LIST_INIT;
5112 int res = 0;
5114 if (strbuf_read_file_or_whine(&new_todo.buf, rebase_path_todo()) < 0) {
5115 res = -1;
5116 goto out;
5119 if (strbuf_read_file_or_whine(&old_todo.buf, rebase_path_todo_backup()) < 0) {
5120 res = -1;
5121 goto out;
5124 res = todo_list_parse_insn_buffer(r, old_todo.buf.buf, &old_todo);
5125 if (!res)
5126 res = todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo);
5127 if (!res)
5128 res = todo_list_check(&old_todo, &new_todo);
5129 if (res)
5130 fprintf(stderr, _(edit_todo_list_advice));
5131 out:
5132 todo_list_release(&old_todo);
5133 todo_list_release(&new_todo);
5135 return res;
5138 /* skip picking commits whose parents are unchanged */
5139 static int skip_unnecessary_picks(struct repository *r,
5140 struct todo_list *todo_list,
5141 struct object_id *base_oid)
5143 struct object_id *parent_oid;
5144 int i;
5146 for (i = 0; i < todo_list->nr; i++) {
5147 struct todo_item *item = todo_list->items + i;
5149 if (item->command >= TODO_NOOP)
5150 continue;
5151 if (item->command != TODO_PICK)
5152 break;
5153 if (parse_commit(item->commit)) {
5154 return error(_("could not parse commit '%s'"),
5155 oid_to_hex(&item->commit->object.oid));
5157 if (!item->commit->parents)
5158 break; /* root commit */
5159 if (item->commit->parents->next)
5160 break; /* merge commit */
5161 parent_oid = &item->commit->parents->item->object.oid;
5162 if (!oideq(parent_oid, base_oid))
5163 break;
5164 oidcpy(base_oid, &item->commit->object.oid);
5166 if (i > 0) {
5167 const char *done_path = rebase_path_done();
5169 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
5170 error_errno(_("could not write to '%s'"), done_path);
5171 return -1;
5174 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
5175 todo_list->nr -= i;
5176 todo_list->current = 0;
5178 if (is_fixup(peek_command(todo_list, 0)))
5179 record_in_rewritten(base_oid, peek_command(todo_list, 0));
5182 return 0;
5185 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
5186 const char *shortrevisions, const char *onto_name,
5187 struct commit *onto, const char *orig_head,
5188 struct string_list *commands, unsigned autosquash,
5189 struct todo_list *todo_list)
5191 const char *shortonto, *todo_file = rebase_path_todo();
5192 struct todo_list new_todo = TODO_LIST_INIT;
5193 struct strbuf *buf = &todo_list->buf;
5194 struct object_id oid = onto->object.oid;
5195 int res;
5197 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
5199 if (buf->len == 0) {
5200 struct todo_item *item = append_new_todo(todo_list);
5201 item->command = TODO_NOOP;
5202 item->commit = NULL;
5203 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
5206 if (autosquash && todo_list_rearrange_squash(todo_list))
5207 return -1;
5209 if (commands->nr)
5210 todo_list_add_exec_commands(todo_list, commands);
5212 if (count_commands(todo_list) == 0) {
5213 apply_autostash(opts);
5214 sequencer_remove_state(opts);
5216 return error(_("nothing to do"));
5219 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
5220 shortonto, flags);
5221 if (res == -1)
5222 return -1;
5223 else if (res == -2) {
5224 apply_autostash(opts);
5225 sequencer_remove_state(opts);
5227 return -1;
5228 } else if (res == -3) {
5229 apply_autostash(opts);
5230 sequencer_remove_state(opts);
5231 todo_list_release(&new_todo);
5233 return error(_("nothing to do"));
5236 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) ||
5237 todo_list_check(todo_list, &new_todo)) {
5238 fprintf(stderr, _(edit_todo_list_advice));
5239 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
5240 todo_list_release(&new_todo);
5242 return -1;
5245 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
5246 todo_list_release(&new_todo);
5247 return error(_("could not skip unnecessary pick commands"));
5250 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
5251 flags & ~(TODO_LIST_SHORTEN_IDS))) {
5252 todo_list_release(&new_todo);
5253 return error_errno(_("could not write '%s'"), todo_file);
5256 todo_list_release(&new_todo);
5258 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
5259 return -1;
5261 if (require_clean_work_tree(r, "rebase", "", 1, 1))
5262 return -1;
5264 return sequencer_continue(r, opts);
5267 struct subject2item_entry {
5268 struct hashmap_entry entry;
5269 int i;
5270 char subject[FLEX_ARRAY];
5273 static int subject2item_cmp(const void *fndata,
5274 const struct hashmap_entry *eptr,
5275 const struct hashmap_entry *entry_or_key,
5276 const void *key)
5278 const struct subject2item_entry *a, *b;
5280 a = container_of(eptr, const struct subject2item_entry, entry);
5281 b = container_of(entry_or_key, const struct subject2item_entry, entry);
5283 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
5286 define_commit_slab(commit_todo_item, struct todo_item *);
5289 * Rearrange the todo list that has both "pick commit-id msg" and "pick
5290 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
5291 * after the former, and change "pick" to "fixup"/"squash".
5293 * Note that if the config has specified a custom instruction format, each log
5294 * message will have to be retrieved from the commit (as the oneline in the
5295 * script cannot be trusted) in order to normalize the autosquash arrangement.
5297 int todo_list_rearrange_squash(struct todo_list *todo_list)
5299 struct hashmap subject2item;
5300 int rearranged = 0, *next, *tail, i, nr = 0, alloc = 0;
5301 char **subjects;
5302 struct commit_todo_item commit_todo;
5303 struct todo_item *items = NULL;
5305 init_commit_todo_item(&commit_todo);
5307 * The hashmap maps onelines to the respective todo list index.
5309 * If any items need to be rearranged, the next[i] value will indicate
5310 * which item was moved directly after the i'th.
5312 * In that case, last[i] will indicate the index of the latest item to
5313 * be moved to appear after the i'th.
5315 hashmap_init(&subject2item, subject2item_cmp, NULL, todo_list->nr);
5316 ALLOC_ARRAY(next, todo_list->nr);
5317 ALLOC_ARRAY(tail, todo_list->nr);
5318 ALLOC_ARRAY(subjects, todo_list->nr);
5319 for (i = 0; i < todo_list->nr; i++) {
5320 struct strbuf buf = STRBUF_INIT;
5321 struct todo_item *item = todo_list->items + i;
5322 const char *commit_buffer, *subject, *p;
5323 size_t subject_len;
5324 int i2 = -1;
5325 struct subject2item_entry *entry;
5327 next[i] = tail[i] = -1;
5328 if (!item->commit || item->command == TODO_DROP) {
5329 subjects[i] = NULL;
5330 continue;
5333 if (is_fixup(item->command)) {
5334 clear_commit_todo_item(&commit_todo);
5335 return error(_("the script was already rearranged."));
5338 *commit_todo_item_at(&commit_todo, item->commit) = item;
5340 parse_commit(item->commit);
5341 commit_buffer = logmsg_reencode(item->commit, NULL, "UTF-8");
5342 find_commit_subject(commit_buffer, &subject);
5343 format_subject(&buf, subject, " ");
5344 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5345 unuse_commit_buffer(item->commit, commit_buffer);
5346 if ((skip_prefix(subject, "fixup! ", &p) ||
5347 skip_prefix(subject, "squash! ", &p))) {
5348 struct commit *commit2;
5350 for (;;) {
5351 while (isspace(*p))
5352 p++;
5353 if (!skip_prefix(p, "fixup! ", &p) &&
5354 !skip_prefix(p, "squash! ", &p))
5355 break;
5358 entry = hashmap_get_entry_from_hash(&subject2item,
5359 strhash(p), p,
5360 struct subject2item_entry,
5361 entry);
5362 if (entry)
5363 /* found by title */
5364 i2 = entry->i;
5365 else if (!strchr(p, ' ') &&
5366 (commit2 =
5367 lookup_commit_reference_by_name(p)) &&
5368 *commit_todo_item_at(&commit_todo, commit2))
5369 /* found by commit name */
5370 i2 = *commit_todo_item_at(&commit_todo, commit2)
5371 - todo_list->items;
5372 else {
5373 /* copy can be a prefix of the commit subject */
5374 for (i2 = 0; i2 < i; i2++)
5375 if (subjects[i2] &&
5376 starts_with(subjects[i2], p))
5377 break;
5378 if (i2 == i)
5379 i2 = -1;
5382 if (i2 >= 0) {
5383 rearranged = 1;
5384 todo_list->items[i].command =
5385 starts_with(subject, "fixup!") ?
5386 TODO_FIXUP : TODO_SQUASH;
5387 if (next[i2] < 0)
5388 next[i2] = i;
5389 else
5390 next[tail[i2]] = i;
5391 tail[i2] = i;
5392 } else if (!hashmap_get_from_hash(&subject2item,
5393 strhash(subject), subject)) {
5394 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5395 entry->i = i;
5396 hashmap_entry_init(&entry->entry,
5397 strhash(entry->subject));
5398 hashmap_put(&subject2item, &entry->entry);
5402 if (rearranged) {
5403 for (i = 0; i < todo_list->nr; i++) {
5404 enum todo_command command = todo_list->items[i].command;
5405 int cur = i;
5408 * Initially, all commands are 'pick's. If it is a
5409 * fixup or a squash now, we have rearranged it.
5411 if (is_fixup(command))
5412 continue;
5414 while (cur >= 0) {
5415 ALLOC_GROW(items, nr + 1, alloc);
5416 items[nr++] = todo_list->items[cur];
5417 cur = next[cur];
5421 FREE_AND_NULL(todo_list->items);
5422 todo_list->items = items;
5423 todo_list->nr = nr;
5424 todo_list->alloc = alloc;
5427 free(next);
5428 free(tail);
5429 for (i = 0; i < todo_list->nr; i++)
5430 free(subjects[i]);
5431 free(subjects);
5432 hashmap_free_entries(&subject2item, struct subject2item_entry, entry);
5434 clear_commit_todo_item(&commit_todo);
5436 return 0;