rebase: add a config option to default to --reschedule-failed-exec
[git.git] / sequencer.c
blob69bee63e116f4212be0db1ef457154d9496c492a
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 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 static GIT_PATH_FUNC(rebase_path_todo_backup,
59 "rebase-merge/git-rebase-todo.backup")
62 * The rebase command lines that have already been processed. A line
63 * is moved here when it is first handled, before any associated user
64 * actions.
66 static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
68 * The file to keep track of how many commands were already processed (e.g.
69 * for the prompt).
71 static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
73 * The file to keep track of how many commands are to be processed in total
74 * (e.g. for the prompt).
76 static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
78 * The commit message that is planned to be used for any changes that
79 * need to be committed following a user interaction.
81 static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
83 * The file into which is accumulated the suggested commit message for
84 * squash/fixup commands. When the first of a series of squash/fixups
85 * is seen, the file is created and the commit message from the
86 * previous commit and from the first squash/fixup commit are written
87 * to it. The commit message for each subsequent squash/fixup commit
88 * is appended to the file as it is processed.
90 static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
92 * If the current series of squash/fixups has not yet included a squash
93 * command, then this file exists and holds the commit message of the
94 * original "pick" commit. (If the series ends without a "squash"
95 * command, then this can be used as the commit message of the combined
96 * commit without opening the editor.)
98 static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
100 * This file contains the list fixup/squash commands that have been
101 * accumulated into message-fixup or message-squash so far.
103 static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
105 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
106 * GIT_AUTHOR_DATE that will be used for the commit that is currently
107 * being rebased.
109 static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
111 * When an "edit" rebase command is being processed, the SHA1 of the
112 * commit to be edited is recorded in this file. When "git rebase
113 * --continue" is executed, if there are any staged changes then they
114 * will be amended to the HEAD commit, but only provided the HEAD
115 * commit is still the commit to be edited. When any other rebase
116 * command is processed, this file is deleted.
118 static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
120 * When we stop at a given patch via the "edit" command, this file contains
121 * the abbreviated commit name of the corresponding patch.
123 static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
125 * For the post-rewrite hook, we make a list of rewritten commits and
126 * their new sha1s. The rewritten-pending list keeps the sha1s of
127 * commits that have been processed, but not committed yet,
128 * e.g. because they are waiting for a 'squash' command.
130 static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
131 static GIT_PATH_FUNC(rebase_path_rewritten_pending,
132 "rebase-merge/rewritten-pending")
135 * The path of the file containig the OID of the "squash onto" commit, i.e.
136 * the dummy commit used for `reset [new root]`.
138 static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
141 * The path of the file listing refs that need to be deleted after the rebase
142 * finishes. This is used by the `label` command to record the need for cleanup.
144 static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
147 * The following files are written by git-rebase just after parsing the
148 * command-line.
150 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
151 static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
152 static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
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_quiet, "rebase-merge/quiet")
161 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
163 static int git_sequencer_config(const char *k, const char *v, void *cb)
165 struct replay_opts *opts = cb;
166 int status;
168 if (!strcmp(k, "commit.cleanup")) {
169 const char *s;
171 status = git_config_string(&s, k, v);
172 if (status)
173 return status;
175 if (!strcmp(s, "verbatim"))
176 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
177 else if (!strcmp(s, "whitespace"))
178 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
179 else if (!strcmp(s, "strip"))
180 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
181 else if (!strcmp(s, "scissors"))
182 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
183 else
184 warning(_("invalid commit message cleanup mode '%s'"),
187 free((char *)s);
188 return status;
191 if (!strcmp(k, "commit.gpgsign")) {
192 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
193 return 0;
196 status = git_gpg_config(k, v, NULL);
197 if (status)
198 return status;
200 return git_diff_basic_config(k, v, NULL);
203 void sequencer_init_config(struct replay_opts *opts)
205 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
206 git_config(git_sequencer_config, opts);
209 static inline int is_rebase_i(const struct replay_opts *opts)
211 return opts->action == REPLAY_INTERACTIVE_REBASE;
214 static const char *get_dir(const struct replay_opts *opts)
216 if (is_rebase_i(opts))
217 return rebase_path();
218 return git_path_seq_dir();
221 static const char *get_todo_path(const struct replay_opts *opts)
223 if (is_rebase_i(opts))
224 return rebase_path_todo();
225 return git_path_todo_file();
229 * Returns 0 for non-conforming footer
230 * Returns 1 for conforming footer
231 * Returns 2 when sob exists within conforming footer
232 * Returns 3 when sob exists within conforming footer as last entry
234 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
235 size_t ignore_footer)
237 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
238 struct trailer_info info;
239 size_t i;
240 int found_sob = 0, found_sob_last = 0;
242 opts.no_divider = 1;
244 trailer_info_get(&info, sb->buf, &opts);
246 if (info.trailer_start == info.trailer_end)
247 return 0;
249 for (i = 0; i < info.trailer_nr; i++)
250 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
251 found_sob = 1;
252 if (i == info.trailer_nr - 1)
253 found_sob_last = 1;
256 trailer_info_release(&info);
258 if (found_sob_last)
259 return 3;
260 if (found_sob)
261 return 2;
262 return 1;
265 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
267 static struct strbuf buf = STRBUF_INIT;
269 strbuf_reset(&buf);
270 if (opts->gpg_sign)
271 sq_quotef(&buf, "-S%s", opts->gpg_sign);
272 return buf.buf;
275 int sequencer_remove_state(struct replay_opts *opts)
277 struct strbuf buf = STRBUF_INIT;
278 int i;
280 if (is_rebase_i(opts) &&
281 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
282 char *p = buf.buf;
283 while (*p) {
284 char *eol = strchr(p, '\n');
285 if (eol)
286 *eol = '\0';
287 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0)
288 warning(_("could not delete '%s'"), p);
289 if (!eol)
290 break;
291 p = eol + 1;
295 free(opts->gpg_sign);
296 free(opts->strategy);
297 for (i = 0; i < opts->xopts_nr; i++)
298 free(opts->xopts[i]);
299 free(opts->xopts);
300 strbuf_release(&opts->current_fixups);
302 strbuf_reset(&buf);
303 strbuf_addstr(&buf, get_dir(opts));
304 remove_dir_recursively(&buf, 0);
305 strbuf_release(&buf);
307 return 0;
310 static const char *action_name(const struct replay_opts *opts)
312 switch (opts->action) {
313 case REPLAY_REVERT:
314 return N_("revert");
315 case REPLAY_PICK:
316 return N_("cherry-pick");
317 case REPLAY_INTERACTIVE_REBASE:
318 return N_("rebase -i");
320 die(_("unknown action: %d"), opts->action);
323 struct commit_message {
324 char *parent_label;
325 char *label;
326 char *subject;
327 const char *message;
330 static const char *short_commit_name(struct commit *commit)
332 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
335 static int get_message(struct commit *commit, struct commit_message *out)
337 const char *abbrev, *subject;
338 int subject_len;
340 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
341 abbrev = short_commit_name(commit);
343 subject_len = find_commit_subject(out->message, &subject);
345 out->subject = xmemdupz(subject, subject_len);
346 out->label = xstrfmt("%s... %s", abbrev, out->subject);
347 out->parent_label = xstrfmt("parent of %s", out->label);
349 return 0;
352 static void free_message(struct commit *commit, struct commit_message *msg)
354 free(msg->parent_label);
355 free(msg->label);
356 free(msg->subject);
357 unuse_commit_buffer(commit, msg->message);
360 static void print_advice(int show_hint, struct replay_opts *opts)
362 char *msg = getenv("GIT_CHERRY_PICK_HELP");
364 if (msg) {
365 fprintf(stderr, "%s\n", msg);
367 * A conflict has occurred but the porcelain
368 * (typically rebase --interactive) wants to take care
369 * of the commit itself so remove CHERRY_PICK_HEAD
371 unlink(git_path_cherry_pick_head(the_repository));
372 return;
375 if (show_hint) {
376 if (opts->no_commit)
377 advise(_("after resolving the conflicts, mark the corrected paths\n"
378 "with 'git add <paths>' or 'git rm <paths>'"));
379 else
380 advise(_("after resolving the conflicts, mark the corrected paths\n"
381 "with 'git add <paths>' or 'git rm <paths>'\n"
382 "and commit the result with 'git commit'"));
386 int write_message(const void *buf, size_t len, const char *filename,
387 int append_eol)
389 struct lock_file msg_file = LOCK_INIT;
391 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
392 if (msg_fd < 0)
393 return error_errno(_("could not lock '%s'"), filename);
394 if (write_in_full(msg_fd, buf, len) < 0) {
395 error_errno(_("could not write to '%s'"), filename);
396 rollback_lock_file(&msg_file);
397 return -1;
399 if (append_eol && write(msg_fd, "\n", 1) < 0) {
400 error_errno(_("could not write eol to '%s'"), filename);
401 rollback_lock_file(&msg_file);
402 return -1;
404 if (commit_lock_file(&msg_file) < 0)
405 return error(_("failed to finalize '%s'"), filename);
407 return 0;
411 * Reads a file that was presumably written by a shell script, i.e. with an
412 * end-of-line marker that needs to be stripped.
414 * Note that only the last end-of-line marker is stripped, consistent with the
415 * behavior of "$(cat path)" in a shell script.
417 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
419 static int read_oneliner(struct strbuf *buf,
420 const char *path, int skip_if_empty)
422 int orig_len = buf->len;
424 if (!file_exists(path))
425 return 0;
427 if (strbuf_read_file(buf, path, 0) < 0) {
428 warning_errno(_("could not read '%s'"), path);
429 return 0;
432 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
433 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
434 --buf->len;
435 buf->buf[buf->len] = '\0';
438 if (skip_if_empty && buf->len == orig_len)
439 return 0;
441 return 1;
444 static struct tree *empty_tree(void)
446 return lookup_tree(the_repository, the_repository->hash_algo->empty_tree);
449 static int error_dirty_index(struct replay_opts *opts)
451 if (read_cache_unmerged())
452 return error_resolve_conflict(_(action_name(opts)));
454 error(_("your local changes would be overwritten by %s."),
455 _(action_name(opts)));
457 if (advice_commit_before_merge)
458 advise(_("commit your changes or stash them to proceed."));
459 return -1;
462 static void update_abort_safety_file(void)
464 struct object_id head;
466 /* Do nothing on a single-pick */
467 if (!file_exists(git_path_seq_dir()))
468 return;
470 if (!get_oid("HEAD", &head))
471 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
472 else
473 write_file(git_path_abort_safety_file(), "%s", "");
476 static int fast_forward_to(const struct object_id *to, const struct object_id *from,
477 int unborn, struct replay_opts *opts)
479 struct ref_transaction *transaction;
480 struct strbuf sb = STRBUF_INIT;
481 struct strbuf err = STRBUF_INIT;
483 read_index(&the_index);
484 if (checkout_fast_forward(the_repository, from, to, 1))
485 return -1; /* the callee should have complained already */
487 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
489 transaction = ref_transaction_begin(&err);
490 if (!transaction ||
491 ref_transaction_update(transaction, "HEAD",
492 to, unborn && !is_rebase_i(opts) ?
493 &null_oid : from,
494 0, sb.buf, &err) ||
495 ref_transaction_commit(transaction, &err)) {
496 ref_transaction_free(transaction);
497 error("%s", err.buf);
498 strbuf_release(&sb);
499 strbuf_release(&err);
500 return -1;
503 strbuf_release(&sb);
504 strbuf_release(&err);
505 ref_transaction_free(transaction);
506 update_abort_safety_file();
507 return 0;
510 void append_conflicts_hint(struct strbuf *msgbuf)
512 int i;
514 strbuf_addch(msgbuf, '\n');
515 strbuf_commented_addf(msgbuf, "Conflicts:\n");
516 for (i = 0; i < active_nr;) {
517 const struct cache_entry *ce = active_cache[i++];
518 if (ce_stage(ce)) {
519 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
520 while (i < active_nr && !strcmp(ce->name,
521 active_cache[i]->name))
522 i++;
527 static int do_recursive_merge(struct commit *base, struct commit *next,
528 const char *base_label, const char *next_label,
529 struct object_id *head, struct strbuf *msgbuf,
530 struct replay_opts *opts)
532 struct merge_options o;
533 struct tree *result, *next_tree, *base_tree, *head_tree;
534 int clean;
535 char **xopt;
536 struct lock_file index_lock = LOCK_INIT;
538 if (hold_locked_index(&index_lock, LOCK_REPORT_ON_ERROR) < 0)
539 return -1;
541 read_cache();
543 init_merge_options(&o);
544 o.ancestor = base ? base_label : "(empty tree)";
545 o.branch1 = "HEAD";
546 o.branch2 = next ? next_label : "(empty tree)";
547 if (is_rebase_i(opts))
548 o.buffer_output = 2;
549 o.show_rename_progress = 1;
551 head_tree = parse_tree_indirect(head);
552 next_tree = next ? get_commit_tree(next) : empty_tree();
553 base_tree = base ? get_commit_tree(base) : empty_tree();
555 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
556 parse_merge_opt(&o, *xopt);
558 clean = merge_trees(&o,
559 head_tree,
560 next_tree, base_tree, &result);
561 if (is_rebase_i(opts) && clean <= 0)
562 fputs(o.obuf.buf, stdout);
563 strbuf_release(&o.obuf);
564 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
565 if (clean < 0) {
566 rollback_lock_file(&index_lock);
567 return clean;
570 if (write_locked_index(&the_index, &index_lock,
571 COMMIT_LOCK | SKIP_IF_UNCHANGED))
573 * TRANSLATORS: %s will be "revert", "cherry-pick" or
574 * "rebase -i".
576 return error(_("%s: Unable to write new index file"),
577 _(action_name(opts)));
579 if (!clean)
580 append_conflicts_hint(msgbuf);
582 return !clean;
585 static struct object_id *get_cache_tree_oid(void)
587 if (!active_cache_tree)
588 active_cache_tree = cache_tree();
590 if (!cache_tree_fully_valid(active_cache_tree))
591 if (cache_tree_update(&the_index, 0)) {
592 error(_("unable to update cache tree"));
593 return NULL;
596 return &active_cache_tree->oid;
599 static int is_index_unchanged(void)
601 struct object_id head_oid, *cache_tree_oid;
602 struct commit *head_commit;
604 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
605 return error(_("could not resolve HEAD commit"));
607 head_commit = lookup_commit(the_repository, &head_oid);
610 * If head_commit is NULL, check_commit, called from
611 * lookup_commit, would have indicated that head_commit is not
612 * a commit object already. parse_commit() will return failure
613 * without further complaints in such a case. Otherwise, if
614 * the commit is invalid, parse_commit() will complain. So
615 * there is nothing for us to say here. Just return failure.
617 if (parse_commit(head_commit))
618 return -1;
620 if (!(cache_tree_oid = get_cache_tree_oid()))
621 return -1;
623 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
626 static int write_author_script(const char *message)
628 struct strbuf buf = STRBUF_INIT;
629 const char *eol;
630 int res;
632 for (;;)
633 if (!*message || starts_with(message, "\n")) {
634 missing_author:
635 /* Missing 'author' line? */
636 unlink(rebase_path_author_script());
637 return 0;
638 } else if (skip_prefix(message, "author ", &message))
639 break;
640 else if ((eol = strchr(message, '\n')))
641 message = eol + 1;
642 else
643 goto missing_author;
645 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
646 while (*message && *message != '\n' && *message != '\r')
647 if (skip_prefix(message, " <", &message))
648 break;
649 else if (*message != '\'')
650 strbuf_addch(&buf, *(message++));
651 else
652 strbuf_addf(&buf, "'\\%c'", *(message++));
653 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
654 while (*message && *message != '\n' && *message != '\r')
655 if (skip_prefix(message, "> ", &message))
656 break;
657 else if (*message != '\'')
658 strbuf_addch(&buf, *(message++));
659 else
660 strbuf_addf(&buf, "'\\%c'", *(message++));
661 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
662 while (*message && *message != '\n' && *message != '\r')
663 if (*message != '\'')
664 strbuf_addch(&buf, *(message++));
665 else
666 strbuf_addf(&buf, "'\\%c'", *(message++));
667 strbuf_addch(&buf, '\'');
668 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
669 strbuf_release(&buf);
670 return res;
674 * Take a series of KEY='VALUE' lines where VALUE part is
675 * sq-quoted, and append <KEY, VALUE> at the end of the string list
677 static int parse_key_value_squoted(char *buf, struct string_list *list)
679 while (*buf) {
680 struct string_list_item *item;
681 char *np;
682 char *cp = strchr(buf, '=');
683 if (!cp) {
684 np = strchrnul(buf, '\n');
685 return error(_("no key present in '%.*s'"),
686 (int) (np - buf), buf);
688 np = strchrnul(cp, '\n');
689 *cp++ = '\0';
690 item = string_list_append(list, buf);
692 buf = np + (*np == '\n');
693 *np = '\0';
694 cp = sq_dequote(cp);
695 if (!cp)
696 return error(_("unable to dequote value of '%s'"),
697 item->string);
698 item->util = xstrdup(cp);
700 return 0;
704 * Reads and parses the state directory's "author-script" file, and sets name,
705 * email and date accordingly.
706 * Returns 0 on success, -1 if the file could not be parsed.
708 * The author script is of the format:
710 * GIT_AUTHOR_NAME='$author_name'
711 * GIT_AUTHOR_EMAIL='$author_email'
712 * GIT_AUTHOR_DATE='$author_date'
714 * where $author_name, $author_email and $author_date are quoted. We are strict
715 * with our parsing, as the file was meant to be eval'd in the old
716 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
717 * from what this function expects, it is better to bail out than to do
718 * something that the user does not expect.
720 int read_author_script(const char *path, char **name, char **email, char **date,
721 int allow_missing)
723 struct strbuf buf = STRBUF_INIT;
724 struct string_list kv = STRING_LIST_INIT_DUP;
725 int retval = -1; /* assume failure */
726 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
728 if (strbuf_read_file(&buf, path, 256) <= 0) {
729 strbuf_release(&buf);
730 if (errno == ENOENT && allow_missing)
731 return 0;
732 else
733 return error_errno(_("could not open '%s' for reading"),
734 path);
737 if (parse_key_value_squoted(buf.buf, &kv))
738 goto finish;
740 for (i = 0; i < kv.nr; i++) {
741 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
742 if (name_i != -2)
743 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
744 else
745 name_i = i;
746 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
747 if (email_i != -2)
748 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
749 else
750 email_i = i;
751 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
752 if (date_i != -2)
753 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
754 else
755 date_i = i;
756 } else {
757 err = error(_("unknown variable '%s'"),
758 kv.items[i].string);
761 if (name_i == -2)
762 error(_("missing 'GIT_AUTHOR_NAME'"));
763 if (email_i == -2)
764 error(_("missing 'GIT_AUTHOR_EMAIL'"));
765 if (date_i == -2)
766 error(_("missing 'GIT_AUTHOR_DATE'"));
767 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
768 goto finish;
769 *name = kv.items[name_i].util;
770 *email = kv.items[email_i].util;
771 *date = kv.items[date_i].util;
772 retval = 0;
773 finish:
774 string_list_clear(&kv, !!retval);
775 strbuf_release(&buf);
776 return retval;
780 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
781 * file with shell quoting into struct argv_array. Returns -1 on
782 * error, 0 otherwise.
784 static int read_env_script(struct argv_array *env)
786 char *name, *email, *date;
788 if (read_author_script(rebase_path_author_script(),
789 &name, &email, &date, 0))
790 return -1;
792 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
793 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
794 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
795 free(name);
796 free(email);
797 free(date);
799 return 0;
802 static char *get_author(const char *message)
804 size_t len;
805 const char *a;
807 a = find_commit_header(message, "author", &len);
808 if (a)
809 return xmemdupz(a, len);
811 return NULL;
814 /* Read author-script and return an ident line (author <email> timestamp) */
815 static const char *read_author_ident(struct strbuf *buf)
817 struct strbuf out = STRBUF_INIT;
818 char *name, *email, *date;
820 if (read_author_script(rebase_path_author_script(),
821 &name, &email, &date, 0))
822 return NULL;
824 /* validate date since fmt_ident() will die() on bad value */
825 if (parse_date(date, &out)){
826 warning(_("invalid date format '%s' in '%s'"),
827 date, rebase_path_author_script());
828 strbuf_release(&out);
829 return NULL;
832 strbuf_reset(&out);
833 strbuf_addstr(&out, fmt_ident(name, email, date, 0));
834 strbuf_swap(buf, &out);
835 strbuf_release(&out);
836 free(name);
837 free(email);
838 free(date);
839 return buf->buf;
842 static const char staged_changes_advice[] =
843 N_("you have staged changes in your working tree\n"
844 "If these changes are meant to be squashed into the previous commit, run:\n"
845 "\n"
846 " git commit --amend %s\n"
847 "\n"
848 "If they are meant to go into a new commit, run:\n"
849 "\n"
850 " git commit %s\n"
851 "\n"
852 "In both cases, once you're done, continue with:\n"
853 "\n"
854 " git rebase --continue\n");
856 #define ALLOW_EMPTY (1<<0)
857 #define EDIT_MSG (1<<1)
858 #define AMEND_MSG (1<<2)
859 #define CLEANUP_MSG (1<<3)
860 #define VERIFY_MSG (1<<4)
861 #define CREATE_ROOT_COMMIT (1<<5)
863 static int run_command_silent_on_success(struct child_process *cmd)
865 struct strbuf buf = STRBUF_INIT;
866 int rc;
868 cmd->stdout_to_stderr = 1;
869 rc = pipe_command(cmd,
870 NULL, 0,
871 NULL, 0,
872 &buf, 0);
874 if (rc)
875 fputs(buf.buf, stderr);
876 strbuf_release(&buf);
877 return rc;
881 * If we are cherry-pick, and if the merge did not result in
882 * hand-editing, we will hit this commit and inherit the original
883 * author date and name.
885 * If we are revert, or if our cherry-pick results in a hand merge,
886 * we had better say that the current user is responsible for that.
888 * An exception is when run_git_commit() is called during an
889 * interactive rebase: in that case, we will want to retain the
890 * author metadata.
892 static int run_git_commit(const char *defmsg, struct replay_opts *opts,
893 unsigned int flags)
895 struct child_process cmd = CHILD_PROCESS_INIT;
896 const char *value;
898 if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
899 struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
900 const char *author = NULL;
901 struct object_id root_commit, *cache_tree_oid;
902 int res = 0;
904 if (is_rebase_i(opts)) {
905 author = read_author_ident(&script);
906 if (!author) {
907 strbuf_release(&script);
908 return -1;
912 if (!defmsg)
913 BUG("root commit without message");
915 if (!(cache_tree_oid = get_cache_tree_oid()))
916 res = -1;
918 if (!res)
919 res = strbuf_read_file(&msg, defmsg, 0);
921 if (res <= 0)
922 res = error_errno(_("could not read '%s'"), defmsg);
923 else
924 res = commit_tree(msg.buf, msg.len, cache_tree_oid,
925 NULL, &root_commit, author,
926 opts->gpg_sign);
928 strbuf_release(&msg);
929 strbuf_release(&script);
930 if (!res) {
931 update_ref(NULL, "CHERRY_PICK_HEAD", &root_commit, NULL,
932 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR);
933 res = update_ref(NULL, "HEAD", &root_commit, NULL, 0,
934 UPDATE_REFS_MSG_ON_ERR);
936 return res < 0 ? error(_("writing root commit")) : 0;
939 cmd.git_cmd = 1;
941 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
942 const char *gpg_opt = gpg_sign_opt_quoted(opts);
944 return error(_(staged_changes_advice),
945 gpg_opt, gpg_opt);
948 argv_array_push(&cmd.args, "commit");
950 if (!(flags & VERIFY_MSG))
951 argv_array_push(&cmd.args, "-n");
952 if ((flags & AMEND_MSG))
953 argv_array_push(&cmd.args, "--amend");
954 if (opts->gpg_sign)
955 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
956 if (defmsg)
957 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
958 else if (!(flags & EDIT_MSG))
959 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
960 if ((flags & CLEANUP_MSG))
961 argv_array_push(&cmd.args, "--cleanup=strip");
962 if ((flags & EDIT_MSG))
963 argv_array_push(&cmd.args, "-e");
964 else if (!(flags & CLEANUP_MSG) &&
965 !opts->signoff && !opts->record_origin &&
966 git_config_get_value("commit.cleanup", &value))
967 argv_array_push(&cmd.args, "--cleanup=verbatim");
969 if ((flags & ALLOW_EMPTY))
970 argv_array_push(&cmd.args, "--allow-empty");
972 if (!(flags & EDIT_MSG))
973 argv_array_push(&cmd.args, "--allow-empty-message");
975 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
976 return run_command_silent_on_success(&cmd);
977 else
978 return run_command(&cmd);
981 static int rest_is_empty(const struct strbuf *sb, int start)
983 int i, eol;
984 const char *nl;
986 /* Check if the rest is just whitespace and Signed-off-by's. */
987 for (i = start; i < sb->len; i++) {
988 nl = memchr(sb->buf + i, '\n', sb->len - i);
989 if (nl)
990 eol = nl - sb->buf;
991 else
992 eol = sb->len;
994 if (strlen(sign_off_header) <= eol - i &&
995 starts_with(sb->buf + i, sign_off_header)) {
996 i = eol;
997 continue;
999 while (i < eol)
1000 if (!isspace(sb->buf[i++]))
1001 return 0;
1004 return 1;
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;
1098 code = start_command(&proc);
1099 if (code)
1100 return code;
1101 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1102 sigchain_push(SIGPIPE, SIG_IGN);
1103 write_in_full(proc.in, sb.buf, sb.len);
1104 close(proc.in);
1105 strbuf_release(&sb);
1106 sigchain_pop(SIGPIPE);
1107 return finish_command(&proc);
1110 void commit_post_rewrite(const struct commit *old_head,
1111 const struct object_id *new_head)
1113 struct notes_rewrite_cfg *cfg;
1115 cfg = init_copy_notes_for_rewrite("amend");
1116 if (cfg) {
1117 /* we are amending, so old_head is not NULL */
1118 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1119 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1121 run_rewrite_hook(&old_head->object.oid, new_head);
1124 static int run_prepare_commit_msg_hook(struct strbuf *msg, const char *commit)
1126 struct argv_array hook_env = ARGV_ARRAY_INIT;
1127 int ret;
1128 const char *name;
1130 name = git_path_commit_editmsg();
1131 if (write_message(msg->buf, msg->len, name, 0))
1132 return -1;
1134 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", get_index_file());
1135 argv_array_push(&hook_env, "GIT_EDITOR=:");
1136 if (commit)
1137 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1138 "commit", commit, NULL);
1139 else
1140 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1141 "message", NULL);
1142 if (ret)
1143 ret = error(_("'prepare-commit-msg' hook failed"));
1144 argv_array_clear(&hook_env);
1146 return ret;
1149 static const char implicit_ident_advice_noconfig[] =
1150 N_("Your name and email address were configured automatically based\n"
1151 "on your username and hostname. Please check that they are accurate.\n"
1152 "You can suppress this message by setting them explicitly. Run the\n"
1153 "following command and follow the instructions in your editor to edit\n"
1154 "your configuration file:\n"
1155 "\n"
1156 " git config --global --edit\n"
1157 "\n"
1158 "After doing this, you may fix the identity used for this commit with:\n"
1159 "\n"
1160 " git commit --amend --reset-author\n");
1162 static const char implicit_ident_advice_config[] =
1163 N_("Your name and email address were configured automatically based\n"
1164 "on your username and hostname. Please check that they are accurate.\n"
1165 "You can suppress this message by setting them explicitly:\n"
1166 "\n"
1167 " git config --global user.name \"Your Name\"\n"
1168 " git config --global user.email you@example.com\n"
1169 "\n"
1170 "After doing this, you may fix the identity used for this commit with:\n"
1171 "\n"
1172 " git commit --amend --reset-author\n");
1174 static const char *implicit_ident_advice(void)
1176 char *user_config = expand_user_path("~/.gitconfig", 0);
1177 char *xdg_config = xdg_config_home("config");
1178 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1180 free(user_config);
1181 free(xdg_config);
1183 if (config_exists)
1184 return _(implicit_ident_advice_config);
1185 else
1186 return _(implicit_ident_advice_noconfig);
1190 void print_commit_summary(const char *prefix, const struct object_id *oid,
1191 unsigned int flags)
1193 struct rev_info rev;
1194 struct commit *commit;
1195 struct strbuf format = STRBUF_INIT;
1196 const char *head;
1197 struct pretty_print_context pctx = {0};
1198 struct strbuf author_ident = STRBUF_INIT;
1199 struct strbuf committer_ident = STRBUF_INIT;
1201 commit = lookup_commit(the_repository, oid);
1202 if (!commit)
1203 die(_("couldn't look up newly created commit"));
1204 if (parse_commit(commit))
1205 die(_("could not parse newly created commit"));
1207 strbuf_addstr(&format, "format:%h] %s");
1209 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1210 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1211 if (strbuf_cmp(&author_ident, &committer_ident)) {
1212 strbuf_addstr(&format, "\n Author: ");
1213 strbuf_addbuf_percentquote(&format, &author_ident);
1215 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1216 struct strbuf date = STRBUF_INIT;
1218 format_commit_message(commit, "%ad", &date, &pctx);
1219 strbuf_addstr(&format, "\n Date: ");
1220 strbuf_addbuf_percentquote(&format, &date);
1221 strbuf_release(&date);
1223 if (!committer_ident_sufficiently_given()) {
1224 strbuf_addstr(&format, "\n Committer: ");
1225 strbuf_addbuf_percentquote(&format, &committer_ident);
1226 if (advice_implicit_identity) {
1227 strbuf_addch(&format, '\n');
1228 strbuf_addstr(&format, implicit_ident_advice());
1231 strbuf_release(&author_ident);
1232 strbuf_release(&committer_ident);
1234 repo_init_revisions(the_repository, &rev, prefix);
1235 setup_revisions(0, NULL, &rev, NULL);
1237 rev.diff = 1;
1238 rev.diffopt.output_format =
1239 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1241 rev.verbose_header = 1;
1242 rev.show_root_diff = 1;
1243 get_commit_format(format.buf, &rev);
1244 rev.always_show_header = 0;
1245 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1246 rev.diffopt.break_opt = 0;
1247 diff_setup_done(&rev.diffopt);
1249 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1250 if (!head)
1251 die_errno(_("unable to resolve HEAD after creating commit"));
1252 if (!strcmp(head, "HEAD"))
1253 head = _("detached HEAD");
1254 else
1255 skip_prefix(head, "refs/heads/", &head);
1256 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1257 _(" (root-commit)") : "");
1259 if (!log_tree_commit(&rev, commit)) {
1260 rev.always_show_header = 1;
1261 rev.use_terminator = 1;
1262 log_tree_commit(&rev, commit);
1265 strbuf_release(&format);
1268 static int parse_head(struct commit **head)
1270 struct commit *current_head;
1271 struct object_id oid;
1273 if (get_oid("HEAD", &oid)) {
1274 current_head = NULL;
1275 } else {
1276 current_head = lookup_commit_reference(the_repository, &oid);
1277 if (!current_head)
1278 return error(_("could not parse HEAD"));
1279 if (!oideq(&oid, &current_head->object.oid)) {
1280 warning(_("HEAD %s is not a commit!"),
1281 oid_to_hex(&oid));
1283 if (parse_commit(current_head))
1284 return error(_("could not parse HEAD commit"));
1286 *head = current_head;
1288 return 0;
1292 * Try to commit without forking 'git commit'. In some cases we need
1293 * to run 'git commit' to display an error message
1295 * Returns:
1296 * -1 - error unable to commit
1297 * 0 - success
1298 * 1 - run 'git commit'
1300 static int try_to_commit(struct strbuf *msg, const char *author,
1301 struct replay_opts *opts, unsigned int flags,
1302 struct object_id *oid)
1304 struct object_id tree;
1305 struct commit *current_head;
1306 struct commit_list *parents = NULL;
1307 struct commit_extra_header *extra = NULL;
1308 struct strbuf err = STRBUF_INIT;
1309 struct strbuf commit_msg = STRBUF_INIT;
1310 char *amend_author = NULL;
1311 const char *hook_commit = NULL;
1312 enum commit_msg_cleanup_mode cleanup;
1313 int res = 0;
1315 if (parse_head(&current_head))
1316 return -1;
1318 if (flags & AMEND_MSG) {
1319 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1320 const char *out_enc = get_commit_output_encoding();
1321 const char *message = logmsg_reencode(current_head, NULL,
1322 out_enc);
1324 if (!msg) {
1325 const char *orig_message = NULL;
1327 find_commit_subject(message, &orig_message);
1328 msg = &commit_msg;
1329 strbuf_addstr(msg, orig_message);
1330 hook_commit = "HEAD";
1332 author = amend_author = get_author(message);
1333 unuse_commit_buffer(current_head, message);
1334 if (!author) {
1335 res = error(_("unable to parse commit author"));
1336 goto out;
1338 parents = copy_commit_list(current_head->parents);
1339 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1340 } else if (current_head) {
1341 commit_list_insert(current_head, &parents);
1344 if (write_index_as_tree(&tree, &the_index, get_index_file(), 0, NULL)) {
1345 res = error(_("git write-tree failed to write a tree"));
1346 goto out;
1349 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1350 get_commit_tree_oid(current_head) :
1351 the_hash_algo->empty_tree, &tree)) {
1352 res = 1; /* run 'git commit' to display error message */
1353 goto out;
1356 if (find_hook("prepare-commit-msg")) {
1357 res = run_prepare_commit_msg_hook(msg, hook_commit);
1358 if (res)
1359 goto out;
1360 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1361 2048) < 0) {
1362 res = error_errno(_("unable to read commit message "
1363 "from '%s'"),
1364 git_path_commit_editmsg());
1365 goto out;
1367 msg = &commit_msg;
1370 cleanup = (flags & CLEANUP_MSG) ? COMMIT_MSG_CLEANUP_ALL :
1371 opts->default_msg_cleanup;
1373 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1374 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1375 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1376 res = 1; /* run 'git commit' to display error message */
1377 goto out;
1380 reset_ident_date();
1382 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1383 oid, author, opts->gpg_sign, extra)) {
1384 res = error(_("failed to write commit object"));
1385 goto out;
1388 if (update_head_with_reflog(current_head, oid,
1389 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1390 res = error("%s", err.buf);
1391 goto out;
1394 if (flags & AMEND_MSG)
1395 commit_post_rewrite(current_head, oid);
1397 out:
1398 free_commit_extra_headers(extra);
1399 strbuf_release(&err);
1400 strbuf_release(&commit_msg);
1401 free(amend_author);
1403 return res;
1406 static int do_commit(const char *msg_file, const char *author,
1407 struct replay_opts *opts, unsigned int flags)
1409 int res = 1;
1411 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG) &&
1412 !(flags & CREATE_ROOT_COMMIT)) {
1413 struct object_id oid;
1414 struct strbuf sb = STRBUF_INIT;
1416 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1417 return error_errno(_("unable to read commit message "
1418 "from '%s'"),
1419 msg_file);
1421 res = try_to_commit(msg_file ? &sb : NULL, author, opts, flags,
1422 &oid);
1423 strbuf_release(&sb);
1424 if (!res) {
1425 unlink(git_path_cherry_pick_head(the_repository));
1426 unlink(git_path_merge_msg(the_repository));
1427 if (!is_rebase_i(opts))
1428 print_commit_summary(NULL, &oid,
1429 SUMMARY_SHOW_AUTHOR_DATE);
1430 return res;
1433 if (res == 1)
1434 return run_git_commit(msg_file, opts, flags);
1436 return res;
1439 static int is_original_commit_empty(struct commit *commit)
1441 const struct object_id *ptree_oid;
1443 if (parse_commit(commit))
1444 return error(_("could not parse commit %s"),
1445 oid_to_hex(&commit->object.oid));
1446 if (commit->parents) {
1447 struct commit *parent = commit->parents->item;
1448 if (parse_commit(parent))
1449 return error(_("could not parse parent commit %s"),
1450 oid_to_hex(&parent->object.oid));
1451 ptree_oid = get_commit_tree_oid(parent);
1452 } else {
1453 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1456 return oideq(ptree_oid, get_commit_tree_oid(commit));
1460 * Do we run "git commit" with "--allow-empty"?
1462 static int allow_empty(struct replay_opts *opts, struct commit *commit)
1464 int index_unchanged, empty_commit;
1467 * Three cases:
1469 * (1) we do not allow empty at all and error out.
1471 * (2) we allow ones that were initially empty, but
1472 * forbid the ones that become empty;
1474 * (3) we allow both.
1476 if (!opts->allow_empty)
1477 return 0; /* let "git commit" barf as necessary */
1479 index_unchanged = is_index_unchanged();
1480 if (index_unchanged < 0)
1481 return index_unchanged;
1482 if (!index_unchanged)
1483 return 0; /* we do not have to say --allow-empty */
1485 if (opts->keep_redundant_commits)
1486 return 1;
1488 empty_commit = is_original_commit_empty(commit);
1489 if (empty_commit < 0)
1490 return empty_commit;
1491 if (!empty_commit)
1492 return 0;
1493 else
1494 return 1;
1498 * Note that ordering matters in this enum. Not only must it match the mapping
1499 * below, it is also divided into several sections that matter. When adding
1500 * new commands, make sure you add it in the right section.
1502 enum todo_command {
1503 /* commands that handle commits */
1504 TODO_PICK = 0,
1505 TODO_REVERT,
1506 TODO_EDIT,
1507 TODO_REWORD,
1508 TODO_FIXUP,
1509 TODO_SQUASH,
1510 /* commands that do something else than handling a single commit */
1511 TODO_EXEC,
1512 TODO_BREAK,
1513 TODO_LABEL,
1514 TODO_RESET,
1515 TODO_MERGE,
1516 /* commands that do nothing but are counted for reporting progress */
1517 TODO_NOOP,
1518 TODO_DROP,
1519 /* comments (not counted for reporting progress) */
1520 TODO_COMMENT
1523 static struct {
1524 char c;
1525 const char *str;
1526 } todo_command_info[] = {
1527 { 'p', "pick" },
1528 { 0, "revert" },
1529 { 'e', "edit" },
1530 { 'r', "reword" },
1531 { 'f', "fixup" },
1532 { 's', "squash" },
1533 { 'x', "exec" },
1534 { 'b', "break" },
1535 { 'l', "label" },
1536 { 't', "reset" },
1537 { 'm', "merge" },
1538 { 0, "noop" },
1539 { 'd', "drop" },
1540 { 0, NULL }
1543 static const char *command_to_string(const enum todo_command command)
1545 if (command < TODO_COMMENT)
1546 return todo_command_info[command].str;
1547 die(_("unknown command: %d"), command);
1550 static char command_to_char(const enum todo_command command)
1552 if (command < TODO_COMMENT && todo_command_info[command].c)
1553 return todo_command_info[command].c;
1554 return comment_line_char;
1557 static int is_noop(const enum todo_command command)
1559 return TODO_NOOP <= command;
1562 static int is_fixup(enum todo_command command)
1564 return command == TODO_FIXUP || command == TODO_SQUASH;
1567 /* Does this command create a (non-merge) commit? */
1568 static int is_pick_or_similar(enum todo_command command)
1570 switch (command) {
1571 case TODO_PICK:
1572 case TODO_REVERT:
1573 case TODO_EDIT:
1574 case TODO_REWORD:
1575 case TODO_FIXUP:
1576 case TODO_SQUASH:
1577 return 1;
1578 default:
1579 return 0;
1583 static int update_squash_messages(enum todo_command command,
1584 struct commit *commit, struct replay_opts *opts)
1586 struct strbuf buf = STRBUF_INIT;
1587 int res;
1588 const char *message, *body;
1590 if (opts->current_fixup_count > 0) {
1591 struct strbuf header = STRBUF_INIT;
1592 char *eol;
1594 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1595 return error(_("could not read '%s'"),
1596 rebase_path_squash_msg());
1598 eol = buf.buf[0] != comment_line_char ?
1599 buf.buf : strchrnul(buf.buf, '\n');
1601 strbuf_addf(&header, "%c ", comment_line_char);
1602 strbuf_addf(&header, _("This is a combination of %d commits."),
1603 opts->current_fixup_count + 2);
1604 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1605 strbuf_release(&header);
1606 } else {
1607 struct object_id head;
1608 struct commit *head_commit;
1609 const char *head_message, *body;
1611 if (get_oid("HEAD", &head))
1612 return error(_("need a HEAD to fixup"));
1613 if (!(head_commit = lookup_commit_reference(the_repository, &head)))
1614 return error(_("could not read HEAD"));
1615 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1616 return error(_("could not read HEAD's commit message"));
1618 find_commit_subject(head_message, &body);
1619 if (write_message(body, strlen(body),
1620 rebase_path_fixup_msg(), 0)) {
1621 unuse_commit_buffer(head_commit, head_message);
1622 return error(_("cannot write '%s'"),
1623 rebase_path_fixup_msg());
1626 strbuf_addf(&buf, "%c ", comment_line_char);
1627 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1628 strbuf_addf(&buf, "\n%c ", comment_line_char);
1629 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1630 strbuf_addstr(&buf, "\n\n");
1631 strbuf_addstr(&buf, body);
1633 unuse_commit_buffer(head_commit, head_message);
1636 if (!(message = get_commit_buffer(commit, NULL)))
1637 return error(_("could not read commit message of %s"),
1638 oid_to_hex(&commit->object.oid));
1639 find_commit_subject(message, &body);
1641 if (command == TODO_SQUASH) {
1642 unlink(rebase_path_fixup_msg());
1643 strbuf_addf(&buf, "\n%c ", comment_line_char);
1644 strbuf_addf(&buf, _("This is the commit message #%d:"),
1645 ++opts->current_fixup_count + 1);
1646 strbuf_addstr(&buf, "\n\n");
1647 strbuf_addstr(&buf, body);
1648 } else if (command == TODO_FIXUP) {
1649 strbuf_addf(&buf, "\n%c ", comment_line_char);
1650 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1651 ++opts->current_fixup_count + 1);
1652 strbuf_addstr(&buf, "\n\n");
1653 strbuf_add_commented_lines(&buf, body, strlen(body));
1654 } else
1655 return error(_("unknown command: %d"), command);
1656 unuse_commit_buffer(commit, message);
1658 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1659 strbuf_release(&buf);
1661 if (!res) {
1662 strbuf_addf(&opts->current_fixups, "%s%s %s",
1663 opts->current_fixups.len ? "\n" : "",
1664 command_to_string(command),
1665 oid_to_hex(&commit->object.oid));
1666 res = write_message(opts->current_fixups.buf,
1667 opts->current_fixups.len,
1668 rebase_path_current_fixups(), 0);
1671 return res;
1674 static void flush_rewritten_pending(void) {
1675 struct strbuf buf = STRBUF_INIT;
1676 struct object_id newoid;
1677 FILE *out;
1679 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1680 !get_oid("HEAD", &newoid) &&
1681 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1682 char *bol = buf.buf, *eol;
1684 while (*bol) {
1685 eol = strchrnul(bol, '\n');
1686 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1687 bol, oid_to_hex(&newoid));
1688 if (!*eol)
1689 break;
1690 bol = eol + 1;
1692 fclose(out);
1693 unlink(rebase_path_rewritten_pending());
1695 strbuf_release(&buf);
1698 static void record_in_rewritten(struct object_id *oid,
1699 enum todo_command next_command) {
1700 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1702 if (!out)
1703 return;
1705 fprintf(out, "%s\n", oid_to_hex(oid));
1706 fclose(out);
1708 if (!is_fixup(next_command))
1709 flush_rewritten_pending();
1712 static int do_pick_commit(enum todo_command command, struct commit *commit,
1713 struct replay_opts *opts, int final_fixup)
1715 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1716 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(the_repository);
1717 struct object_id head;
1718 struct commit *base, *next, *parent;
1719 const char *base_label, *next_label;
1720 char *author = NULL;
1721 struct commit_message msg = { NULL, NULL, NULL, NULL };
1722 struct strbuf msgbuf = STRBUF_INIT;
1723 int res, unborn = 0, allow;
1725 if (opts->no_commit) {
1727 * We do not intend to commit immediately. We just want to
1728 * merge the differences in, so let's compute the tree
1729 * that represents the "current" state for merge-recursive
1730 * to work on.
1732 if (write_index_as_tree(&head, &the_index, get_index_file(), 0, NULL))
1733 return error(_("your index file is unmerged."));
1734 } else {
1735 unborn = get_oid("HEAD", &head);
1736 /* Do we want to generate a root commit? */
1737 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1738 oideq(&head, &opts->squash_onto)) {
1739 if (is_fixup(command))
1740 return error(_("cannot fixup root commit"));
1741 flags |= CREATE_ROOT_COMMIT;
1742 unborn = 1;
1743 } else if (unborn)
1744 oidcpy(&head, the_hash_algo->empty_tree);
1745 if (index_differs_from(unborn ? empty_tree_oid_hex() : "HEAD",
1746 NULL, 0))
1747 return error_dirty_index(opts);
1749 discard_cache();
1751 if (!commit->parents)
1752 parent = NULL;
1753 else if (commit->parents->next) {
1754 /* Reverting or cherry-picking a merge commit */
1755 int cnt;
1756 struct commit_list *p;
1758 if (!opts->mainline)
1759 return error(_("commit %s is a merge but no -m option was given."),
1760 oid_to_hex(&commit->object.oid));
1762 for (cnt = 1, p = commit->parents;
1763 cnt != opts->mainline && p;
1764 cnt++)
1765 p = p->next;
1766 if (cnt != opts->mainline || !p)
1767 return error(_("commit %s does not have parent %d"),
1768 oid_to_hex(&commit->object.oid), opts->mainline);
1769 parent = p->item;
1770 } else if (0 < opts->mainline)
1771 return error(_("mainline was specified but commit %s is not a merge."),
1772 oid_to_hex(&commit->object.oid));
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(&commit->object.oid, &head, unborn,
1786 opts);
1787 if (res || command != TODO_REWORD)
1788 goto leave;
1789 flags |= EDIT_MSG | AMEND_MSG | VERIFY_MSG;
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 flags |= EDIT_MSG | VERIFY_MSG;
1848 else if (is_fixup(command)) {
1849 if (update_squash_messages(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(the_repository);
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(the_repository));
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(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(the_repository), 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(the_repository), 0);
1889 commit_list_insert(base, &common);
1890 commit_list_insert(next, &remotes);
1891 res |= try_merge_command(the_repository, 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(res == 1, opts);
1920 repo_rerere(the_repository, opts->allow_rerere_auto);
1921 goto leave;
1924 allow = allow_empty(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 fast_forward_edit:
1932 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1933 res = do_commit(msg_file, author, opts, flags);
1934 else
1935 res = error(_("unable to parse commit author"));
1938 if (!res && final_fixup) {
1939 unlink(rebase_path_fixup_msg());
1940 unlink(rebase_path_squash_msg());
1941 unlink(rebase_path_current_fixups());
1942 strbuf_reset(&opts->current_fixups);
1943 opts->current_fixup_count = 0;
1946 leave:
1947 free_message(commit, &msg);
1948 free(author);
1949 update_abort_safety_file();
1951 return res;
1954 static int prepare_revs(struct replay_opts *opts)
1957 * picking (but not reverting) ranges (but not individual revisions)
1958 * should be done in reverse
1960 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1961 opts->revs->reverse ^= 1;
1963 if (prepare_revision_walk(opts->revs))
1964 return error(_("revision walk setup failed"));
1966 return 0;
1969 static int read_and_refresh_cache(struct replay_opts *opts)
1971 struct lock_file index_lock = LOCK_INIT;
1972 int index_fd = hold_locked_index(&index_lock, 0);
1973 if (read_index(&the_index) < 0) {
1974 rollback_lock_file(&index_lock);
1975 return error(_("git %s: failed to read the index"),
1976 _(action_name(opts)));
1978 refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
1979 if (index_fd >= 0) {
1980 if (write_locked_index(&the_index, &index_lock,
1981 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
1982 return error(_("git %s: failed to refresh the index"),
1983 _(action_name(opts)));
1986 return 0;
1989 enum todo_item_flags {
1990 TODO_EDIT_MERGE_MSG = 1
1993 struct todo_item {
1994 enum todo_command command;
1995 struct commit *commit;
1996 unsigned int flags;
1997 const char *arg;
1998 int arg_len;
1999 size_t offset_in_buf;
2002 struct todo_list {
2003 struct strbuf buf;
2004 struct todo_item *items;
2005 int nr, alloc, current;
2006 int done_nr, total_nr;
2007 struct stat_data stat;
2010 #define TODO_LIST_INIT { STRBUF_INIT }
2012 static void todo_list_release(struct todo_list *todo_list)
2014 strbuf_release(&todo_list->buf);
2015 FREE_AND_NULL(todo_list->items);
2016 todo_list->nr = todo_list->alloc = 0;
2019 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2021 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2022 return todo_list->items + todo_list->nr++;
2025 static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
2027 struct object_id commit_oid;
2028 char *end_of_object_name;
2029 int i, saved, status, padding;
2031 item->flags = 0;
2033 /* left-trim */
2034 bol += strspn(bol, " \t");
2036 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2037 item->command = TODO_COMMENT;
2038 item->commit = NULL;
2039 item->arg = bol;
2040 item->arg_len = eol - bol;
2041 return 0;
2044 for (i = 0; i < TODO_COMMENT; i++)
2045 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
2046 item->command = i;
2047 break;
2048 } else if ((bol + 1 == eol || bol[1] == ' ') &&
2049 *bol == todo_command_info[i].c) {
2050 bol++;
2051 item->command = i;
2052 break;
2054 if (i >= TODO_COMMENT)
2055 return -1;
2057 /* Eat up extra spaces/ tabs before object name */
2058 padding = strspn(bol, " \t");
2059 bol += padding;
2061 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2062 if (bol != eol)
2063 return error(_("%s does not accept arguments: '%s'"),
2064 command_to_string(item->command), bol);
2065 item->commit = NULL;
2066 item->arg = bol;
2067 item->arg_len = eol - bol;
2068 return 0;
2071 if (!padding)
2072 return error(_("missing arguments for %s"),
2073 command_to_string(item->command));
2075 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2076 item->command == TODO_RESET) {
2077 item->commit = NULL;
2078 item->arg = bol;
2079 item->arg_len = (int)(eol - bol);
2080 return 0;
2083 if (item->command == TODO_MERGE) {
2084 if (skip_prefix(bol, "-C", &bol))
2085 bol += strspn(bol, " \t");
2086 else if (skip_prefix(bol, "-c", &bol)) {
2087 bol += strspn(bol, " \t");
2088 item->flags |= TODO_EDIT_MERGE_MSG;
2089 } else {
2090 item->flags |= TODO_EDIT_MERGE_MSG;
2091 item->commit = NULL;
2092 item->arg = bol;
2093 item->arg_len = (int)(eol - bol);
2094 return 0;
2098 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2099 saved = *end_of_object_name;
2100 *end_of_object_name = '\0';
2101 status = get_oid(bol, &commit_oid);
2102 *end_of_object_name = saved;
2104 item->arg = end_of_object_name + strspn(end_of_object_name, " \t");
2105 item->arg_len = (int)(eol - item->arg);
2107 if (status < 0)
2108 return -1;
2110 item->commit = lookup_commit_reference(the_repository, &commit_oid);
2111 return !item->commit;
2114 static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
2116 struct todo_item *item;
2117 char *p = buf, *next_p;
2118 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2120 for (i = 1; *p; i++, p = next_p) {
2121 char *eol = strchrnul(p, '\n');
2123 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2125 if (p != eol && eol[-1] == '\r')
2126 eol--; /* strip Carriage Return */
2128 item = append_new_todo(todo_list);
2129 item->offset_in_buf = p - todo_list->buf.buf;
2130 if (parse_insn_line(item, p, eol)) {
2131 res = error(_("invalid line %d: %.*s"),
2132 i, (int)(eol - p), p);
2133 item->command = TODO_NOOP;
2136 if (fixup_okay)
2137 ; /* do nothing */
2138 else if (is_fixup(item->command))
2139 return error(_("cannot '%s' without a previous commit"),
2140 command_to_string(item->command));
2141 else if (!is_noop(item->command))
2142 fixup_okay = 1;
2145 return res;
2148 static int count_commands(struct todo_list *todo_list)
2150 int count = 0, i;
2152 for (i = 0; i < todo_list->nr; i++)
2153 if (todo_list->items[i].command != TODO_COMMENT)
2154 count++;
2156 return count;
2159 static int get_item_line_offset(struct todo_list *todo_list, int index)
2161 return index < todo_list->nr ?
2162 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2165 static const char *get_item_line(struct todo_list *todo_list, int index)
2167 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2170 static int get_item_line_length(struct todo_list *todo_list, int index)
2172 return get_item_line_offset(todo_list, index + 1)
2173 - get_item_line_offset(todo_list, index);
2176 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2178 int fd;
2179 ssize_t len;
2181 fd = open(path, O_RDONLY);
2182 if (fd < 0)
2183 return error_errno(_("could not open '%s'"), path);
2184 len = strbuf_read(sb, fd, 0);
2185 close(fd);
2186 if (len < 0)
2187 return error(_("could not read '%s'."), path);
2188 return len;
2191 static int read_populate_todo(struct todo_list *todo_list,
2192 struct replay_opts *opts)
2194 struct stat st;
2195 const char *todo_file = get_todo_path(opts);
2196 int res;
2198 strbuf_reset(&todo_list->buf);
2199 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2200 return -1;
2202 res = stat(todo_file, &st);
2203 if (res)
2204 return error(_("could not stat '%s'"), todo_file);
2205 fill_stat_data(&todo_list->stat, &st);
2207 res = parse_insn_buffer(todo_list->buf.buf, todo_list);
2208 if (res) {
2209 if (is_rebase_i(opts))
2210 return error(_("please fix this using "
2211 "'git rebase --edit-todo'."));
2212 return error(_("unusable instruction sheet: '%s'"), todo_file);
2215 if (!todo_list->nr &&
2216 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2217 return error(_("no commits parsed."));
2219 if (!is_rebase_i(opts)) {
2220 enum todo_command valid =
2221 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2222 int i;
2224 for (i = 0; i < todo_list->nr; i++)
2225 if (valid == todo_list->items[i].command)
2226 continue;
2227 else if (valid == TODO_PICK)
2228 return error(_("cannot cherry-pick during a revert."));
2229 else
2230 return error(_("cannot revert during a cherry-pick."));
2233 if (is_rebase_i(opts)) {
2234 struct todo_list done = TODO_LIST_INIT;
2235 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2237 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2238 !parse_insn_buffer(done.buf.buf, &done))
2239 todo_list->done_nr = count_commands(&done);
2240 else
2241 todo_list->done_nr = 0;
2243 todo_list->total_nr = todo_list->done_nr
2244 + count_commands(todo_list);
2245 todo_list_release(&done);
2247 if (f) {
2248 fprintf(f, "%d\n", todo_list->total_nr);
2249 fclose(f);
2253 return 0;
2256 static int git_config_string_dup(char **dest,
2257 const char *var, const char *value)
2259 if (!value)
2260 return config_error_nonbool(var);
2261 free(*dest);
2262 *dest = xstrdup(value);
2263 return 0;
2266 static int populate_opts_cb(const char *key, const char *value, void *data)
2268 struct replay_opts *opts = data;
2269 int error_flag = 1;
2271 if (!value)
2272 error_flag = 0;
2273 else if (!strcmp(key, "options.no-commit"))
2274 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2275 else if (!strcmp(key, "options.edit"))
2276 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2277 else if (!strcmp(key, "options.signoff"))
2278 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2279 else if (!strcmp(key, "options.record-origin"))
2280 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2281 else if (!strcmp(key, "options.allow-ff"))
2282 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2283 else if (!strcmp(key, "options.mainline"))
2284 opts->mainline = git_config_int(key, value);
2285 else if (!strcmp(key, "options.strategy"))
2286 git_config_string_dup(&opts->strategy, key, value);
2287 else if (!strcmp(key, "options.gpg-sign"))
2288 git_config_string_dup(&opts->gpg_sign, key, value);
2289 else if (!strcmp(key, "options.strategy-option")) {
2290 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2291 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2292 } else if (!strcmp(key, "options.allow-rerere-auto"))
2293 opts->allow_rerere_auto =
2294 git_config_bool_or_int(key, value, &error_flag) ?
2295 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2296 else
2297 return error(_("invalid key: %s"), key);
2299 if (!error_flag)
2300 return error(_("invalid value for %s: %s"), key, value);
2302 return 0;
2305 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2307 int i;
2308 char *strategy_opts_string = raw_opts;
2310 if (*strategy_opts_string == ' ')
2311 strategy_opts_string++;
2313 opts->xopts_nr = split_cmdline(strategy_opts_string,
2314 (const char ***)&opts->xopts);
2315 for (i = 0; i < opts->xopts_nr; i++) {
2316 const char *arg = opts->xopts[i];
2318 skip_prefix(arg, "--", &arg);
2319 opts->xopts[i] = xstrdup(arg);
2323 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2325 strbuf_reset(buf);
2326 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2327 return;
2328 opts->strategy = strbuf_detach(buf, NULL);
2329 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2330 return;
2332 parse_strategy_opts(opts, buf->buf);
2335 static int read_populate_opts(struct replay_opts *opts)
2337 if (is_rebase_i(opts)) {
2338 struct strbuf buf = STRBUF_INIT;
2340 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2341 if (!starts_with(buf.buf, "-S"))
2342 strbuf_reset(&buf);
2343 else {
2344 free(opts->gpg_sign);
2345 opts->gpg_sign = xstrdup(buf.buf + 2);
2347 strbuf_reset(&buf);
2350 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2351 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2352 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2353 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2354 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2355 strbuf_reset(&buf);
2358 if (file_exists(rebase_path_verbose()))
2359 opts->verbose = 1;
2361 if (file_exists(rebase_path_signoff())) {
2362 opts->allow_ff = 0;
2363 opts->signoff = 1;
2366 if (file_exists(rebase_path_reschedule_failed_exec()))
2367 opts->reschedule_failed_exec = 1;
2369 read_strategy_opts(opts, &buf);
2370 strbuf_release(&buf);
2372 if (read_oneliner(&opts->current_fixups,
2373 rebase_path_current_fixups(), 1)) {
2374 const char *p = opts->current_fixups.buf;
2375 opts->current_fixup_count = 1;
2376 while ((p = strchr(p, '\n'))) {
2377 opts->current_fixup_count++;
2378 p++;
2382 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2383 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2384 return error(_("unusable squash-onto"));
2385 opts->have_squash_onto = 1;
2388 return 0;
2391 if (!file_exists(git_path_opts_file()))
2392 return 0;
2394 * The function git_parse_source(), called from git_config_from_file(),
2395 * may die() in case of a syntactically incorrect file. We do not care
2396 * about this case, though, because we wrote that file ourselves, so we
2397 * are pretty certain that it is syntactically correct.
2399 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2400 return error(_("malformed options sheet: '%s'"),
2401 git_path_opts_file());
2402 return 0;
2405 static void write_strategy_opts(struct replay_opts *opts)
2407 int i;
2408 struct strbuf buf = STRBUF_INIT;
2410 for (i = 0; i < opts->xopts_nr; ++i)
2411 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2413 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2414 strbuf_release(&buf);
2417 int write_basic_state(struct replay_opts *opts, const char *head_name,
2418 const char *onto, const char *orig_head)
2420 const char *quiet = getenv("GIT_QUIET");
2422 if (head_name)
2423 write_file(rebase_path_head_name(), "%s\n", head_name);
2424 if (onto)
2425 write_file(rebase_path_onto(), "%s\n", onto);
2426 if (orig_head)
2427 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2429 if (quiet)
2430 write_file(rebase_path_quiet(), "%s\n", quiet);
2431 else
2432 write_file(rebase_path_quiet(), "\n");
2434 if (opts->verbose)
2435 write_file(rebase_path_verbose(), "%s", "");
2436 if (opts->strategy)
2437 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2438 if (opts->xopts_nr > 0)
2439 write_strategy_opts(opts);
2441 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2442 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2443 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2444 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2446 if (opts->gpg_sign)
2447 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2448 if (opts->signoff)
2449 write_file(rebase_path_signoff(), "--signoff\n");
2450 if (opts->reschedule_failed_exec)
2451 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
2453 return 0;
2456 static int walk_revs_populate_todo(struct todo_list *todo_list,
2457 struct replay_opts *opts)
2459 enum todo_command command = opts->action == REPLAY_PICK ?
2460 TODO_PICK : TODO_REVERT;
2461 const char *command_string = todo_command_info[command].str;
2462 struct commit *commit;
2464 if (prepare_revs(opts))
2465 return -1;
2467 while ((commit = get_revision(opts->revs))) {
2468 struct todo_item *item = append_new_todo(todo_list);
2469 const char *commit_buffer = get_commit_buffer(commit, NULL);
2470 const char *subject;
2471 int subject_len;
2473 item->command = command;
2474 item->commit = commit;
2475 item->arg = NULL;
2476 item->arg_len = 0;
2477 item->offset_in_buf = todo_list->buf.len;
2478 subject_len = find_commit_subject(commit_buffer, &subject);
2479 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2480 short_commit_name(commit), subject_len, subject);
2481 unuse_commit_buffer(commit, commit_buffer);
2484 if (!todo_list->nr)
2485 return error(_("empty commit set passed"));
2487 return 0;
2490 static int create_seq_dir(void)
2492 if (file_exists(git_path_seq_dir())) {
2493 error(_("a cherry-pick or revert is already in progress"));
2494 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2495 return -1;
2496 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2497 return error_errno(_("could not create sequencer directory '%s'"),
2498 git_path_seq_dir());
2499 return 0;
2502 static int save_head(const char *head)
2504 struct lock_file head_lock = LOCK_INIT;
2505 struct strbuf buf = STRBUF_INIT;
2506 int fd;
2507 ssize_t written;
2509 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2510 if (fd < 0)
2511 return error_errno(_("could not lock HEAD"));
2512 strbuf_addf(&buf, "%s\n", head);
2513 written = write_in_full(fd, buf.buf, buf.len);
2514 strbuf_release(&buf);
2515 if (written < 0) {
2516 error_errno(_("could not write to '%s'"), git_path_head_file());
2517 rollback_lock_file(&head_lock);
2518 return -1;
2520 if (commit_lock_file(&head_lock) < 0)
2521 return error(_("failed to finalize '%s'"), git_path_head_file());
2522 return 0;
2525 static int rollback_is_safe(void)
2527 struct strbuf sb = STRBUF_INIT;
2528 struct object_id expected_head, actual_head;
2530 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2531 strbuf_trim(&sb);
2532 if (get_oid_hex(sb.buf, &expected_head)) {
2533 strbuf_release(&sb);
2534 die(_("could not parse %s"), git_path_abort_safety_file());
2536 strbuf_release(&sb);
2538 else if (errno == ENOENT)
2539 oidclr(&expected_head);
2540 else
2541 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2543 if (get_oid("HEAD", &actual_head))
2544 oidclr(&actual_head);
2546 return oideq(&actual_head, &expected_head);
2549 static int reset_for_rollback(const struct object_id *oid)
2551 const char *argv[4]; /* reset --merge <arg> + NULL */
2553 argv[0] = "reset";
2554 argv[1] = "--merge";
2555 argv[2] = oid_to_hex(oid);
2556 argv[3] = NULL;
2557 return run_command_v_opt(argv, RUN_GIT_CMD);
2560 static int rollback_single_pick(void)
2562 struct object_id head_oid;
2564 if (!file_exists(git_path_cherry_pick_head(the_repository)) &&
2565 !file_exists(git_path_revert_head(the_repository)))
2566 return error(_("no cherry-pick or revert in progress"));
2567 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2568 return error(_("cannot resolve HEAD"));
2569 if (is_null_oid(&head_oid))
2570 return error(_("cannot abort from a branch yet to be born"));
2571 return reset_for_rollback(&head_oid);
2574 int sequencer_rollback(struct replay_opts *opts)
2576 FILE *f;
2577 struct object_id oid;
2578 struct strbuf buf = STRBUF_INIT;
2579 const char *p;
2581 f = fopen(git_path_head_file(), "r");
2582 if (!f && errno == ENOENT) {
2584 * There is no multiple-cherry-pick in progress.
2585 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2586 * a single-cherry-pick in progress, abort that.
2588 return rollback_single_pick();
2590 if (!f)
2591 return error_errno(_("cannot open '%s'"), git_path_head_file());
2592 if (strbuf_getline_lf(&buf, f)) {
2593 error(_("cannot read '%s': %s"), git_path_head_file(),
2594 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2595 fclose(f);
2596 goto fail;
2598 fclose(f);
2599 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2600 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2601 git_path_head_file());
2602 goto fail;
2604 if (is_null_oid(&oid)) {
2605 error(_("cannot abort from a branch yet to be born"));
2606 goto fail;
2609 if (!rollback_is_safe()) {
2610 /* Do not error, just do not rollback */
2611 warning(_("You seem to have moved HEAD. "
2612 "Not rewinding, check your HEAD!"));
2613 } else
2614 if (reset_for_rollback(&oid))
2615 goto fail;
2616 strbuf_release(&buf);
2617 return sequencer_remove_state(opts);
2618 fail:
2619 strbuf_release(&buf);
2620 return -1;
2623 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2625 struct lock_file todo_lock = LOCK_INIT;
2626 const char *todo_path = get_todo_path(opts);
2627 int next = todo_list->current, offset, fd;
2630 * rebase -i writes "git-rebase-todo" without the currently executing
2631 * command, appending it to "done" instead.
2633 if (is_rebase_i(opts))
2634 next++;
2636 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2637 if (fd < 0)
2638 return error_errno(_("could not lock '%s'"), todo_path);
2639 offset = get_item_line_offset(todo_list, next);
2640 if (write_in_full(fd, todo_list->buf.buf + offset,
2641 todo_list->buf.len - offset) < 0)
2642 return error_errno(_("could not write to '%s'"), todo_path);
2643 if (commit_lock_file(&todo_lock) < 0)
2644 return error(_("failed to finalize '%s'"), todo_path);
2646 if (is_rebase_i(opts) && next > 0) {
2647 const char *done = rebase_path_done();
2648 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2649 int ret = 0;
2651 if (fd < 0)
2652 return 0;
2653 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2654 get_item_line_length(todo_list, next - 1))
2655 < 0)
2656 ret = error_errno(_("could not write to '%s'"), done);
2657 if (close(fd) < 0)
2658 ret = error_errno(_("failed to finalize '%s'"), done);
2659 return ret;
2661 return 0;
2664 static int save_opts(struct replay_opts *opts)
2666 const char *opts_file = git_path_opts_file();
2667 int res = 0;
2669 if (opts->no_commit)
2670 res |= git_config_set_in_file_gently(opts_file, "options.no-commit", "true");
2671 if (opts->edit)
2672 res |= git_config_set_in_file_gently(opts_file, "options.edit", "true");
2673 if (opts->signoff)
2674 res |= git_config_set_in_file_gently(opts_file, "options.signoff", "true");
2675 if (opts->record_origin)
2676 res |= git_config_set_in_file_gently(opts_file, "options.record-origin", "true");
2677 if (opts->allow_ff)
2678 res |= git_config_set_in_file_gently(opts_file, "options.allow-ff", "true");
2679 if (opts->mainline) {
2680 struct strbuf buf = STRBUF_INIT;
2681 strbuf_addf(&buf, "%d", opts->mainline);
2682 res |= git_config_set_in_file_gently(opts_file, "options.mainline", buf.buf);
2683 strbuf_release(&buf);
2685 if (opts->strategy)
2686 res |= git_config_set_in_file_gently(opts_file, "options.strategy", opts->strategy);
2687 if (opts->gpg_sign)
2688 res |= git_config_set_in_file_gently(opts_file, "options.gpg-sign", opts->gpg_sign);
2689 if (opts->xopts) {
2690 int i;
2691 for (i = 0; i < opts->xopts_nr; i++)
2692 res |= git_config_set_multivar_in_file_gently(opts_file,
2693 "options.strategy-option",
2694 opts->xopts[i], "^$", 0);
2696 if (opts->allow_rerere_auto)
2697 res |= git_config_set_in_file_gently(opts_file, "options.allow-rerere-auto",
2698 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2699 "true" : "false");
2700 return res;
2703 static int make_patch(struct commit *commit, struct replay_opts *opts)
2705 struct strbuf buf = STRBUF_INIT;
2706 struct rev_info log_tree_opt;
2707 const char *subject, *p;
2708 int res = 0;
2710 p = short_commit_name(commit);
2711 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2712 return -1;
2713 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2714 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2715 res |= error(_("could not update %s"), "REBASE_HEAD");
2717 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2718 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2719 repo_init_revisions(the_repository, &log_tree_opt, NULL);
2720 log_tree_opt.abbrev = 0;
2721 log_tree_opt.diff = 1;
2722 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2723 log_tree_opt.disable_stdin = 1;
2724 log_tree_opt.no_commit_id = 1;
2725 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2726 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2727 if (!log_tree_opt.diffopt.file)
2728 res |= error_errno(_("could not open '%s'"), buf.buf);
2729 else {
2730 res |= log_tree_commit(&log_tree_opt, commit);
2731 fclose(log_tree_opt.diffopt.file);
2733 strbuf_reset(&buf);
2735 strbuf_addf(&buf, "%s/message", get_dir(opts));
2736 if (!file_exists(buf.buf)) {
2737 const char *commit_buffer = get_commit_buffer(commit, NULL);
2738 find_commit_subject(commit_buffer, &subject);
2739 res |= write_message(subject, strlen(subject), buf.buf, 1);
2740 unuse_commit_buffer(commit, commit_buffer);
2742 strbuf_release(&buf);
2744 return res;
2747 static int intend_to_amend(void)
2749 struct object_id head;
2750 char *p;
2752 if (get_oid("HEAD", &head))
2753 return error(_("cannot read HEAD"));
2755 p = oid_to_hex(&head);
2756 return write_message(p, strlen(p), rebase_path_amend(), 1);
2759 static int error_with_patch(struct commit *commit,
2760 const char *subject, int subject_len,
2761 struct replay_opts *opts, int exit_code, int to_amend)
2763 if (commit) {
2764 if (make_patch(commit, opts))
2765 return -1;
2766 } else if (copy_file(rebase_path_message(),
2767 git_path_merge_msg(the_repository), 0666))
2768 return error(_("unable to copy '%s' to '%s'"),
2769 git_path_merge_msg(the_repository), rebase_path_message());
2771 if (to_amend) {
2772 if (intend_to_amend())
2773 return -1;
2775 fprintf(stderr,
2776 _("You can amend the commit now, with\n"
2777 "\n"
2778 " git commit --amend %s\n"
2779 "\n"
2780 "Once you are satisfied with your changes, run\n"
2781 "\n"
2782 " git rebase --continue\n"),
2783 gpg_sign_opt_quoted(opts));
2784 } else if (exit_code) {
2785 if (commit)
2786 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
2787 short_commit_name(commit), subject_len, subject);
2788 else
2790 * We don't have the hash of the parent so
2791 * just print the line from the todo file.
2793 fprintf_ln(stderr, _("Could not merge %.*s"),
2794 subject_len, subject);
2797 return exit_code;
2800 static int error_failed_squash(struct commit *commit,
2801 struct replay_opts *opts, int subject_len, const char *subject)
2803 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
2804 return error(_("could not copy '%s' to '%s'"),
2805 rebase_path_squash_msg(), rebase_path_message());
2806 unlink(git_path_merge_msg(the_repository));
2807 if (copy_file(git_path_merge_msg(the_repository), rebase_path_message(), 0666))
2808 return error(_("could not copy '%s' to '%s'"),
2809 rebase_path_message(),
2810 git_path_merge_msg(the_repository));
2811 return error_with_patch(commit, subject, subject_len, opts, 1, 0);
2814 static int do_exec(const char *command_line)
2816 struct argv_array child_env = ARGV_ARRAY_INIT;
2817 const char *child_argv[] = { NULL, NULL };
2818 int dirty, status;
2820 fprintf(stderr, "Executing: %s\n", command_line);
2821 child_argv[0] = command_line;
2822 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
2823 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
2824 absolute_path(get_git_work_tree()));
2825 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
2826 child_env.argv);
2828 /* force re-reading of the cache */
2829 if (discard_cache() < 0 || read_cache() < 0)
2830 return error(_("could not read index"));
2832 dirty = require_clean_work_tree("rebase", NULL, 1, 1);
2834 if (status) {
2835 warning(_("execution failed: %s\n%s"
2836 "You can fix the problem, and then run\n"
2837 "\n"
2838 " git rebase --continue\n"
2839 "\n"),
2840 command_line,
2841 dirty ? N_("and made changes to the index and/or the "
2842 "working tree\n") : "");
2843 if (status == 127)
2844 /* command not found */
2845 status = 1;
2846 } else if (dirty) {
2847 warning(_("execution succeeded: %s\nbut "
2848 "left changes to the index and/or the working tree\n"
2849 "Commit or stash your changes, and then run\n"
2850 "\n"
2851 " git rebase --continue\n"
2852 "\n"), command_line);
2853 status = 1;
2856 argv_array_clear(&child_env);
2858 return status;
2861 static int safe_append(const char *filename, const char *fmt, ...)
2863 va_list ap;
2864 struct lock_file lock = LOCK_INIT;
2865 int fd = hold_lock_file_for_update(&lock, filename,
2866 LOCK_REPORT_ON_ERROR);
2867 struct strbuf buf = STRBUF_INIT;
2869 if (fd < 0)
2870 return -1;
2872 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
2873 error_errno(_("could not read '%s'"), filename);
2874 rollback_lock_file(&lock);
2875 return -1;
2877 strbuf_complete(&buf, '\n');
2878 va_start(ap, fmt);
2879 strbuf_vaddf(&buf, fmt, ap);
2880 va_end(ap);
2882 if (write_in_full(fd, buf.buf, buf.len) < 0) {
2883 error_errno(_("could not write to '%s'"), filename);
2884 strbuf_release(&buf);
2885 rollback_lock_file(&lock);
2886 return -1;
2888 if (commit_lock_file(&lock) < 0) {
2889 strbuf_release(&buf);
2890 rollback_lock_file(&lock);
2891 return error(_("failed to finalize '%s'"), filename);
2894 strbuf_release(&buf);
2895 return 0;
2898 static int do_label(const char *name, int len)
2900 struct ref_store *refs = get_main_ref_store(the_repository);
2901 struct ref_transaction *transaction;
2902 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
2903 struct strbuf msg = STRBUF_INIT;
2904 int ret = 0;
2905 struct object_id head_oid;
2907 if (len == 1 && *name == '#')
2908 return error(_("illegal label name: '%.*s'"), len, name);
2910 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
2911 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
2913 transaction = ref_store_transaction_begin(refs, &err);
2914 if (!transaction) {
2915 error("%s", err.buf);
2916 ret = -1;
2917 } else if (get_oid("HEAD", &head_oid)) {
2918 error(_("could not read HEAD"));
2919 ret = -1;
2920 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
2921 NULL, 0, msg.buf, &err) < 0 ||
2922 ref_transaction_commit(transaction, &err)) {
2923 error("%s", err.buf);
2924 ret = -1;
2926 ref_transaction_free(transaction);
2927 strbuf_release(&err);
2928 strbuf_release(&msg);
2930 if (!ret)
2931 ret = safe_append(rebase_path_refs_to_delete(),
2932 "%s\n", ref_name.buf);
2933 strbuf_release(&ref_name);
2935 return ret;
2938 static const char *reflog_message(struct replay_opts *opts,
2939 const char *sub_action, const char *fmt, ...);
2941 static int do_reset(const char *name, int len, struct replay_opts *opts)
2943 struct strbuf ref_name = STRBUF_INIT;
2944 struct object_id oid;
2945 struct lock_file lock = LOCK_INIT;
2946 struct tree_desc desc;
2947 struct tree *tree;
2948 struct unpack_trees_options unpack_tree_opts;
2949 int ret = 0;
2951 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0)
2952 return -1;
2954 if (len == 10 && !strncmp("[new root]", name, len)) {
2955 if (!opts->have_squash_onto) {
2956 const char *hex;
2957 if (commit_tree("", 0, the_hash_algo->empty_tree,
2958 NULL, &opts->squash_onto,
2959 NULL, NULL))
2960 return error(_("writing fake root commit"));
2961 opts->have_squash_onto = 1;
2962 hex = oid_to_hex(&opts->squash_onto);
2963 if (write_message(hex, strlen(hex),
2964 rebase_path_squash_onto(), 0))
2965 return error(_("writing squash-onto"));
2967 oidcpy(&oid, &opts->squash_onto);
2968 } else {
2969 int i;
2971 /* Determine the length of the label */
2972 for (i = 0; i < len; i++)
2973 if (isspace(name[i]))
2974 break;
2975 len = i;
2977 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
2978 if (get_oid(ref_name.buf, &oid) &&
2979 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
2980 error(_("could not read '%s'"), ref_name.buf);
2981 rollback_lock_file(&lock);
2982 strbuf_release(&ref_name);
2983 return -1;
2987 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
2988 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
2989 unpack_tree_opts.head_idx = 1;
2990 unpack_tree_opts.src_index = &the_index;
2991 unpack_tree_opts.dst_index = &the_index;
2992 unpack_tree_opts.fn = oneway_merge;
2993 unpack_tree_opts.merge = 1;
2994 unpack_tree_opts.update = 1;
2996 if (read_cache_unmerged()) {
2997 rollback_lock_file(&lock);
2998 strbuf_release(&ref_name);
2999 return error_resolve_conflict(_(action_name(opts)));
3002 if (!fill_tree_descriptor(&desc, &oid)) {
3003 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3004 rollback_lock_file(&lock);
3005 free((void *)desc.buffer);
3006 strbuf_release(&ref_name);
3007 return -1;
3010 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3011 rollback_lock_file(&lock);
3012 free((void *)desc.buffer);
3013 strbuf_release(&ref_name);
3014 return -1;
3017 tree = parse_tree_indirect(&oid);
3018 prime_cache_tree(&the_index, tree);
3020 if (write_locked_index(&the_index, &lock, COMMIT_LOCK) < 0)
3021 ret = error(_("could not write index"));
3022 free((void *)desc.buffer);
3024 if (!ret)
3025 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3026 len, name), "HEAD", &oid,
3027 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3029 strbuf_release(&ref_name);
3030 return ret;
3033 static struct commit *lookup_label(const char *label, int len,
3034 struct strbuf *buf)
3036 struct commit *commit;
3038 strbuf_reset(buf);
3039 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3040 commit = lookup_commit_reference_by_name(buf->buf);
3041 if (!commit) {
3042 /* fall back to non-rewritten ref or commit */
3043 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3044 commit = lookup_commit_reference_by_name(buf->buf);
3047 if (!commit)
3048 error(_("could not resolve '%s'"), buf->buf);
3050 return commit;
3053 static int do_merge(struct commit *commit, const char *arg, int arg_len,
3054 int flags, struct replay_opts *opts)
3056 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3057 EDIT_MSG | VERIFY_MSG : 0;
3058 struct strbuf ref_name = STRBUF_INIT;
3059 struct commit *head_commit, *merge_commit, *i;
3060 struct commit_list *bases, *j, *reversed = NULL;
3061 struct commit_list *to_merge = NULL, **tail = &to_merge;
3062 struct merge_options o;
3063 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3064 static struct lock_file lock;
3065 const char *p;
3067 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
3068 ret = -1;
3069 goto leave_merge;
3072 head_commit = lookup_commit_reference_by_name("HEAD");
3073 if (!head_commit) {
3074 ret = error(_("cannot merge without a current revision"));
3075 goto leave_merge;
3079 * For octopus merges, the arg starts with the list of revisions to be
3080 * merged. The list is optionally followed by '#' and the oneline.
3082 merge_arg_len = oneline_offset = arg_len;
3083 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3084 if (!*p)
3085 break;
3086 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3087 p += 1 + strspn(p + 1, " \t\n");
3088 oneline_offset = p - arg;
3089 break;
3091 k = strcspn(p, " \t\n");
3092 if (!k)
3093 continue;
3094 merge_commit = lookup_label(p, k, &ref_name);
3095 if (!merge_commit) {
3096 ret = error(_("unable to parse '%.*s'"), k, p);
3097 goto leave_merge;
3099 tail = &commit_list_insert(merge_commit, tail)->next;
3100 p += k;
3101 merge_arg_len = p - arg;
3104 if (!to_merge) {
3105 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3106 goto leave_merge;
3109 if (opts->have_squash_onto &&
3110 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3112 * When the user tells us to "merge" something into a
3113 * "[new root]", let's simply fast-forward to the merge head.
3115 rollback_lock_file(&lock);
3116 if (to_merge->next)
3117 ret = error(_("octopus merge cannot be executed on "
3118 "top of a [new root]"));
3119 else
3120 ret = fast_forward_to(&to_merge->item->object.oid,
3121 &head_commit->object.oid, 0,
3122 opts);
3123 goto leave_merge;
3126 if (commit) {
3127 const char *message = get_commit_buffer(commit, NULL);
3128 const char *body;
3129 int len;
3131 if (!message) {
3132 ret = error(_("could not get commit message of '%s'"),
3133 oid_to_hex(&commit->object.oid));
3134 goto leave_merge;
3136 write_author_script(message);
3137 find_commit_subject(message, &body);
3138 len = strlen(body);
3139 ret = write_message(body, len, git_path_merge_msg(the_repository), 0);
3140 unuse_commit_buffer(commit, message);
3141 if (ret) {
3142 error_errno(_("could not write '%s'"),
3143 git_path_merge_msg(the_repository));
3144 goto leave_merge;
3146 } else {
3147 struct strbuf buf = STRBUF_INIT;
3148 int len;
3150 strbuf_addf(&buf, "author %s", git_author_info(0));
3151 write_author_script(buf.buf);
3152 strbuf_reset(&buf);
3154 if (oneline_offset < arg_len) {
3155 p = arg + oneline_offset;
3156 len = arg_len - oneline_offset;
3157 } else {
3158 strbuf_addf(&buf, "Merge %s '%.*s'",
3159 to_merge->next ? "branches" : "branch",
3160 merge_arg_len, arg);
3161 p = buf.buf;
3162 len = buf.len;
3165 ret = write_message(p, len, git_path_merge_msg(the_repository), 0);
3166 strbuf_release(&buf);
3167 if (ret) {
3168 error_errno(_("could not write '%s'"),
3169 git_path_merge_msg(the_repository));
3170 goto leave_merge;
3175 * If HEAD is not identical to the first parent of the original merge
3176 * commit, we cannot fast-forward.
3178 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3179 oideq(&commit->parents->item->object.oid,
3180 &head_commit->object.oid);
3183 * If any merge head is different from the original one, we cannot
3184 * fast-forward.
3186 if (can_fast_forward) {
3187 struct commit_list *p = commit->parents->next;
3189 for (j = to_merge; j && p; j = j->next, p = p->next)
3190 if (!oideq(&j->item->object.oid,
3191 &p->item->object.oid)) {
3192 can_fast_forward = 0;
3193 break;
3196 * If the number of merge heads differs from the original merge
3197 * commit, we cannot fast-forward.
3199 if (j || p)
3200 can_fast_forward = 0;
3203 if (can_fast_forward) {
3204 rollback_lock_file(&lock);
3205 ret = fast_forward_to(&commit->object.oid,
3206 &head_commit->object.oid, 0, opts);
3207 goto leave_merge;
3210 if (to_merge->next) {
3211 /* Octopus merge */
3212 struct child_process cmd = CHILD_PROCESS_INIT;
3214 if (read_env_script(&cmd.env_array)) {
3215 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3217 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3218 goto leave_merge;
3221 cmd.git_cmd = 1;
3222 argv_array_push(&cmd.args, "merge");
3223 argv_array_push(&cmd.args, "-s");
3224 argv_array_push(&cmd.args, "octopus");
3225 argv_array_push(&cmd.args, "--no-edit");
3226 argv_array_push(&cmd.args, "--no-ff");
3227 argv_array_push(&cmd.args, "--no-log");
3228 argv_array_push(&cmd.args, "--no-stat");
3229 argv_array_push(&cmd.args, "-F");
3230 argv_array_push(&cmd.args, git_path_merge_msg(the_repository));
3231 if (opts->gpg_sign)
3232 argv_array_push(&cmd.args, opts->gpg_sign);
3234 /* Add the tips to be merged */
3235 for (j = to_merge; j; j = j->next)
3236 argv_array_push(&cmd.args,
3237 oid_to_hex(&j->item->object.oid));
3239 strbuf_release(&ref_name);
3240 unlink(git_path_cherry_pick_head(the_repository));
3241 rollback_lock_file(&lock);
3243 rollback_lock_file(&lock);
3244 ret = run_command(&cmd);
3246 /* force re-reading of the cache */
3247 if (!ret && (discard_cache() < 0 || read_cache() < 0))
3248 ret = error(_("could not read index"));
3249 goto leave_merge;
3252 merge_commit = to_merge->item;
3253 bases = get_merge_bases(head_commit, merge_commit);
3254 if (bases && oideq(&merge_commit->object.oid,
3255 &bases->item->object.oid)) {
3256 ret = 0;
3257 /* skip merging an ancestor of HEAD */
3258 goto leave_merge;
3261 write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
3262 git_path_merge_head(the_repository), 0);
3263 write_message("no-ff", 5, git_path_merge_mode(the_repository), 0);
3265 for (j = bases; j; j = j->next)
3266 commit_list_insert(j->item, &reversed);
3267 free_commit_list(bases);
3269 read_cache();
3270 init_merge_options(&o);
3271 o.branch1 = "HEAD";
3272 o.branch2 = ref_name.buf;
3273 o.buffer_output = 2;
3275 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3276 if (ret <= 0)
3277 fputs(o.obuf.buf, stdout);
3278 strbuf_release(&o.obuf);
3279 if (ret < 0) {
3280 error(_("could not even attempt to merge '%.*s'"),
3281 merge_arg_len, arg);
3282 goto leave_merge;
3285 * The return value of merge_recursive() is 1 on clean, and 0 on
3286 * unclean merge.
3288 * Let's reverse that, so that do_merge() returns 0 upon success and
3289 * 1 upon failed merge (keeping the return value -1 for the cases where
3290 * we will want to reschedule the `merge` command).
3292 ret = !ret;
3294 if (active_cache_changed &&
3295 write_locked_index(&the_index, &lock, COMMIT_LOCK)) {
3296 ret = error(_("merge: Unable to write new index file"));
3297 goto leave_merge;
3300 rollback_lock_file(&lock);
3301 if (ret)
3302 repo_rerere(the_repository, opts->allow_rerere_auto);
3303 else
3305 * In case of problems, we now want to return a positive
3306 * value (a negative one would indicate that the `merge`
3307 * command needs to be rescheduled).
3309 ret = !!run_git_commit(git_path_merge_msg(the_repository), opts,
3310 run_commit_flags);
3312 leave_merge:
3313 strbuf_release(&ref_name);
3314 rollback_lock_file(&lock);
3315 free_commit_list(to_merge);
3316 return ret;
3319 static int is_final_fixup(struct todo_list *todo_list)
3321 int i = todo_list->current;
3323 if (!is_fixup(todo_list->items[i].command))
3324 return 0;
3326 while (++i < todo_list->nr)
3327 if (is_fixup(todo_list->items[i].command))
3328 return 0;
3329 else if (!is_noop(todo_list->items[i].command))
3330 break;
3331 return 1;
3334 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3336 int i;
3338 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3339 if (!is_noop(todo_list->items[i].command))
3340 return todo_list->items[i].command;
3342 return -1;
3345 static int apply_autostash(struct replay_opts *opts)
3347 struct strbuf stash_sha1 = STRBUF_INIT;
3348 struct child_process child = CHILD_PROCESS_INIT;
3349 int ret = 0;
3351 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3352 strbuf_release(&stash_sha1);
3353 return 0;
3355 strbuf_trim(&stash_sha1);
3357 child.git_cmd = 1;
3358 child.no_stdout = 1;
3359 child.no_stderr = 1;
3360 argv_array_push(&child.args, "stash");
3361 argv_array_push(&child.args, "apply");
3362 argv_array_push(&child.args, stash_sha1.buf);
3363 if (!run_command(&child))
3364 fprintf(stderr, _("Applied autostash.\n"));
3365 else {
3366 struct child_process store = CHILD_PROCESS_INIT;
3368 store.git_cmd = 1;
3369 argv_array_push(&store.args, "stash");
3370 argv_array_push(&store.args, "store");
3371 argv_array_push(&store.args, "-m");
3372 argv_array_push(&store.args, "autostash");
3373 argv_array_push(&store.args, "-q");
3374 argv_array_push(&store.args, stash_sha1.buf);
3375 if (run_command(&store))
3376 ret = error(_("cannot store %s"), stash_sha1.buf);
3377 else
3378 fprintf(stderr,
3379 _("Applying autostash resulted in conflicts.\n"
3380 "Your changes are safe in the stash.\n"
3381 "You can run \"git stash pop\" or"
3382 " \"git stash drop\" at any time.\n"));
3385 strbuf_release(&stash_sha1);
3386 return ret;
3389 static const char *reflog_message(struct replay_opts *opts,
3390 const char *sub_action, const char *fmt, ...)
3392 va_list ap;
3393 static struct strbuf buf = STRBUF_INIT;
3395 va_start(ap, fmt);
3396 strbuf_reset(&buf);
3397 strbuf_addstr(&buf, action_name(opts));
3398 if (sub_action)
3399 strbuf_addf(&buf, " (%s)", sub_action);
3400 if (fmt) {
3401 strbuf_addstr(&buf, ": ");
3402 strbuf_vaddf(&buf, fmt, ap);
3404 va_end(ap);
3406 return buf.buf;
3409 static int run_git_checkout(struct replay_opts *opts, const char *commit,
3410 const char *action)
3412 struct child_process cmd = CHILD_PROCESS_INIT;
3414 cmd.git_cmd = 1;
3416 argv_array_push(&cmd.args, "checkout");
3417 argv_array_push(&cmd.args, commit);
3418 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3420 if (opts->verbose)
3421 return run_command(&cmd);
3422 else
3423 return run_command_silent_on_success(&cmd);
3426 int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit)
3428 const char *action;
3430 if (commit && *commit) {
3431 action = reflog_message(opts, "start", "checkout %s", commit);
3432 if (run_git_checkout(opts, commit, action))
3433 return error(_("could not checkout %s"), commit);
3436 return 0;
3439 static int checkout_onto(struct replay_opts *opts,
3440 const char *onto_name, const char *onto,
3441 const char *orig_head)
3443 struct object_id oid;
3444 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3446 if (get_oid(orig_head, &oid))
3447 return error(_("%s: not a valid OID"), orig_head);
3449 if (run_git_checkout(opts, onto, action)) {
3450 apply_autostash(opts);
3451 sequencer_remove_state(opts);
3452 return error(_("could not detach HEAD"));
3455 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3458 static int stopped_at_head(void)
3460 struct object_id head;
3461 struct commit *commit;
3462 struct commit_message message;
3464 if (get_oid("HEAD", &head) ||
3465 !(commit = lookup_commit(the_repository, &head)) ||
3466 parse_commit(commit) || get_message(commit, &message))
3467 fprintf(stderr, _("Stopped at HEAD\n"));
3468 else {
3469 fprintf(stderr, _("Stopped at %s\n"), message.label);
3470 free_message(commit, &message);
3472 return 0;
3476 static const char rescheduled_advice[] =
3477 N_("Could not execute the todo command\n"
3478 "\n"
3479 " %.*s"
3480 "\n"
3481 "It has been rescheduled; To edit the command before continuing, please\n"
3482 "edit the todo list first:\n"
3483 "\n"
3484 " git rebase --edit-todo\n"
3485 " git rebase --continue\n");
3487 static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)
3489 int res = 0, reschedule = 0;
3491 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3492 if (opts->allow_ff)
3493 assert(!(opts->signoff || opts->no_commit ||
3494 opts->record_origin || opts->edit));
3495 if (read_and_refresh_cache(opts))
3496 return -1;
3498 while (todo_list->current < todo_list->nr) {
3499 struct todo_item *item = todo_list->items + todo_list->current;
3500 if (save_todo(todo_list, opts))
3501 return -1;
3502 if (is_rebase_i(opts)) {
3503 if (item->command != TODO_COMMENT) {
3504 FILE *f = fopen(rebase_path_msgnum(), "w");
3506 todo_list->done_nr++;
3508 if (f) {
3509 fprintf(f, "%d\n", todo_list->done_nr);
3510 fclose(f);
3512 fprintf(stderr, "Rebasing (%d/%d)%s",
3513 todo_list->done_nr,
3514 todo_list->total_nr,
3515 opts->verbose ? "\n" : "\r");
3517 unlink(rebase_path_message());
3518 unlink(rebase_path_author_script());
3519 unlink(rebase_path_stopped_sha());
3520 unlink(rebase_path_amend());
3521 unlink(git_path_merge_head(the_repository));
3522 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3524 if (item->command == TODO_BREAK)
3525 return stopped_at_head();
3527 if (item->command <= TODO_SQUASH) {
3528 if (is_rebase_i(opts))
3529 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3530 command_to_string(item->command), NULL),
3532 res = do_pick_commit(item->command, item->commit,
3533 opts, is_final_fixup(todo_list));
3534 if (is_rebase_i(opts) && res < 0) {
3535 /* Reschedule */
3536 advise(_(rescheduled_advice),
3537 get_item_line_length(todo_list,
3538 todo_list->current),
3539 get_item_line(todo_list,
3540 todo_list->current));
3541 todo_list->current--;
3542 if (save_todo(todo_list, opts))
3543 return -1;
3545 if (item->command == TODO_EDIT) {
3546 struct commit *commit = item->commit;
3547 if (!res)
3548 fprintf(stderr,
3549 _("Stopped at %s... %.*s\n"),
3550 short_commit_name(commit),
3551 item->arg_len, item->arg);
3552 return error_with_patch(commit,
3553 item->arg, item->arg_len, opts, res,
3554 !res);
3556 if (is_rebase_i(opts) && !res)
3557 record_in_rewritten(&item->commit->object.oid,
3558 peek_command(todo_list, 1));
3559 if (res && is_fixup(item->command)) {
3560 if (res == 1)
3561 intend_to_amend();
3562 return error_failed_squash(item->commit, opts,
3563 item->arg_len, item->arg);
3564 } else if (res && is_rebase_i(opts) && item->commit) {
3565 int to_amend = 0;
3566 struct object_id oid;
3569 * If we are rewording and have either
3570 * fast-forwarded already, or are about to
3571 * create a new root commit, we want to amend,
3572 * otherwise we do not.
3574 if (item->command == TODO_REWORD &&
3575 !get_oid("HEAD", &oid) &&
3576 (oideq(&item->commit->object.oid, &oid) ||
3577 (opts->have_squash_onto &&
3578 oideq(&opts->squash_onto, &oid))))
3579 to_amend = 1;
3581 return res | error_with_patch(item->commit,
3582 item->arg, item->arg_len, opts,
3583 res, to_amend);
3585 } else if (item->command == TODO_EXEC) {
3586 char *end_of_arg = (char *)(item->arg + item->arg_len);
3587 int saved = *end_of_arg;
3588 struct stat st;
3590 *end_of_arg = '\0';
3591 res = do_exec(item->arg);
3592 *end_of_arg = saved;
3594 /* Reread the todo file if it has changed. */
3595 if (res) {
3596 if (opts->reschedule_failed_exec)
3597 reschedule = 1;
3598 } else if (stat(get_todo_path(opts), &st))
3599 res = error_errno(_("could not stat '%s'"),
3600 get_todo_path(opts));
3601 else if (match_stat_data(&todo_list->stat, &st)) {
3602 todo_list_release(todo_list);
3603 if (read_populate_todo(todo_list, opts))
3604 res = -1; /* message was printed */
3605 /* `current` will be incremented below */
3606 todo_list->current = -1;
3608 } else if (item->command == TODO_LABEL) {
3609 if ((res = do_label(item->arg, item->arg_len)))
3610 reschedule = 1;
3611 } else if (item->command == TODO_RESET) {
3612 if ((res = do_reset(item->arg, item->arg_len, opts)))
3613 reschedule = 1;
3614 } else if (item->command == TODO_MERGE) {
3615 if ((res = do_merge(item->commit,
3616 item->arg, item->arg_len,
3617 item->flags, opts)) < 0)
3618 reschedule = 1;
3619 else if (item->commit)
3620 record_in_rewritten(&item->commit->object.oid,
3621 peek_command(todo_list, 1));
3622 if (res > 0)
3623 /* failed with merge conflicts */
3624 return error_with_patch(item->commit,
3625 item->arg,
3626 item->arg_len, opts,
3627 res, 0);
3628 } else if (!is_noop(item->command))
3629 return error(_("unknown command %d"), item->command);
3631 if (reschedule) {
3632 advise(_(rescheduled_advice),
3633 get_item_line_length(todo_list,
3634 todo_list->current),
3635 get_item_line(todo_list, todo_list->current));
3636 todo_list->current--;
3637 if (save_todo(todo_list, opts))
3638 return -1;
3639 if (item->commit)
3640 return error_with_patch(item->commit,
3641 item->arg,
3642 item->arg_len, opts,
3643 res, 0);
3646 todo_list->current++;
3647 if (res)
3648 return res;
3651 if (is_rebase_i(opts)) {
3652 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
3653 struct stat st;
3655 /* Stopped in the middle, as planned? */
3656 if (todo_list->current < todo_list->nr)
3657 return 0;
3659 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3660 starts_with(head_ref.buf, "refs/")) {
3661 const char *msg;
3662 struct object_id head, orig;
3663 int res;
3665 if (get_oid("HEAD", &head)) {
3666 res = error(_("cannot read HEAD"));
3667 cleanup_head_ref:
3668 strbuf_release(&head_ref);
3669 strbuf_release(&buf);
3670 return res;
3672 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
3673 get_oid_hex(buf.buf, &orig)) {
3674 res = error(_("could not read orig-head"));
3675 goto cleanup_head_ref;
3677 strbuf_reset(&buf);
3678 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3679 res = error(_("could not read 'onto'"));
3680 goto cleanup_head_ref;
3682 msg = reflog_message(opts, "finish", "%s onto %s",
3683 head_ref.buf, buf.buf);
3684 if (update_ref(msg, head_ref.buf, &head, &orig,
3685 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
3686 res = error(_("could not update %s"),
3687 head_ref.buf);
3688 goto cleanup_head_ref;
3690 msg = reflog_message(opts, "finish", "returning to %s",
3691 head_ref.buf);
3692 if (create_symref("HEAD", head_ref.buf, msg)) {
3693 res = error(_("could not update HEAD to %s"),
3694 head_ref.buf);
3695 goto cleanup_head_ref;
3697 strbuf_reset(&buf);
3700 if (opts->verbose) {
3701 struct rev_info log_tree_opt;
3702 struct object_id orig, head;
3704 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3705 repo_init_revisions(the_repository, &log_tree_opt, NULL);
3706 log_tree_opt.diff = 1;
3707 log_tree_opt.diffopt.output_format =
3708 DIFF_FORMAT_DIFFSTAT;
3709 log_tree_opt.disable_stdin = 1;
3711 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
3712 !get_oid(buf.buf, &orig) &&
3713 !get_oid("HEAD", &head)) {
3714 diff_tree_oid(&orig, &head, "",
3715 &log_tree_opt.diffopt);
3716 log_tree_diff_flush(&log_tree_opt);
3719 flush_rewritten_pending();
3720 if (!stat(rebase_path_rewritten_list(), &st) &&
3721 st.st_size > 0) {
3722 struct child_process child = CHILD_PROCESS_INIT;
3723 const char *post_rewrite_hook =
3724 find_hook("post-rewrite");
3726 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
3727 child.git_cmd = 1;
3728 argv_array_push(&child.args, "notes");
3729 argv_array_push(&child.args, "copy");
3730 argv_array_push(&child.args, "--for-rewrite=rebase");
3731 /* we don't care if this copying failed */
3732 run_command(&child);
3734 if (post_rewrite_hook) {
3735 struct child_process hook = CHILD_PROCESS_INIT;
3737 hook.in = open(rebase_path_rewritten_list(),
3738 O_RDONLY);
3739 hook.stdout_to_stderr = 1;
3740 argv_array_push(&hook.args, post_rewrite_hook);
3741 argv_array_push(&hook.args, "rebase");
3742 /* we don't care if this hook failed */
3743 run_command(&hook);
3746 apply_autostash(opts);
3748 fprintf(stderr, "Successfully rebased and updated %s.\n",
3749 head_ref.buf);
3751 strbuf_release(&buf);
3752 strbuf_release(&head_ref);
3756 * Sequence of picks finished successfully; cleanup by
3757 * removing the .git/sequencer directory
3759 return sequencer_remove_state(opts);
3762 static int continue_single_pick(void)
3764 const char *argv[] = { "commit", NULL };
3766 if (!file_exists(git_path_cherry_pick_head(the_repository)) &&
3767 !file_exists(git_path_revert_head(the_repository)))
3768 return error(_("no cherry-pick or revert in progress"));
3769 return run_command_v_opt(argv, RUN_GIT_CMD);
3772 static int commit_staged_changes(struct replay_opts *opts,
3773 struct todo_list *todo_list)
3775 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
3776 unsigned int final_fixup = 0, is_clean;
3778 if (has_unstaged_changes(1))
3779 return error(_("cannot rebase: You have unstaged changes."));
3781 is_clean = !has_uncommitted_changes(0);
3783 if (file_exists(rebase_path_amend())) {
3784 struct strbuf rev = STRBUF_INIT;
3785 struct object_id head, to_amend;
3787 if (get_oid("HEAD", &head))
3788 return error(_("cannot amend non-existing commit"));
3789 if (!read_oneliner(&rev, rebase_path_amend(), 0))
3790 return error(_("invalid file: '%s'"), rebase_path_amend());
3791 if (get_oid_hex(rev.buf, &to_amend))
3792 return error(_("invalid contents: '%s'"),
3793 rebase_path_amend());
3794 if (!is_clean && !oideq(&head, &to_amend))
3795 return error(_("\nYou have uncommitted changes in your "
3796 "working tree. Please, commit them\n"
3797 "first and then run 'git rebase "
3798 "--continue' again."));
3800 * When skipping a failed fixup/squash, we need to edit the
3801 * commit message, the current fixup list and count, and if it
3802 * was the last fixup/squash in the chain, we need to clean up
3803 * the commit message and if there was a squash, let the user
3804 * edit it.
3806 if (!is_clean || !opts->current_fixup_count)
3807 ; /* this is not the final fixup */
3808 else if (!oideq(&head, &to_amend) ||
3809 !file_exists(rebase_path_stopped_sha())) {
3810 /* was a final fixup or squash done manually? */
3811 if (!is_fixup(peek_command(todo_list, 0))) {
3812 unlink(rebase_path_fixup_msg());
3813 unlink(rebase_path_squash_msg());
3814 unlink(rebase_path_current_fixups());
3815 strbuf_reset(&opts->current_fixups);
3816 opts->current_fixup_count = 0;
3818 } else {
3819 /* we are in a fixup/squash chain */
3820 const char *p = opts->current_fixups.buf;
3821 int len = opts->current_fixups.len;
3823 opts->current_fixup_count--;
3824 if (!len)
3825 BUG("Incorrect current_fixups:\n%s", p);
3826 while (len && p[len - 1] != '\n')
3827 len--;
3828 strbuf_setlen(&opts->current_fixups, len);
3829 if (write_message(p, len, rebase_path_current_fixups(),
3830 0) < 0)
3831 return error(_("could not write file: '%s'"),
3832 rebase_path_current_fixups());
3835 * If a fixup/squash in a fixup/squash chain failed, the
3836 * commit message is already correct, no need to commit
3837 * it again.
3839 * Only if it is the final command in the fixup/squash
3840 * chain, and only if the chain is longer than a single
3841 * fixup/squash command (which was just skipped), do we
3842 * actually need to re-commit with a cleaned up commit
3843 * message.
3845 if (opts->current_fixup_count > 0 &&
3846 !is_fixup(peek_command(todo_list, 0))) {
3847 final_fixup = 1;
3849 * If there was not a single "squash" in the
3850 * chain, we only need to clean up the commit
3851 * message, no need to bother the user with
3852 * opening the commit message in the editor.
3854 if (!starts_with(p, "squash ") &&
3855 !strstr(p, "\nsquash "))
3856 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
3857 } else if (is_fixup(peek_command(todo_list, 0))) {
3859 * We need to update the squash message to skip
3860 * the latest commit message.
3862 struct commit *commit;
3863 const char *path = rebase_path_squash_msg();
3865 if (parse_head(&commit) ||
3866 !(p = get_commit_buffer(commit, NULL)) ||
3867 write_message(p, strlen(p), path, 0)) {
3868 unuse_commit_buffer(commit, p);
3869 return error(_("could not write file: "
3870 "'%s'"), path);
3872 unuse_commit_buffer(commit, p);
3876 strbuf_release(&rev);
3877 flags |= AMEND_MSG;
3880 if (is_clean) {
3881 const char *cherry_pick_head = git_path_cherry_pick_head(the_repository);
3883 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
3884 return error(_("could not remove CHERRY_PICK_HEAD"));
3885 if (!final_fixup)
3886 return 0;
3889 if (run_git_commit(final_fixup ? NULL : rebase_path_message(),
3890 opts, flags))
3891 return error(_("could not commit staged changes."));
3892 unlink(rebase_path_amend());
3893 unlink(git_path_merge_head(the_repository));
3894 if (final_fixup) {
3895 unlink(rebase_path_fixup_msg());
3896 unlink(rebase_path_squash_msg());
3898 if (opts->current_fixup_count > 0) {
3900 * Whether final fixup or not, we just cleaned up the commit
3901 * message...
3903 unlink(rebase_path_current_fixups());
3904 strbuf_reset(&opts->current_fixups);
3905 opts->current_fixup_count = 0;
3907 return 0;
3910 int sequencer_continue(struct replay_opts *opts)
3912 struct todo_list todo_list = TODO_LIST_INIT;
3913 int res;
3915 if (read_and_refresh_cache(opts))
3916 return -1;
3918 if (read_populate_opts(opts))
3919 return -1;
3920 if (is_rebase_i(opts)) {
3921 if ((res = read_populate_todo(&todo_list, opts)))
3922 goto release_todo_list;
3923 if (commit_staged_changes(opts, &todo_list))
3924 return -1;
3925 } else if (!file_exists(get_todo_path(opts)))
3926 return continue_single_pick();
3927 else if ((res = read_populate_todo(&todo_list, opts)))
3928 goto release_todo_list;
3930 if (!is_rebase_i(opts)) {
3931 /* Verify that the conflict has been resolved */
3932 if (file_exists(git_path_cherry_pick_head(the_repository)) ||
3933 file_exists(git_path_revert_head(the_repository))) {
3934 res = continue_single_pick();
3935 if (res)
3936 goto release_todo_list;
3938 if (index_differs_from("HEAD", NULL, 0)) {
3939 res = error_dirty_index(opts);
3940 goto release_todo_list;
3942 todo_list.current++;
3943 } else if (file_exists(rebase_path_stopped_sha())) {
3944 struct strbuf buf = STRBUF_INIT;
3945 struct object_id oid;
3947 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
3948 !get_oid_committish(buf.buf, &oid))
3949 record_in_rewritten(&oid, peek_command(&todo_list, 0));
3950 strbuf_release(&buf);
3953 res = pick_commits(&todo_list, opts);
3954 release_todo_list:
3955 todo_list_release(&todo_list);
3956 return res;
3959 static int single_pick(struct commit *cmit, struct replay_opts *opts)
3961 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3962 return do_pick_commit(opts->action == REPLAY_PICK ?
3963 TODO_PICK : TODO_REVERT, cmit, opts, 0);
3966 int sequencer_pick_revisions(struct replay_opts *opts)
3968 struct todo_list todo_list = TODO_LIST_INIT;
3969 struct object_id oid;
3970 int i, res;
3972 assert(opts->revs);
3973 if (read_and_refresh_cache(opts))
3974 return -1;
3976 for (i = 0; i < opts->revs->pending.nr; i++) {
3977 struct object_id oid;
3978 const char *name = opts->revs->pending.objects[i].name;
3980 /* This happens when using --stdin. */
3981 if (!strlen(name))
3982 continue;
3984 if (!get_oid(name, &oid)) {
3985 if (!lookup_commit_reference_gently(the_repository, &oid, 1)) {
3986 enum object_type type = oid_object_info(the_repository,
3987 &oid,
3988 NULL);
3989 return error(_("%s: can't cherry-pick a %s"),
3990 name, type_name(type));
3992 } else
3993 return error(_("%s: bad revision"), name);
3997 * If we were called as "git cherry-pick <commit>", just
3998 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
3999 * REVERT_HEAD, and don't touch the sequencer state.
4000 * This means it is possible to cherry-pick in the middle
4001 * of a cherry-pick sequence.
4003 if (opts->revs->cmdline.nr == 1 &&
4004 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4005 opts->revs->no_walk &&
4006 !opts->revs->cmdline.rev->flags) {
4007 struct commit *cmit;
4008 if (prepare_revision_walk(opts->revs))
4009 return error(_("revision walk setup failed"));
4010 cmit = get_revision(opts->revs);
4011 if (!cmit)
4012 return error(_("empty commit set passed"));
4013 if (get_revision(opts->revs))
4014 BUG("unexpected extra commit from walk");
4015 return single_pick(cmit, opts);
4019 * Start a new cherry-pick/ revert sequence; but
4020 * first, make sure that an existing one isn't in
4021 * progress
4024 if (walk_revs_populate_todo(&todo_list, opts) ||
4025 create_seq_dir() < 0)
4026 return -1;
4027 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4028 return error(_("can't revert as initial commit"));
4029 if (save_head(oid_to_hex(&oid)))
4030 return -1;
4031 if (save_opts(opts))
4032 return -1;
4033 update_abort_safety_file();
4034 res = pick_commits(&todo_list, opts);
4035 todo_list_release(&todo_list);
4036 return res;
4039 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4041 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4042 struct strbuf sob = STRBUF_INIT;
4043 int has_footer;
4045 strbuf_addstr(&sob, sign_off_header);
4046 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
4047 getenv("GIT_COMMITTER_EMAIL")));
4048 strbuf_addch(&sob, '\n');
4050 if (!ignore_footer)
4051 strbuf_complete_line(msgbuf);
4054 * If the whole message buffer is equal to the sob, pretend that we
4055 * found a conforming footer with a matching sob
4057 if (msgbuf->len - ignore_footer == sob.len &&
4058 !strncmp(msgbuf->buf, sob.buf, sob.len))
4059 has_footer = 3;
4060 else
4061 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4063 if (!has_footer) {
4064 const char *append_newlines = NULL;
4065 size_t len = msgbuf->len - ignore_footer;
4067 if (!len) {
4069 * The buffer is completely empty. Leave foom for
4070 * the title and body to be filled in by the user.
4072 append_newlines = "\n\n";
4073 } else if (len == 1) {
4075 * Buffer contains a single newline. Add another
4076 * so that we leave room for the title and body.
4078 append_newlines = "\n";
4079 } else if (msgbuf->buf[len - 2] != '\n') {
4081 * Buffer ends with a single newline. Add another
4082 * so that there is an empty line between the message
4083 * body and the sob.
4085 append_newlines = "\n";
4086 } /* else, the buffer already ends with two newlines. */
4088 if (append_newlines)
4089 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4090 append_newlines, strlen(append_newlines));
4093 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4094 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4095 sob.buf, sob.len);
4097 strbuf_release(&sob);
4100 struct labels_entry {
4101 struct hashmap_entry entry;
4102 char label[FLEX_ARRAY];
4105 static int labels_cmp(const void *fndata, const struct labels_entry *a,
4106 const struct labels_entry *b, const void *key)
4108 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4111 struct string_entry {
4112 struct oidmap_entry entry;
4113 char string[FLEX_ARRAY];
4116 struct label_state {
4117 struct oidmap commit2label;
4118 struct hashmap labels;
4119 struct strbuf buf;
4122 static const char *label_oid(struct object_id *oid, const char *label,
4123 struct label_state *state)
4125 struct labels_entry *labels_entry;
4126 struct string_entry *string_entry;
4127 struct object_id dummy;
4128 size_t len;
4129 int i;
4131 string_entry = oidmap_get(&state->commit2label, oid);
4132 if (string_entry)
4133 return string_entry->string;
4136 * For "uninteresting" commits, i.e. commits that are not to be
4137 * rebased, and which can therefore not be labeled, we use a unique
4138 * abbreviation of the commit name. This is slightly more complicated
4139 * than calling find_unique_abbrev() because we also need to make
4140 * sure that the abbreviation does not conflict with any other
4141 * label.
4143 * We disallow "interesting" commits to be labeled by a string that
4144 * is a valid full-length hash, to ensure that we always can find an
4145 * abbreviation for any uninteresting commit's names that does not
4146 * clash with any other label.
4148 if (!label) {
4149 char *p;
4151 strbuf_reset(&state->buf);
4152 strbuf_grow(&state->buf, GIT_SHA1_HEXSZ);
4153 label = p = state->buf.buf;
4155 find_unique_abbrev_r(p, oid, default_abbrev);
4158 * We may need to extend the abbreviated hash so that there is
4159 * no conflicting label.
4161 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4162 size_t i = strlen(p) + 1;
4164 oid_to_hex_r(p, oid);
4165 for (; i < GIT_SHA1_HEXSZ; i++) {
4166 char save = p[i];
4167 p[i] = '\0';
4168 if (!hashmap_get_from_hash(&state->labels,
4169 strihash(p), p))
4170 break;
4171 p[i] = save;
4174 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
4175 !get_oid_hex(label, &dummy)) ||
4176 (len == 1 && *label == '#') ||
4177 hashmap_get_from_hash(&state->labels,
4178 strihash(label), label)) {
4180 * If the label already exists, or if the label is a valid full
4181 * OID, or the label is a '#' (which we use as a separator
4182 * between merge heads and oneline), we append a dash and a
4183 * number to make it unique.
4185 struct strbuf *buf = &state->buf;
4187 strbuf_reset(buf);
4188 strbuf_add(buf, label, len);
4190 for (i = 2; ; i++) {
4191 strbuf_setlen(buf, len);
4192 strbuf_addf(buf, "-%d", i);
4193 if (!hashmap_get_from_hash(&state->labels,
4194 strihash(buf->buf),
4195 buf->buf))
4196 break;
4199 label = buf->buf;
4202 FLEX_ALLOC_STR(labels_entry, label, label);
4203 hashmap_entry_init(labels_entry, strihash(label));
4204 hashmap_add(&state->labels, labels_entry);
4206 FLEX_ALLOC_STR(string_entry, string, label);
4207 oidcpy(&string_entry->entry.oid, oid);
4208 oidmap_put(&state->commit2label, string_entry);
4210 return string_entry->string;
4213 static int make_script_with_merges(struct pretty_print_context *pp,
4214 struct rev_info *revs, FILE *out,
4215 unsigned flags)
4217 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4218 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4219 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4220 struct strbuf label = STRBUF_INIT;
4221 struct commit_list *commits = NULL, **tail = &commits, *iter;
4222 struct commit_list *tips = NULL, **tips_tail = &tips;
4223 struct commit *commit;
4224 struct oidmap commit2todo = OIDMAP_INIT;
4225 struct string_entry *entry;
4226 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4227 shown = OIDSET_INIT;
4228 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4230 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4231 const char *cmd_pick = abbr ? "p" : "pick",
4232 *cmd_label = abbr ? "l" : "label",
4233 *cmd_reset = abbr ? "t" : "reset",
4234 *cmd_merge = abbr ? "m" : "merge";
4236 oidmap_init(&commit2todo, 0);
4237 oidmap_init(&state.commit2label, 0);
4238 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4239 strbuf_init(&state.buf, 32);
4241 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4242 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4243 FLEX_ALLOC_STR(entry, string, "onto");
4244 oidcpy(&entry->entry.oid, oid);
4245 oidmap_put(&state.commit2label, entry);
4249 * First phase:
4250 * - get onelines for all commits
4251 * - gather all branch tips (i.e. 2nd or later parents of merges)
4252 * - label all branch tips
4254 while ((commit = get_revision(revs))) {
4255 struct commit_list *to_merge;
4256 const char *p1, *p2;
4257 struct object_id *oid;
4258 int is_empty;
4260 tail = &commit_list_insert(commit, tail)->next;
4261 oidset_insert(&interesting, &commit->object.oid);
4263 is_empty = is_original_commit_empty(commit);
4264 if (!is_empty && (commit->object.flags & PATCHSAME))
4265 continue;
4267 strbuf_reset(&oneline);
4268 pretty_print_commit(pp, commit, &oneline);
4270 to_merge = commit->parents ? commit->parents->next : NULL;
4271 if (!to_merge) {
4272 /* non-merge commit: easy case */
4273 strbuf_reset(&buf);
4274 if (!keep_empty && is_empty)
4275 strbuf_addf(&buf, "%c ", comment_line_char);
4276 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4277 oid_to_hex(&commit->object.oid),
4278 oneline.buf);
4280 FLEX_ALLOC_STR(entry, string, buf.buf);
4281 oidcpy(&entry->entry.oid, &commit->object.oid);
4282 oidmap_put(&commit2todo, entry);
4284 continue;
4287 /* Create a label */
4288 strbuf_reset(&label);
4289 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4290 (p1 = strchr(p1, '\'')) &&
4291 (p2 = strchr(++p1, '\'')))
4292 strbuf_add(&label, p1, p2 - p1);
4293 else if (skip_prefix(oneline.buf, "Merge pull request ",
4294 &p1) &&
4295 (p1 = strstr(p1, " from ")))
4296 strbuf_addstr(&label, p1 + strlen(" from "));
4297 else
4298 strbuf_addbuf(&label, &oneline);
4300 for (p1 = label.buf; *p1; p1++)
4301 if (isspace(*p1))
4302 *(char *)p1 = '-';
4304 strbuf_reset(&buf);
4305 strbuf_addf(&buf, "%s -C %s",
4306 cmd_merge, oid_to_hex(&commit->object.oid));
4308 /* label the tips of merged branches */
4309 for (; to_merge; to_merge = to_merge->next) {
4310 oid = &to_merge->item->object.oid;
4311 strbuf_addch(&buf, ' ');
4313 if (!oidset_contains(&interesting, oid)) {
4314 strbuf_addstr(&buf, label_oid(oid, NULL,
4315 &state));
4316 continue;
4319 tips_tail = &commit_list_insert(to_merge->item,
4320 tips_tail)->next;
4322 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4324 strbuf_addf(&buf, " # %s", oneline.buf);
4326 FLEX_ALLOC_STR(entry, string, buf.buf);
4327 oidcpy(&entry->entry.oid, &commit->object.oid);
4328 oidmap_put(&commit2todo, entry);
4332 * Second phase:
4333 * - label branch points
4334 * - add HEAD to the branch tips
4336 for (iter = commits; iter; iter = iter->next) {
4337 struct commit_list *parent = iter->item->parents;
4338 for (; parent; parent = parent->next) {
4339 struct object_id *oid = &parent->item->object.oid;
4340 if (!oidset_contains(&interesting, oid))
4341 continue;
4342 if (oidset_insert(&child_seen, oid))
4343 label_oid(oid, "branch-point", &state);
4346 /* Add HEAD as implict "tip of branch" */
4347 if (!iter->next)
4348 tips_tail = &commit_list_insert(iter->item,
4349 tips_tail)->next;
4353 * Third phase: output the todo list. This is a bit tricky, as we
4354 * want to avoid jumping back and forth between revisions. To
4355 * accomplish that goal, we walk backwards from the branch tips,
4356 * gathering commits not yet shown, reversing the list on the fly,
4357 * then outputting that list (labeling revisions as needed).
4359 fprintf(out, "%s onto\n", cmd_label);
4360 for (iter = tips; iter; iter = iter->next) {
4361 struct commit_list *list = NULL, *iter2;
4363 commit = iter->item;
4364 if (oidset_contains(&shown, &commit->object.oid))
4365 continue;
4366 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4368 if (entry)
4369 fprintf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4370 else
4371 fprintf(out, "\n");
4373 while (oidset_contains(&interesting, &commit->object.oid) &&
4374 !oidset_contains(&shown, &commit->object.oid)) {
4375 commit_list_insert(commit, &list);
4376 if (!commit->parents) {
4377 commit = NULL;
4378 break;
4380 commit = commit->parents->item;
4383 if (!commit)
4384 fprintf(out, "%s %s\n", cmd_reset,
4385 rebase_cousins ? "onto" : "[new root]");
4386 else {
4387 const char *to = NULL;
4389 entry = oidmap_get(&state.commit2label,
4390 &commit->object.oid);
4391 if (entry)
4392 to = entry->string;
4393 else if (!rebase_cousins)
4394 to = label_oid(&commit->object.oid, NULL,
4395 &state);
4397 if (!to || !strcmp(to, "onto"))
4398 fprintf(out, "%s onto\n", cmd_reset);
4399 else {
4400 strbuf_reset(&oneline);
4401 pretty_print_commit(pp, commit, &oneline);
4402 fprintf(out, "%s %s # %s\n",
4403 cmd_reset, to, oneline.buf);
4407 for (iter2 = list; iter2; iter2 = iter2->next) {
4408 struct object_id *oid = &iter2->item->object.oid;
4409 entry = oidmap_get(&commit2todo, oid);
4410 /* only show if not already upstream */
4411 if (entry)
4412 fprintf(out, "%s\n", entry->string);
4413 entry = oidmap_get(&state.commit2label, oid);
4414 if (entry)
4415 fprintf(out, "%s %s\n",
4416 cmd_label, entry->string);
4417 oidset_insert(&shown, oid);
4420 free_commit_list(list);
4423 free_commit_list(commits);
4424 free_commit_list(tips);
4426 strbuf_release(&label);
4427 strbuf_release(&oneline);
4428 strbuf_release(&buf);
4430 oidmap_free(&commit2todo, 1);
4431 oidmap_free(&state.commit2label, 1);
4432 hashmap_free(&state.labels, 1);
4433 strbuf_release(&state.buf);
4435 return 0;
4438 int sequencer_make_script(FILE *out, int argc, const char **argv,
4439 unsigned flags)
4441 char *format = NULL;
4442 struct pretty_print_context pp = {0};
4443 struct strbuf buf = STRBUF_INIT;
4444 struct rev_info revs;
4445 struct commit *commit;
4446 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4447 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4448 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4450 repo_init_revisions(the_repository, &revs, NULL);
4451 revs.verbose_header = 1;
4452 if (!rebase_merges)
4453 revs.max_parents = 1;
4454 revs.cherry_mark = 1;
4455 revs.limited = 1;
4456 revs.reverse = 1;
4457 revs.right_only = 1;
4458 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4459 revs.topo_order = 1;
4461 revs.pretty_given = 1;
4462 git_config_get_string("rebase.instructionFormat", &format);
4463 if (!format || !*format) {
4464 free(format);
4465 format = xstrdup("%s");
4467 get_commit_format(format, &revs);
4468 free(format);
4469 pp.fmt = revs.commit_format;
4470 pp.output_encoding = get_log_output_encoding();
4472 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4473 return error(_("make_script: unhandled options"));
4475 if (prepare_revision_walk(&revs) < 0)
4476 return error(_("make_script: error preparing revisions"));
4478 if (rebase_merges)
4479 return make_script_with_merges(&pp, &revs, out, flags);
4481 while ((commit = get_revision(&revs))) {
4482 int is_empty = is_original_commit_empty(commit);
4484 if (!is_empty && (commit->object.flags & PATCHSAME))
4485 continue;
4486 strbuf_reset(&buf);
4487 if (!keep_empty && is_empty)
4488 strbuf_addf(&buf, "%c ", comment_line_char);
4489 strbuf_addf(&buf, "%s %s ", insn,
4490 oid_to_hex(&commit->object.oid));
4491 pretty_print_commit(&pp, commit, &buf);
4492 strbuf_addch(&buf, '\n');
4493 fputs(buf.buf, out);
4495 strbuf_release(&buf);
4496 return 0;
4500 * Add commands after pick and (series of) squash/fixup commands
4501 * in the todo list.
4503 int sequencer_add_exec_commands(const char *commands)
4505 const char *todo_file = rebase_path_todo();
4506 struct todo_list todo_list = TODO_LIST_INIT;
4507 struct strbuf *buf = &todo_list.buf;
4508 size_t offset = 0, commands_len = strlen(commands);
4509 int i, insert;
4511 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4512 return error(_("could not read '%s'."), todo_file);
4514 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
4515 todo_list_release(&todo_list);
4516 return error(_("unusable todo list: '%s'"), todo_file);
4520 * Insert <commands> after every pick. Here, fixup/squash chains
4521 * are considered part of the pick, so we insert the commands *after*
4522 * those chains if there are any.
4524 insert = -1;
4525 for (i = 0; i < todo_list.nr; i++) {
4526 enum todo_command command = todo_list.items[i].command;
4528 if (insert >= 0) {
4529 /* skip fixup/squash chains */
4530 if (command == TODO_COMMENT)
4531 continue;
4532 else if (is_fixup(command)) {
4533 insert = i + 1;
4534 continue;
4536 strbuf_insert(buf,
4537 todo_list.items[insert].offset_in_buf +
4538 offset, commands, commands_len);
4539 offset += commands_len;
4540 insert = -1;
4543 if (command == TODO_PICK || command == TODO_MERGE)
4544 insert = i + 1;
4547 /* insert or append final <commands> */
4548 if (insert >= 0 && insert < todo_list.nr)
4549 strbuf_insert(buf, todo_list.items[insert].offset_in_buf +
4550 offset, commands, commands_len);
4551 else if (insert >= 0 || !offset)
4552 strbuf_add(buf, commands, commands_len);
4554 i = write_message(buf->buf, buf->len, todo_file, 0);
4555 todo_list_release(&todo_list);
4556 return i;
4559 int transform_todos(unsigned flags)
4561 const char *todo_file = rebase_path_todo();
4562 struct todo_list todo_list = TODO_LIST_INIT;
4563 struct strbuf buf = STRBUF_INIT;
4564 struct todo_item *item;
4565 int i;
4567 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4568 return error(_("could not read '%s'."), todo_file);
4570 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
4571 todo_list_release(&todo_list);
4572 return error(_("unusable todo list: '%s'"), todo_file);
4575 for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
4576 /* if the item is not a command write it and continue */
4577 if (item->command >= TODO_COMMENT) {
4578 strbuf_addf(&buf, "%.*s\n", item->arg_len, item->arg);
4579 continue;
4582 /* add command to the buffer */
4583 if (flags & TODO_LIST_ABBREVIATE_CMDS)
4584 strbuf_addch(&buf, command_to_char(item->command));
4585 else
4586 strbuf_addstr(&buf, command_to_string(item->command));
4588 /* add commit id */
4589 if (item->commit) {
4590 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
4591 short_commit_name(item->commit) :
4592 oid_to_hex(&item->commit->object.oid);
4594 if (item->command == TODO_MERGE) {
4595 if (item->flags & TODO_EDIT_MERGE_MSG)
4596 strbuf_addstr(&buf, " -c");
4597 else
4598 strbuf_addstr(&buf, " -C");
4601 strbuf_addf(&buf, " %s", oid);
4604 /* add all the rest */
4605 if (!item->arg_len)
4606 strbuf_addch(&buf, '\n');
4607 else
4608 strbuf_addf(&buf, " %.*s\n", item->arg_len, item->arg);
4611 i = write_message(buf.buf, buf.len, todo_file, 0);
4612 todo_list_release(&todo_list);
4613 return i;
4616 enum missing_commit_check_level get_missing_commit_check_level(void)
4618 const char *value;
4620 if (git_config_get_value("rebase.missingcommitscheck", &value) ||
4621 !strcasecmp("ignore", value))
4622 return MISSING_COMMIT_CHECK_IGNORE;
4623 if (!strcasecmp("warn", value))
4624 return MISSING_COMMIT_CHECK_WARN;
4625 if (!strcasecmp("error", value))
4626 return MISSING_COMMIT_CHECK_ERROR;
4627 warning(_("unrecognized setting %s for option "
4628 "rebase.missingCommitsCheck. Ignoring."), value);
4629 return MISSING_COMMIT_CHECK_IGNORE;
4632 define_commit_slab(commit_seen, unsigned char);
4634 * Check if the user dropped some commits by mistake
4635 * Behaviour determined by rebase.missingCommitsCheck.
4636 * Check if there is an unrecognized command or a
4637 * bad SHA-1 in a command.
4639 int check_todo_list(void)
4641 enum missing_commit_check_level check_level = get_missing_commit_check_level();
4642 struct strbuf todo_file = STRBUF_INIT;
4643 struct todo_list todo_list = TODO_LIST_INIT;
4644 struct strbuf missing = STRBUF_INIT;
4645 int advise_to_edit_todo = 0, res = 0, i;
4646 struct commit_seen commit_seen;
4648 init_commit_seen(&commit_seen);
4650 strbuf_addstr(&todo_file, rebase_path_todo());
4651 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4652 res = -1;
4653 goto leave_check;
4655 advise_to_edit_todo = res =
4656 parse_insn_buffer(todo_list.buf.buf, &todo_list);
4658 if (res || check_level == MISSING_COMMIT_CHECK_IGNORE)
4659 goto leave_check;
4661 /* Mark the commits in git-rebase-todo as seen */
4662 for (i = 0; i < todo_list.nr; i++) {
4663 struct commit *commit = todo_list.items[i].commit;
4664 if (commit)
4665 *commit_seen_at(&commit_seen, commit) = 1;
4668 todo_list_release(&todo_list);
4669 strbuf_addstr(&todo_file, ".backup");
4670 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4671 res = -1;
4672 goto leave_check;
4674 strbuf_release(&todo_file);
4675 res = !!parse_insn_buffer(todo_list.buf.buf, &todo_list);
4677 /* Find commits in git-rebase-todo.backup yet unseen */
4678 for (i = todo_list.nr - 1; i >= 0; i--) {
4679 struct todo_item *item = todo_list.items + i;
4680 struct commit *commit = item->commit;
4681 if (commit && !*commit_seen_at(&commit_seen, commit)) {
4682 strbuf_addf(&missing, " - %s %.*s\n",
4683 short_commit_name(commit),
4684 item->arg_len, item->arg);
4685 *commit_seen_at(&commit_seen, commit) = 1;
4689 /* Warn about missing commits */
4690 if (!missing.len)
4691 goto leave_check;
4693 if (check_level == MISSING_COMMIT_CHECK_ERROR)
4694 advise_to_edit_todo = res = 1;
4696 fprintf(stderr,
4697 _("Warning: some commits may have been dropped accidentally.\n"
4698 "Dropped commits (newer to older):\n"));
4700 /* Make the list user-friendly and display */
4701 fputs(missing.buf, stderr);
4702 strbuf_release(&missing);
4704 fprintf(stderr, _("To avoid this message, use \"drop\" to "
4705 "explicitly remove a commit.\n\n"
4706 "Use 'git config rebase.missingCommitsCheck' to change "
4707 "the level of warnings.\n"
4708 "The possible behaviours are: ignore, warn, error.\n\n"));
4710 leave_check:
4711 clear_commit_seen(&commit_seen);
4712 strbuf_release(&todo_file);
4713 todo_list_release(&todo_list);
4715 if (advise_to_edit_todo)
4716 fprintf(stderr,
4717 _("You can fix this with 'git rebase --edit-todo' "
4718 "and then run 'git rebase --continue'.\n"
4719 "Or you can abort the rebase with 'git rebase"
4720 " --abort'.\n"));
4722 return res;
4725 static int rewrite_file(const char *path, const char *buf, size_t len)
4727 int rc = 0;
4728 int fd = open(path, O_WRONLY | O_TRUNC);
4729 if (fd < 0)
4730 return error_errno(_("could not open '%s' for writing"), path);
4731 if (write_in_full(fd, buf, len) < 0)
4732 rc = error_errno(_("could not write to '%s'"), path);
4733 if (close(fd) && !rc)
4734 rc = error_errno(_("could not close '%s'"), path);
4735 return rc;
4738 /* skip picking commits whose parents are unchanged */
4739 static int skip_unnecessary_picks(struct object_id *output_oid)
4741 const char *todo_file = rebase_path_todo();
4742 struct strbuf buf = STRBUF_INIT;
4743 struct todo_list todo_list = TODO_LIST_INIT;
4744 struct object_id *parent_oid;
4745 int fd, i;
4747 if (!read_oneliner(&buf, rebase_path_onto(), 0))
4748 return error(_("could not read 'onto'"));
4749 if (get_oid(buf.buf, output_oid)) {
4750 strbuf_release(&buf);
4751 return error(_("need a HEAD to fixup"));
4753 strbuf_release(&buf);
4755 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4756 return -1;
4757 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
4758 todo_list_release(&todo_list);
4759 return -1;
4762 for (i = 0; i < todo_list.nr; i++) {
4763 struct todo_item *item = todo_list.items + i;
4765 if (item->command >= TODO_NOOP)
4766 continue;
4767 if (item->command != TODO_PICK)
4768 break;
4769 if (parse_commit(item->commit)) {
4770 todo_list_release(&todo_list);
4771 return error(_("could not parse commit '%s'"),
4772 oid_to_hex(&item->commit->object.oid));
4774 if (!item->commit->parents)
4775 break; /* root commit */
4776 if (item->commit->parents->next)
4777 break; /* merge commit */
4778 parent_oid = &item->commit->parents->item->object.oid;
4779 if (!oideq(parent_oid, output_oid))
4780 break;
4781 oidcpy(output_oid, &item->commit->object.oid);
4783 if (i > 0) {
4784 int offset = get_item_line_offset(&todo_list, i);
4785 const char *done_path = rebase_path_done();
4787 fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
4788 if (fd < 0) {
4789 error_errno(_("could not open '%s' for writing"),
4790 done_path);
4791 todo_list_release(&todo_list);
4792 return -1;
4794 if (write_in_full(fd, todo_list.buf.buf, offset) < 0) {
4795 error_errno(_("could not write to '%s'"), done_path);
4796 todo_list_release(&todo_list);
4797 close(fd);
4798 return -1;
4800 close(fd);
4802 if (rewrite_file(rebase_path_todo(), todo_list.buf.buf + offset,
4803 todo_list.buf.len - offset) < 0) {
4804 todo_list_release(&todo_list);
4805 return -1;
4808 todo_list.current = i;
4809 if (is_fixup(peek_command(&todo_list, 0)))
4810 record_in_rewritten(output_oid, peek_command(&todo_list, 0));
4813 todo_list_release(&todo_list);
4815 return 0;
4818 int complete_action(struct replay_opts *opts, unsigned flags,
4819 const char *shortrevisions, const char *onto_name,
4820 const char *onto, const char *orig_head, const char *cmd,
4821 unsigned autosquash)
4823 const char *shortonto, *todo_file = rebase_path_todo();
4824 struct todo_list todo_list = TODO_LIST_INIT;
4825 struct strbuf *buf = &(todo_list.buf);
4826 struct object_id oid;
4827 struct stat st;
4829 get_oid(onto, &oid);
4830 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
4832 if (!lstat(todo_file, &st) && st.st_size == 0 &&
4833 write_message("noop\n", 5, todo_file, 0))
4834 return -1;
4836 if (autosquash && rearrange_squash())
4837 return -1;
4839 if (cmd && *cmd)
4840 sequencer_add_exec_commands(cmd);
4842 if (strbuf_read_file(buf, todo_file, 0) < 0)
4843 return error_errno(_("could not read '%s'."), todo_file);
4845 if (parse_insn_buffer(buf->buf, &todo_list)) {
4846 todo_list_release(&todo_list);
4847 return error(_("unusable todo list: '%s'"), todo_file);
4850 if (count_commands(&todo_list) == 0) {
4851 apply_autostash(opts);
4852 sequencer_remove_state(opts);
4853 todo_list_release(&todo_list);
4855 return error(_("nothing to do"));
4858 strbuf_addch(buf, '\n');
4859 strbuf_commented_addf(buf, Q_("Rebase %s onto %s (%d command)",
4860 "Rebase %s onto %s (%d commands)",
4861 count_commands(&todo_list)),
4862 shortrevisions, shortonto, count_commands(&todo_list));
4863 append_todo_help(0, flags & TODO_LIST_KEEP_EMPTY, buf);
4865 if (write_message(buf->buf, buf->len, todo_file, 0)) {
4866 todo_list_release(&todo_list);
4867 return -1;
4870 if (copy_file(rebase_path_todo_backup(), todo_file, 0666))
4871 return error(_("could not copy '%s' to '%s'."), todo_file,
4872 rebase_path_todo_backup());
4874 if (transform_todos(flags | TODO_LIST_SHORTEN_IDS))
4875 return error(_("could not transform the todo list"));
4877 strbuf_reset(buf);
4879 if (launch_sequence_editor(todo_file, buf, NULL)) {
4880 apply_autostash(opts);
4881 sequencer_remove_state(opts);
4882 todo_list_release(&todo_list);
4884 return -1;
4887 strbuf_stripspace(buf, 1);
4888 if (buf->len == 0) {
4889 apply_autostash(opts);
4890 sequencer_remove_state(opts);
4891 todo_list_release(&todo_list);
4893 return error(_("nothing to do"));
4896 todo_list_release(&todo_list);
4898 if (check_todo_list()) {
4899 checkout_onto(opts, onto_name, onto, orig_head);
4900 return -1;
4903 if (transform_todos(flags & ~(TODO_LIST_SHORTEN_IDS)))
4904 return error(_("could not transform the todo list"));
4906 if (opts->allow_ff && skip_unnecessary_picks(&oid))
4907 return error(_("could not skip unnecessary pick commands"));
4909 if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head))
4910 return -1;
4912 if (require_clean_work_tree("rebase", "", 1, 1))
4913 return -1;
4915 return sequencer_continue(opts);
4918 struct subject2item_entry {
4919 struct hashmap_entry entry;
4920 int i;
4921 char subject[FLEX_ARRAY];
4924 static int subject2item_cmp(const void *fndata,
4925 const struct subject2item_entry *a,
4926 const struct subject2item_entry *b, const void *key)
4928 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
4931 define_commit_slab(commit_todo_item, struct todo_item *);
4934 * Rearrange the todo list that has both "pick commit-id msg" and "pick
4935 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
4936 * after the former, and change "pick" to "fixup"/"squash".
4938 * Note that if the config has specified a custom instruction format, each log
4939 * message will have to be retrieved from the commit (as the oneline in the
4940 * script cannot be trusted) in order to normalize the autosquash arrangement.
4942 int rearrange_squash(void)
4944 const char *todo_file = rebase_path_todo();
4945 struct todo_list todo_list = TODO_LIST_INIT;
4946 struct hashmap subject2item;
4947 int res = 0, rearranged = 0, *next, *tail, i;
4948 char **subjects;
4949 struct commit_todo_item commit_todo;
4951 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4952 return -1;
4953 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
4954 todo_list_release(&todo_list);
4955 return -1;
4958 init_commit_todo_item(&commit_todo);
4960 * The hashmap maps onelines to the respective todo list index.
4962 * If any items need to be rearranged, the next[i] value will indicate
4963 * which item was moved directly after the i'th.
4965 * In that case, last[i] will indicate the index of the latest item to
4966 * be moved to appear after the i'th.
4968 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
4969 NULL, todo_list.nr);
4970 ALLOC_ARRAY(next, todo_list.nr);
4971 ALLOC_ARRAY(tail, todo_list.nr);
4972 ALLOC_ARRAY(subjects, todo_list.nr);
4973 for (i = 0; i < todo_list.nr; i++) {
4974 struct strbuf buf = STRBUF_INIT;
4975 struct todo_item *item = todo_list.items + i;
4976 const char *commit_buffer, *subject, *p;
4977 size_t subject_len;
4978 int i2 = -1;
4979 struct subject2item_entry *entry;
4981 next[i] = tail[i] = -1;
4982 if (!item->commit || item->command == TODO_DROP) {
4983 subjects[i] = NULL;
4984 continue;
4987 if (is_fixup(item->command)) {
4988 todo_list_release(&todo_list);
4989 clear_commit_todo_item(&commit_todo);
4990 return error(_("the script was already rearranged."));
4993 *commit_todo_item_at(&commit_todo, item->commit) = item;
4995 parse_commit(item->commit);
4996 commit_buffer = get_commit_buffer(item->commit, NULL);
4997 find_commit_subject(commit_buffer, &subject);
4998 format_subject(&buf, subject, " ");
4999 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5000 unuse_commit_buffer(item->commit, commit_buffer);
5001 if ((skip_prefix(subject, "fixup! ", &p) ||
5002 skip_prefix(subject, "squash! ", &p))) {
5003 struct commit *commit2;
5005 for (;;) {
5006 while (isspace(*p))
5007 p++;
5008 if (!skip_prefix(p, "fixup! ", &p) &&
5009 !skip_prefix(p, "squash! ", &p))
5010 break;
5013 if ((entry = hashmap_get_from_hash(&subject2item,
5014 strhash(p), p)))
5015 /* found by title */
5016 i2 = entry->i;
5017 else if (!strchr(p, ' ') &&
5018 (commit2 =
5019 lookup_commit_reference_by_name(p)) &&
5020 *commit_todo_item_at(&commit_todo, commit2))
5021 /* found by commit name */
5022 i2 = *commit_todo_item_at(&commit_todo, commit2)
5023 - todo_list.items;
5024 else {
5025 /* copy can be a prefix of the commit subject */
5026 for (i2 = 0; i2 < i; i2++)
5027 if (subjects[i2] &&
5028 starts_with(subjects[i2], p))
5029 break;
5030 if (i2 == i)
5031 i2 = -1;
5034 if (i2 >= 0) {
5035 rearranged = 1;
5036 todo_list.items[i].command =
5037 starts_with(subject, "fixup!") ?
5038 TODO_FIXUP : TODO_SQUASH;
5039 if (next[i2] < 0)
5040 next[i2] = i;
5041 else
5042 next[tail[i2]] = i;
5043 tail[i2] = i;
5044 } else if (!hashmap_get_from_hash(&subject2item,
5045 strhash(subject), subject)) {
5046 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5047 entry->i = i;
5048 hashmap_entry_init(entry, strhash(entry->subject));
5049 hashmap_put(&subject2item, entry);
5053 if (rearranged) {
5054 struct strbuf buf = STRBUF_INIT;
5056 for (i = 0; i < todo_list.nr; i++) {
5057 enum todo_command command = todo_list.items[i].command;
5058 int cur = i;
5061 * Initially, all commands are 'pick's. If it is a
5062 * fixup or a squash now, we have rearranged it.
5064 if (is_fixup(command))
5065 continue;
5067 while (cur >= 0) {
5068 const char *bol =
5069 get_item_line(&todo_list, cur);
5070 const char *eol =
5071 get_item_line(&todo_list, cur + 1);
5073 /* replace 'pick', by 'fixup' or 'squash' */
5074 command = todo_list.items[cur].command;
5075 if (is_fixup(command)) {
5076 strbuf_addstr(&buf,
5077 todo_command_info[command].str);
5078 bol += strcspn(bol, " \t");
5081 strbuf_add(&buf, bol, eol - bol);
5083 cur = next[cur];
5087 res = rewrite_file(todo_file, buf.buf, buf.len);
5088 strbuf_release(&buf);
5091 free(next);
5092 free(tail);
5093 for (i = 0; i < todo_list.nr; i++)
5094 free(subjects[i]);
5095 free(subjects);
5096 hashmap_free(&subject2item, 1);
5097 todo_list_release(&todo_list);
5099 clear_commit_todo_item(&commit_todo);
5100 return res;