sequencer: simplify root commit creation
[git/debian.git] / sequencer.c
blob2adcf5a639c3a7d0154f07cf07f420f5d4f54007
1 #include "cache.h"
2 #include "config.h"
3 #include "lockfile.h"
4 #include "dir.h"
5 #include "object-store.h"
6 #include "object.h"
7 #include "commit.h"
8 #include "sequencer.h"
9 #include "tag.h"
10 #include "run-command.h"
11 #include "exec-cmd.h"
12 #include "utf8.h"
13 #include "cache-tree.h"
14 #include "diff.h"
15 #include "revision.h"
16 #include "rerere.h"
17 #include "merge-recursive.h"
18 #include "refs.h"
19 #include "argv-array.h"
20 #include "quote.h"
21 #include "trailer.h"
22 #include "log-tree.h"
23 #include "wt-status.h"
24 #include "hashmap.h"
25 #include "notes-utils.h"
26 #include "sigchain.h"
27 #include "unpack-trees.h"
28 #include "worktree.h"
29 #include "oidmap.h"
30 #include "oidset.h"
31 #include "commit-slab.h"
32 #include "alias.h"
33 #include "commit-reach.h"
34 #include "rebase-interactive.h"
36 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
38 static const char sign_off_header[] = "Signed-off-by: ";
39 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
41 GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
43 GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
45 static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
46 static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
47 static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
48 static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
50 static GIT_PATH_FUNC(rebase_path, "rebase-merge")
52 * The file containing rebase commands, comments, and empty lines.
53 * This file is created by "git rebase -i" then edited by the user. As
54 * the lines are processed, they are removed from the front of this
55 * file and written to the tail of 'done'.
57 GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
58 GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
61 * The rebase command lines that have already been processed. A line
62 * is moved here when it is first handled, before any associated user
63 * actions.
65 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
67 * The file to keep track of how many commands were already processed (e.g.
68 * for the prompt).
70 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
72 * The file to keep track of how many commands are to be processed in total
73 * (e.g. for the prompt).
75 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
77 * The commit message that is planned to be used for any changes that
78 * need to be committed following a user interaction.
80 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
82 * The file into which is accumulated the suggested commit message for
83 * squash/fixup commands. When the first of a series of squash/fixups
84 * is seen, the file is created and the commit message from the
85 * previous commit and from the first squash/fixup commit are written
86 * to it. The commit message for each subsequent squash/fixup commit
87 * is appended to the file as it is processed.
89 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
91 * If the current series of squash/fixups has not yet included a squash
92 * command, then this file exists and holds the commit message of the
93 * original "pick" commit. (If the series ends without a "squash"
94 * command, then this can be used as the commit message of the combined
95 * commit without opening the editor.)
97 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
99 * This file contains the list fixup/squash commands that have been
100 * accumulated into message-fixup or message-squash so far.
102 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
104 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
105 * GIT_AUTHOR_DATE that will be used for the commit that is currently
106 * being rebased.
108 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
110 * When an "edit" rebase command is being processed, the SHA1 of the
111 * commit to be edited is recorded in this file. When "git rebase
112 * --continue" is executed, if there are any staged changes then they
113 * will be amended to the HEAD commit, but only provided the HEAD
114 * commit is still the commit to be edited. When any other rebase
115 * command is processed, this file is deleted.
117 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
119 * When we stop at a given patch via the "edit" command, this file contains
120 * the abbreviated commit name of the corresponding patch.
122 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
124 * For the post-rewrite hook, we make a list of rewritten commits and
125 * their new sha1s. The rewritten-pending list keeps the sha1s of
126 * commits that have been processed, but not committed yet,
127 * e.g. because they are waiting for a 'squash' command.
129 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
130 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
131 "rebase-merge/rewritten-pending")
134 * The path of the file containig the OID of the "squash onto" commit, i.e.
135 * the dummy commit used for `reset [new root]`.
137 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
140 * The path of the file listing refs that need to be deleted after the rebase
141 * finishes. This is used by the `label` command to record the need for cleanup.
143 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
146 * The following files are written by git-rebase just after parsing the
147 * command-line.
149 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
150 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
151 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
152 static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
153 static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
154 static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
155 static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
156 static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
157 static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
158 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
159 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
160 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
162 static int git_sequencer_config(const char *k, const char *v, void *cb)
164 struct replay_opts *opts = cb;
165 int status;
167 if (!strcmp(k, "commit.cleanup")) {
168 const char *s;
170 status = git_config_string(&s, k, v);
171 if (status)
172 return status;
174 if (!strcmp(s, "verbatim")) {
175 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
176 opts->explicit_cleanup = 1;
177 } else if (!strcmp(s, "whitespace")) {
178 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
179 opts->explicit_cleanup = 1;
180 } else if (!strcmp(s, "strip")) {
181 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
182 opts->explicit_cleanup = 1;
183 } else if (!strcmp(s, "scissors")) {
184 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
185 opts->explicit_cleanup = 1;
186 } else {
187 warning(_("invalid commit message cleanup mode '%s'"),
191 free((char *)s);
192 return status;
195 if (!strcmp(k, "commit.gpgsign")) {
196 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
197 return 0;
200 status = git_gpg_config(k, v, NULL);
201 if (status)
202 return status;
204 return git_diff_basic_config(k, v, NULL);
207 void sequencer_init_config(struct replay_opts *opts)
209 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
210 git_config(git_sequencer_config, opts);
213 static inline int is_rebase_i(const struct replay_opts *opts)
215 return opts->action == REPLAY_INTERACTIVE_REBASE;
218 static const char *get_dir(const struct replay_opts *opts)
220 if (is_rebase_i(opts))
221 return rebase_path();
222 return git_path_seq_dir();
225 static const char *get_todo_path(const struct replay_opts *opts)
227 if (is_rebase_i(opts))
228 return rebase_path_todo();
229 return git_path_todo_file();
233 * Returns 0 for non-conforming footer
234 * Returns 1 for conforming footer
235 * Returns 2 when sob exists within conforming footer
236 * Returns 3 when sob exists within conforming footer as last entry
238 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
239 size_t ignore_footer)
241 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
242 struct trailer_info info;
243 size_t i;
244 int found_sob = 0, found_sob_last = 0;
246 opts.no_divider = 1;
248 trailer_info_get(&info, sb->buf, &opts);
250 if (info.trailer_start == info.trailer_end)
251 return 0;
253 for (i = 0; i < info.trailer_nr; i++)
254 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
255 found_sob = 1;
256 if (i == info.trailer_nr - 1)
257 found_sob_last = 1;
260 trailer_info_release(&info);
262 if (found_sob_last)
263 return 3;
264 if (found_sob)
265 return 2;
266 return 1;
269 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
271 static struct strbuf buf = STRBUF_INIT;
273 strbuf_reset(&buf);
274 if (opts->gpg_sign)
275 sq_quotef(&buf, "-S%s", opts->gpg_sign);
276 return buf.buf;
279 int sequencer_remove_state(struct replay_opts *opts)
281 struct strbuf buf = STRBUF_INIT;
282 int i, ret = 0;
284 if (is_rebase_i(opts) &&
285 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
286 char *p = buf.buf;
287 while (*p) {
288 char *eol = strchr(p, '\n');
289 if (eol)
290 *eol = '\0';
291 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0) {
292 warning(_("could not delete '%s'"), p);
293 ret = -1;
295 if (!eol)
296 break;
297 p = eol + 1;
301 free(opts->gpg_sign);
302 free(opts->strategy);
303 for (i = 0; i < opts->xopts_nr; i++)
304 free(opts->xopts[i]);
305 free(opts->xopts);
306 strbuf_release(&opts->current_fixups);
308 strbuf_reset(&buf);
309 strbuf_addstr(&buf, get_dir(opts));
310 if (remove_dir_recursively(&buf, 0))
311 ret = error(_("could not remove '%s'"), buf.buf);
312 strbuf_release(&buf);
314 return ret;
317 static const char *action_name(const struct replay_opts *opts)
319 switch (opts->action) {
320 case REPLAY_REVERT:
321 return N_("revert");
322 case REPLAY_PICK:
323 return N_("cherry-pick");
324 case REPLAY_INTERACTIVE_REBASE:
325 return N_("rebase -i");
327 die(_("unknown action: %d"), opts->action);
330 struct commit_message {
331 char *parent_label;
332 char *label;
333 char *subject;
334 const char *message;
337 static const char *short_commit_name(struct commit *commit)
339 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
342 static int get_message(struct commit *commit, struct commit_message *out)
344 const char *abbrev, *subject;
345 int subject_len;
347 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
348 abbrev = short_commit_name(commit);
350 subject_len = find_commit_subject(out->message, &subject);
352 out->subject = xmemdupz(subject, subject_len);
353 out->label = xstrfmt("%s... %s", abbrev, out->subject);
354 out->parent_label = xstrfmt("parent of %s", out->label);
356 return 0;
359 static void free_message(struct commit *commit, struct commit_message *msg)
361 free(msg->parent_label);
362 free(msg->label);
363 free(msg->subject);
364 unuse_commit_buffer(commit, msg->message);
367 static void print_advice(struct repository *r, int show_hint,
368 struct replay_opts *opts)
370 char *msg = getenv("GIT_CHERRY_PICK_HELP");
372 if (msg) {
373 fprintf(stderr, "%s\n", msg);
375 * A conflict has occurred but the porcelain
376 * (typically rebase --interactive) wants to take care
377 * of the commit itself so remove CHERRY_PICK_HEAD
379 unlink(git_path_cherry_pick_head(r));
380 return;
383 if (show_hint) {
384 if (opts->no_commit)
385 advise(_("after resolving the conflicts, mark the corrected paths\n"
386 "with 'git add <paths>' or 'git rm <paths>'"));
387 else
388 advise(_("after resolving the conflicts, mark the corrected paths\n"
389 "with 'git add <paths>' or 'git rm <paths>'\n"
390 "and commit the result with 'git commit'"));
394 static int write_message(const void *buf, size_t len, const char *filename,
395 int append_eol)
397 struct lock_file msg_file = LOCK_INIT;
399 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
400 if (msg_fd < 0)
401 return error_errno(_("could not lock '%s'"), filename);
402 if (write_in_full(msg_fd, buf, len) < 0) {
403 error_errno(_("could not write to '%s'"), filename);
404 rollback_lock_file(&msg_file);
405 return -1;
407 if (append_eol && write(msg_fd, "\n", 1) < 0) {
408 error_errno(_("could not write eol to '%s'"), filename);
409 rollback_lock_file(&msg_file);
410 return -1;
412 if (commit_lock_file(&msg_file) < 0)
413 return error(_("failed to finalize '%s'"), filename);
415 return 0;
419 * Reads a file that was presumably written by a shell script, i.e. with an
420 * end-of-line marker that needs to be stripped.
422 * Note that only the last end-of-line marker is stripped, consistent with the
423 * behavior of "$(cat path)" in a shell script.
425 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
427 static int read_oneliner(struct strbuf *buf,
428 const char *path, int skip_if_empty)
430 int orig_len = buf->len;
432 if (!file_exists(path))
433 return 0;
435 if (strbuf_read_file(buf, path, 0) < 0) {
436 warning_errno(_("could not read '%s'"), path);
437 return 0;
440 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
441 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
442 --buf->len;
443 buf->buf[buf->len] = '\0';
446 if (skip_if_empty && buf->len == orig_len)
447 return 0;
449 return 1;
452 static struct tree *empty_tree(struct repository *r)
454 return lookup_tree(r, the_hash_algo->empty_tree);
457 static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
459 if (repo_read_index_unmerged(repo))
460 return error_resolve_conflict(_(action_name(opts)));
462 error(_("your local changes would be overwritten by %s."),
463 _(action_name(opts)));
465 if (advice_commit_before_merge)
466 advise(_("commit your changes or stash them to proceed."));
467 return -1;
470 static void update_abort_safety_file(void)
472 struct object_id head;
474 /* Do nothing on a single-pick */
475 if (!file_exists(git_path_seq_dir()))
476 return;
478 if (!get_oid("HEAD", &head))
479 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
480 else
481 write_file(git_path_abort_safety_file(), "%s", "");
484 static int fast_forward_to(struct repository *r,
485 const struct object_id *to,
486 const struct object_id *from,
487 int unborn,
488 struct replay_opts *opts)
490 struct ref_transaction *transaction;
491 struct strbuf sb = STRBUF_INIT;
492 struct strbuf err = STRBUF_INIT;
494 repo_read_index(r);
495 if (checkout_fast_forward(r, from, to, 1))
496 return -1; /* the callee should have complained already */
498 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
500 transaction = ref_transaction_begin(&err);
501 if (!transaction ||
502 ref_transaction_update(transaction, "HEAD",
503 to, unborn && !is_rebase_i(opts) ?
504 &null_oid : from,
505 0, sb.buf, &err) ||
506 ref_transaction_commit(transaction, &err)) {
507 ref_transaction_free(transaction);
508 error("%s", err.buf);
509 strbuf_release(&sb);
510 strbuf_release(&err);
511 return -1;
514 strbuf_release(&sb);
515 strbuf_release(&err);
516 ref_transaction_free(transaction);
517 update_abort_safety_file();
518 return 0;
521 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
522 int use_editor)
524 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
525 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
526 COMMIT_MSG_CLEANUP_SPACE;
527 else if (!strcmp(cleanup_arg, "verbatim"))
528 return COMMIT_MSG_CLEANUP_NONE;
529 else if (!strcmp(cleanup_arg, "whitespace"))
530 return COMMIT_MSG_CLEANUP_SPACE;
531 else if (!strcmp(cleanup_arg, "strip"))
532 return COMMIT_MSG_CLEANUP_ALL;
533 else if (!strcmp(cleanup_arg, "scissors"))
534 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
535 COMMIT_MSG_CLEANUP_SPACE;
536 else
537 die(_("Invalid cleanup mode %s"), cleanup_arg);
541 * NB using int rather than enum cleanup_mode to stop clang's
542 * -Wtautological-constant-out-of-range-compare complaining that the comparison
543 * is always true.
545 static const char *describe_cleanup_mode(int cleanup_mode)
547 static const char *modes[] = { "whitespace",
548 "verbatim",
549 "scissors",
550 "strip" };
552 if (cleanup_mode < ARRAY_SIZE(modes))
553 return modes[cleanup_mode];
555 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
558 void append_conflicts_hint(struct index_state *istate,
559 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
561 int i;
563 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
564 strbuf_addch(msgbuf, '\n');
565 wt_status_append_cut_line(msgbuf);
566 strbuf_addch(msgbuf, comment_line_char);
569 strbuf_addch(msgbuf, '\n');
570 strbuf_commented_addf(msgbuf, "Conflicts:\n");
571 for (i = 0; i < istate->cache_nr;) {
572 const struct cache_entry *ce = istate->cache[i++];
573 if (ce_stage(ce)) {
574 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
575 while (i < istate->cache_nr &&
576 !strcmp(ce->name, istate->cache[i]->name))
577 i++;
582 static int do_recursive_merge(struct repository *r,
583 struct commit *base, struct commit *next,
584 const char *base_label, const char *next_label,
585 struct object_id *head, struct strbuf *msgbuf,
586 struct replay_opts *opts)
588 struct merge_options o;
589 struct tree *result, *next_tree, *base_tree, *head_tree;
590 int clean;
591 char **xopt;
592 struct lock_file index_lock = LOCK_INIT;
594 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
595 return -1;
597 repo_read_index(r);
599 init_merge_options(&o, r);
600 o.ancestor = base ? base_label : "(empty tree)";
601 o.branch1 = "HEAD";
602 o.branch2 = next ? next_label : "(empty tree)";
603 if (is_rebase_i(opts))
604 o.buffer_output = 2;
605 o.show_rename_progress = 1;
607 head_tree = parse_tree_indirect(head);
608 next_tree = next ? get_commit_tree(next) : empty_tree(r);
609 base_tree = base ? get_commit_tree(base) : empty_tree(r);
611 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
612 parse_merge_opt(&o, *xopt);
614 clean = merge_trees(&o,
615 head_tree,
616 next_tree, base_tree, &result);
617 if (is_rebase_i(opts) && clean <= 0)
618 fputs(o.obuf.buf, stdout);
619 strbuf_release(&o.obuf);
620 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
621 if (clean < 0) {
622 rollback_lock_file(&index_lock);
623 return clean;
626 if (write_locked_index(r->index, &index_lock,
627 COMMIT_LOCK | SKIP_IF_UNCHANGED))
629 * TRANSLATORS: %s will be "revert", "cherry-pick" or
630 * "rebase -i".
632 return error(_("%s: Unable to write new index file"),
633 _(action_name(opts)));
635 if (!clean)
636 append_conflicts_hint(r->index, msgbuf,
637 opts->default_msg_cleanup);
639 return !clean;
642 static struct object_id *get_cache_tree_oid(struct index_state *istate)
644 if (!istate->cache_tree)
645 istate->cache_tree = cache_tree();
647 if (!cache_tree_fully_valid(istate->cache_tree))
648 if (cache_tree_update(istate, 0)) {
649 error(_("unable to update cache tree"));
650 return NULL;
653 return &istate->cache_tree->oid;
656 static int is_index_unchanged(struct repository *r)
658 struct object_id head_oid, *cache_tree_oid;
659 struct commit *head_commit;
660 struct index_state *istate = r->index;
662 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
663 return error(_("could not resolve HEAD commit"));
665 head_commit = lookup_commit(r, &head_oid);
668 * If head_commit is NULL, check_commit, called from
669 * lookup_commit, would have indicated that head_commit is not
670 * a commit object already. parse_commit() will return failure
671 * without further complaints in such a case. Otherwise, if
672 * the commit is invalid, parse_commit() will complain. So
673 * there is nothing for us to say here. Just return failure.
675 if (parse_commit(head_commit))
676 return -1;
678 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
679 return -1;
681 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
684 static int write_author_script(const char *message)
686 struct strbuf buf = STRBUF_INIT;
687 const char *eol;
688 int res;
690 for (;;)
691 if (!*message || starts_with(message, "\n")) {
692 missing_author:
693 /* Missing 'author' line? */
694 unlink(rebase_path_author_script());
695 return 0;
696 } else if (skip_prefix(message, "author ", &message))
697 break;
698 else if ((eol = strchr(message, '\n')))
699 message = eol + 1;
700 else
701 goto missing_author;
703 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
704 while (*message && *message != '\n' && *message != '\r')
705 if (skip_prefix(message, " <", &message))
706 break;
707 else if (*message != '\'')
708 strbuf_addch(&buf, *(message++));
709 else
710 strbuf_addf(&buf, "'\\%c'", *(message++));
711 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
712 while (*message && *message != '\n' && *message != '\r')
713 if (skip_prefix(message, "> ", &message))
714 break;
715 else if (*message != '\'')
716 strbuf_addch(&buf, *(message++));
717 else
718 strbuf_addf(&buf, "'\\%c'", *(message++));
719 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
720 while (*message && *message != '\n' && *message != '\r')
721 if (*message != '\'')
722 strbuf_addch(&buf, *(message++));
723 else
724 strbuf_addf(&buf, "'\\%c'", *(message++));
725 strbuf_addch(&buf, '\'');
726 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
727 strbuf_release(&buf);
728 return res;
732 * Take a series of KEY='VALUE' lines where VALUE part is
733 * sq-quoted, and append <KEY, VALUE> at the end of the string list
735 static int parse_key_value_squoted(char *buf, struct string_list *list)
737 while (*buf) {
738 struct string_list_item *item;
739 char *np;
740 char *cp = strchr(buf, '=');
741 if (!cp) {
742 np = strchrnul(buf, '\n');
743 return error(_("no key present in '%.*s'"),
744 (int) (np - buf), buf);
746 np = strchrnul(cp, '\n');
747 *cp++ = '\0';
748 item = string_list_append(list, buf);
750 buf = np + (*np == '\n');
751 *np = '\0';
752 cp = sq_dequote(cp);
753 if (!cp)
754 return error(_("unable to dequote value of '%s'"),
755 item->string);
756 item->util = xstrdup(cp);
758 return 0;
762 * Reads and parses the state directory's "author-script" file, and sets name,
763 * email and date accordingly.
764 * Returns 0 on success, -1 if the file could not be parsed.
766 * The author script is of the format:
768 * GIT_AUTHOR_NAME='$author_name'
769 * GIT_AUTHOR_EMAIL='$author_email'
770 * GIT_AUTHOR_DATE='$author_date'
772 * where $author_name, $author_email and $author_date are quoted. We are strict
773 * with our parsing, as the file was meant to be eval'd in the old
774 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
775 * from what this function expects, it is better to bail out than to do
776 * something that the user does not expect.
778 int read_author_script(const char *path, char **name, char **email, char **date,
779 int allow_missing)
781 struct strbuf buf = STRBUF_INIT;
782 struct string_list kv = STRING_LIST_INIT_DUP;
783 int retval = -1; /* assume failure */
784 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
786 if (strbuf_read_file(&buf, path, 256) <= 0) {
787 strbuf_release(&buf);
788 if (errno == ENOENT && allow_missing)
789 return 0;
790 else
791 return error_errno(_("could not open '%s' for reading"),
792 path);
795 if (parse_key_value_squoted(buf.buf, &kv))
796 goto finish;
798 for (i = 0; i < kv.nr; i++) {
799 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
800 if (name_i != -2)
801 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
802 else
803 name_i = i;
804 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
805 if (email_i != -2)
806 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
807 else
808 email_i = i;
809 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
810 if (date_i != -2)
811 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
812 else
813 date_i = i;
814 } else {
815 err = error(_("unknown variable '%s'"),
816 kv.items[i].string);
819 if (name_i == -2)
820 error(_("missing 'GIT_AUTHOR_NAME'"));
821 if (email_i == -2)
822 error(_("missing 'GIT_AUTHOR_EMAIL'"));
823 if (date_i == -2)
824 error(_("missing 'GIT_AUTHOR_DATE'"));
825 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
826 goto finish;
827 *name = kv.items[name_i].util;
828 *email = kv.items[email_i].util;
829 *date = kv.items[date_i].util;
830 retval = 0;
831 finish:
832 string_list_clear(&kv, !!retval);
833 strbuf_release(&buf);
834 return retval;
838 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
839 * file with shell quoting into struct argv_array. Returns -1 on
840 * error, 0 otherwise.
842 static int read_env_script(struct argv_array *env)
844 char *name, *email, *date;
846 if (read_author_script(rebase_path_author_script(),
847 &name, &email, &date, 0))
848 return -1;
850 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
851 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
852 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
853 free(name);
854 free(email);
855 free(date);
857 return 0;
860 static char *get_author(const char *message)
862 size_t len;
863 const char *a;
865 a = find_commit_header(message, "author", &len);
866 if (a)
867 return xmemdupz(a, len);
869 return NULL;
872 static const char staged_changes_advice[] =
873 N_("you have staged changes in your working tree\n"
874 "If these changes are meant to be squashed into the previous commit, run:\n"
875 "\n"
876 " git commit --amend %s\n"
877 "\n"
878 "If they are meant to go into a new commit, run:\n"
879 "\n"
880 " git commit %s\n"
881 "\n"
882 "In both cases, once you're done, continue with:\n"
883 "\n"
884 " git rebase --continue\n");
886 #define ALLOW_EMPTY (1<<0)
887 #define EDIT_MSG (1<<1)
888 #define AMEND_MSG (1<<2)
889 #define CLEANUP_MSG (1<<3)
890 #define VERIFY_MSG (1<<4)
891 #define CREATE_ROOT_COMMIT (1<<5)
893 static int run_command_silent_on_success(struct child_process *cmd)
895 struct strbuf buf = STRBUF_INIT;
896 int rc;
898 cmd->stdout_to_stderr = 1;
899 rc = pipe_command(cmd,
900 NULL, 0,
901 NULL, 0,
902 &buf, 0);
904 if (rc)
905 fputs(buf.buf, stderr);
906 strbuf_release(&buf);
907 return rc;
911 * If we are cherry-pick, and if the merge did not result in
912 * hand-editing, we will hit this commit and inherit the original
913 * author date and name.
915 * If we are revert, or if our cherry-pick results in a hand merge,
916 * we had better say that the current user is responsible for that.
918 * An exception is when run_git_commit() is called during an
919 * interactive rebase: in that case, we will want to retain the
920 * author metadata.
922 static int run_git_commit(struct repository *r,
923 const char *defmsg,
924 struct replay_opts *opts,
925 unsigned int flags)
927 struct child_process cmd = CHILD_PROCESS_INIT;
929 cmd.git_cmd = 1;
931 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
932 const char *gpg_opt = gpg_sign_opt_quoted(opts);
934 return error(_(staged_changes_advice),
935 gpg_opt, gpg_opt);
938 argv_array_push(&cmd.args, "commit");
940 if (!(flags & VERIFY_MSG))
941 argv_array_push(&cmd.args, "-n");
942 if ((flags & AMEND_MSG))
943 argv_array_push(&cmd.args, "--amend");
944 if (opts->gpg_sign)
945 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
946 if (defmsg)
947 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
948 else if (!(flags & EDIT_MSG))
949 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
950 if ((flags & CLEANUP_MSG))
951 argv_array_push(&cmd.args, "--cleanup=strip");
952 if ((flags & EDIT_MSG))
953 argv_array_push(&cmd.args, "-e");
954 else if (!(flags & CLEANUP_MSG) &&
955 !opts->signoff && !opts->record_origin &&
956 !opts->explicit_cleanup)
957 argv_array_push(&cmd.args, "--cleanup=verbatim");
959 if ((flags & ALLOW_EMPTY))
960 argv_array_push(&cmd.args, "--allow-empty");
962 if (!(flags & EDIT_MSG))
963 argv_array_push(&cmd.args, "--allow-empty-message");
965 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
966 return run_command_silent_on_success(&cmd);
967 else
968 return run_command(&cmd);
971 static int rest_is_empty(const struct strbuf *sb, int start)
973 int i, eol;
974 const char *nl;
976 /* Check if the rest is just whitespace and Signed-off-by's. */
977 for (i = start; i < sb->len; i++) {
978 nl = memchr(sb->buf + i, '\n', sb->len - i);
979 if (nl)
980 eol = nl - sb->buf;
981 else
982 eol = sb->len;
984 if (strlen(sign_off_header) <= eol - i &&
985 starts_with(sb->buf + i, sign_off_header)) {
986 i = eol;
987 continue;
989 while (i < eol)
990 if (!isspace(sb->buf[i++]))
991 return 0;
994 return 1;
997 void cleanup_message(struct strbuf *msgbuf,
998 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1000 if (verbose || /* Truncate the message just before the diff, if any. */
1001 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1002 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1003 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1004 strbuf_stripspace(msgbuf, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1008 * Find out if the message in the strbuf contains only whitespace and
1009 * Signed-off-by lines.
1011 int message_is_empty(const struct strbuf *sb,
1012 enum commit_msg_cleanup_mode cleanup_mode)
1014 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1015 return 0;
1016 return rest_is_empty(sb, 0);
1020 * See if the user edited the message in the editor or left what
1021 * was in the template intact
1023 int template_untouched(const struct strbuf *sb, const char *template_file,
1024 enum commit_msg_cleanup_mode cleanup_mode)
1026 struct strbuf tmpl = STRBUF_INIT;
1027 const char *start;
1029 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1030 return 0;
1032 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1033 return 0;
1035 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1036 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1037 start = sb->buf;
1038 strbuf_release(&tmpl);
1039 return rest_is_empty(sb, start - sb->buf);
1042 int update_head_with_reflog(const struct commit *old_head,
1043 const struct object_id *new_head,
1044 const char *action, const struct strbuf *msg,
1045 struct strbuf *err)
1047 struct ref_transaction *transaction;
1048 struct strbuf sb = STRBUF_INIT;
1049 const char *nl;
1050 int ret = 0;
1052 if (action) {
1053 strbuf_addstr(&sb, action);
1054 strbuf_addstr(&sb, ": ");
1057 nl = strchr(msg->buf, '\n');
1058 if (nl) {
1059 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1060 } else {
1061 strbuf_addbuf(&sb, msg);
1062 strbuf_addch(&sb, '\n');
1065 transaction = ref_transaction_begin(err);
1066 if (!transaction ||
1067 ref_transaction_update(transaction, "HEAD", new_head,
1068 old_head ? &old_head->object.oid : &null_oid,
1069 0, sb.buf, err) ||
1070 ref_transaction_commit(transaction, err)) {
1071 ret = -1;
1073 ref_transaction_free(transaction);
1074 strbuf_release(&sb);
1076 return ret;
1079 static int run_rewrite_hook(const struct object_id *oldoid,
1080 const struct object_id *newoid)
1082 struct child_process proc = CHILD_PROCESS_INIT;
1083 const char *argv[3];
1084 int code;
1085 struct strbuf sb = STRBUF_INIT;
1087 argv[0] = find_hook("post-rewrite");
1088 if (!argv[0])
1089 return 0;
1091 argv[1] = "amend";
1092 argv[2] = NULL;
1094 proc.argv = argv;
1095 proc.in = -1;
1096 proc.stdout_to_stderr = 1;
1097 proc.trace2_hook_name = "post-rewrite";
1099 code = start_command(&proc);
1100 if (code)
1101 return code;
1102 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1103 sigchain_push(SIGPIPE, SIG_IGN);
1104 write_in_full(proc.in, sb.buf, sb.len);
1105 close(proc.in);
1106 strbuf_release(&sb);
1107 sigchain_pop(SIGPIPE);
1108 return finish_command(&proc);
1111 void commit_post_rewrite(struct repository *r,
1112 const struct commit *old_head,
1113 const struct object_id *new_head)
1115 struct notes_rewrite_cfg *cfg;
1117 cfg = init_copy_notes_for_rewrite("amend");
1118 if (cfg) {
1119 /* we are amending, so old_head is not NULL */
1120 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1121 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
1123 run_rewrite_hook(&old_head->object.oid, new_head);
1126 static int run_prepare_commit_msg_hook(struct repository *r,
1127 struct strbuf *msg,
1128 const char *commit)
1130 struct argv_array hook_env = ARGV_ARRAY_INIT;
1131 int ret;
1132 const char *name;
1134 name = git_path_commit_editmsg();
1135 if (write_message(msg->buf, msg->len, name, 0))
1136 return -1;
1138 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", r->index_file);
1139 argv_array_push(&hook_env, "GIT_EDITOR=:");
1140 if (commit)
1141 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1142 "commit", commit, NULL);
1143 else
1144 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1145 "message", NULL);
1146 if (ret)
1147 ret = error(_("'prepare-commit-msg' hook failed"));
1148 argv_array_clear(&hook_env);
1150 return ret;
1153 static const char implicit_ident_advice_noconfig[] =
1154 N_("Your name and email address were configured automatically based\n"
1155 "on your username and hostname. Please check that they are accurate.\n"
1156 "You can suppress this message by setting them explicitly. Run the\n"
1157 "following command and follow the instructions in your editor to edit\n"
1158 "your configuration file:\n"
1159 "\n"
1160 " git config --global --edit\n"
1161 "\n"
1162 "After doing this, you may fix the identity used for this commit with:\n"
1163 "\n"
1164 " git commit --amend --reset-author\n");
1166 static const char implicit_ident_advice_config[] =
1167 N_("Your name and email address were configured automatically based\n"
1168 "on your username and hostname. Please check that they are accurate.\n"
1169 "You can suppress this message by setting them explicitly:\n"
1170 "\n"
1171 " git config --global user.name \"Your Name\"\n"
1172 " git config --global user.email you@example.com\n"
1173 "\n"
1174 "After doing this, you may fix the identity used for this commit with:\n"
1175 "\n"
1176 " git commit --amend --reset-author\n");
1178 static const char *implicit_ident_advice(void)
1180 char *user_config = expand_user_path("~/.gitconfig", 0);
1181 char *xdg_config = xdg_config_home("config");
1182 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1184 free(user_config);
1185 free(xdg_config);
1187 if (config_exists)
1188 return _(implicit_ident_advice_config);
1189 else
1190 return _(implicit_ident_advice_noconfig);
1194 void print_commit_summary(struct repository *r,
1195 const char *prefix,
1196 const struct object_id *oid,
1197 unsigned int flags)
1199 struct rev_info rev;
1200 struct commit *commit;
1201 struct strbuf format = STRBUF_INIT;
1202 const char *head;
1203 struct pretty_print_context pctx = {0};
1204 struct strbuf author_ident = STRBUF_INIT;
1205 struct strbuf committer_ident = STRBUF_INIT;
1207 commit = lookup_commit(r, oid);
1208 if (!commit)
1209 die(_("couldn't look up newly created commit"));
1210 if (parse_commit(commit))
1211 die(_("could not parse newly created commit"));
1213 strbuf_addstr(&format, "format:%h] %s");
1215 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1216 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1217 if (strbuf_cmp(&author_ident, &committer_ident)) {
1218 strbuf_addstr(&format, "\n Author: ");
1219 strbuf_addbuf_percentquote(&format, &author_ident);
1221 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1222 struct strbuf date = STRBUF_INIT;
1224 format_commit_message(commit, "%ad", &date, &pctx);
1225 strbuf_addstr(&format, "\n Date: ");
1226 strbuf_addbuf_percentquote(&format, &date);
1227 strbuf_release(&date);
1229 if (!committer_ident_sufficiently_given()) {
1230 strbuf_addstr(&format, "\n Committer: ");
1231 strbuf_addbuf_percentquote(&format, &committer_ident);
1232 if (advice_implicit_identity) {
1233 strbuf_addch(&format, '\n');
1234 strbuf_addstr(&format, implicit_ident_advice());
1237 strbuf_release(&author_ident);
1238 strbuf_release(&committer_ident);
1240 repo_init_revisions(r, &rev, prefix);
1241 setup_revisions(0, NULL, &rev, NULL);
1243 rev.diff = 1;
1244 rev.diffopt.output_format =
1245 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1247 rev.verbose_header = 1;
1248 rev.show_root_diff = 1;
1249 get_commit_format(format.buf, &rev);
1250 rev.always_show_header = 0;
1251 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1252 rev.diffopt.break_opt = 0;
1253 diff_setup_done(&rev.diffopt);
1255 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1256 if (!head)
1257 die_errno(_("unable to resolve HEAD after creating commit"));
1258 if (!strcmp(head, "HEAD"))
1259 head = _("detached HEAD");
1260 else
1261 skip_prefix(head, "refs/heads/", &head);
1262 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1263 _(" (root-commit)") : "");
1265 if (!log_tree_commit(&rev, commit)) {
1266 rev.always_show_header = 1;
1267 rev.use_terminator = 1;
1268 log_tree_commit(&rev, commit);
1271 strbuf_release(&format);
1274 static int parse_head(struct repository *r, struct commit **head)
1276 struct commit *current_head;
1277 struct object_id oid;
1279 if (get_oid("HEAD", &oid)) {
1280 current_head = NULL;
1281 } else {
1282 current_head = lookup_commit_reference(r, &oid);
1283 if (!current_head)
1284 return error(_("could not parse HEAD"));
1285 if (!oideq(&oid, &current_head->object.oid)) {
1286 warning(_("HEAD %s is not a commit!"),
1287 oid_to_hex(&oid));
1289 if (parse_commit(current_head))
1290 return error(_("could not parse HEAD commit"));
1292 *head = current_head;
1294 return 0;
1298 * Try to commit without forking 'git commit'. In some cases we need
1299 * to run 'git commit' to display an error message
1301 * Returns:
1302 * -1 - error unable to commit
1303 * 0 - success
1304 * 1 - run 'git commit'
1306 static int try_to_commit(struct repository *r,
1307 struct strbuf *msg, const char *author,
1308 struct replay_opts *opts, unsigned int flags,
1309 struct object_id *oid)
1311 struct object_id tree;
1312 struct commit *current_head = NULL;
1313 struct commit_list *parents = NULL;
1314 struct commit_extra_header *extra = NULL;
1315 struct strbuf err = STRBUF_INIT;
1316 struct strbuf commit_msg = STRBUF_INIT;
1317 char *amend_author = NULL;
1318 const char *hook_commit = NULL;
1319 enum commit_msg_cleanup_mode cleanup;
1320 int res = 0;
1322 if (parse_head(r, &current_head))
1323 return -1;
1325 if (flags & AMEND_MSG) {
1326 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1327 const char *out_enc = get_commit_output_encoding();
1328 const char *message = logmsg_reencode(current_head, NULL,
1329 out_enc);
1331 if (!msg) {
1332 const char *orig_message = NULL;
1334 find_commit_subject(message, &orig_message);
1335 msg = &commit_msg;
1336 strbuf_addstr(msg, orig_message);
1337 hook_commit = "HEAD";
1339 author = amend_author = get_author(message);
1340 unuse_commit_buffer(current_head, message);
1341 if (!author) {
1342 res = error(_("unable to parse commit author"));
1343 goto out;
1345 parents = copy_commit_list(current_head->parents);
1346 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1347 } else if (current_head &&
1348 (!(flags & CREATE_ROOT_COMMIT) || (flags & AMEND_MSG))) {
1349 commit_list_insert(current_head, &parents);
1352 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1353 res = error(_("git write-tree failed to write a tree"));
1354 goto out;
1357 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1358 get_commit_tree_oid(current_head) :
1359 the_hash_algo->empty_tree, &tree)) {
1360 res = 1; /* run 'git commit' to display error message */
1361 goto out;
1364 if (find_hook("prepare-commit-msg")) {
1365 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1366 if (res)
1367 goto out;
1368 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1369 2048) < 0) {
1370 res = error_errno(_("unable to read commit message "
1371 "from '%s'"),
1372 git_path_commit_editmsg());
1373 goto out;
1375 msg = &commit_msg;
1378 if (flags & CLEANUP_MSG)
1379 cleanup = COMMIT_MSG_CLEANUP_ALL;
1380 else if ((opts->signoff || opts->record_origin) &&
1381 !opts->explicit_cleanup)
1382 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1383 else
1384 cleanup = opts->default_msg_cleanup;
1386 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1387 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1388 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1389 res = 1; /* run 'git commit' to display error message */
1390 goto out;
1393 reset_ident_date();
1395 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1396 oid, author, opts->gpg_sign, extra)) {
1397 res = error(_("failed to write commit object"));
1398 goto out;
1401 if (update_head_with_reflog(current_head, oid,
1402 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1403 res = error("%s", err.buf);
1404 goto out;
1407 if (flags & AMEND_MSG)
1408 commit_post_rewrite(r, current_head, oid);
1410 out:
1411 free_commit_extra_headers(extra);
1412 strbuf_release(&err);
1413 strbuf_release(&commit_msg);
1414 free(amend_author);
1416 return res;
1419 static int do_commit(struct repository *r,
1420 const char *msg_file, const char *author,
1421 struct replay_opts *opts, unsigned int flags)
1423 int res = 1;
1425 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG)) {
1426 struct object_id oid;
1427 struct strbuf sb = STRBUF_INIT;
1429 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1430 return error_errno(_("unable to read commit message "
1431 "from '%s'"),
1432 msg_file);
1434 res = try_to_commit(r, msg_file ? &sb : NULL,
1435 author, opts, flags, &oid);
1436 strbuf_release(&sb);
1437 if (!res) {
1438 unlink(git_path_cherry_pick_head(r));
1439 unlink(git_path_merge_msg(r));
1440 if (!is_rebase_i(opts))
1441 print_commit_summary(r, NULL, &oid,
1442 SUMMARY_SHOW_AUTHOR_DATE);
1443 return res;
1446 if (res == 1)
1447 return run_git_commit(r, msg_file, opts, flags);
1449 return res;
1452 static int is_original_commit_empty(struct commit *commit)
1454 const struct object_id *ptree_oid;
1456 if (parse_commit(commit))
1457 return error(_("could not parse commit %s"),
1458 oid_to_hex(&commit->object.oid));
1459 if (commit->parents) {
1460 struct commit *parent = commit->parents->item;
1461 if (parse_commit(parent))
1462 return error(_("could not parse parent commit %s"),
1463 oid_to_hex(&parent->object.oid));
1464 ptree_oid = get_commit_tree_oid(parent);
1465 } else {
1466 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1469 return oideq(ptree_oid, get_commit_tree_oid(commit));
1473 * Do we run "git commit" with "--allow-empty"?
1475 static int allow_empty(struct repository *r,
1476 struct replay_opts *opts,
1477 struct commit *commit)
1479 int index_unchanged, empty_commit;
1482 * Three cases:
1484 * (1) we do not allow empty at all and error out.
1486 * (2) we allow ones that were initially empty, but
1487 * forbid the ones that become empty;
1489 * (3) we allow both.
1491 if (!opts->allow_empty)
1492 return 0; /* let "git commit" barf as necessary */
1494 index_unchanged = is_index_unchanged(r);
1495 if (index_unchanged < 0)
1496 return index_unchanged;
1497 if (!index_unchanged)
1498 return 0; /* we do not have to say --allow-empty */
1500 if (opts->keep_redundant_commits)
1501 return 1;
1503 empty_commit = is_original_commit_empty(commit);
1504 if (empty_commit < 0)
1505 return empty_commit;
1506 if (!empty_commit)
1507 return 0;
1508 else
1509 return 1;
1512 static struct {
1513 char c;
1514 const char *str;
1515 } todo_command_info[] = {
1516 { 'p', "pick" },
1517 { 0, "revert" },
1518 { 'e', "edit" },
1519 { 'r', "reword" },
1520 { 'f', "fixup" },
1521 { 's', "squash" },
1522 { 'x', "exec" },
1523 { 'b', "break" },
1524 { 'l', "label" },
1525 { 't', "reset" },
1526 { 'm', "merge" },
1527 { 0, "noop" },
1528 { 'd', "drop" },
1529 { 0, NULL }
1532 static const char *command_to_string(const enum todo_command command)
1534 if (command < TODO_COMMENT)
1535 return todo_command_info[command].str;
1536 die(_("unknown command: %d"), command);
1539 static char command_to_char(const enum todo_command command)
1541 if (command < TODO_COMMENT && todo_command_info[command].c)
1542 return todo_command_info[command].c;
1543 return comment_line_char;
1546 static int is_noop(const enum todo_command command)
1548 return TODO_NOOP <= command;
1551 static int is_fixup(enum todo_command command)
1553 return command == TODO_FIXUP || command == TODO_SQUASH;
1556 /* Does this command create a (non-merge) commit? */
1557 static int is_pick_or_similar(enum todo_command command)
1559 switch (command) {
1560 case TODO_PICK:
1561 case TODO_REVERT:
1562 case TODO_EDIT:
1563 case TODO_REWORD:
1564 case TODO_FIXUP:
1565 case TODO_SQUASH:
1566 return 1;
1567 default:
1568 return 0;
1572 static int update_squash_messages(struct repository *r,
1573 enum todo_command command,
1574 struct commit *commit,
1575 struct replay_opts *opts)
1577 struct strbuf buf = STRBUF_INIT;
1578 int res;
1579 const char *message, *body;
1581 if (opts->current_fixup_count > 0) {
1582 struct strbuf header = STRBUF_INIT;
1583 char *eol;
1585 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1586 return error(_("could not read '%s'"),
1587 rebase_path_squash_msg());
1589 eol = buf.buf[0] != comment_line_char ?
1590 buf.buf : strchrnul(buf.buf, '\n');
1592 strbuf_addf(&header, "%c ", comment_line_char);
1593 strbuf_addf(&header, _("This is a combination of %d commits."),
1594 opts->current_fixup_count + 2);
1595 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1596 strbuf_release(&header);
1597 } else {
1598 struct object_id head;
1599 struct commit *head_commit;
1600 const char *head_message, *body;
1602 if (get_oid("HEAD", &head))
1603 return error(_("need a HEAD to fixup"));
1604 if (!(head_commit = lookup_commit_reference(r, &head)))
1605 return error(_("could not read HEAD"));
1606 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1607 return error(_("could not read HEAD's commit message"));
1609 find_commit_subject(head_message, &body);
1610 if (write_message(body, strlen(body),
1611 rebase_path_fixup_msg(), 0)) {
1612 unuse_commit_buffer(head_commit, head_message);
1613 return error(_("cannot write '%s'"),
1614 rebase_path_fixup_msg());
1617 strbuf_addf(&buf, "%c ", comment_line_char);
1618 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1619 strbuf_addf(&buf, "\n%c ", comment_line_char);
1620 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1621 strbuf_addstr(&buf, "\n\n");
1622 strbuf_addstr(&buf, body);
1624 unuse_commit_buffer(head_commit, head_message);
1627 if (!(message = get_commit_buffer(commit, NULL)))
1628 return error(_("could not read commit message of %s"),
1629 oid_to_hex(&commit->object.oid));
1630 find_commit_subject(message, &body);
1632 if (command == TODO_SQUASH) {
1633 unlink(rebase_path_fixup_msg());
1634 strbuf_addf(&buf, "\n%c ", comment_line_char);
1635 strbuf_addf(&buf, _("This is the commit message #%d:"),
1636 ++opts->current_fixup_count + 1);
1637 strbuf_addstr(&buf, "\n\n");
1638 strbuf_addstr(&buf, body);
1639 } else if (command == TODO_FIXUP) {
1640 strbuf_addf(&buf, "\n%c ", comment_line_char);
1641 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1642 ++opts->current_fixup_count + 1);
1643 strbuf_addstr(&buf, "\n\n");
1644 strbuf_add_commented_lines(&buf, body, strlen(body));
1645 } else
1646 return error(_("unknown command: %d"), command);
1647 unuse_commit_buffer(commit, message);
1649 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1650 strbuf_release(&buf);
1652 if (!res) {
1653 strbuf_addf(&opts->current_fixups, "%s%s %s",
1654 opts->current_fixups.len ? "\n" : "",
1655 command_to_string(command),
1656 oid_to_hex(&commit->object.oid));
1657 res = write_message(opts->current_fixups.buf,
1658 opts->current_fixups.len,
1659 rebase_path_current_fixups(), 0);
1662 return res;
1665 static void flush_rewritten_pending(void)
1667 struct strbuf buf = STRBUF_INIT;
1668 struct object_id newoid;
1669 FILE *out;
1671 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1672 !get_oid("HEAD", &newoid) &&
1673 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1674 char *bol = buf.buf, *eol;
1676 while (*bol) {
1677 eol = strchrnul(bol, '\n');
1678 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1679 bol, oid_to_hex(&newoid));
1680 if (!*eol)
1681 break;
1682 bol = eol + 1;
1684 fclose(out);
1685 unlink(rebase_path_rewritten_pending());
1687 strbuf_release(&buf);
1690 static void record_in_rewritten(struct object_id *oid,
1691 enum todo_command next_command)
1693 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1695 if (!out)
1696 return;
1698 fprintf(out, "%s\n", oid_to_hex(oid));
1699 fclose(out);
1701 if (!is_fixup(next_command))
1702 flush_rewritten_pending();
1705 static int do_pick_commit(struct repository *r,
1706 enum todo_command command,
1707 struct commit *commit,
1708 struct replay_opts *opts,
1709 int final_fixup, int *check_todo)
1711 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1712 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
1713 struct object_id head;
1714 struct commit *base, *next, *parent;
1715 const char *base_label, *next_label;
1716 char *author = NULL;
1717 struct commit_message msg = { NULL, NULL, NULL, NULL };
1718 struct strbuf msgbuf = STRBUF_INIT;
1719 int res, unborn = 0, reword = 0, allow;
1721 if (opts->no_commit) {
1723 * We do not intend to commit immediately. We just want to
1724 * merge the differences in, so let's compute the tree
1725 * that represents the "current" state for merge-recursive
1726 * to work on.
1728 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
1729 return error(_("your index file is unmerged."));
1730 } else {
1731 unborn = get_oid("HEAD", &head);
1732 /* Do we want to generate a root commit? */
1733 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1734 oideq(&head, &opts->squash_onto)) {
1735 if (is_fixup(command))
1736 return error(_("cannot fixup root commit"));
1737 flags |= CREATE_ROOT_COMMIT;
1738 unborn = 1;
1739 } else if (unborn)
1740 oidcpy(&head, the_hash_algo->empty_tree);
1741 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
1742 NULL, 0))
1743 return error_dirty_index(r, opts);
1745 discard_index(r->index);
1747 if (!commit->parents)
1748 parent = NULL;
1749 else if (commit->parents->next) {
1750 /* Reverting or cherry-picking a merge commit */
1751 int cnt;
1752 struct commit_list *p;
1754 if (!opts->mainline)
1755 return error(_("commit %s is a merge but no -m option was given."),
1756 oid_to_hex(&commit->object.oid));
1758 for (cnt = 1, p = commit->parents;
1759 cnt != opts->mainline && p;
1760 cnt++)
1761 p = p->next;
1762 if (cnt != opts->mainline || !p)
1763 return error(_("commit %s does not have parent %d"),
1764 oid_to_hex(&commit->object.oid), opts->mainline);
1765 parent = p->item;
1766 } else if (1 < opts->mainline)
1768 * Non-first parent explicitly specified as mainline for
1769 * non-merge commit
1771 return error(_("commit %s does not have parent %d"),
1772 oid_to_hex(&commit->object.oid), opts->mainline);
1773 else
1774 parent = commit->parents->item;
1776 if (get_message(commit, &msg) != 0)
1777 return error(_("cannot get commit message for %s"),
1778 oid_to_hex(&commit->object.oid));
1780 if (opts->allow_ff && !is_fixup(command) &&
1781 ((parent && oideq(&parent->object.oid, &head)) ||
1782 (!parent && unborn))) {
1783 if (is_rebase_i(opts))
1784 write_author_script(msg.message);
1785 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
1786 opts);
1787 if (res || command != TODO_REWORD)
1788 goto leave;
1789 reword = 1;
1790 msg_file = NULL;
1791 goto fast_forward_edit;
1793 if (parent && parse_commit(parent) < 0)
1794 /* TRANSLATORS: The first %s will be a "todo" command like
1795 "revert" or "pick", the second %s a SHA1. */
1796 return error(_("%s: cannot parse parent commit %s"),
1797 command_to_string(command),
1798 oid_to_hex(&parent->object.oid));
1801 * "commit" is an existing commit. We would want to apply
1802 * the difference it introduces since its first parent "prev"
1803 * on top of the current HEAD if we are cherry-pick. Or the
1804 * reverse of it if we are revert.
1807 if (command == TODO_REVERT) {
1808 base = commit;
1809 base_label = msg.label;
1810 next = parent;
1811 next_label = msg.parent_label;
1812 strbuf_addstr(&msgbuf, "Revert \"");
1813 strbuf_addstr(&msgbuf, msg.subject);
1814 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1815 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1817 if (commit->parents && commit->parents->next) {
1818 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1819 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1821 strbuf_addstr(&msgbuf, ".\n");
1822 } else {
1823 const char *p;
1825 base = parent;
1826 base_label = msg.parent_label;
1827 next = commit;
1828 next_label = msg.label;
1830 /* Append the commit log message to msgbuf. */
1831 if (find_commit_subject(msg.message, &p))
1832 strbuf_addstr(&msgbuf, p);
1834 if (opts->record_origin) {
1835 strbuf_complete_line(&msgbuf);
1836 if (!has_conforming_footer(&msgbuf, NULL, 0))
1837 strbuf_addch(&msgbuf, '\n');
1838 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1839 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1840 strbuf_addstr(&msgbuf, ")\n");
1842 if (!is_fixup(command))
1843 author = get_author(msg.message);
1846 if (command == TODO_REWORD)
1847 reword = 1;
1848 else if (is_fixup(command)) {
1849 if (update_squash_messages(r, command, commit, opts))
1850 return -1;
1851 flags |= AMEND_MSG;
1852 if (!final_fixup)
1853 msg_file = rebase_path_squash_msg();
1854 else if (file_exists(rebase_path_fixup_msg())) {
1855 flags |= CLEANUP_MSG;
1856 msg_file = rebase_path_fixup_msg();
1857 } else {
1858 const char *dest = git_path_squash_msg(r);
1859 unlink(dest);
1860 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1861 return error(_("could not rename '%s' to '%s'"),
1862 rebase_path_squash_msg(), dest);
1863 unlink(git_path_merge_msg(r));
1864 msg_file = dest;
1865 flags |= EDIT_MSG;
1869 if (opts->signoff && !is_fixup(command))
1870 append_signoff(&msgbuf, 0, 0);
1872 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1873 res = -1;
1874 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1875 res = do_recursive_merge(r, base, next, base_label, next_label,
1876 &head, &msgbuf, opts);
1877 if (res < 0)
1878 goto leave;
1880 res |= write_message(msgbuf.buf, msgbuf.len,
1881 git_path_merge_msg(r), 0);
1882 } else {
1883 struct commit_list *common = NULL;
1884 struct commit_list *remotes = NULL;
1886 res = write_message(msgbuf.buf, msgbuf.len,
1887 git_path_merge_msg(r), 0);
1889 commit_list_insert(base, &common);
1890 commit_list_insert(next, &remotes);
1891 res |= try_merge_command(r, opts->strategy,
1892 opts->xopts_nr, (const char **)opts->xopts,
1893 common, oid_to_hex(&head), remotes);
1894 free_commit_list(common);
1895 free_commit_list(remotes);
1897 strbuf_release(&msgbuf);
1900 * If the merge was clean or if it failed due to conflict, we write
1901 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1902 * However, if the merge did not even start, then we don't want to
1903 * write it at all.
1905 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
1906 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
1907 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1908 res = -1;
1909 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
1910 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
1911 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1912 res = -1;
1914 if (res) {
1915 error(command == TODO_REVERT
1916 ? _("could not revert %s... %s")
1917 : _("could not apply %s... %s"),
1918 short_commit_name(commit), msg.subject);
1919 print_advice(r, res == 1, opts);
1920 repo_rerere(r, opts->allow_rerere_auto);
1921 goto leave;
1924 allow = allow_empty(r, opts, commit);
1925 if (allow < 0) {
1926 res = allow;
1927 goto leave;
1928 } else if (allow)
1929 flags |= ALLOW_EMPTY;
1930 if (!opts->no_commit) {
1931 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1932 res = do_commit(r, msg_file, author, opts, flags);
1933 else
1934 res = error(_("unable to parse commit author"));
1935 *check_todo = !!(flags & EDIT_MSG);
1936 if (!res && reword) {
1937 fast_forward_edit:
1938 res = run_git_commit(r, NULL, opts, EDIT_MSG |
1939 VERIFY_MSG | AMEND_MSG |
1940 (flags & ALLOW_EMPTY));
1941 *check_todo = 1;
1946 if (!res && final_fixup) {
1947 unlink(rebase_path_fixup_msg());
1948 unlink(rebase_path_squash_msg());
1949 unlink(rebase_path_current_fixups());
1950 strbuf_reset(&opts->current_fixups);
1951 opts->current_fixup_count = 0;
1954 leave:
1955 free_message(commit, &msg);
1956 free(author);
1957 update_abort_safety_file();
1959 return res;
1962 static int prepare_revs(struct replay_opts *opts)
1965 * picking (but not reverting) ranges (but not individual revisions)
1966 * should be done in reverse
1968 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1969 opts->revs->reverse ^= 1;
1971 if (prepare_revision_walk(opts->revs))
1972 return error(_("revision walk setup failed"));
1974 return 0;
1977 static int read_and_refresh_cache(struct repository *r,
1978 struct replay_opts *opts)
1980 struct lock_file index_lock = LOCK_INIT;
1981 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
1982 if (repo_read_index(r) < 0) {
1983 rollback_lock_file(&index_lock);
1984 return error(_("git %s: failed to read the index"),
1985 _(action_name(opts)));
1987 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
1988 if (index_fd >= 0) {
1989 if (write_locked_index(r->index, &index_lock,
1990 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
1991 return error(_("git %s: failed to refresh the index"),
1992 _(action_name(opts)));
1995 return 0;
1998 enum todo_item_flags {
1999 TODO_EDIT_MERGE_MSG = 1
2002 void todo_list_release(struct todo_list *todo_list)
2004 strbuf_release(&todo_list->buf);
2005 FREE_AND_NULL(todo_list->items);
2006 todo_list->nr = todo_list->alloc = 0;
2009 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2011 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2012 return todo_list->items + todo_list->nr++;
2015 const char *todo_item_get_arg(struct todo_list *todo_list,
2016 struct todo_item *item)
2018 return todo_list->buf.buf + item->arg_offset;
2021 static int parse_insn_line(struct repository *r, struct todo_item *item,
2022 const char *buf, const char *bol, char *eol)
2024 struct object_id commit_oid;
2025 char *end_of_object_name;
2026 int i, saved, status, padding;
2028 item->flags = 0;
2030 /* left-trim */
2031 bol += strspn(bol, " \t");
2033 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2034 item->command = TODO_COMMENT;
2035 item->commit = NULL;
2036 item->arg_offset = bol - buf;
2037 item->arg_len = eol - bol;
2038 return 0;
2041 for (i = 0; i < TODO_COMMENT; i++)
2042 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
2043 item->command = i;
2044 break;
2045 } else if ((bol + 1 == eol || bol[1] == ' ') &&
2046 *bol == todo_command_info[i].c) {
2047 bol++;
2048 item->command = i;
2049 break;
2051 if (i >= TODO_COMMENT)
2052 return -1;
2054 /* Eat up extra spaces/ tabs before object name */
2055 padding = strspn(bol, " \t");
2056 bol += padding;
2058 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2059 if (bol != eol)
2060 return error(_("%s does not accept arguments: '%s'"),
2061 command_to_string(item->command), bol);
2062 item->commit = NULL;
2063 item->arg_offset = bol - buf;
2064 item->arg_len = eol - bol;
2065 return 0;
2068 if (!padding)
2069 return error(_("missing arguments for %s"),
2070 command_to_string(item->command));
2072 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2073 item->command == TODO_RESET) {
2074 item->commit = NULL;
2075 item->arg_offset = bol - buf;
2076 item->arg_len = (int)(eol - bol);
2077 return 0;
2080 if (item->command == TODO_MERGE) {
2081 if (skip_prefix(bol, "-C", &bol))
2082 bol += strspn(bol, " \t");
2083 else if (skip_prefix(bol, "-c", &bol)) {
2084 bol += strspn(bol, " \t");
2085 item->flags |= TODO_EDIT_MERGE_MSG;
2086 } else {
2087 item->flags |= TODO_EDIT_MERGE_MSG;
2088 item->commit = NULL;
2089 item->arg_offset = bol - buf;
2090 item->arg_len = (int)(eol - bol);
2091 return 0;
2095 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2096 saved = *end_of_object_name;
2097 *end_of_object_name = '\0';
2098 status = get_oid(bol, &commit_oid);
2099 *end_of_object_name = saved;
2101 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2102 item->arg_offset = bol - buf;
2103 item->arg_len = (int)(eol - bol);
2105 if (status < 0)
2106 return error(_("could not parse '%.*s'"),
2107 (int)(end_of_object_name - bol), bol);
2109 item->commit = lookup_commit_reference(r, &commit_oid);
2110 return !item->commit;
2113 int sequencer_get_last_command(struct repository *r, enum replay_action *action)
2115 struct todo_item item;
2116 char *eol;
2117 const char *todo_file;
2118 struct strbuf buf = STRBUF_INIT;
2119 int ret = -1;
2121 todo_file = git_path_todo_file();
2122 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2123 if (errno == ENOENT)
2124 return -1;
2125 else
2126 return error_errno("unable to open '%s'", todo_file);
2128 eol = strchrnul(buf.buf, '\n');
2129 if (buf.buf != eol && eol[-1] == '\r')
2130 eol--; /* strip Carriage Return */
2131 if (parse_insn_line(r, &item, buf.buf, buf.buf, eol))
2132 goto fail;
2133 if (item.command == TODO_PICK)
2134 *action = REPLAY_PICK;
2135 else if (item.command == TODO_REVERT)
2136 *action = REPLAY_REVERT;
2137 else
2138 goto fail;
2140 ret = 0;
2142 fail:
2143 strbuf_release(&buf);
2145 return ret;
2148 int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2149 struct todo_list *todo_list)
2151 struct todo_item *item;
2152 char *p = buf, *next_p;
2153 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2155 todo_list->current = todo_list->nr = 0;
2157 for (i = 1; *p; i++, p = next_p) {
2158 char *eol = strchrnul(p, '\n');
2160 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2162 if (p != eol && eol[-1] == '\r')
2163 eol--; /* strip Carriage Return */
2165 item = append_new_todo(todo_list);
2166 item->offset_in_buf = p - todo_list->buf.buf;
2167 if (parse_insn_line(r, item, buf, p, eol)) {
2168 res = error(_("invalid line %d: %.*s"),
2169 i, (int)(eol - p), p);
2170 item->command = TODO_COMMENT + 1;
2171 item->arg_offset = p - buf;
2172 item->arg_len = (int)(eol - p);
2173 item->commit = NULL;
2176 if (fixup_okay)
2177 ; /* do nothing */
2178 else if (is_fixup(item->command))
2179 return error(_("cannot '%s' without a previous commit"),
2180 command_to_string(item->command));
2181 else if (!is_noop(item->command))
2182 fixup_okay = 1;
2185 return res;
2188 static int count_commands(struct todo_list *todo_list)
2190 int count = 0, i;
2192 for (i = 0; i < todo_list->nr; i++)
2193 if (todo_list->items[i].command != TODO_COMMENT)
2194 count++;
2196 return count;
2199 static int get_item_line_offset(struct todo_list *todo_list, int index)
2201 return index < todo_list->nr ?
2202 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2205 static const char *get_item_line(struct todo_list *todo_list, int index)
2207 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2210 static int get_item_line_length(struct todo_list *todo_list, int index)
2212 return get_item_line_offset(todo_list, index + 1)
2213 - get_item_line_offset(todo_list, index);
2216 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2218 int fd;
2219 ssize_t len;
2221 fd = open(path, O_RDONLY);
2222 if (fd < 0)
2223 return error_errno(_("could not open '%s'"), path);
2224 len = strbuf_read(sb, fd, 0);
2225 close(fd);
2226 if (len < 0)
2227 return error(_("could not read '%s'."), path);
2228 return len;
2231 static int have_finished_the_last_pick(void)
2233 struct strbuf buf = STRBUF_INIT;
2234 const char *eol;
2235 const char *todo_path = git_path_todo_file();
2236 int ret = 0;
2238 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2239 if (errno == ENOENT) {
2240 return 0;
2241 } else {
2242 error_errno("unable to open '%s'", todo_path);
2243 return 0;
2246 /* If there is only one line then we are done */
2247 eol = strchr(buf.buf, '\n');
2248 if (!eol || !eol[1])
2249 ret = 1;
2251 strbuf_release(&buf);
2253 return ret;
2256 void sequencer_post_commit_cleanup(struct repository *r)
2258 struct replay_opts opts = REPLAY_OPTS_INIT;
2259 int need_cleanup = 0;
2261 if (file_exists(git_path_cherry_pick_head(r))) {
2262 unlink(git_path_cherry_pick_head(r));
2263 opts.action = REPLAY_PICK;
2264 need_cleanup = 1;
2267 if (file_exists(git_path_revert_head(r))) {
2268 unlink(git_path_revert_head(r));
2269 opts.action = REPLAY_REVERT;
2270 need_cleanup = 1;
2273 if (!need_cleanup)
2274 return;
2276 if (!have_finished_the_last_pick())
2277 return;
2279 sequencer_remove_state(&opts);
2282 static int read_populate_todo(struct repository *r,
2283 struct todo_list *todo_list,
2284 struct replay_opts *opts)
2286 struct stat st;
2287 const char *todo_file = get_todo_path(opts);
2288 int res;
2290 strbuf_reset(&todo_list->buf);
2291 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2292 return -1;
2294 res = stat(todo_file, &st);
2295 if (res)
2296 return error(_("could not stat '%s'"), todo_file);
2297 fill_stat_data(&todo_list->stat, &st);
2299 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2300 if (res) {
2301 if (is_rebase_i(opts))
2302 return error(_("please fix this using "
2303 "'git rebase --edit-todo'."));
2304 return error(_("unusable instruction sheet: '%s'"), todo_file);
2307 if (!todo_list->nr &&
2308 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2309 return error(_("no commits parsed."));
2311 if (!is_rebase_i(opts)) {
2312 enum todo_command valid =
2313 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2314 int i;
2316 for (i = 0; i < todo_list->nr; i++)
2317 if (valid == todo_list->items[i].command)
2318 continue;
2319 else if (valid == TODO_PICK)
2320 return error(_("cannot cherry-pick during a revert."));
2321 else
2322 return error(_("cannot revert during a cherry-pick."));
2325 if (is_rebase_i(opts)) {
2326 struct todo_list done = TODO_LIST_INIT;
2327 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2329 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2330 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
2331 todo_list->done_nr = count_commands(&done);
2332 else
2333 todo_list->done_nr = 0;
2335 todo_list->total_nr = todo_list->done_nr
2336 + count_commands(todo_list);
2337 todo_list_release(&done);
2339 if (f) {
2340 fprintf(f, "%d\n", todo_list->total_nr);
2341 fclose(f);
2345 return 0;
2348 static int git_config_string_dup(char **dest,
2349 const char *var, const char *value)
2351 if (!value)
2352 return config_error_nonbool(var);
2353 free(*dest);
2354 *dest = xstrdup(value);
2355 return 0;
2358 static int populate_opts_cb(const char *key, const char *value, void *data)
2360 struct replay_opts *opts = data;
2361 int error_flag = 1;
2363 if (!value)
2364 error_flag = 0;
2365 else if (!strcmp(key, "options.no-commit"))
2366 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2367 else if (!strcmp(key, "options.edit"))
2368 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2369 else if (!strcmp(key, "options.allow-empty"))
2370 opts->allow_empty =
2371 git_config_bool_or_int(key, value, &error_flag);
2372 else if (!strcmp(key, "options.allow-empty-message"))
2373 opts->allow_empty_message =
2374 git_config_bool_or_int(key, value, &error_flag);
2375 else if (!strcmp(key, "options.keep-redundant-commits"))
2376 opts->keep_redundant_commits =
2377 git_config_bool_or_int(key, value, &error_flag);
2378 else if (!strcmp(key, "options.signoff"))
2379 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2380 else if (!strcmp(key, "options.record-origin"))
2381 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2382 else if (!strcmp(key, "options.allow-ff"))
2383 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2384 else if (!strcmp(key, "options.mainline"))
2385 opts->mainline = git_config_int(key, value);
2386 else if (!strcmp(key, "options.strategy"))
2387 git_config_string_dup(&opts->strategy, key, value);
2388 else if (!strcmp(key, "options.gpg-sign"))
2389 git_config_string_dup(&opts->gpg_sign, key, value);
2390 else if (!strcmp(key, "options.strategy-option")) {
2391 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2392 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2393 } else if (!strcmp(key, "options.allow-rerere-auto"))
2394 opts->allow_rerere_auto =
2395 git_config_bool_or_int(key, value, &error_flag) ?
2396 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2397 else if (!strcmp(key, "options.default-msg-cleanup")) {
2398 opts->explicit_cleanup = 1;
2399 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
2400 } else
2401 return error(_("invalid key: %s"), key);
2403 if (!error_flag)
2404 return error(_("invalid value for %s: %s"), key, value);
2406 return 0;
2409 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2411 int i;
2412 char *strategy_opts_string = raw_opts;
2414 if (*strategy_opts_string == ' ')
2415 strategy_opts_string++;
2417 opts->xopts_nr = split_cmdline(strategy_opts_string,
2418 (const char ***)&opts->xopts);
2419 for (i = 0; i < opts->xopts_nr; i++) {
2420 const char *arg = opts->xopts[i];
2422 skip_prefix(arg, "--", &arg);
2423 opts->xopts[i] = xstrdup(arg);
2427 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2429 strbuf_reset(buf);
2430 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2431 return;
2432 opts->strategy = strbuf_detach(buf, NULL);
2433 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2434 return;
2436 parse_strategy_opts(opts, buf->buf);
2439 static int read_populate_opts(struct replay_opts *opts)
2441 if (is_rebase_i(opts)) {
2442 struct strbuf buf = STRBUF_INIT;
2444 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2445 if (!starts_with(buf.buf, "-S"))
2446 strbuf_reset(&buf);
2447 else {
2448 free(opts->gpg_sign);
2449 opts->gpg_sign = xstrdup(buf.buf + 2);
2451 strbuf_reset(&buf);
2454 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2455 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2456 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2457 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2458 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2459 strbuf_reset(&buf);
2462 if (file_exists(rebase_path_verbose()))
2463 opts->verbose = 1;
2465 if (file_exists(rebase_path_quiet()))
2466 opts->quiet = 1;
2468 if (file_exists(rebase_path_signoff())) {
2469 opts->allow_ff = 0;
2470 opts->signoff = 1;
2473 if (file_exists(rebase_path_reschedule_failed_exec()))
2474 opts->reschedule_failed_exec = 1;
2476 read_strategy_opts(opts, &buf);
2477 strbuf_release(&buf);
2479 if (read_oneliner(&opts->current_fixups,
2480 rebase_path_current_fixups(), 1)) {
2481 const char *p = opts->current_fixups.buf;
2482 opts->current_fixup_count = 1;
2483 while ((p = strchr(p, '\n'))) {
2484 opts->current_fixup_count++;
2485 p++;
2489 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2490 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2491 return error(_("unusable squash-onto"));
2492 opts->have_squash_onto = 1;
2495 return 0;
2498 if (!file_exists(git_path_opts_file()))
2499 return 0;
2501 * The function git_parse_source(), called from git_config_from_file(),
2502 * may die() in case of a syntactically incorrect file. We do not care
2503 * about this case, though, because we wrote that file ourselves, so we
2504 * are pretty certain that it is syntactically correct.
2506 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2507 return error(_("malformed options sheet: '%s'"),
2508 git_path_opts_file());
2509 return 0;
2512 static void write_strategy_opts(struct replay_opts *opts)
2514 int i;
2515 struct strbuf buf = STRBUF_INIT;
2517 for (i = 0; i < opts->xopts_nr; ++i)
2518 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2520 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2521 strbuf_release(&buf);
2524 int write_basic_state(struct replay_opts *opts, const char *head_name,
2525 struct commit *onto, const char *orig_head)
2527 const char *quiet = getenv("GIT_QUIET");
2529 if (head_name)
2530 write_file(rebase_path_head_name(), "%s\n", head_name);
2531 if (onto)
2532 write_file(rebase_path_onto(), "%s\n",
2533 oid_to_hex(&onto->object.oid));
2534 if (orig_head)
2535 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2537 if (quiet)
2538 write_file(rebase_path_quiet(), "%s\n", quiet);
2539 if (opts->verbose)
2540 write_file(rebase_path_verbose(), "%s", "");
2541 if (opts->strategy)
2542 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2543 if (opts->xopts_nr > 0)
2544 write_strategy_opts(opts);
2546 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2547 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2548 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2549 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2551 if (opts->gpg_sign)
2552 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2553 if (opts->signoff)
2554 write_file(rebase_path_signoff(), "--signoff\n");
2555 if (opts->reschedule_failed_exec)
2556 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
2558 return 0;
2561 static int walk_revs_populate_todo(struct todo_list *todo_list,
2562 struct replay_opts *opts)
2564 enum todo_command command = opts->action == REPLAY_PICK ?
2565 TODO_PICK : TODO_REVERT;
2566 const char *command_string = todo_command_info[command].str;
2567 struct commit *commit;
2569 if (prepare_revs(opts))
2570 return -1;
2572 while ((commit = get_revision(opts->revs))) {
2573 struct todo_item *item = append_new_todo(todo_list);
2574 const char *commit_buffer = get_commit_buffer(commit, NULL);
2575 const char *subject;
2576 int subject_len;
2578 item->command = command;
2579 item->commit = commit;
2580 item->arg_offset = 0;
2581 item->arg_len = 0;
2582 item->offset_in_buf = todo_list->buf.len;
2583 subject_len = find_commit_subject(commit_buffer, &subject);
2584 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2585 short_commit_name(commit), subject_len, subject);
2586 unuse_commit_buffer(commit, commit_buffer);
2589 if (!todo_list->nr)
2590 return error(_("empty commit set passed"));
2592 return 0;
2595 static int create_seq_dir(void)
2597 if (file_exists(git_path_seq_dir())) {
2598 error(_("a cherry-pick or revert is already in progress"));
2599 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2600 return -1;
2601 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2602 return error_errno(_("could not create sequencer directory '%s'"),
2603 git_path_seq_dir());
2604 return 0;
2607 static int save_head(const char *head)
2609 struct lock_file head_lock = LOCK_INIT;
2610 struct strbuf buf = STRBUF_INIT;
2611 int fd;
2612 ssize_t written;
2614 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2615 if (fd < 0)
2616 return error_errno(_("could not lock HEAD"));
2617 strbuf_addf(&buf, "%s\n", head);
2618 written = write_in_full(fd, buf.buf, buf.len);
2619 strbuf_release(&buf);
2620 if (written < 0) {
2621 error_errno(_("could not write to '%s'"), git_path_head_file());
2622 rollback_lock_file(&head_lock);
2623 return -1;
2625 if (commit_lock_file(&head_lock) < 0)
2626 return error(_("failed to finalize '%s'"), git_path_head_file());
2627 return 0;
2630 static int rollback_is_safe(void)
2632 struct strbuf sb = STRBUF_INIT;
2633 struct object_id expected_head, actual_head;
2635 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2636 strbuf_trim(&sb);
2637 if (get_oid_hex(sb.buf, &expected_head)) {
2638 strbuf_release(&sb);
2639 die(_("could not parse %s"), git_path_abort_safety_file());
2641 strbuf_release(&sb);
2643 else if (errno == ENOENT)
2644 oidclr(&expected_head);
2645 else
2646 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2648 if (get_oid("HEAD", &actual_head))
2649 oidclr(&actual_head);
2651 return oideq(&actual_head, &expected_head);
2654 static int reset_for_rollback(const struct object_id *oid)
2656 const char *argv[4]; /* reset --merge <arg> + NULL */
2658 argv[0] = "reset";
2659 argv[1] = "--merge";
2660 argv[2] = oid_to_hex(oid);
2661 argv[3] = NULL;
2662 return run_command_v_opt(argv, RUN_GIT_CMD);
2665 static int rollback_single_pick(struct repository *r)
2667 struct object_id head_oid;
2669 if (!file_exists(git_path_cherry_pick_head(r)) &&
2670 !file_exists(git_path_revert_head(r)))
2671 return error(_("no cherry-pick or revert in progress"));
2672 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2673 return error(_("cannot resolve HEAD"));
2674 if (is_null_oid(&head_oid))
2675 return error(_("cannot abort from a branch yet to be born"));
2676 return reset_for_rollback(&head_oid);
2679 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
2681 FILE *f;
2682 struct object_id oid;
2683 struct strbuf buf = STRBUF_INIT;
2684 const char *p;
2686 f = fopen(git_path_head_file(), "r");
2687 if (!f && errno == ENOENT) {
2689 * There is no multiple-cherry-pick in progress.
2690 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2691 * a single-cherry-pick in progress, abort that.
2693 return rollback_single_pick(r);
2695 if (!f)
2696 return error_errno(_("cannot open '%s'"), git_path_head_file());
2697 if (strbuf_getline_lf(&buf, f)) {
2698 error(_("cannot read '%s': %s"), git_path_head_file(),
2699 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2700 fclose(f);
2701 goto fail;
2703 fclose(f);
2704 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2705 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2706 git_path_head_file());
2707 goto fail;
2709 if (is_null_oid(&oid)) {
2710 error(_("cannot abort from a branch yet to be born"));
2711 goto fail;
2714 if (!rollback_is_safe()) {
2715 /* Do not error, just do not rollback */
2716 warning(_("You seem to have moved HEAD. "
2717 "Not rewinding, check your HEAD!"));
2718 } else
2719 if (reset_for_rollback(&oid))
2720 goto fail;
2721 strbuf_release(&buf);
2722 return sequencer_remove_state(opts);
2723 fail:
2724 strbuf_release(&buf);
2725 return -1;
2728 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2730 struct lock_file todo_lock = LOCK_INIT;
2731 const char *todo_path = get_todo_path(opts);
2732 int next = todo_list->current, offset, fd;
2735 * rebase -i writes "git-rebase-todo" without the currently executing
2736 * command, appending it to "done" instead.
2738 if (is_rebase_i(opts))
2739 next++;
2741 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2742 if (fd < 0)
2743 return error_errno(_("could not lock '%s'"), todo_path);
2744 offset = get_item_line_offset(todo_list, next);
2745 if (write_in_full(fd, todo_list->buf.buf + offset,
2746 todo_list->buf.len - offset) < 0)
2747 return error_errno(_("could not write to '%s'"), todo_path);
2748 if (commit_lock_file(&todo_lock) < 0)
2749 return error(_("failed to finalize '%s'"), todo_path);
2751 if (is_rebase_i(opts) && next > 0) {
2752 const char *done = rebase_path_done();
2753 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2754 int ret = 0;
2756 if (fd < 0)
2757 return 0;
2758 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2759 get_item_line_length(todo_list, next - 1))
2760 < 0)
2761 ret = error_errno(_("could not write to '%s'"), done);
2762 if (close(fd) < 0)
2763 ret = error_errno(_("failed to finalize '%s'"), done);
2764 return ret;
2766 return 0;
2769 static int save_opts(struct replay_opts *opts)
2771 const char *opts_file = git_path_opts_file();
2772 int res = 0;
2774 if (opts->no_commit)
2775 res |= git_config_set_in_file_gently(opts_file,
2776 "options.no-commit", "true");
2777 if (opts->edit)
2778 res |= git_config_set_in_file_gently(opts_file,
2779 "options.edit", "true");
2780 if (opts->allow_empty)
2781 res |= git_config_set_in_file_gently(opts_file,
2782 "options.allow-empty", "true");
2783 if (opts->allow_empty_message)
2784 res |= git_config_set_in_file_gently(opts_file,
2785 "options.allow-empty-message", "true");
2786 if (opts->keep_redundant_commits)
2787 res |= git_config_set_in_file_gently(opts_file,
2788 "options.keep-redundant-commits", "true");
2789 if (opts->signoff)
2790 res |= git_config_set_in_file_gently(opts_file,
2791 "options.signoff", "true");
2792 if (opts->record_origin)
2793 res |= git_config_set_in_file_gently(opts_file,
2794 "options.record-origin", "true");
2795 if (opts->allow_ff)
2796 res |= git_config_set_in_file_gently(opts_file,
2797 "options.allow-ff", "true");
2798 if (opts->mainline) {
2799 struct strbuf buf = STRBUF_INIT;
2800 strbuf_addf(&buf, "%d", opts->mainline);
2801 res |= git_config_set_in_file_gently(opts_file,
2802 "options.mainline", buf.buf);
2803 strbuf_release(&buf);
2805 if (opts->strategy)
2806 res |= git_config_set_in_file_gently(opts_file,
2807 "options.strategy", opts->strategy);
2808 if (opts->gpg_sign)
2809 res |= git_config_set_in_file_gently(opts_file,
2810 "options.gpg-sign", opts->gpg_sign);
2811 if (opts->xopts) {
2812 int i;
2813 for (i = 0; i < opts->xopts_nr; i++)
2814 res |= git_config_set_multivar_in_file_gently(opts_file,
2815 "options.strategy-option",
2816 opts->xopts[i], "^$", 0);
2818 if (opts->allow_rerere_auto)
2819 res |= git_config_set_in_file_gently(opts_file,
2820 "options.allow-rerere-auto",
2821 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2822 "true" : "false");
2824 if (opts->explicit_cleanup)
2825 res |= git_config_set_in_file_gently(opts_file,
2826 "options.default-msg-cleanup",
2827 describe_cleanup_mode(opts->default_msg_cleanup));
2828 return res;
2831 static int make_patch(struct repository *r,
2832 struct commit *commit,
2833 struct replay_opts *opts)
2835 struct strbuf buf = STRBUF_INIT;
2836 struct rev_info log_tree_opt;
2837 const char *subject, *p;
2838 int res = 0;
2840 p = short_commit_name(commit);
2841 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2842 return -1;
2843 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2844 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2845 res |= error(_("could not update %s"), "REBASE_HEAD");
2847 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2848 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2849 repo_init_revisions(r, &log_tree_opt, NULL);
2850 log_tree_opt.abbrev = 0;
2851 log_tree_opt.diff = 1;
2852 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2853 log_tree_opt.disable_stdin = 1;
2854 log_tree_opt.no_commit_id = 1;
2855 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2856 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2857 if (!log_tree_opt.diffopt.file)
2858 res |= error_errno(_("could not open '%s'"), buf.buf);
2859 else {
2860 res |= log_tree_commit(&log_tree_opt, commit);
2861 fclose(log_tree_opt.diffopt.file);
2863 strbuf_reset(&buf);
2865 strbuf_addf(&buf, "%s/message", get_dir(opts));
2866 if (!file_exists(buf.buf)) {
2867 const char *commit_buffer = get_commit_buffer(commit, NULL);
2868 find_commit_subject(commit_buffer, &subject);
2869 res |= write_message(subject, strlen(subject), buf.buf, 1);
2870 unuse_commit_buffer(commit, commit_buffer);
2872 strbuf_release(&buf);
2874 return res;
2877 static int intend_to_amend(void)
2879 struct object_id head;
2880 char *p;
2882 if (get_oid("HEAD", &head))
2883 return error(_("cannot read HEAD"));
2885 p = oid_to_hex(&head);
2886 return write_message(p, strlen(p), rebase_path_amend(), 1);
2889 static int error_with_patch(struct repository *r,
2890 struct commit *commit,
2891 const char *subject, int subject_len,
2892 struct replay_opts *opts,
2893 int exit_code, int to_amend)
2895 if (commit) {
2896 if (make_patch(r, commit, opts))
2897 return -1;
2898 } else if (copy_file(rebase_path_message(),
2899 git_path_merge_msg(r), 0666))
2900 return error(_("unable to copy '%s' to '%s'"),
2901 git_path_merge_msg(r), rebase_path_message());
2903 if (to_amend) {
2904 if (intend_to_amend())
2905 return -1;
2907 fprintf(stderr,
2908 _("You can amend the commit now, with\n"
2909 "\n"
2910 " git commit --amend %s\n"
2911 "\n"
2912 "Once you are satisfied with your changes, run\n"
2913 "\n"
2914 " git rebase --continue\n"),
2915 gpg_sign_opt_quoted(opts));
2916 } else if (exit_code) {
2917 if (commit)
2918 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
2919 short_commit_name(commit), subject_len, subject);
2920 else
2922 * We don't have the hash of the parent so
2923 * just print the line from the todo file.
2925 fprintf_ln(stderr, _("Could not merge %.*s"),
2926 subject_len, subject);
2929 return exit_code;
2932 static int error_failed_squash(struct repository *r,
2933 struct commit *commit,
2934 struct replay_opts *opts,
2935 int subject_len,
2936 const char *subject)
2938 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
2939 return error(_("could not copy '%s' to '%s'"),
2940 rebase_path_squash_msg(), rebase_path_message());
2941 unlink(git_path_merge_msg(r));
2942 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
2943 return error(_("could not copy '%s' to '%s'"),
2944 rebase_path_message(),
2945 git_path_merge_msg(r));
2946 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
2949 static int do_exec(struct repository *r, const char *command_line)
2951 struct argv_array child_env = ARGV_ARRAY_INIT;
2952 const char *child_argv[] = { NULL, NULL };
2953 int dirty, status;
2955 fprintf(stderr, "Executing: %s\n", command_line);
2956 child_argv[0] = command_line;
2957 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
2958 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
2959 absolute_path(get_git_work_tree()));
2960 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
2961 child_env.argv);
2963 /* force re-reading of the cache */
2964 if (discard_index(r->index) < 0 || repo_read_index(r) < 0)
2965 return error(_("could not read index"));
2967 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
2969 if (status) {
2970 warning(_("execution failed: %s\n%s"
2971 "You can fix the problem, and then run\n"
2972 "\n"
2973 " git rebase --continue\n"
2974 "\n"),
2975 command_line,
2976 dirty ? N_("and made changes to the index and/or the "
2977 "working tree\n") : "");
2978 if (status == 127)
2979 /* command not found */
2980 status = 1;
2981 } else if (dirty) {
2982 warning(_("execution succeeded: %s\nbut "
2983 "left changes to the index and/or the working tree\n"
2984 "Commit or stash your changes, and then run\n"
2985 "\n"
2986 " git rebase --continue\n"
2987 "\n"), command_line);
2988 status = 1;
2991 argv_array_clear(&child_env);
2993 return status;
2996 static int safe_append(const char *filename, const char *fmt, ...)
2998 va_list ap;
2999 struct lock_file lock = LOCK_INIT;
3000 int fd = hold_lock_file_for_update(&lock, filename,
3001 LOCK_REPORT_ON_ERROR);
3002 struct strbuf buf = STRBUF_INIT;
3004 if (fd < 0)
3005 return -1;
3007 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3008 error_errno(_("could not read '%s'"), filename);
3009 rollback_lock_file(&lock);
3010 return -1;
3012 strbuf_complete(&buf, '\n');
3013 va_start(ap, fmt);
3014 strbuf_vaddf(&buf, fmt, ap);
3015 va_end(ap);
3017 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3018 error_errno(_("could not write to '%s'"), filename);
3019 strbuf_release(&buf);
3020 rollback_lock_file(&lock);
3021 return -1;
3023 if (commit_lock_file(&lock) < 0) {
3024 strbuf_release(&buf);
3025 rollback_lock_file(&lock);
3026 return error(_("failed to finalize '%s'"), filename);
3029 strbuf_release(&buf);
3030 return 0;
3033 static int do_label(struct repository *r, const char *name, int len)
3035 struct ref_store *refs = get_main_ref_store(r);
3036 struct ref_transaction *transaction;
3037 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3038 struct strbuf msg = STRBUF_INIT;
3039 int ret = 0;
3040 struct object_id head_oid;
3042 if (len == 1 && *name == '#')
3043 return error(_("illegal label name: '%.*s'"), len, name);
3045 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3046 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
3048 transaction = ref_store_transaction_begin(refs, &err);
3049 if (!transaction) {
3050 error("%s", err.buf);
3051 ret = -1;
3052 } else if (get_oid("HEAD", &head_oid)) {
3053 error(_("could not read HEAD"));
3054 ret = -1;
3055 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
3056 NULL, 0, msg.buf, &err) < 0 ||
3057 ref_transaction_commit(transaction, &err)) {
3058 error("%s", err.buf);
3059 ret = -1;
3061 ref_transaction_free(transaction);
3062 strbuf_release(&err);
3063 strbuf_release(&msg);
3065 if (!ret)
3066 ret = safe_append(rebase_path_refs_to_delete(),
3067 "%s\n", ref_name.buf);
3068 strbuf_release(&ref_name);
3070 return ret;
3073 static const char *reflog_message(struct replay_opts *opts,
3074 const char *sub_action, const char *fmt, ...);
3076 static int do_reset(struct repository *r,
3077 const char *name, int len,
3078 struct replay_opts *opts)
3080 struct strbuf ref_name = STRBUF_INIT;
3081 struct object_id oid;
3082 struct lock_file lock = LOCK_INIT;
3083 struct tree_desc desc;
3084 struct tree *tree;
3085 struct unpack_trees_options unpack_tree_opts;
3086 int ret = 0;
3088 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
3089 return -1;
3091 if (len == 10 && !strncmp("[new root]", name, len)) {
3092 if (!opts->have_squash_onto) {
3093 const char *hex;
3094 if (commit_tree("", 0, the_hash_algo->empty_tree,
3095 NULL, &opts->squash_onto,
3096 NULL, NULL))
3097 return error(_("writing fake root commit"));
3098 opts->have_squash_onto = 1;
3099 hex = oid_to_hex(&opts->squash_onto);
3100 if (write_message(hex, strlen(hex),
3101 rebase_path_squash_onto(), 0))
3102 return error(_("writing squash-onto"));
3104 oidcpy(&oid, &opts->squash_onto);
3105 } else {
3106 int i;
3108 /* Determine the length of the label */
3109 for (i = 0; i < len; i++)
3110 if (isspace(name[i]))
3111 break;
3112 len = i;
3114 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3115 if (get_oid(ref_name.buf, &oid) &&
3116 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
3117 error(_("could not read '%s'"), ref_name.buf);
3118 rollback_lock_file(&lock);
3119 strbuf_release(&ref_name);
3120 return -1;
3124 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
3125 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3126 unpack_tree_opts.head_idx = 1;
3127 unpack_tree_opts.src_index = r->index;
3128 unpack_tree_opts.dst_index = r->index;
3129 unpack_tree_opts.fn = oneway_merge;
3130 unpack_tree_opts.merge = 1;
3131 unpack_tree_opts.update = 1;
3133 if (repo_read_index_unmerged(r)) {
3134 rollback_lock_file(&lock);
3135 strbuf_release(&ref_name);
3136 return error_resolve_conflict(_(action_name(opts)));
3139 if (!fill_tree_descriptor(&desc, &oid)) {
3140 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3141 rollback_lock_file(&lock);
3142 free((void *)desc.buffer);
3143 strbuf_release(&ref_name);
3144 return -1;
3147 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3148 rollback_lock_file(&lock);
3149 free((void *)desc.buffer);
3150 strbuf_release(&ref_name);
3151 return -1;
3154 tree = parse_tree_indirect(&oid);
3155 prime_cache_tree(r, r->index, tree);
3157 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3158 ret = error(_("could not write index"));
3159 free((void *)desc.buffer);
3161 if (!ret)
3162 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3163 len, name), "HEAD", &oid,
3164 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3166 strbuf_release(&ref_name);
3167 return ret;
3170 static struct commit *lookup_label(const char *label, int len,
3171 struct strbuf *buf)
3173 struct commit *commit;
3175 strbuf_reset(buf);
3176 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3177 commit = lookup_commit_reference_by_name(buf->buf);
3178 if (!commit) {
3179 /* fall back to non-rewritten ref or commit */
3180 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3181 commit = lookup_commit_reference_by_name(buf->buf);
3184 if (!commit)
3185 error(_("could not resolve '%s'"), buf->buf);
3187 return commit;
3190 static int do_merge(struct repository *r,
3191 struct commit *commit,
3192 const char *arg, int arg_len,
3193 int flags, struct replay_opts *opts)
3195 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3196 EDIT_MSG | VERIFY_MSG : 0;
3197 struct strbuf ref_name = STRBUF_INIT;
3198 struct commit *head_commit, *merge_commit, *i;
3199 struct commit_list *bases, *j, *reversed = NULL;
3200 struct commit_list *to_merge = NULL, **tail = &to_merge;
3201 struct merge_options o;
3202 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3203 static struct lock_file lock;
3204 const char *p;
3206 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
3207 ret = -1;
3208 goto leave_merge;
3211 head_commit = lookup_commit_reference_by_name("HEAD");
3212 if (!head_commit) {
3213 ret = error(_("cannot merge without a current revision"));
3214 goto leave_merge;
3218 * For octopus merges, the arg starts with the list of revisions to be
3219 * merged. The list is optionally followed by '#' and the oneline.
3221 merge_arg_len = oneline_offset = arg_len;
3222 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3223 if (!*p)
3224 break;
3225 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3226 p += 1 + strspn(p + 1, " \t\n");
3227 oneline_offset = p - arg;
3228 break;
3230 k = strcspn(p, " \t\n");
3231 if (!k)
3232 continue;
3233 merge_commit = lookup_label(p, k, &ref_name);
3234 if (!merge_commit) {
3235 ret = error(_("unable to parse '%.*s'"), k, p);
3236 goto leave_merge;
3238 tail = &commit_list_insert(merge_commit, tail)->next;
3239 p += k;
3240 merge_arg_len = p - arg;
3243 if (!to_merge) {
3244 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3245 goto leave_merge;
3248 if (opts->have_squash_onto &&
3249 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3251 * When the user tells us to "merge" something into a
3252 * "[new root]", let's simply fast-forward to the merge head.
3254 rollback_lock_file(&lock);
3255 if (to_merge->next)
3256 ret = error(_("octopus merge cannot be executed on "
3257 "top of a [new root]"));
3258 else
3259 ret = fast_forward_to(r, &to_merge->item->object.oid,
3260 &head_commit->object.oid, 0,
3261 opts);
3262 goto leave_merge;
3265 if (commit) {
3266 const char *message = get_commit_buffer(commit, NULL);
3267 const char *body;
3268 int len;
3270 if (!message) {
3271 ret = error(_("could not get commit message of '%s'"),
3272 oid_to_hex(&commit->object.oid));
3273 goto leave_merge;
3275 write_author_script(message);
3276 find_commit_subject(message, &body);
3277 len = strlen(body);
3278 ret = write_message(body, len, git_path_merge_msg(r), 0);
3279 unuse_commit_buffer(commit, message);
3280 if (ret) {
3281 error_errno(_("could not write '%s'"),
3282 git_path_merge_msg(r));
3283 goto leave_merge;
3285 } else {
3286 struct strbuf buf = STRBUF_INIT;
3287 int len;
3289 strbuf_addf(&buf, "author %s", git_author_info(0));
3290 write_author_script(buf.buf);
3291 strbuf_reset(&buf);
3293 if (oneline_offset < arg_len) {
3294 p = arg + oneline_offset;
3295 len = arg_len - oneline_offset;
3296 } else {
3297 strbuf_addf(&buf, "Merge %s '%.*s'",
3298 to_merge->next ? "branches" : "branch",
3299 merge_arg_len, arg);
3300 p = buf.buf;
3301 len = buf.len;
3304 ret = write_message(p, len, git_path_merge_msg(r), 0);
3305 strbuf_release(&buf);
3306 if (ret) {
3307 error_errno(_("could not write '%s'"),
3308 git_path_merge_msg(r));
3309 goto leave_merge;
3314 * If HEAD is not identical to the first parent of the original merge
3315 * commit, we cannot fast-forward.
3317 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3318 oideq(&commit->parents->item->object.oid,
3319 &head_commit->object.oid);
3322 * If any merge head is different from the original one, we cannot
3323 * fast-forward.
3325 if (can_fast_forward) {
3326 struct commit_list *p = commit->parents->next;
3328 for (j = to_merge; j && p; j = j->next, p = p->next)
3329 if (!oideq(&j->item->object.oid,
3330 &p->item->object.oid)) {
3331 can_fast_forward = 0;
3332 break;
3335 * If the number of merge heads differs from the original merge
3336 * commit, we cannot fast-forward.
3338 if (j || p)
3339 can_fast_forward = 0;
3342 if (can_fast_forward) {
3343 rollback_lock_file(&lock);
3344 ret = fast_forward_to(r, &commit->object.oid,
3345 &head_commit->object.oid, 0, opts);
3346 goto leave_merge;
3349 if (to_merge->next) {
3350 /* Octopus merge */
3351 struct child_process cmd = CHILD_PROCESS_INIT;
3353 if (read_env_script(&cmd.env_array)) {
3354 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3356 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3357 goto leave_merge;
3360 cmd.git_cmd = 1;
3361 argv_array_push(&cmd.args, "merge");
3362 argv_array_push(&cmd.args, "-s");
3363 argv_array_push(&cmd.args, "octopus");
3364 argv_array_push(&cmd.args, "--no-edit");
3365 argv_array_push(&cmd.args, "--no-ff");
3366 argv_array_push(&cmd.args, "--no-log");
3367 argv_array_push(&cmd.args, "--no-stat");
3368 argv_array_push(&cmd.args, "-F");
3369 argv_array_push(&cmd.args, git_path_merge_msg(r));
3370 if (opts->gpg_sign)
3371 argv_array_push(&cmd.args, opts->gpg_sign);
3373 /* Add the tips to be merged */
3374 for (j = to_merge; j; j = j->next)
3375 argv_array_push(&cmd.args,
3376 oid_to_hex(&j->item->object.oid));
3378 strbuf_release(&ref_name);
3379 unlink(git_path_cherry_pick_head(r));
3380 rollback_lock_file(&lock);
3382 rollback_lock_file(&lock);
3383 ret = run_command(&cmd);
3385 /* force re-reading of the cache */
3386 if (!ret && (discard_index(r->index) < 0 ||
3387 repo_read_index(r) < 0))
3388 ret = error(_("could not read index"));
3389 goto leave_merge;
3392 merge_commit = to_merge->item;
3393 bases = get_merge_bases(head_commit, merge_commit);
3394 if (bases && oideq(&merge_commit->object.oid,
3395 &bases->item->object.oid)) {
3396 ret = 0;
3397 /* skip merging an ancestor of HEAD */
3398 goto leave_merge;
3401 write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
3402 git_path_merge_head(r), 0);
3403 write_message("no-ff", 5, git_path_merge_mode(r), 0);
3405 for (j = bases; j; j = j->next)
3406 commit_list_insert(j->item, &reversed);
3407 free_commit_list(bases);
3409 repo_read_index(r);
3410 init_merge_options(&o, r);
3411 o.branch1 = "HEAD";
3412 o.branch2 = ref_name.buf;
3413 o.buffer_output = 2;
3415 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3416 if (ret <= 0)
3417 fputs(o.obuf.buf, stdout);
3418 strbuf_release(&o.obuf);
3419 if (ret < 0) {
3420 error(_("could not even attempt to merge '%.*s'"),
3421 merge_arg_len, arg);
3422 goto leave_merge;
3425 * The return value of merge_recursive() is 1 on clean, and 0 on
3426 * unclean merge.
3428 * Let's reverse that, so that do_merge() returns 0 upon success and
3429 * 1 upon failed merge (keeping the return value -1 for the cases where
3430 * we will want to reschedule the `merge` command).
3432 ret = !ret;
3434 if (r->index->cache_changed &&
3435 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
3436 ret = error(_("merge: Unable to write new index file"));
3437 goto leave_merge;
3440 rollback_lock_file(&lock);
3441 if (ret)
3442 repo_rerere(r, opts->allow_rerere_auto);
3443 else
3445 * In case of problems, we now want to return a positive
3446 * value (a negative one would indicate that the `merge`
3447 * command needs to be rescheduled).
3449 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3450 run_commit_flags);
3452 leave_merge:
3453 strbuf_release(&ref_name);
3454 rollback_lock_file(&lock);
3455 free_commit_list(to_merge);
3456 return ret;
3459 static int is_final_fixup(struct todo_list *todo_list)
3461 int i = todo_list->current;
3463 if (!is_fixup(todo_list->items[i].command))
3464 return 0;
3466 while (++i < todo_list->nr)
3467 if (is_fixup(todo_list->items[i].command))
3468 return 0;
3469 else if (!is_noop(todo_list->items[i].command))
3470 break;
3471 return 1;
3474 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3476 int i;
3478 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3479 if (!is_noop(todo_list->items[i].command))
3480 return todo_list->items[i].command;
3482 return -1;
3485 static int apply_autostash(struct replay_opts *opts)
3487 struct strbuf stash_sha1 = STRBUF_INIT;
3488 struct child_process child = CHILD_PROCESS_INIT;
3489 int ret = 0;
3491 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3492 strbuf_release(&stash_sha1);
3493 return 0;
3495 strbuf_trim(&stash_sha1);
3497 child.git_cmd = 1;
3498 child.no_stdout = 1;
3499 child.no_stderr = 1;
3500 argv_array_push(&child.args, "stash");
3501 argv_array_push(&child.args, "apply");
3502 argv_array_push(&child.args, stash_sha1.buf);
3503 if (!run_command(&child))
3504 fprintf(stderr, _("Applied autostash.\n"));
3505 else {
3506 struct child_process store = CHILD_PROCESS_INIT;
3508 store.git_cmd = 1;
3509 argv_array_push(&store.args, "stash");
3510 argv_array_push(&store.args, "store");
3511 argv_array_push(&store.args, "-m");
3512 argv_array_push(&store.args, "autostash");
3513 argv_array_push(&store.args, "-q");
3514 argv_array_push(&store.args, stash_sha1.buf);
3515 if (run_command(&store))
3516 ret = error(_("cannot store %s"), stash_sha1.buf);
3517 else
3518 fprintf(stderr,
3519 _("Applying autostash resulted in conflicts.\n"
3520 "Your changes are safe in the stash.\n"
3521 "You can run \"git stash pop\" or"
3522 " \"git stash drop\" at any time.\n"));
3525 strbuf_release(&stash_sha1);
3526 return ret;
3529 static const char *reflog_message(struct replay_opts *opts,
3530 const char *sub_action, const char *fmt, ...)
3532 va_list ap;
3533 static struct strbuf buf = STRBUF_INIT;
3535 va_start(ap, fmt);
3536 strbuf_reset(&buf);
3537 strbuf_addstr(&buf, action_name(opts));
3538 if (sub_action)
3539 strbuf_addf(&buf, " (%s)", sub_action);
3540 if (fmt) {
3541 strbuf_addstr(&buf, ": ");
3542 strbuf_vaddf(&buf, fmt, ap);
3544 va_end(ap);
3546 return buf.buf;
3549 static int run_git_checkout(struct repository *r, struct replay_opts *opts,
3550 const char *commit, const char *action)
3552 struct child_process cmd = CHILD_PROCESS_INIT;
3553 int ret;
3555 cmd.git_cmd = 1;
3557 argv_array_push(&cmd.args, "checkout");
3558 argv_array_push(&cmd.args, commit);
3559 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3561 if (opts->verbose)
3562 ret = run_command(&cmd);
3563 else
3564 ret = run_command_silent_on_success(&cmd);
3566 if (!ret)
3567 discard_index(r->index);
3569 return ret;
3572 int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
3573 const char *commit)
3575 const char *action;
3577 if (commit && *commit) {
3578 action = reflog_message(opts, "start", "checkout %s", commit);
3579 if (run_git_checkout(r, opts, commit, action))
3580 return error(_("could not checkout %s"), commit);
3583 return 0;
3586 static int checkout_onto(struct repository *r, struct replay_opts *opts,
3587 const char *onto_name, const struct object_id *onto,
3588 const char *orig_head)
3590 struct object_id oid;
3591 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3593 if (get_oid(orig_head, &oid))
3594 return error(_("%s: not a valid OID"), orig_head);
3596 if (run_git_checkout(r, opts, oid_to_hex(onto), action)) {
3597 apply_autostash(opts);
3598 sequencer_remove_state(opts);
3599 return error(_("could not detach HEAD"));
3602 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3605 static int stopped_at_head(struct repository *r)
3607 struct object_id head;
3608 struct commit *commit;
3609 struct commit_message message;
3611 if (get_oid("HEAD", &head) ||
3612 !(commit = lookup_commit(r, &head)) ||
3613 parse_commit(commit) || get_message(commit, &message))
3614 fprintf(stderr, _("Stopped at HEAD\n"));
3615 else {
3616 fprintf(stderr, _("Stopped at %s\n"), message.label);
3617 free_message(commit, &message);
3619 return 0;
3623 static const char rescheduled_advice[] =
3624 N_("Could not execute the todo command\n"
3625 "\n"
3626 " %.*s"
3627 "\n"
3628 "It has been rescheduled; To edit the command before continuing, please\n"
3629 "edit the todo list first:\n"
3630 "\n"
3631 " git rebase --edit-todo\n"
3632 " git rebase --continue\n");
3634 static int pick_commits(struct repository *r,
3635 struct todo_list *todo_list,
3636 struct replay_opts *opts)
3638 int res = 0, reschedule = 0;
3640 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3641 if (opts->allow_ff)
3642 assert(!(opts->signoff || opts->no_commit ||
3643 opts->record_origin || opts->edit));
3644 if (read_and_refresh_cache(r, opts))
3645 return -1;
3647 while (todo_list->current < todo_list->nr) {
3648 struct todo_item *item = todo_list->items + todo_list->current;
3649 const char *arg = todo_item_get_arg(todo_list, item);
3650 int check_todo = 0;
3652 if (save_todo(todo_list, opts))
3653 return -1;
3654 if (is_rebase_i(opts)) {
3655 if (item->command != TODO_COMMENT) {
3656 FILE *f = fopen(rebase_path_msgnum(), "w");
3658 todo_list->done_nr++;
3660 if (f) {
3661 fprintf(f, "%d\n", todo_list->done_nr);
3662 fclose(f);
3664 if (!opts->quiet)
3665 fprintf(stderr, "Rebasing (%d/%d)%s",
3666 todo_list->done_nr,
3667 todo_list->total_nr,
3668 opts->verbose ? "\n" : "\r");
3670 unlink(rebase_path_message());
3671 unlink(rebase_path_author_script());
3672 unlink(rebase_path_stopped_sha());
3673 unlink(rebase_path_amend());
3674 unlink(git_path_merge_head(the_repository));
3675 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3677 if (item->command == TODO_BREAK) {
3678 if (!opts->verbose)
3679 term_clear_line();
3680 return stopped_at_head(r);
3683 if (item->command <= TODO_SQUASH) {
3684 if (is_rebase_i(opts))
3685 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3686 command_to_string(item->command), NULL),
3688 res = do_pick_commit(r, item->command, item->commit,
3689 opts, is_final_fixup(todo_list),
3690 &check_todo);
3691 if (is_rebase_i(opts) && res < 0) {
3692 /* Reschedule */
3693 advise(_(rescheduled_advice),
3694 get_item_line_length(todo_list,
3695 todo_list->current),
3696 get_item_line(todo_list,
3697 todo_list->current));
3698 todo_list->current--;
3699 if (save_todo(todo_list, opts))
3700 return -1;
3702 if (item->command == TODO_EDIT) {
3703 struct commit *commit = item->commit;
3704 if (!res) {
3705 if (!opts->verbose)
3706 term_clear_line();
3707 fprintf(stderr,
3708 _("Stopped at %s... %.*s\n"),
3709 short_commit_name(commit),
3710 item->arg_len, arg);
3712 return error_with_patch(r, commit,
3713 arg, item->arg_len, opts, res, !res);
3715 if (is_rebase_i(opts) && !res)
3716 record_in_rewritten(&item->commit->object.oid,
3717 peek_command(todo_list, 1));
3718 if (res && is_fixup(item->command)) {
3719 if (res == 1)
3720 intend_to_amend();
3721 return error_failed_squash(r, item->commit, opts,
3722 item->arg_len, arg);
3723 } else if (res && is_rebase_i(opts) && item->commit) {
3724 int to_amend = 0;
3725 struct object_id oid;
3728 * If we are rewording and have either
3729 * fast-forwarded already, or are about to
3730 * create a new root commit, we want to amend,
3731 * otherwise we do not.
3733 if (item->command == TODO_REWORD &&
3734 !get_oid("HEAD", &oid) &&
3735 (oideq(&item->commit->object.oid, &oid) ||
3736 (opts->have_squash_onto &&
3737 oideq(&opts->squash_onto, &oid))))
3738 to_amend = 1;
3740 return res | error_with_patch(r, item->commit,
3741 arg, item->arg_len, opts,
3742 res, to_amend);
3744 } else if (item->command == TODO_EXEC) {
3745 char *end_of_arg = (char *)(arg + item->arg_len);
3746 int saved = *end_of_arg;
3748 if (!opts->verbose)
3749 term_clear_line();
3750 *end_of_arg = '\0';
3751 res = do_exec(r, arg);
3752 *end_of_arg = saved;
3754 if (res) {
3755 if (opts->reschedule_failed_exec)
3756 reschedule = 1;
3758 check_todo = 1;
3759 } else if (item->command == TODO_LABEL) {
3760 if ((res = do_label(r, arg, item->arg_len)))
3761 reschedule = 1;
3762 } else if (item->command == TODO_RESET) {
3763 if ((res = do_reset(r, arg, item->arg_len, opts)))
3764 reschedule = 1;
3765 } else if (item->command == TODO_MERGE) {
3766 if ((res = do_merge(r, item->commit,
3767 arg, item->arg_len,
3768 item->flags, opts)) < 0)
3769 reschedule = 1;
3770 else if (item->commit)
3771 record_in_rewritten(&item->commit->object.oid,
3772 peek_command(todo_list, 1));
3773 if (res > 0)
3774 /* failed with merge conflicts */
3775 return error_with_patch(r, item->commit,
3776 arg, item->arg_len,
3777 opts, res, 0);
3778 } else if (!is_noop(item->command))
3779 return error(_("unknown command %d"), item->command);
3781 if (reschedule) {
3782 advise(_(rescheduled_advice),
3783 get_item_line_length(todo_list,
3784 todo_list->current),
3785 get_item_line(todo_list, todo_list->current));
3786 todo_list->current--;
3787 if (save_todo(todo_list, opts))
3788 return -1;
3789 if (item->commit)
3790 return error_with_patch(r,
3791 item->commit,
3792 arg, item->arg_len,
3793 opts, res, 0);
3794 } else if (check_todo && !res) {
3795 struct stat st;
3797 if (stat(get_todo_path(opts), &st)) {
3798 res = error_errno(_("could not stat '%s'"),
3799 get_todo_path(opts));
3800 } else if (match_stat_data(&todo_list->stat, &st)) {
3801 /* Reread the todo file if it has changed. */
3802 todo_list_release(todo_list);
3803 if (read_populate_todo(r, todo_list, opts))
3804 res = -1; /* message was printed */
3805 /* `current` will be incremented below */
3806 todo_list->current = -1;
3810 todo_list->current++;
3811 if (res)
3812 return res;
3815 if (is_rebase_i(opts)) {
3816 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
3817 struct stat st;
3819 /* Stopped in the middle, as planned? */
3820 if (todo_list->current < todo_list->nr)
3821 return 0;
3823 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3824 starts_with(head_ref.buf, "refs/")) {
3825 const char *msg;
3826 struct object_id head, orig;
3827 int res;
3829 if (get_oid("HEAD", &head)) {
3830 res = error(_("cannot read HEAD"));
3831 cleanup_head_ref:
3832 strbuf_release(&head_ref);
3833 strbuf_release(&buf);
3834 return res;
3836 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
3837 get_oid_hex(buf.buf, &orig)) {
3838 res = error(_("could not read orig-head"));
3839 goto cleanup_head_ref;
3841 strbuf_reset(&buf);
3842 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3843 res = error(_("could not read 'onto'"));
3844 goto cleanup_head_ref;
3846 msg = reflog_message(opts, "finish", "%s onto %s",
3847 head_ref.buf, buf.buf);
3848 if (update_ref(msg, head_ref.buf, &head, &orig,
3849 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
3850 res = error(_("could not update %s"),
3851 head_ref.buf);
3852 goto cleanup_head_ref;
3854 msg = reflog_message(opts, "finish", "returning to %s",
3855 head_ref.buf);
3856 if (create_symref("HEAD", head_ref.buf, msg)) {
3857 res = error(_("could not update HEAD to %s"),
3858 head_ref.buf);
3859 goto cleanup_head_ref;
3861 strbuf_reset(&buf);
3864 if (opts->verbose) {
3865 struct rev_info log_tree_opt;
3866 struct object_id orig, head;
3868 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3869 repo_init_revisions(r, &log_tree_opt, NULL);
3870 log_tree_opt.diff = 1;
3871 log_tree_opt.diffopt.output_format =
3872 DIFF_FORMAT_DIFFSTAT;
3873 log_tree_opt.disable_stdin = 1;
3875 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
3876 !get_oid(buf.buf, &orig) &&
3877 !get_oid("HEAD", &head)) {
3878 diff_tree_oid(&orig, &head, "",
3879 &log_tree_opt.diffopt);
3880 log_tree_diff_flush(&log_tree_opt);
3883 flush_rewritten_pending();
3884 if (!stat(rebase_path_rewritten_list(), &st) &&
3885 st.st_size > 0) {
3886 struct child_process child = CHILD_PROCESS_INIT;
3887 const char *post_rewrite_hook =
3888 find_hook("post-rewrite");
3890 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
3891 child.git_cmd = 1;
3892 argv_array_push(&child.args, "notes");
3893 argv_array_push(&child.args, "copy");
3894 argv_array_push(&child.args, "--for-rewrite=rebase");
3895 /* we don't care if this copying failed */
3896 run_command(&child);
3898 if (post_rewrite_hook) {
3899 struct child_process hook = CHILD_PROCESS_INIT;
3901 hook.in = open(rebase_path_rewritten_list(),
3902 O_RDONLY);
3903 hook.stdout_to_stderr = 1;
3904 hook.trace2_hook_name = "post-rewrite";
3905 argv_array_push(&hook.args, post_rewrite_hook);
3906 argv_array_push(&hook.args, "rebase");
3907 /* we don't care if this hook failed */
3908 run_command(&hook);
3911 apply_autostash(opts);
3913 if (!opts->quiet) {
3914 if (!opts->verbose)
3915 term_clear_line();
3916 fprintf(stderr,
3917 "Successfully rebased and updated %s.\n",
3918 head_ref.buf);
3921 strbuf_release(&buf);
3922 strbuf_release(&head_ref);
3926 * Sequence of picks finished successfully; cleanup by
3927 * removing the .git/sequencer directory
3929 return sequencer_remove_state(opts);
3932 static int continue_single_pick(struct repository *r)
3934 const char *argv[] = { "commit", NULL };
3936 if (!file_exists(git_path_cherry_pick_head(r)) &&
3937 !file_exists(git_path_revert_head(r)))
3938 return error(_("no cherry-pick or revert in progress"));
3939 return run_command_v_opt(argv, RUN_GIT_CMD);
3942 static int commit_staged_changes(struct repository *r,
3943 struct replay_opts *opts,
3944 struct todo_list *todo_list)
3946 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
3947 unsigned int final_fixup = 0, is_clean;
3949 if (has_unstaged_changes(r, 1))
3950 return error(_("cannot rebase: You have unstaged changes."));
3952 is_clean = !has_uncommitted_changes(r, 0);
3954 if (file_exists(rebase_path_amend())) {
3955 struct strbuf rev = STRBUF_INIT;
3956 struct object_id head, to_amend;
3958 if (get_oid("HEAD", &head))
3959 return error(_("cannot amend non-existing commit"));
3960 if (!read_oneliner(&rev, rebase_path_amend(), 0))
3961 return error(_("invalid file: '%s'"), rebase_path_amend());
3962 if (get_oid_hex(rev.buf, &to_amend))
3963 return error(_("invalid contents: '%s'"),
3964 rebase_path_amend());
3965 if (!is_clean && !oideq(&head, &to_amend))
3966 return error(_("\nYou have uncommitted changes in your "
3967 "working tree. Please, commit them\n"
3968 "first and then run 'git rebase "
3969 "--continue' again."));
3971 * When skipping a failed fixup/squash, we need to edit the
3972 * commit message, the current fixup list and count, and if it
3973 * was the last fixup/squash in the chain, we need to clean up
3974 * the commit message and if there was a squash, let the user
3975 * edit it.
3977 if (!is_clean || !opts->current_fixup_count)
3978 ; /* this is not the final fixup */
3979 else if (!oideq(&head, &to_amend) ||
3980 !file_exists(rebase_path_stopped_sha())) {
3981 /* was a final fixup or squash done manually? */
3982 if (!is_fixup(peek_command(todo_list, 0))) {
3983 unlink(rebase_path_fixup_msg());
3984 unlink(rebase_path_squash_msg());
3985 unlink(rebase_path_current_fixups());
3986 strbuf_reset(&opts->current_fixups);
3987 opts->current_fixup_count = 0;
3989 } else {
3990 /* we are in a fixup/squash chain */
3991 const char *p = opts->current_fixups.buf;
3992 int len = opts->current_fixups.len;
3994 opts->current_fixup_count--;
3995 if (!len)
3996 BUG("Incorrect current_fixups:\n%s", p);
3997 while (len && p[len - 1] != '\n')
3998 len--;
3999 strbuf_setlen(&opts->current_fixups, len);
4000 if (write_message(p, len, rebase_path_current_fixups(),
4001 0) < 0)
4002 return error(_("could not write file: '%s'"),
4003 rebase_path_current_fixups());
4006 * If a fixup/squash in a fixup/squash chain failed, the
4007 * commit message is already correct, no need to commit
4008 * it again.
4010 * Only if it is the final command in the fixup/squash
4011 * chain, and only if the chain is longer than a single
4012 * fixup/squash command (which was just skipped), do we
4013 * actually need to re-commit with a cleaned up commit
4014 * message.
4016 if (opts->current_fixup_count > 0 &&
4017 !is_fixup(peek_command(todo_list, 0))) {
4018 final_fixup = 1;
4020 * If there was not a single "squash" in the
4021 * chain, we only need to clean up the commit
4022 * message, no need to bother the user with
4023 * opening the commit message in the editor.
4025 if (!starts_with(p, "squash ") &&
4026 !strstr(p, "\nsquash "))
4027 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
4028 } else if (is_fixup(peek_command(todo_list, 0))) {
4030 * We need to update the squash message to skip
4031 * the latest commit message.
4033 struct commit *commit;
4034 const char *path = rebase_path_squash_msg();
4036 if (parse_head(r, &commit) ||
4037 !(p = get_commit_buffer(commit, NULL)) ||
4038 write_message(p, strlen(p), path, 0)) {
4039 unuse_commit_buffer(commit, p);
4040 return error(_("could not write file: "
4041 "'%s'"), path);
4043 unuse_commit_buffer(commit, p);
4047 strbuf_release(&rev);
4048 flags |= AMEND_MSG;
4051 if (is_clean) {
4052 const char *cherry_pick_head = git_path_cherry_pick_head(r);
4054 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
4055 return error(_("could not remove CHERRY_PICK_HEAD"));
4056 if (!final_fixup)
4057 return 0;
4060 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
4061 opts, flags))
4062 return error(_("could not commit staged changes."));
4063 unlink(rebase_path_amend());
4064 unlink(git_path_merge_head(the_repository));
4065 if (final_fixup) {
4066 unlink(rebase_path_fixup_msg());
4067 unlink(rebase_path_squash_msg());
4069 if (opts->current_fixup_count > 0) {
4071 * Whether final fixup or not, we just cleaned up the commit
4072 * message...
4074 unlink(rebase_path_current_fixups());
4075 strbuf_reset(&opts->current_fixups);
4076 opts->current_fixup_count = 0;
4078 return 0;
4081 int sequencer_continue(struct repository *r, struct replay_opts *opts)
4083 struct todo_list todo_list = TODO_LIST_INIT;
4084 int res;
4086 if (read_and_refresh_cache(r, opts))
4087 return -1;
4089 if (read_populate_opts(opts))
4090 return -1;
4091 if (is_rebase_i(opts)) {
4092 if ((res = read_populate_todo(r, &todo_list, opts)))
4093 goto release_todo_list;
4094 if (commit_staged_changes(r, opts, &todo_list))
4095 return -1;
4096 } else if (!file_exists(get_todo_path(opts)))
4097 return continue_single_pick(r);
4098 else if ((res = read_populate_todo(r, &todo_list, opts)))
4099 goto release_todo_list;
4101 if (!is_rebase_i(opts)) {
4102 /* Verify that the conflict has been resolved */
4103 if (file_exists(git_path_cherry_pick_head(r)) ||
4104 file_exists(git_path_revert_head(r))) {
4105 res = continue_single_pick(r);
4106 if (res)
4107 goto release_todo_list;
4109 if (index_differs_from(r, "HEAD", NULL, 0)) {
4110 res = error_dirty_index(r, opts);
4111 goto release_todo_list;
4113 todo_list.current++;
4114 } else if (file_exists(rebase_path_stopped_sha())) {
4115 struct strbuf buf = STRBUF_INIT;
4116 struct object_id oid;
4118 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
4119 !get_oid_committish(buf.buf, &oid))
4120 record_in_rewritten(&oid, peek_command(&todo_list, 0));
4121 strbuf_release(&buf);
4124 res = pick_commits(r, &todo_list, opts);
4125 release_todo_list:
4126 todo_list_release(&todo_list);
4127 return res;
4130 static int single_pick(struct repository *r,
4131 struct commit *cmit,
4132 struct replay_opts *opts)
4134 int check_todo;
4136 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
4137 return do_pick_commit(r, opts->action == REPLAY_PICK ?
4138 TODO_PICK : TODO_REVERT, cmit, opts, 0,
4139 &check_todo);
4142 int sequencer_pick_revisions(struct repository *r,
4143 struct replay_opts *opts)
4145 struct todo_list todo_list = TODO_LIST_INIT;
4146 struct object_id oid;
4147 int i, res;
4149 assert(opts->revs);
4150 if (read_and_refresh_cache(r, opts))
4151 return -1;
4153 for (i = 0; i < opts->revs->pending.nr; i++) {
4154 struct object_id oid;
4155 const char *name = opts->revs->pending.objects[i].name;
4157 /* This happens when using --stdin. */
4158 if (!strlen(name))
4159 continue;
4161 if (!get_oid(name, &oid)) {
4162 if (!lookup_commit_reference_gently(r, &oid, 1)) {
4163 enum object_type type = oid_object_info(r,
4164 &oid,
4165 NULL);
4166 return error(_("%s: can't cherry-pick a %s"),
4167 name, type_name(type));
4169 } else
4170 return error(_("%s: bad revision"), name);
4174 * If we were called as "git cherry-pick <commit>", just
4175 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4176 * REVERT_HEAD, and don't touch the sequencer state.
4177 * This means it is possible to cherry-pick in the middle
4178 * of a cherry-pick sequence.
4180 if (opts->revs->cmdline.nr == 1 &&
4181 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4182 opts->revs->no_walk &&
4183 !opts->revs->cmdline.rev->flags) {
4184 struct commit *cmit;
4185 if (prepare_revision_walk(opts->revs))
4186 return error(_("revision walk setup failed"));
4187 cmit = get_revision(opts->revs);
4188 if (!cmit)
4189 return error(_("empty commit set passed"));
4190 if (get_revision(opts->revs))
4191 BUG("unexpected extra commit from walk");
4192 return single_pick(r, cmit, opts);
4196 * Start a new cherry-pick/ revert sequence; but
4197 * first, make sure that an existing one isn't in
4198 * progress
4201 if (walk_revs_populate_todo(&todo_list, opts) ||
4202 create_seq_dir() < 0)
4203 return -1;
4204 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4205 return error(_("can't revert as initial commit"));
4206 if (save_head(oid_to_hex(&oid)))
4207 return -1;
4208 if (save_opts(opts))
4209 return -1;
4210 update_abort_safety_file();
4211 res = pick_commits(r, &todo_list, opts);
4212 todo_list_release(&todo_list);
4213 return res;
4216 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4218 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4219 struct strbuf sob = STRBUF_INIT;
4220 int has_footer;
4222 strbuf_addstr(&sob, sign_off_header);
4223 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
4224 strbuf_addch(&sob, '\n');
4226 if (!ignore_footer)
4227 strbuf_complete_line(msgbuf);
4230 * If the whole message buffer is equal to the sob, pretend that we
4231 * found a conforming footer with a matching sob
4233 if (msgbuf->len - ignore_footer == sob.len &&
4234 !strncmp(msgbuf->buf, sob.buf, sob.len))
4235 has_footer = 3;
4236 else
4237 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4239 if (!has_footer) {
4240 const char *append_newlines = NULL;
4241 size_t len = msgbuf->len - ignore_footer;
4243 if (!len) {
4245 * The buffer is completely empty. Leave foom for
4246 * the title and body to be filled in by the user.
4248 append_newlines = "\n\n";
4249 } else if (len == 1) {
4251 * Buffer contains a single newline. Add another
4252 * so that we leave room for the title and body.
4254 append_newlines = "\n";
4255 } else if (msgbuf->buf[len - 2] != '\n') {
4257 * Buffer ends with a single newline. Add another
4258 * so that there is an empty line between the message
4259 * body and the sob.
4261 append_newlines = "\n";
4262 } /* else, the buffer already ends with two newlines. */
4264 if (append_newlines)
4265 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4266 append_newlines, strlen(append_newlines));
4269 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4270 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4271 sob.buf, sob.len);
4273 strbuf_release(&sob);
4276 struct labels_entry {
4277 struct hashmap_entry entry;
4278 char label[FLEX_ARRAY];
4281 static int labels_cmp(const void *fndata, const struct labels_entry *a,
4282 const struct labels_entry *b, const void *key)
4284 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4287 struct string_entry {
4288 struct oidmap_entry entry;
4289 char string[FLEX_ARRAY];
4292 struct label_state {
4293 struct oidmap commit2label;
4294 struct hashmap labels;
4295 struct strbuf buf;
4298 static const char *label_oid(struct object_id *oid, const char *label,
4299 struct label_state *state)
4301 struct labels_entry *labels_entry;
4302 struct string_entry *string_entry;
4303 struct object_id dummy;
4304 size_t len;
4305 int i;
4307 string_entry = oidmap_get(&state->commit2label, oid);
4308 if (string_entry)
4309 return string_entry->string;
4312 * For "uninteresting" commits, i.e. commits that are not to be
4313 * rebased, and which can therefore not be labeled, we use a unique
4314 * abbreviation of the commit name. This is slightly more complicated
4315 * than calling find_unique_abbrev() because we also need to make
4316 * sure that the abbreviation does not conflict with any other
4317 * label.
4319 * We disallow "interesting" commits to be labeled by a string that
4320 * is a valid full-length hash, to ensure that we always can find an
4321 * abbreviation for any uninteresting commit's names that does not
4322 * clash with any other label.
4324 if (!label) {
4325 char *p;
4327 strbuf_reset(&state->buf);
4328 strbuf_grow(&state->buf, GIT_SHA1_HEXSZ);
4329 label = p = state->buf.buf;
4331 find_unique_abbrev_r(p, oid, default_abbrev);
4334 * We may need to extend the abbreviated hash so that there is
4335 * no conflicting label.
4337 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4338 size_t i = strlen(p) + 1;
4340 oid_to_hex_r(p, oid);
4341 for (; i < GIT_SHA1_HEXSZ; i++) {
4342 char save = p[i];
4343 p[i] = '\0';
4344 if (!hashmap_get_from_hash(&state->labels,
4345 strihash(p), p))
4346 break;
4347 p[i] = save;
4350 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
4351 !get_oid_hex(label, &dummy)) ||
4352 (len == 1 && *label == '#') ||
4353 hashmap_get_from_hash(&state->labels,
4354 strihash(label), label)) {
4356 * If the label already exists, or if the label is a valid full
4357 * OID, or the label is a '#' (which we use as a separator
4358 * between merge heads and oneline), we append a dash and a
4359 * number to make it unique.
4361 struct strbuf *buf = &state->buf;
4363 strbuf_reset(buf);
4364 strbuf_add(buf, label, len);
4366 for (i = 2; ; i++) {
4367 strbuf_setlen(buf, len);
4368 strbuf_addf(buf, "-%d", i);
4369 if (!hashmap_get_from_hash(&state->labels,
4370 strihash(buf->buf),
4371 buf->buf))
4372 break;
4375 label = buf->buf;
4378 FLEX_ALLOC_STR(labels_entry, label, label);
4379 hashmap_entry_init(labels_entry, strihash(label));
4380 hashmap_add(&state->labels, labels_entry);
4382 FLEX_ALLOC_STR(string_entry, string, label);
4383 oidcpy(&string_entry->entry.oid, oid);
4384 oidmap_put(&state->commit2label, string_entry);
4386 return string_entry->string;
4389 static int make_script_with_merges(struct pretty_print_context *pp,
4390 struct rev_info *revs, struct strbuf *out,
4391 unsigned flags)
4393 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4394 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4395 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4396 struct strbuf label = STRBUF_INIT;
4397 struct commit_list *commits = NULL, **tail = &commits, *iter;
4398 struct commit_list *tips = NULL, **tips_tail = &tips;
4399 struct commit *commit;
4400 struct oidmap commit2todo = OIDMAP_INIT;
4401 struct string_entry *entry;
4402 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4403 shown = OIDSET_INIT;
4404 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4406 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4407 const char *cmd_pick = abbr ? "p" : "pick",
4408 *cmd_label = abbr ? "l" : "label",
4409 *cmd_reset = abbr ? "t" : "reset",
4410 *cmd_merge = abbr ? "m" : "merge";
4412 oidmap_init(&commit2todo, 0);
4413 oidmap_init(&state.commit2label, 0);
4414 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4415 strbuf_init(&state.buf, 32);
4417 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4418 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4419 FLEX_ALLOC_STR(entry, string, "onto");
4420 oidcpy(&entry->entry.oid, oid);
4421 oidmap_put(&state.commit2label, entry);
4425 * First phase:
4426 * - get onelines for all commits
4427 * - gather all branch tips (i.e. 2nd or later parents of merges)
4428 * - label all branch tips
4430 while ((commit = get_revision(revs))) {
4431 struct commit_list *to_merge;
4432 const char *p1, *p2;
4433 struct object_id *oid;
4434 int is_empty;
4436 tail = &commit_list_insert(commit, tail)->next;
4437 oidset_insert(&interesting, &commit->object.oid);
4439 is_empty = is_original_commit_empty(commit);
4440 if (!is_empty && (commit->object.flags & PATCHSAME))
4441 continue;
4443 strbuf_reset(&oneline);
4444 pretty_print_commit(pp, commit, &oneline);
4446 to_merge = commit->parents ? commit->parents->next : NULL;
4447 if (!to_merge) {
4448 /* non-merge commit: easy case */
4449 strbuf_reset(&buf);
4450 if (!keep_empty && is_empty)
4451 strbuf_addf(&buf, "%c ", comment_line_char);
4452 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4453 oid_to_hex(&commit->object.oid),
4454 oneline.buf);
4456 FLEX_ALLOC_STR(entry, string, buf.buf);
4457 oidcpy(&entry->entry.oid, &commit->object.oid);
4458 oidmap_put(&commit2todo, entry);
4460 continue;
4463 /* Create a label */
4464 strbuf_reset(&label);
4465 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4466 (p1 = strchr(p1, '\'')) &&
4467 (p2 = strchr(++p1, '\'')))
4468 strbuf_add(&label, p1, p2 - p1);
4469 else if (skip_prefix(oneline.buf, "Merge pull request ",
4470 &p1) &&
4471 (p1 = strstr(p1, " from ")))
4472 strbuf_addstr(&label, p1 + strlen(" from "));
4473 else
4474 strbuf_addbuf(&label, &oneline);
4476 for (p1 = label.buf; *p1; p1++)
4477 if (isspace(*p1))
4478 *(char *)p1 = '-';
4480 strbuf_reset(&buf);
4481 strbuf_addf(&buf, "%s -C %s",
4482 cmd_merge, oid_to_hex(&commit->object.oid));
4484 /* label the tips of merged branches */
4485 for (; to_merge; to_merge = to_merge->next) {
4486 oid = &to_merge->item->object.oid;
4487 strbuf_addch(&buf, ' ');
4489 if (!oidset_contains(&interesting, oid)) {
4490 strbuf_addstr(&buf, label_oid(oid, NULL,
4491 &state));
4492 continue;
4495 tips_tail = &commit_list_insert(to_merge->item,
4496 tips_tail)->next;
4498 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4500 strbuf_addf(&buf, " # %s", oneline.buf);
4502 FLEX_ALLOC_STR(entry, string, buf.buf);
4503 oidcpy(&entry->entry.oid, &commit->object.oid);
4504 oidmap_put(&commit2todo, entry);
4508 * Second phase:
4509 * - label branch points
4510 * - add HEAD to the branch tips
4512 for (iter = commits; iter; iter = iter->next) {
4513 struct commit_list *parent = iter->item->parents;
4514 for (; parent; parent = parent->next) {
4515 struct object_id *oid = &parent->item->object.oid;
4516 if (!oidset_contains(&interesting, oid))
4517 continue;
4518 if (oidset_insert(&child_seen, oid))
4519 label_oid(oid, "branch-point", &state);
4522 /* Add HEAD as implict "tip of branch" */
4523 if (!iter->next)
4524 tips_tail = &commit_list_insert(iter->item,
4525 tips_tail)->next;
4529 * Third phase: output the todo list. This is a bit tricky, as we
4530 * want to avoid jumping back and forth between revisions. To
4531 * accomplish that goal, we walk backwards from the branch tips,
4532 * gathering commits not yet shown, reversing the list on the fly,
4533 * then outputting that list (labeling revisions as needed).
4535 strbuf_addf(out, "%s onto\n", cmd_label);
4536 for (iter = tips; iter; iter = iter->next) {
4537 struct commit_list *list = NULL, *iter2;
4539 commit = iter->item;
4540 if (oidset_contains(&shown, &commit->object.oid))
4541 continue;
4542 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4544 if (entry)
4545 strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4546 else
4547 strbuf_addch(out, '\n');
4549 while (oidset_contains(&interesting, &commit->object.oid) &&
4550 !oidset_contains(&shown, &commit->object.oid)) {
4551 commit_list_insert(commit, &list);
4552 if (!commit->parents) {
4553 commit = NULL;
4554 break;
4556 commit = commit->parents->item;
4559 if (!commit)
4560 strbuf_addf(out, "%s %s\n", cmd_reset,
4561 rebase_cousins ? "onto" : "[new root]");
4562 else {
4563 const char *to = NULL;
4565 entry = oidmap_get(&state.commit2label,
4566 &commit->object.oid);
4567 if (entry)
4568 to = entry->string;
4569 else if (!rebase_cousins)
4570 to = label_oid(&commit->object.oid, NULL,
4571 &state);
4573 if (!to || !strcmp(to, "onto"))
4574 strbuf_addf(out, "%s onto\n", cmd_reset);
4575 else {
4576 strbuf_reset(&oneline);
4577 pretty_print_commit(pp, commit, &oneline);
4578 strbuf_addf(out, "%s %s # %s\n",
4579 cmd_reset, to, oneline.buf);
4583 for (iter2 = list; iter2; iter2 = iter2->next) {
4584 struct object_id *oid = &iter2->item->object.oid;
4585 entry = oidmap_get(&commit2todo, oid);
4586 /* only show if not already upstream */
4587 if (entry)
4588 strbuf_addf(out, "%s\n", entry->string);
4589 entry = oidmap_get(&state.commit2label, oid);
4590 if (entry)
4591 strbuf_addf(out, "%s %s\n",
4592 cmd_label, entry->string);
4593 oidset_insert(&shown, oid);
4596 free_commit_list(list);
4599 free_commit_list(commits);
4600 free_commit_list(tips);
4602 strbuf_release(&label);
4603 strbuf_release(&oneline);
4604 strbuf_release(&buf);
4606 oidmap_free(&commit2todo, 1);
4607 oidmap_free(&state.commit2label, 1);
4608 hashmap_free(&state.labels, 1);
4609 strbuf_release(&state.buf);
4611 return 0;
4614 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
4615 const char **argv, unsigned flags)
4617 char *format = NULL;
4618 struct pretty_print_context pp = {0};
4619 struct rev_info revs;
4620 struct commit *commit;
4621 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4622 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4623 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4625 repo_init_revisions(r, &revs, NULL);
4626 revs.verbose_header = 1;
4627 if (!rebase_merges)
4628 revs.max_parents = 1;
4629 revs.cherry_mark = 1;
4630 revs.limited = 1;
4631 revs.reverse = 1;
4632 revs.right_only = 1;
4633 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4634 revs.topo_order = 1;
4636 revs.pretty_given = 1;
4637 git_config_get_string("rebase.instructionFormat", &format);
4638 if (!format || !*format) {
4639 free(format);
4640 format = xstrdup("%s");
4642 get_commit_format(format, &revs);
4643 free(format);
4644 pp.fmt = revs.commit_format;
4645 pp.output_encoding = get_log_output_encoding();
4647 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4648 return error(_("make_script: unhandled options"));
4650 if (prepare_revision_walk(&revs) < 0)
4651 return error(_("make_script: error preparing revisions"));
4653 if (rebase_merges)
4654 return make_script_with_merges(&pp, &revs, out, flags);
4656 while ((commit = get_revision(&revs))) {
4657 int is_empty = is_original_commit_empty(commit);
4659 if (!is_empty && (commit->object.flags & PATCHSAME))
4660 continue;
4661 if (!keep_empty && is_empty)
4662 strbuf_addf(out, "%c ", comment_line_char);
4663 strbuf_addf(out, "%s %s ", insn,
4664 oid_to_hex(&commit->object.oid));
4665 pretty_print_commit(&pp, commit, out);
4666 strbuf_addch(out, '\n');
4668 return 0;
4672 * Add commands after pick and (series of) squash/fixup commands
4673 * in the todo list.
4675 void todo_list_add_exec_commands(struct todo_list *todo_list,
4676 struct string_list *commands)
4678 struct strbuf *buf = &todo_list->buf;
4679 size_t base_offset = buf->len;
4680 int i, insert, nr = 0, alloc = 0;
4681 struct todo_item *items = NULL, *base_items = NULL;
4683 base_items = xcalloc(commands->nr, sizeof(struct todo_item));
4684 for (i = 0; i < commands->nr; i++) {
4685 size_t command_len = strlen(commands->items[i].string);
4687 strbuf_addstr(buf, commands->items[i].string);
4688 strbuf_addch(buf, '\n');
4690 base_items[i].command = TODO_EXEC;
4691 base_items[i].offset_in_buf = base_offset;
4692 base_items[i].arg_offset = base_offset + strlen("exec ");
4693 base_items[i].arg_len = command_len - strlen("exec ");
4695 base_offset += command_len + 1;
4699 * Insert <commands> after every pick. Here, fixup/squash chains
4700 * are considered part of the pick, so we insert the commands *after*
4701 * those chains if there are any.
4703 * As we insert the exec commands immediatly after rearranging
4704 * any fixups and before the user edits the list, a fixup chain
4705 * can never contain comments (any comments are empty picks that
4706 * have been commented out because the user did not specify
4707 * --keep-empty). So, it is safe to insert an exec command
4708 * without looking at the command following a comment.
4710 insert = 0;
4711 for (i = 0; i < todo_list->nr; i++) {
4712 enum todo_command command = todo_list->items[i].command;
4713 if (insert && !is_fixup(command)) {
4714 ALLOC_GROW(items, nr + commands->nr, alloc);
4715 COPY_ARRAY(items + nr, base_items, commands->nr);
4716 nr += commands->nr;
4718 insert = 0;
4721 ALLOC_GROW(items, nr + 1, alloc);
4722 items[nr++] = todo_list->items[i];
4724 if (command == TODO_PICK || command == TODO_MERGE)
4725 insert = 1;
4728 /* insert or append final <commands> */
4729 if (insert || nr == todo_list->nr) {
4730 ALLOC_GROW(items, nr + commands->nr, alloc);
4731 COPY_ARRAY(items + nr, base_items, commands->nr);
4732 nr += commands->nr;
4735 free(base_items);
4736 FREE_AND_NULL(todo_list->items);
4737 todo_list->items = items;
4738 todo_list->nr = nr;
4739 todo_list->alloc = alloc;
4742 static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
4743 struct strbuf *buf, int num, unsigned flags)
4745 struct todo_item *item;
4746 int i, max = todo_list->nr;
4748 if (num > 0 && num < max)
4749 max = num;
4751 for (item = todo_list->items, i = 0; i < max; i++, item++) {
4752 /* if the item is not a command write it and continue */
4753 if (item->command >= TODO_COMMENT) {
4754 strbuf_addf(buf, "%.*s\n", item->arg_len,
4755 todo_item_get_arg(todo_list, item));
4756 continue;
4759 /* add command to the buffer */
4760 if (flags & TODO_LIST_ABBREVIATE_CMDS)
4761 strbuf_addch(buf, command_to_char(item->command));
4762 else
4763 strbuf_addstr(buf, command_to_string(item->command));
4765 /* add commit id */
4766 if (item->commit) {
4767 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
4768 short_commit_name(item->commit) :
4769 oid_to_hex(&item->commit->object.oid);
4771 if (item->command == TODO_MERGE) {
4772 if (item->flags & TODO_EDIT_MERGE_MSG)
4773 strbuf_addstr(buf, " -c");
4774 else
4775 strbuf_addstr(buf, " -C");
4778 strbuf_addf(buf, " %s", oid);
4781 /* add all the rest */
4782 if (!item->arg_len)
4783 strbuf_addch(buf, '\n');
4784 else
4785 strbuf_addf(buf, " %.*s\n", item->arg_len,
4786 todo_item_get_arg(todo_list, item));
4790 int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
4791 const char *file, const char *shortrevisions,
4792 const char *shortonto, int num, unsigned flags)
4794 int res;
4795 struct strbuf buf = STRBUF_INIT;
4797 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
4798 if (flags & TODO_LIST_APPEND_TODO_HELP)
4799 append_todo_help(flags & TODO_LIST_KEEP_EMPTY, count_commands(todo_list),
4800 shortrevisions, shortonto, &buf);
4802 res = write_message(buf.buf, buf.len, file, 0);
4803 strbuf_release(&buf);
4805 return res;
4808 static const char edit_todo_list_advice[] =
4809 N_("You can fix this with 'git rebase --edit-todo' "
4810 "and then run 'git rebase --continue'.\n"
4811 "Or you can abort the rebase with 'git rebase"
4812 " --abort'.\n");
4814 int check_todo_list_from_file(struct repository *r)
4816 struct todo_list old_todo = TODO_LIST_INIT, new_todo = TODO_LIST_INIT;
4817 int res = 0;
4819 if (strbuf_read_file_or_whine(&new_todo.buf, rebase_path_todo()) < 0) {
4820 res = -1;
4821 goto out;
4824 if (strbuf_read_file_or_whine(&old_todo.buf, rebase_path_todo_backup()) < 0) {
4825 res = -1;
4826 goto out;
4829 res = todo_list_parse_insn_buffer(r, old_todo.buf.buf, &old_todo);
4830 if (!res)
4831 res = todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo);
4832 if (!res)
4833 res = todo_list_check(&old_todo, &new_todo);
4834 if (res)
4835 fprintf(stderr, _(edit_todo_list_advice));
4836 out:
4837 todo_list_release(&old_todo);
4838 todo_list_release(&new_todo);
4840 return res;
4843 /* skip picking commits whose parents are unchanged */
4844 static int skip_unnecessary_picks(struct repository *r,
4845 struct todo_list *todo_list,
4846 struct object_id *base_oid)
4848 struct object_id *parent_oid;
4849 int i;
4851 for (i = 0; i < todo_list->nr; i++) {
4852 struct todo_item *item = todo_list->items + i;
4854 if (item->command >= TODO_NOOP)
4855 continue;
4856 if (item->command != TODO_PICK)
4857 break;
4858 if (parse_commit(item->commit)) {
4859 return error(_("could not parse commit '%s'"),
4860 oid_to_hex(&item->commit->object.oid));
4862 if (!item->commit->parents)
4863 break; /* root commit */
4864 if (item->commit->parents->next)
4865 break; /* merge commit */
4866 parent_oid = &item->commit->parents->item->object.oid;
4867 if (!oideq(parent_oid, base_oid))
4868 break;
4869 oidcpy(base_oid, &item->commit->object.oid);
4871 if (i > 0) {
4872 const char *done_path = rebase_path_done();
4874 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
4875 error_errno(_("could not write to '%s'"), done_path);
4876 return -1;
4879 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
4880 todo_list->nr -= i;
4881 todo_list->current = 0;
4883 if (is_fixup(peek_command(todo_list, 0)))
4884 record_in_rewritten(base_oid, peek_command(todo_list, 0));
4887 return 0;
4890 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
4891 const char *shortrevisions, const char *onto_name,
4892 struct commit *onto, const char *orig_head,
4893 struct string_list *commands, unsigned autosquash,
4894 struct todo_list *todo_list)
4896 const char *shortonto, *todo_file = rebase_path_todo();
4897 struct todo_list new_todo = TODO_LIST_INIT;
4898 struct strbuf *buf = &todo_list->buf;
4899 struct object_id oid = onto->object.oid;
4900 int res;
4902 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
4904 if (buf->len == 0) {
4905 struct todo_item *item = append_new_todo(todo_list);
4906 item->command = TODO_NOOP;
4907 item->commit = NULL;
4908 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
4911 if (autosquash && todo_list_rearrange_squash(todo_list))
4912 return -1;
4914 if (commands->nr)
4915 todo_list_add_exec_commands(todo_list, commands);
4917 if (count_commands(todo_list) == 0) {
4918 apply_autostash(opts);
4919 sequencer_remove_state(opts);
4921 return error(_("nothing to do"));
4924 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
4925 shortonto, flags);
4926 if (res == -1)
4927 return -1;
4928 else if (res == -2) {
4929 apply_autostash(opts);
4930 sequencer_remove_state(opts);
4932 return -1;
4933 } else if (res == -3) {
4934 apply_autostash(opts);
4935 sequencer_remove_state(opts);
4936 todo_list_release(&new_todo);
4938 return error(_("nothing to do"));
4941 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) ||
4942 todo_list_check(todo_list, &new_todo)) {
4943 fprintf(stderr, _(edit_todo_list_advice));
4944 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
4945 todo_list_release(&new_todo);
4947 return -1;
4950 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
4951 todo_list_release(&new_todo);
4952 return error(_("could not skip unnecessary pick commands"));
4955 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
4956 flags & ~(TODO_LIST_SHORTEN_IDS))) {
4957 todo_list_release(&new_todo);
4958 return error_errno(_("could not write '%s'"), todo_file);
4961 todo_list_release(&new_todo);
4963 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
4964 return -1;
4966 if (require_clean_work_tree(r, "rebase", "", 1, 1))
4967 return -1;
4969 return sequencer_continue(r, opts);
4972 struct subject2item_entry {
4973 struct hashmap_entry entry;
4974 int i;
4975 char subject[FLEX_ARRAY];
4978 static int subject2item_cmp(const void *fndata,
4979 const struct subject2item_entry *a,
4980 const struct subject2item_entry *b, const void *key)
4982 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
4985 define_commit_slab(commit_todo_item, struct todo_item *);
4988 * Rearrange the todo list that has both "pick commit-id msg" and "pick
4989 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
4990 * after the former, and change "pick" to "fixup"/"squash".
4992 * Note that if the config has specified a custom instruction format, each log
4993 * message will have to be retrieved from the commit (as the oneline in the
4994 * script cannot be trusted) in order to normalize the autosquash arrangement.
4996 int todo_list_rearrange_squash(struct todo_list *todo_list)
4998 struct hashmap subject2item;
4999 int rearranged = 0, *next, *tail, i, nr = 0, alloc = 0;
5000 char **subjects;
5001 struct commit_todo_item commit_todo;
5002 struct todo_item *items = NULL;
5004 init_commit_todo_item(&commit_todo);
5006 * The hashmap maps onelines to the respective todo list index.
5008 * If any items need to be rearranged, the next[i] value will indicate
5009 * which item was moved directly after the i'th.
5011 * In that case, last[i] will indicate the index of the latest item to
5012 * be moved to appear after the i'th.
5014 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
5015 NULL, todo_list->nr);
5016 ALLOC_ARRAY(next, todo_list->nr);
5017 ALLOC_ARRAY(tail, todo_list->nr);
5018 ALLOC_ARRAY(subjects, todo_list->nr);
5019 for (i = 0; i < todo_list->nr; i++) {
5020 struct strbuf buf = STRBUF_INIT;
5021 struct todo_item *item = todo_list->items + i;
5022 const char *commit_buffer, *subject, *p;
5023 size_t subject_len;
5024 int i2 = -1;
5025 struct subject2item_entry *entry;
5027 next[i] = tail[i] = -1;
5028 if (!item->commit || item->command == TODO_DROP) {
5029 subjects[i] = NULL;
5030 continue;
5033 if (is_fixup(item->command)) {
5034 clear_commit_todo_item(&commit_todo);
5035 return error(_("the script was already rearranged."));
5038 *commit_todo_item_at(&commit_todo, item->commit) = item;
5040 parse_commit(item->commit);
5041 commit_buffer = get_commit_buffer(item->commit, NULL);
5042 find_commit_subject(commit_buffer, &subject);
5043 format_subject(&buf, subject, " ");
5044 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5045 unuse_commit_buffer(item->commit, commit_buffer);
5046 if ((skip_prefix(subject, "fixup! ", &p) ||
5047 skip_prefix(subject, "squash! ", &p))) {
5048 struct commit *commit2;
5050 for (;;) {
5051 while (isspace(*p))
5052 p++;
5053 if (!skip_prefix(p, "fixup! ", &p) &&
5054 !skip_prefix(p, "squash! ", &p))
5055 break;
5058 if ((entry = hashmap_get_from_hash(&subject2item,
5059 strhash(p), p)))
5060 /* found by title */
5061 i2 = entry->i;
5062 else if (!strchr(p, ' ') &&
5063 (commit2 =
5064 lookup_commit_reference_by_name(p)) &&
5065 *commit_todo_item_at(&commit_todo, commit2))
5066 /* found by commit name */
5067 i2 = *commit_todo_item_at(&commit_todo, commit2)
5068 - todo_list->items;
5069 else {
5070 /* copy can be a prefix of the commit subject */
5071 for (i2 = 0; i2 < i; i2++)
5072 if (subjects[i2] &&
5073 starts_with(subjects[i2], p))
5074 break;
5075 if (i2 == i)
5076 i2 = -1;
5079 if (i2 >= 0) {
5080 rearranged = 1;
5081 todo_list->items[i].command =
5082 starts_with(subject, "fixup!") ?
5083 TODO_FIXUP : TODO_SQUASH;
5084 if (next[i2] < 0)
5085 next[i2] = i;
5086 else
5087 next[tail[i2]] = i;
5088 tail[i2] = i;
5089 } else if (!hashmap_get_from_hash(&subject2item,
5090 strhash(subject), subject)) {
5091 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5092 entry->i = i;
5093 hashmap_entry_init(entry, strhash(entry->subject));
5094 hashmap_put(&subject2item, entry);
5098 if (rearranged) {
5099 for (i = 0; i < todo_list->nr; i++) {
5100 enum todo_command command = todo_list->items[i].command;
5101 int cur = i;
5104 * Initially, all commands are 'pick's. If it is a
5105 * fixup or a squash now, we have rearranged it.
5107 if (is_fixup(command))
5108 continue;
5110 while (cur >= 0) {
5111 ALLOC_GROW(items, nr + 1, alloc);
5112 items[nr++] = todo_list->items[cur];
5113 cur = next[cur];
5117 FREE_AND_NULL(todo_list->items);
5118 todo_list->items = items;
5119 todo_list->nr = nr;
5120 todo_list->alloc = alloc;
5123 free(next);
5124 free(tail);
5125 for (i = 0; i < todo_list->nr; i++)
5126 free(subjects[i]);
5127 free(subjects);
5128 hashmap_free(&subject2item, 1);
5130 clear_commit_todo_item(&commit_todo);
5132 return 0;