sequencer.c: remove implicit dependency on the_index
[git/raj.git] / sequencer.c
blob6cf3f65b0c05691794584e0ed8945de40f3d9d07
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")
162 static int git_sequencer_config(const char *k, const char *v, void *cb)
164 struct replay_opts *opts = cb;
165 int status;
167 if (!strcmp(k, "commit.cleanup")) {
168 const char *s;
170 status = git_config_string(&s, k, v);
171 if (status)
172 return status;
174 if (!strcmp(s, "verbatim"))
175 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
176 else if (!strcmp(s, "whitespace"))
177 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
178 else if (!strcmp(s, "strip"))
179 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
180 else if (!strcmp(s, "scissors"))
181 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
182 else
183 warning(_("invalid commit message cleanup mode '%s'"),
186 free((char *)s);
187 return status;
190 if (!strcmp(k, "commit.gpgsign")) {
191 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
192 return 0;
195 status = git_gpg_config(k, v, NULL);
196 if (status)
197 return status;
199 return git_diff_basic_config(k, v, NULL);
202 void sequencer_init_config(struct replay_opts *opts)
204 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
205 git_config(git_sequencer_config, opts);
208 static inline int is_rebase_i(const struct replay_opts *opts)
210 return opts->action == REPLAY_INTERACTIVE_REBASE;
213 static const char *get_dir(const struct replay_opts *opts)
215 if (is_rebase_i(opts))
216 return rebase_path();
217 return git_path_seq_dir();
220 static const char *get_todo_path(const struct replay_opts *opts)
222 if (is_rebase_i(opts))
223 return rebase_path_todo();
224 return git_path_todo_file();
228 * Returns 0 for non-conforming footer
229 * Returns 1 for conforming footer
230 * Returns 2 when sob exists within conforming footer
231 * Returns 3 when sob exists within conforming footer as last entry
233 static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
234 size_t ignore_footer)
236 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
237 struct trailer_info info;
238 size_t i;
239 int found_sob = 0, found_sob_last = 0;
241 opts.no_divider = 1;
243 trailer_info_get(&info, sb->buf, &opts);
245 if (info.trailer_start == info.trailer_end)
246 return 0;
248 for (i = 0; i < info.trailer_nr; i++)
249 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
250 found_sob = 1;
251 if (i == info.trailer_nr - 1)
252 found_sob_last = 1;
255 trailer_info_release(&info);
257 if (found_sob_last)
258 return 3;
259 if (found_sob)
260 return 2;
261 return 1;
264 static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
266 static struct strbuf buf = STRBUF_INIT;
268 strbuf_reset(&buf);
269 if (opts->gpg_sign)
270 sq_quotef(&buf, "-S%s", opts->gpg_sign);
271 return buf.buf;
274 int sequencer_remove_state(struct replay_opts *opts)
276 struct strbuf buf = STRBUF_INIT;
277 int i;
279 if (is_rebase_i(opts) &&
280 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
281 char *p = buf.buf;
282 while (*p) {
283 char *eol = strchr(p, '\n');
284 if (eol)
285 *eol = '\0';
286 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0)
287 warning(_("could not delete '%s'"), p);
288 if (!eol)
289 break;
290 p = eol + 1;
294 free(opts->gpg_sign);
295 free(opts->strategy);
296 for (i = 0; i < opts->xopts_nr; i++)
297 free(opts->xopts[i]);
298 free(opts->xopts);
299 strbuf_release(&opts->current_fixups);
301 strbuf_reset(&buf);
302 strbuf_addstr(&buf, get_dir(opts));
303 remove_dir_recursively(&buf, 0);
304 strbuf_release(&buf);
306 return 0;
309 static const char *action_name(const struct replay_opts *opts)
311 switch (opts->action) {
312 case REPLAY_REVERT:
313 return N_("revert");
314 case REPLAY_PICK:
315 return N_("cherry-pick");
316 case REPLAY_INTERACTIVE_REBASE:
317 return N_("rebase -i");
319 die(_("unknown action: %d"), opts->action);
322 struct commit_message {
323 char *parent_label;
324 char *label;
325 char *subject;
326 const char *message;
329 static const char *short_commit_name(struct commit *commit)
331 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
334 static int get_message(struct commit *commit, struct commit_message *out)
336 const char *abbrev, *subject;
337 int subject_len;
339 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
340 abbrev = short_commit_name(commit);
342 subject_len = find_commit_subject(out->message, &subject);
344 out->subject = xmemdupz(subject, subject_len);
345 out->label = xstrfmt("%s... %s", abbrev, out->subject);
346 out->parent_label = xstrfmt("parent of %s", out->label);
348 return 0;
351 static void free_message(struct commit *commit, struct commit_message *msg)
353 free(msg->parent_label);
354 free(msg->label);
355 free(msg->subject);
356 unuse_commit_buffer(commit, msg->message);
359 static void print_advice(int show_hint, struct replay_opts *opts)
361 char *msg = getenv("GIT_CHERRY_PICK_HELP");
363 if (msg) {
364 fprintf(stderr, "%s\n", msg);
366 * A conflict has occurred but the porcelain
367 * (typically rebase --interactive) wants to take care
368 * of the commit itself so remove CHERRY_PICK_HEAD
370 unlink(git_path_cherry_pick_head(the_repository));
371 return;
374 if (show_hint) {
375 if (opts->no_commit)
376 advise(_("after resolving the conflicts, mark the corrected paths\n"
377 "with 'git add <paths>' or 'git rm <paths>'"));
378 else
379 advise(_("after resolving the conflicts, mark the corrected paths\n"
380 "with 'git add <paths>' or 'git rm <paths>'\n"
381 "and commit the result with 'git commit'"));
385 int write_message(const void *buf, size_t len, const char *filename,
386 int append_eol)
388 struct lock_file msg_file = LOCK_INIT;
390 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
391 if (msg_fd < 0)
392 return error_errno(_("could not lock '%s'"), filename);
393 if (write_in_full(msg_fd, buf, len) < 0) {
394 error_errno(_("could not write to '%s'"), filename);
395 rollback_lock_file(&msg_file);
396 return -1;
398 if (append_eol && write(msg_fd, "\n", 1) < 0) {
399 error_errno(_("could not write eol to '%s'"), filename);
400 rollback_lock_file(&msg_file);
401 return -1;
403 if (commit_lock_file(&msg_file) < 0)
404 return error(_("failed to finalize '%s'"), filename);
406 return 0;
410 * Reads a file that was presumably written by a shell script, i.e. with an
411 * end-of-line marker that needs to be stripped.
413 * Note that only the last end-of-line marker is stripped, consistent with the
414 * behavior of "$(cat path)" in a shell script.
416 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
418 static int read_oneliner(struct strbuf *buf,
419 const char *path, int skip_if_empty)
421 int orig_len = buf->len;
423 if (!file_exists(path))
424 return 0;
426 if (strbuf_read_file(buf, path, 0) < 0) {
427 warning_errno(_("could not read '%s'"), path);
428 return 0;
431 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
432 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
433 --buf->len;
434 buf->buf[buf->len] = '\0';
437 if (skip_if_empty && buf->len == orig_len)
438 return 0;
440 return 1;
443 static struct tree *empty_tree(void)
445 return lookup_tree(the_repository, the_repository->hash_algo->empty_tree);
448 static int error_dirty_index(struct index_state *istate, struct replay_opts *opts)
450 if (read_index_unmerged(istate))
451 return error_resolve_conflict(_(action_name(opts)));
453 error(_("your local changes would be overwritten by %s."),
454 _(action_name(opts)));
456 if (advice_commit_before_merge)
457 advise(_("commit your changes or stash them to proceed."));
458 return -1;
461 static void update_abort_safety_file(void)
463 struct object_id head;
465 /* Do nothing on a single-pick */
466 if (!file_exists(git_path_seq_dir()))
467 return;
469 if (!get_oid("HEAD", &head))
470 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
471 else
472 write_file(git_path_abort_safety_file(), "%s", "");
475 static int fast_forward_to(struct repository *r,
476 const struct object_id *to,
477 const struct object_id *from,
478 int unborn,
479 struct replay_opts *opts)
481 struct ref_transaction *transaction;
482 struct strbuf sb = STRBUF_INIT;
483 struct strbuf err = STRBUF_INIT;
485 read_index(r->index);
486 if (checkout_fast_forward(r, from, to, 1))
487 return -1; /* the callee should have complained already */
489 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
491 transaction = ref_transaction_begin(&err);
492 if (!transaction ||
493 ref_transaction_update(transaction, "HEAD",
494 to, unborn && !is_rebase_i(opts) ?
495 &null_oid : from,
496 0, sb.buf, &err) ||
497 ref_transaction_commit(transaction, &err)) {
498 ref_transaction_free(transaction);
499 error("%s", err.buf);
500 strbuf_release(&sb);
501 strbuf_release(&err);
502 return -1;
505 strbuf_release(&sb);
506 strbuf_release(&err);
507 ref_transaction_free(transaction);
508 update_abort_safety_file();
509 return 0;
512 void append_conflicts_hint(struct index_state *istate,
513 struct strbuf *msgbuf)
515 int i;
517 strbuf_addch(msgbuf, '\n');
518 strbuf_commented_addf(msgbuf, "Conflicts:\n");
519 for (i = 0; i < istate->cache_nr;) {
520 const struct cache_entry *ce = istate->cache[i++];
521 if (ce_stage(ce)) {
522 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
523 while (i < istate->cache_nr &&
524 !strcmp(ce->name, istate->cache[i]->name))
525 i++;
530 static int do_recursive_merge(struct repository *r,
531 struct commit *base, struct commit *next,
532 const char *base_label, const char *next_label,
533 struct object_id *head, struct strbuf *msgbuf,
534 struct replay_opts *opts)
536 struct merge_options o;
537 struct tree *result, *next_tree, *base_tree, *head_tree;
538 int clean;
539 char **xopt;
540 struct lock_file index_lock = LOCK_INIT;
542 if (hold_locked_index(&index_lock, LOCK_REPORT_ON_ERROR) < 0)
543 return -1;
545 read_index(r->index);
547 init_merge_options(&o);
548 o.ancestor = base ? base_label : "(empty tree)";
549 o.branch1 = "HEAD";
550 o.branch2 = next ? next_label : "(empty tree)";
551 if (is_rebase_i(opts))
552 o.buffer_output = 2;
553 o.show_rename_progress = 1;
555 head_tree = parse_tree_indirect(head);
556 next_tree = next ? get_commit_tree(next) : empty_tree();
557 base_tree = base ? get_commit_tree(base) : empty_tree();
559 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
560 parse_merge_opt(&o, *xopt);
562 clean = merge_trees(&o,
563 head_tree,
564 next_tree, base_tree, &result);
565 if (is_rebase_i(opts) && clean <= 0)
566 fputs(o.obuf.buf, stdout);
567 strbuf_release(&o.obuf);
568 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
569 if (clean < 0) {
570 rollback_lock_file(&index_lock);
571 return clean;
574 if (write_locked_index(r->index, &index_lock,
575 COMMIT_LOCK | SKIP_IF_UNCHANGED))
577 * TRANSLATORS: %s will be "revert", "cherry-pick" or
578 * "rebase -i".
580 return error(_("%s: Unable to write new index file"),
581 _(action_name(opts)));
583 if (!clean)
584 append_conflicts_hint(r->index, msgbuf);
586 return !clean;
589 static struct object_id *get_cache_tree_oid(struct index_state *istate)
591 if (!istate->cache_tree)
592 istate->cache_tree = cache_tree();
594 if (!cache_tree_fully_valid(istate->cache_tree))
595 if (cache_tree_update(istate, 0)) {
596 error(_("unable to update cache tree"));
597 return NULL;
600 return &istate->cache_tree->oid;
603 static int is_index_unchanged(struct index_state *istate)
605 struct object_id head_oid, *cache_tree_oid;
606 struct commit *head_commit;
608 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
609 return error(_("could not resolve HEAD commit"));
611 head_commit = lookup_commit(the_repository, &head_oid);
614 * If head_commit is NULL, check_commit, called from
615 * lookup_commit, would have indicated that head_commit is not
616 * a commit object already. parse_commit() will return failure
617 * without further complaints in such a case. Otherwise, if
618 * the commit is invalid, parse_commit() will complain. So
619 * there is nothing for us to say here. Just return failure.
621 if (parse_commit(head_commit))
622 return -1;
624 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
625 return -1;
627 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
630 static int write_author_script(const char *message)
632 struct strbuf buf = STRBUF_INIT;
633 const char *eol;
634 int res;
636 for (;;)
637 if (!*message || starts_with(message, "\n")) {
638 missing_author:
639 /* Missing 'author' line? */
640 unlink(rebase_path_author_script());
641 return 0;
642 } else if (skip_prefix(message, "author ", &message))
643 break;
644 else if ((eol = strchr(message, '\n')))
645 message = eol + 1;
646 else
647 goto missing_author;
649 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
650 while (*message && *message != '\n' && *message != '\r')
651 if (skip_prefix(message, " <", &message))
652 break;
653 else if (*message != '\'')
654 strbuf_addch(&buf, *(message++));
655 else
656 strbuf_addf(&buf, "'\\%c'", *(message++));
657 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
658 while (*message && *message != '\n' && *message != '\r')
659 if (skip_prefix(message, "> ", &message))
660 break;
661 else if (*message != '\'')
662 strbuf_addch(&buf, *(message++));
663 else
664 strbuf_addf(&buf, "'\\%c'", *(message++));
665 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
666 while (*message && *message != '\n' && *message != '\r')
667 if (*message != '\'')
668 strbuf_addch(&buf, *(message++));
669 else
670 strbuf_addf(&buf, "'\\%c'", *(message++));
671 strbuf_addch(&buf, '\'');
672 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
673 strbuf_release(&buf);
674 return res;
679 * write_author_script() used to fail to terminate the last line with a "'" and
680 * also escaped "'" incorrectly as "'\\\\''" rather than "'\\''". We check for
681 * the terminating "'" on the last line to see how "'" has been escaped in case
682 * git was upgraded while rebase was stopped.
684 static int quoting_is_broken(const char *s, size_t n)
686 /* Skip any empty lines in case the file was hand edited */
687 while (n > 0 && s[--n] == '\n')
688 ; /* empty */
689 if (n > 0 && s[n] != '\'')
690 return 1;
692 return 0;
696 * Read a list of environment variable assignments (such as the author-script
697 * file) into an environment block. Returns -1 on error, 0 otherwise.
699 static int read_env_script(struct argv_array *env)
701 struct strbuf script = STRBUF_INIT;
702 int i, count = 0, sq_bug;
703 const char *p2;
704 char *p;
706 if (strbuf_read_file(&script, rebase_path_author_script(), 256) <= 0)
707 return -1;
708 /* write_author_script() used to quote incorrectly */
709 sq_bug = quoting_is_broken(script.buf, script.len);
710 for (p = script.buf; *p; p++)
711 if (sq_bug && skip_prefix(p, "'\\\\''", &p2))
712 strbuf_splice(&script, p - script.buf, p2 - p, "'", 1);
713 else if (skip_prefix(p, "'\\''", &p2))
714 strbuf_splice(&script, p - script.buf, p2 - p, "'", 1);
715 else if (*p == '\'')
716 strbuf_splice(&script, p-- - script.buf, 1, "", 0);
717 else if (*p == '\n') {
718 *p = '\0';
719 count++;
722 for (i = 0, p = script.buf; i < count; i++) {
723 argv_array_push(env, p);
724 p += strlen(p) + 1;
727 return 0;
730 static char *get_author(const char *message)
732 size_t len;
733 const char *a;
735 a = find_commit_header(message, "author", &len);
736 if (a)
737 return xmemdupz(a, len);
739 return NULL;
742 /* Read author-script and return an ident line (author <email> timestamp) */
743 static const char *read_author_ident(struct strbuf *buf)
745 const char *keys[] = {
746 "GIT_AUTHOR_NAME=", "GIT_AUTHOR_EMAIL=", "GIT_AUTHOR_DATE="
748 struct strbuf out = STRBUF_INIT;
749 char *in, *eol;
750 const char *val[3];
751 int i = 0;
753 if (strbuf_read_file(buf, rebase_path_author_script(), 256) <= 0)
754 return NULL;
756 /* dequote values and construct ident line in-place */
757 for (in = buf->buf; i < 3 && in - buf->buf < buf->len; i++) {
758 if (!skip_prefix(in, keys[i], (const char **)&in)) {
759 warning(_("could not parse '%s' (looking for '%s')"),
760 rebase_path_author_script(), keys[i]);
761 return NULL;
764 eol = strchrnul(in, '\n');
765 *eol = '\0';
766 if (!sq_dequote(in)) {
767 warning(_("bad quoting on %s value in '%s'"),
768 keys[i], rebase_path_author_script());
769 return NULL;
771 val[i] = in;
772 in = eol + 1;
775 if (i < 3) {
776 warning(_("could not parse '%s' (looking for '%s')"),
777 rebase_path_author_script(), keys[i]);
778 return NULL;
781 /* validate date since fmt_ident() will die() on bad value */
782 if (parse_date(val[2], &out)){
783 warning(_("invalid date format '%s' in '%s'"),
784 val[2], rebase_path_author_script());
785 strbuf_release(&out);
786 return NULL;
789 strbuf_reset(&out);
790 strbuf_addstr(&out, fmt_ident(val[0], val[1], val[2], 0));
791 strbuf_swap(buf, &out);
792 strbuf_release(&out);
793 return buf->buf;
796 static const char staged_changes_advice[] =
797 N_("you have staged changes in your working tree\n"
798 "If these changes are meant to be squashed into the previous commit, run:\n"
799 "\n"
800 " git commit --amend %s\n"
801 "\n"
802 "If they are meant to go into a new commit, run:\n"
803 "\n"
804 " git commit %s\n"
805 "\n"
806 "In both cases, once you're done, continue with:\n"
807 "\n"
808 " git rebase --continue\n");
810 #define ALLOW_EMPTY (1<<0)
811 #define EDIT_MSG (1<<1)
812 #define AMEND_MSG (1<<2)
813 #define CLEANUP_MSG (1<<3)
814 #define VERIFY_MSG (1<<4)
815 #define CREATE_ROOT_COMMIT (1<<5)
817 static int run_command_silent_on_success(struct child_process *cmd)
819 struct strbuf buf = STRBUF_INIT;
820 int rc;
822 cmd->stdout_to_stderr = 1;
823 rc = pipe_command(cmd,
824 NULL, 0,
825 NULL, 0,
826 &buf, 0);
828 if (rc)
829 fputs(buf.buf, stderr);
830 strbuf_release(&buf);
831 return rc;
835 * If we are cherry-pick, and if the merge did not result in
836 * hand-editing, we will hit this commit and inherit the original
837 * author date and name.
839 * If we are revert, or if our cherry-pick results in a hand merge,
840 * we had better say that the current user is responsible for that.
842 * An exception is when run_git_commit() is called during an
843 * interactive rebase: in that case, we will want to retain the
844 * author metadata.
846 static int run_git_commit(struct repository *r,
847 const char *defmsg,
848 struct replay_opts *opts,
849 unsigned int flags)
851 struct child_process cmd = CHILD_PROCESS_INIT;
852 const char *value;
854 if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
855 struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
856 const char *author = NULL;
857 struct object_id root_commit, *cache_tree_oid;
858 int res = 0;
860 if (is_rebase_i(opts)) {
861 author = read_author_ident(&script);
862 if (!author) {
863 strbuf_release(&script);
864 return -1;
868 if (!defmsg)
869 BUG("root commit without message");
871 if (!(cache_tree_oid = get_cache_tree_oid(r->index)))
872 res = -1;
874 if (!res)
875 res = strbuf_read_file(&msg, defmsg, 0);
877 if (res <= 0)
878 res = error_errno(_("could not read '%s'"), defmsg);
879 else
880 res = commit_tree(msg.buf, msg.len, cache_tree_oid,
881 NULL, &root_commit, author,
882 opts->gpg_sign);
884 strbuf_release(&msg);
885 strbuf_release(&script);
886 if (!res) {
887 update_ref(NULL, "CHERRY_PICK_HEAD", &root_commit, NULL,
888 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR);
889 res = update_ref(NULL, "HEAD", &root_commit, NULL, 0,
890 UPDATE_REFS_MSG_ON_ERR);
892 return res < 0 ? error(_("writing root commit")) : 0;
895 cmd.git_cmd = 1;
897 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
898 const char *gpg_opt = gpg_sign_opt_quoted(opts);
900 return error(_(staged_changes_advice),
901 gpg_opt, gpg_opt);
904 argv_array_push(&cmd.args, "commit");
906 if (!(flags & VERIFY_MSG))
907 argv_array_push(&cmd.args, "-n");
908 if ((flags & AMEND_MSG))
909 argv_array_push(&cmd.args, "--amend");
910 if (opts->gpg_sign)
911 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
912 if (defmsg)
913 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
914 else if (!(flags & EDIT_MSG))
915 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
916 if ((flags & CLEANUP_MSG))
917 argv_array_push(&cmd.args, "--cleanup=strip");
918 if ((flags & EDIT_MSG))
919 argv_array_push(&cmd.args, "-e");
920 else if (!(flags & CLEANUP_MSG) &&
921 !opts->signoff && !opts->record_origin &&
922 git_config_get_value("commit.cleanup", &value))
923 argv_array_push(&cmd.args, "--cleanup=verbatim");
925 if ((flags & ALLOW_EMPTY))
926 argv_array_push(&cmd.args, "--allow-empty");
928 if (!(flags & EDIT_MSG))
929 argv_array_push(&cmd.args, "--allow-empty-message");
931 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
932 return run_command_silent_on_success(&cmd);
933 else
934 return run_command(&cmd);
937 static int rest_is_empty(const struct strbuf *sb, int start)
939 int i, eol;
940 const char *nl;
942 /* Check if the rest is just whitespace and Signed-off-by's. */
943 for (i = start; i < sb->len; i++) {
944 nl = memchr(sb->buf + i, '\n', sb->len - i);
945 if (nl)
946 eol = nl - sb->buf;
947 else
948 eol = sb->len;
950 if (strlen(sign_off_header) <= eol - i &&
951 starts_with(sb->buf + i, sign_off_header)) {
952 i = eol;
953 continue;
955 while (i < eol)
956 if (!isspace(sb->buf[i++]))
957 return 0;
960 return 1;
964 * Find out if the message in the strbuf contains only whitespace and
965 * Signed-off-by lines.
967 int message_is_empty(const struct strbuf *sb,
968 enum commit_msg_cleanup_mode cleanup_mode)
970 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
971 return 0;
972 return rest_is_empty(sb, 0);
976 * See if the user edited the message in the editor or left what
977 * was in the template intact
979 int template_untouched(const struct strbuf *sb, const char *template_file,
980 enum commit_msg_cleanup_mode cleanup_mode)
982 struct strbuf tmpl = STRBUF_INIT;
983 const char *start;
985 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
986 return 0;
988 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
989 return 0;
991 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
992 if (!skip_prefix(sb->buf, tmpl.buf, &start))
993 start = sb->buf;
994 strbuf_release(&tmpl);
995 return rest_is_empty(sb, start - sb->buf);
998 int update_head_with_reflog(const struct commit *old_head,
999 const struct object_id *new_head,
1000 const char *action, const struct strbuf *msg,
1001 struct strbuf *err)
1003 struct ref_transaction *transaction;
1004 struct strbuf sb = STRBUF_INIT;
1005 const char *nl;
1006 int ret = 0;
1008 if (action) {
1009 strbuf_addstr(&sb, action);
1010 strbuf_addstr(&sb, ": ");
1013 nl = strchr(msg->buf, '\n');
1014 if (nl) {
1015 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1016 } else {
1017 strbuf_addbuf(&sb, msg);
1018 strbuf_addch(&sb, '\n');
1021 transaction = ref_transaction_begin(err);
1022 if (!transaction ||
1023 ref_transaction_update(transaction, "HEAD", new_head,
1024 old_head ? &old_head->object.oid : &null_oid,
1025 0, sb.buf, err) ||
1026 ref_transaction_commit(transaction, err)) {
1027 ret = -1;
1029 ref_transaction_free(transaction);
1030 strbuf_release(&sb);
1032 return ret;
1035 static int run_rewrite_hook(const struct object_id *oldoid,
1036 const struct object_id *newoid)
1038 struct child_process proc = CHILD_PROCESS_INIT;
1039 const char *argv[3];
1040 int code;
1041 struct strbuf sb = STRBUF_INIT;
1043 argv[0] = find_hook("post-rewrite");
1044 if (!argv[0])
1045 return 0;
1047 argv[1] = "amend";
1048 argv[2] = NULL;
1050 proc.argv = argv;
1051 proc.in = -1;
1052 proc.stdout_to_stderr = 1;
1054 code = start_command(&proc);
1055 if (code)
1056 return code;
1057 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1058 sigchain_push(SIGPIPE, SIG_IGN);
1059 write_in_full(proc.in, sb.buf, sb.len);
1060 close(proc.in);
1061 strbuf_release(&sb);
1062 sigchain_pop(SIGPIPE);
1063 return finish_command(&proc);
1066 void commit_post_rewrite(const struct commit *old_head,
1067 const struct object_id *new_head)
1069 struct notes_rewrite_cfg *cfg;
1071 cfg = init_copy_notes_for_rewrite("amend");
1072 if (cfg) {
1073 /* we are amending, so old_head is not NULL */
1074 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1075 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1077 run_rewrite_hook(&old_head->object.oid, new_head);
1080 static int run_prepare_commit_msg_hook(struct repository *r,
1081 struct strbuf *msg,
1082 const char *commit)
1084 struct argv_array hook_env = ARGV_ARRAY_INIT;
1085 int ret;
1086 const char *name;
1088 name = git_path_commit_editmsg();
1089 if (write_message(msg->buf, msg->len, name, 0))
1090 return -1;
1092 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", r->index_file);
1093 argv_array_push(&hook_env, "GIT_EDITOR=:");
1094 if (commit)
1095 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1096 "commit", commit, NULL);
1097 else
1098 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1099 "message", NULL);
1100 if (ret)
1101 ret = error(_("'prepare-commit-msg' hook failed"));
1102 argv_array_clear(&hook_env);
1104 return ret;
1107 static const char implicit_ident_advice_noconfig[] =
1108 N_("Your name and email address were configured automatically based\n"
1109 "on your username and hostname. Please check that they are accurate.\n"
1110 "You can suppress this message by setting them explicitly. Run the\n"
1111 "following command and follow the instructions in your editor to edit\n"
1112 "your configuration file:\n"
1113 "\n"
1114 " git config --global --edit\n"
1115 "\n"
1116 "After doing this, you may fix the identity used for this commit with:\n"
1117 "\n"
1118 " git commit --amend --reset-author\n");
1120 static const char implicit_ident_advice_config[] =
1121 N_("Your name and email address were configured automatically based\n"
1122 "on your username and hostname. Please check that they are accurate.\n"
1123 "You can suppress this message by setting them explicitly:\n"
1124 "\n"
1125 " git config --global user.name \"Your Name\"\n"
1126 " git config --global user.email you@example.com\n"
1127 "\n"
1128 "After doing this, you may fix the identity used for this commit with:\n"
1129 "\n"
1130 " git commit --amend --reset-author\n");
1132 static const char *implicit_ident_advice(void)
1134 char *user_config = expand_user_path("~/.gitconfig", 0);
1135 char *xdg_config = xdg_config_home("config");
1136 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1138 free(user_config);
1139 free(xdg_config);
1141 if (config_exists)
1142 return _(implicit_ident_advice_config);
1143 else
1144 return _(implicit_ident_advice_noconfig);
1148 void print_commit_summary(struct repository *r,
1149 const char *prefix,
1150 const struct object_id *oid,
1151 unsigned int flags)
1153 struct rev_info rev;
1154 struct commit *commit;
1155 struct strbuf format = STRBUF_INIT;
1156 const char *head;
1157 struct pretty_print_context pctx = {0};
1158 struct strbuf author_ident = STRBUF_INIT;
1159 struct strbuf committer_ident = STRBUF_INIT;
1161 commit = lookup_commit(r, oid);
1162 if (!commit)
1163 die(_("couldn't look up newly created commit"));
1164 if (parse_commit(commit))
1165 die(_("could not parse newly created commit"));
1167 strbuf_addstr(&format, "format:%h] %s");
1169 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1170 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1171 if (strbuf_cmp(&author_ident, &committer_ident)) {
1172 strbuf_addstr(&format, "\n Author: ");
1173 strbuf_addbuf_percentquote(&format, &author_ident);
1175 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1176 struct strbuf date = STRBUF_INIT;
1178 format_commit_message(commit, "%ad", &date, &pctx);
1179 strbuf_addstr(&format, "\n Date: ");
1180 strbuf_addbuf_percentquote(&format, &date);
1181 strbuf_release(&date);
1183 if (!committer_ident_sufficiently_given()) {
1184 strbuf_addstr(&format, "\n Committer: ");
1185 strbuf_addbuf_percentquote(&format, &committer_ident);
1186 if (advice_implicit_identity) {
1187 strbuf_addch(&format, '\n');
1188 strbuf_addstr(&format, implicit_ident_advice());
1191 strbuf_release(&author_ident);
1192 strbuf_release(&committer_ident);
1194 repo_init_revisions(r, &rev, prefix);
1195 setup_revisions(0, NULL, &rev, NULL);
1197 rev.diff = 1;
1198 rev.diffopt.output_format =
1199 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1201 rev.verbose_header = 1;
1202 rev.show_root_diff = 1;
1203 get_commit_format(format.buf, &rev);
1204 rev.always_show_header = 0;
1205 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1206 rev.diffopt.break_opt = 0;
1207 diff_setup_done(&rev.diffopt);
1209 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1210 if (!head)
1211 die_errno(_("unable to resolve HEAD after creating commit"));
1212 if (!strcmp(head, "HEAD"))
1213 head = _("detached HEAD");
1214 else
1215 skip_prefix(head, "refs/heads/", &head);
1216 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1217 _(" (root-commit)") : "");
1219 if (!log_tree_commit(&rev, commit)) {
1220 rev.always_show_header = 1;
1221 rev.use_terminator = 1;
1222 log_tree_commit(&rev, commit);
1225 strbuf_release(&format);
1228 static int parse_head(struct commit **head)
1230 struct commit *current_head;
1231 struct object_id oid;
1233 if (get_oid("HEAD", &oid)) {
1234 current_head = NULL;
1235 } else {
1236 current_head = lookup_commit_reference(the_repository, &oid);
1237 if (!current_head)
1238 return error(_("could not parse HEAD"));
1239 if (!oideq(&oid, &current_head->object.oid)) {
1240 warning(_("HEAD %s is not a commit!"),
1241 oid_to_hex(&oid));
1243 if (parse_commit(current_head))
1244 return error(_("could not parse HEAD commit"));
1246 *head = current_head;
1248 return 0;
1252 * Try to commit without forking 'git commit'. In some cases we need
1253 * to run 'git commit' to display an error message
1255 * Returns:
1256 * -1 - error unable to commit
1257 * 0 - success
1258 * 1 - run 'git commit'
1260 static int try_to_commit(struct repository *r,
1261 struct strbuf *msg, const char *author,
1262 struct replay_opts *opts, unsigned int flags,
1263 struct object_id *oid)
1265 struct object_id tree;
1266 struct commit *current_head;
1267 struct commit_list *parents = NULL;
1268 struct commit_extra_header *extra = NULL;
1269 struct strbuf err = STRBUF_INIT;
1270 struct strbuf commit_msg = STRBUF_INIT;
1271 char *amend_author = NULL;
1272 const char *hook_commit = NULL;
1273 enum commit_msg_cleanup_mode cleanup;
1274 int res = 0;
1276 if (parse_head(&current_head))
1277 return -1;
1279 if (flags & AMEND_MSG) {
1280 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1281 const char *out_enc = get_commit_output_encoding();
1282 const char *message = logmsg_reencode(current_head, NULL,
1283 out_enc);
1285 if (!msg) {
1286 const char *orig_message = NULL;
1288 find_commit_subject(message, &orig_message);
1289 msg = &commit_msg;
1290 strbuf_addstr(msg, orig_message);
1291 hook_commit = "HEAD";
1293 author = amend_author = get_author(message);
1294 unuse_commit_buffer(current_head, message);
1295 if (!author) {
1296 res = error(_("unable to parse commit author"));
1297 goto out;
1299 parents = copy_commit_list(current_head->parents);
1300 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1301 } else if (current_head) {
1302 commit_list_insert(current_head, &parents);
1305 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1306 res = error(_("git write-tree failed to write a tree"));
1307 goto out;
1310 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1311 get_commit_tree_oid(current_head) :
1312 the_hash_algo->empty_tree, &tree)) {
1313 res = 1; /* run 'git commit' to display error message */
1314 goto out;
1317 if (find_hook("prepare-commit-msg")) {
1318 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1319 if (res)
1320 goto out;
1321 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1322 2048) < 0) {
1323 res = error_errno(_("unable to read commit message "
1324 "from '%s'"),
1325 git_path_commit_editmsg());
1326 goto out;
1328 msg = &commit_msg;
1331 cleanup = (flags & CLEANUP_MSG) ? COMMIT_MSG_CLEANUP_ALL :
1332 opts->default_msg_cleanup;
1334 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1335 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1336 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1337 res = 1; /* run 'git commit' to display error message */
1338 goto out;
1341 reset_ident_date();
1343 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1344 oid, author, opts->gpg_sign, extra)) {
1345 res = error(_("failed to write commit object"));
1346 goto out;
1349 if (update_head_with_reflog(current_head, oid,
1350 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1351 res = error("%s", err.buf);
1352 goto out;
1355 if (flags & AMEND_MSG)
1356 commit_post_rewrite(current_head, oid);
1358 out:
1359 free_commit_extra_headers(extra);
1360 strbuf_release(&err);
1361 strbuf_release(&commit_msg);
1362 free(amend_author);
1364 return res;
1367 static int do_commit(struct repository *r,
1368 const char *msg_file, const char *author,
1369 struct replay_opts *opts, unsigned int flags)
1371 int res = 1;
1373 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG) &&
1374 !(flags & CREATE_ROOT_COMMIT)) {
1375 struct object_id oid;
1376 struct strbuf sb = STRBUF_INIT;
1378 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1379 return error_errno(_("unable to read commit message "
1380 "from '%s'"),
1381 msg_file);
1383 res = try_to_commit(r, msg_file ? &sb : NULL,
1384 author, opts, flags, &oid);
1385 strbuf_release(&sb);
1386 if (!res) {
1387 unlink(git_path_cherry_pick_head(r));
1388 unlink(git_path_merge_msg(r));
1389 if (!is_rebase_i(opts))
1390 print_commit_summary(r, NULL, &oid,
1391 SUMMARY_SHOW_AUTHOR_DATE);
1392 return res;
1395 if (res == 1)
1396 return run_git_commit(r, msg_file, opts, flags);
1398 return res;
1401 static int is_original_commit_empty(struct commit *commit)
1403 const struct object_id *ptree_oid;
1405 if (parse_commit(commit))
1406 return error(_("could not parse commit %s"),
1407 oid_to_hex(&commit->object.oid));
1408 if (commit->parents) {
1409 struct commit *parent = commit->parents->item;
1410 if (parse_commit(parent))
1411 return error(_("could not parse parent commit %s"),
1412 oid_to_hex(&parent->object.oid));
1413 ptree_oid = get_commit_tree_oid(parent);
1414 } else {
1415 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1418 return oideq(ptree_oid, get_commit_tree_oid(commit));
1422 * Do we run "git commit" with "--allow-empty"?
1424 static int allow_empty(struct repository *r,
1425 struct replay_opts *opts,
1426 struct commit *commit)
1428 int index_unchanged, empty_commit;
1431 * Three cases:
1433 * (1) we do not allow empty at all and error out.
1435 * (2) we allow ones that were initially empty, but
1436 * forbid the ones that become empty;
1438 * (3) we allow both.
1440 if (!opts->allow_empty)
1441 return 0; /* let "git commit" barf as necessary */
1443 index_unchanged = is_index_unchanged(r->index);
1444 if (index_unchanged < 0)
1445 return index_unchanged;
1446 if (!index_unchanged)
1447 return 0; /* we do not have to say --allow-empty */
1449 if (opts->keep_redundant_commits)
1450 return 1;
1452 empty_commit = is_original_commit_empty(commit);
1453 if (empty_commit < 0)
1454 return empty_commit;
1455 if (!empty_commit)
1456 return 0;
1457 else
1458 return 1;
1462 * Note that ordering matters in this enum. Not only must it match the mapping
1463 * below, it is also divided into several sections that matter. When adding
1464 * new commands, make sure you add it in the right section.
1466 enum todo_command {
1467 /* commands that handle commits */
1468 TODO_PICK = 0,
1469 TODO_REVERT,
1470 TODO_EDIT,
1471 TODO_REWORD,
1472 TODO_FIXUP,
1473 TODO_SQUASH,
1474 /* commands that do something else than handling a single commit */
1475 TODO_EXEC,
1476 TODO_BREAK,
1477 TODO_LABEL,
1478 TODO_RESET,
1479 TODO_MERGE,
1480 /* commands that do nothing but are counted for reporting progress */
1481 TODO_NOOP,
1482 TODO_DROP,
1483 /* comments (not counted for reporting progress) */
1484 TODO_COMMENT
1487 static struct {
1488 char c;
1489 const char *str;
1490 } todo_command_info[] = {
1491 { 'p', "pick" },
1492 { 0, "revert" },
1493 { 'e', "edit" },
1494 { 'r', "reword" },
1495 { 'f', "fixup" },
1496 { 's', "squash" },
1497 { 'x', "exec" },
1498 { 'b', "break" },
1499 { 'l', "label" },
1500 { 't', "reset" },
1501 { 'm', "merge" },
1502 { 0, "noop" },
1503 { 'd', "drop" },
1504 { 0, NULL }
1507 static const char *command_to_string(const enum todo_command command)
1509 if (command < TODO_COMMENT)
1510 return todo_command_info[command].str;
1511 die(_("unknown command: %d"), command);
1514 static char command_to_char(const enum todo_command command)
1516 if (command < TODO_COMMENT && todo_command_info[command].c)
1517 return todo_command_info[command].c;
1518 return comment_line_char;
1521 static int is_noop(const enum todo_command command)
1523 return TODO_NOOP <= command;
1526 static int is_fixup(enum todo_command command)
1528 return command == TODO_FIXUP || command == TODO_SQUASH;
1531 /* Does this command create a (non-merge) commit? */
1532 static int is_pick_or_similar(enum todo_command command)
1534 switch (command) {
1535 case TODO_PICK:
1536 case TODO_REVERT:
1537 case TODO_EDIT:
1538 case TODO_REWORD:
1539 case TODO_FIXUP:
1540 case TODO_SQUASH:
1541 return 1;
1542 default:
1543 return 0;
1547 static int update_squash_messages(enum todo_command command,
1548 struct commit *commit, struct replay_opts *opts)
1550 struct strbuf buf = STRBUF_INIT;
1551 int res;
1552 const char *message, *body;
1554 if (opts->current_fixup_count > 0) {
1555 struct strbuf header = STRBUF_INIT;
1556 char *eol;
1558 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1559 return error(_("could not read '%s'"),
1560 rebase_path_squash_msg());
1562 eol = buf.buf[0] != comment_line_char ?
1563 buf.buf : strchrnul(buf.buf, '\n');
1565 strbuf_addf(&header, "%c ", comment_line_char);
1566 strbuf_addf(&header, _("This is a combination of %d commits."),
1567 opts->current_fixup_count + 2);
1568 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1569 strbuf_release(&header);
1570 } else {
1571 struct object_id head;
1572 struct commit *head_commit;
1573 const char *head_message, *body;
1575 if (get_oid("HEAD", &head))
1576 return error(_("need a HEAD to fixup"));
1577 if (!(head_commit = lookup_commit_reference(the_repository, &head)))
1578 return error(_("could not read HEAD"));
1579 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1580 return error(_("could not read HEAD's commit message"));
1582 find_commit_subject(head_message, &body);
1583 if (write_message(body, strlen(body),
1584 rebase_path_fixup_msg(), 0)) {
1585 unuse_commit_buffer(head_commit, head_message);
1586 return error(_("cannot write '%s'"),
1587 rebase_path_fixup_msg());
1590 strbuf_addf(&buf, "%c ", comment_line_char);
1591 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1592 strbuf_addf(&buf, "\n%c ", comment_line_char);
1593 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1594 strbuf_addstr(&buf, "\n\n");
1595 strbuf_addstr(&buf, body);
1597 unuse_commit_buffer(head_commit, head_message);
1600 if (!(message = get_commit_buffer(commit, NULL)))
1601 return error(_("could not read commit message of %s"),
1602 oid_to_hex(&commit->object.oid));
1603 find_commit_subject(message, &body);
1605 if (command == TODO_SQUASH) {
1606 unlink(rebase_path_fixup_msg());
1607 strbuf_addf(&buf, "\n%c ", comment_line_char);
1608 strbuf_addf(&buf, _("This is the commit message #%d:"),
1609 ++opts->current_fixup_count + 1);
1610 strbuf_addstr(&buf, "\n\n");
1611 strbuf_addstr(&buf, body);
1612 } else if (command == TODO_FIXUP) {
1613 strbuf_addf(&buf, "\n%c ", comment_line_char);
1614 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1615 ++opts->current_fixup_count + 1);
1616 strbuf_addstr(&buf, "\n\n");
1617 strbuf_add_commented_lines(&buf, body, strlen(body));
1618 } else
1619 return error(_("unknown command: %d"), command);
1620 unuse_commit_buffer(commit, message);
1622 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1623 strbuf_release(&buf);
1625 if (!res) {
1626 strbuf_addf(&opts->current_fixups, "%s%s %s",
1627 opts->current_fixups.len ? "\n" : "",
1628 command_to_string(command),
1629 oid_to_hex(&commit->object.oid));
1630 res = write_message(opts->current_fixups.buf,
1631 opts->current_fixups.len,
1632 rebase_path_current_fixups(), 0);
1635 return res;
1638 static void flush_rewritten_pending(void) {
1639 struct strbuf buf = STRBUF_INIT;
1640 struct object_id newoid;
1641 FILE *out;
1643 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1644 !get_oid("HEAD", &newoid) &&
1645 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1646 char *bol = buf.buf, *eol;
1648 while (*bol) {
1649 eol = strchrnul(bol, '\n');
1650 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1651 bol, oid_to_hex(&newoid));
1652 if (!*eol)
1653 break;
1654 bol = eol + 1;
1656 fclose(out);
1657 unlink(rebase_path_rewritten_pending());
1659 strbuf_release(&buf);
1662 static void record_in_rewritten(struct object_id *oid,
1663 enum todo_command next_command) {
1664 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1666 if (!out)
1667 return;
1669 fprintf(out, "%s\n", oid_to_hex(oid));
1670 fclose(out);
1672 if (!is_fixup(next_command))
1673 flush_rewritten_pending();
1676 static int do_pick_commit(struct repository *r,
1677 enum todo_command command,
1678 struct commit *commit,
1679 struct replay_opts *opts,
1680 int final_fixup)
1682 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1683 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
1684 struct object_id head;
1685 struct commit *base, *next, *parent;
1686 const char *base_label, *next_label;
1687 char *author = NULL;
1688 struct commit_message msg = { NULL, NULL, NULL, NULL };
1689 struct strbuf msgbuf = STRBUF_INIT;
1690 int res, unborn = 0, allow;
1692 if (opts->no_commit) {
1694 * We do not intend to commit immediately. We just want to
1695 * merge the differences in, so let's compute the tree
1696 * that represents the "current" state for merge-recursive
1697 * to work on.
1699 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
1700 return error(_("your index file is unmerged."));
1701 } else {
1702 unborn = get_oid("HEAD", &head);
1703 /* Do we want to generate a root commit? */
1704 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1705 oideq(&head, &opts->squash_onto)) {
1706 if (is_fixup(command))
1707 return error(_("cannot fixup root commit"));
1708 flags |= CREATE_ROOT_COMMIT;
1709 unborn = 1;
1710 } else if (unborn)
1711 oidcpy(&head, the_hash_algo->empty_tree);
1712 if (index_differs_from(unborn ? empty_tree_oid_hex() : "HEAD",
1713 NULL, 0))
1714 return error_dirty_index(r->index, opts);
1716 discard_index(r->index);
1718 if (!commit->parents)
1719 parent = NULL;
1720 else if (commit->parents->next) {
1721 /* Reverting or cherry-picking a merge commit */
1722 int cnt;
1723 struct commit_list *p;
1725 if (!opts->mainline)
1726 return error(_("commit %s is a merge but no -m option was given."),
1727 oid_to_hex(&commit->object.oid));
1729 for (cnt = 1, p = commit->parents;
1730 cnt != opts->mainline && p;
1731 cnt++)
1732 p = p->next;
1733 if (cnt != opts->mainline || !p)
1734 return error(_("commit %s does not have parent %d"),
1735 oid_to_hex(&commit->object.oid), opts->mainline);
1736 parent = p->item;
1737 } else if (0 < opts->mainline)
1738 return error(_("mainline was specified but commit %s is not a merge."),
1739 oid_to_hex(&commit->object.oid));
1740 else
1741 parent = commit->parents->item;
1743 if (get_message(commit, &msg) != 0)
1744 return error(_("cannot get commit message for %s"),
1745 oid_to_hex(&commit->object.oid));
1747 if (opts->allow_ff && !is_fixup(command) &&
1748 ((parent && oideq(&parent->object.oid, &head)) ||
1749 (!parent && unborn))) {
1750 if (is_rebase_i(opts))
1751 write_author_script(msg.message);
1752 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
1753 opts);
1754 if (res || command != TODO_REWORD)
1755 goto leave;
1756 flags |= EDIT_MSG | AMEND_MSG | VERIFY_MSG;
1757 msg_file = NULL;
1758 goto fast_forward_edit;
1760 if (parent && parse_commit(parent) < 0)
1761 /* TRANSLATORS: The first %s will be a "todo" command like
1762 "revert" or "pick", the second %s a SHA1. */
1763 return error(_("%s: cannot parse parent commit %s"),
1764 command_to_string(command),
1765 oid_to_hex(&parent->object.oid));
1768 * "commit" is an existing commit. We would want to apply
1769 * the difference it introduces since its first parent "prev"
1770 * on top of the current HEAD if we are cherry-pick. Or the
1771 * reverse of it if we are revert.
1774 if (command == TODO_REVERT) {
1775 base = commit;
1776 base_label = msg.label;
1777 next = parent;
1778 next_label = msg.parent_label;
1779 strbuf_addstr(&msgbuf, "Revert \"");
1780 strbuf_addstr(&msgbuf, msg.subject);
1781 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1782 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1784 if (commit->parents && commit->parents->next) {
1785 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1786 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1788 strbuf_addstr(&msgbuf, ".\n");
1789 } else {
1790 const char *p;
1792 base = parent;
1793 base_label = msg.parent_label;
1794 next = commit;
1795 next_label = msg.label;
1797 /* Append the commit log message to msgbuf. */
1798 if (find_commit_subject(msg.message, &p))
1799 strbuf_addstr(&msgbuf, p);
1801 if (opts->record_origin) {
1802 strbuf_complete_line(&msgbuf);
1803 if (!has_conforming_footer(&msgbuf, NULL, 0))
1804 strbuf_addch(&msgbuf, '\n');
1805 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1806 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1807 strbuf_addstr(&msgbuf, ")\n");
1809 if (!is_fixup(command))
1810 author = get_author(msg.message);
1813 if (command == TODO_REWORD)
1814 flags |= EDIT_MSG | VERIFY_MSG;
1815 else if (is_fixup(command)) {
1816 if (update_squash_messages(command, commit, opts))
1817 return -1;
1818 flags |= AMEND_MSG;
1819 if (!final_fixup)
1820 msg_file = rebase_path_squash_msg();
1821 else if (file_exists(rebase_path_fixup_msg())) {
1822 flags |= CLEANUP_MSG;
1823 msg_file = rebase_path_fixup_msg();
1824 } else {
1825 const char *dest = git_path_squash_msg(r);
1826 unlink(dest);
1827 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1828 return error(_("could not rename '%s' to '%s'"),
1829 rebase_path_squash_msg(), dest);
1830 unlink(git_path_merge_msg(r));
1831 msg_file = dest;
1832 flags |= EDIT_MSG;
1836 if (opts->signoff && !is_fixup(command))
1837 append_signoff(&msgbuf, 0, 0);
1839 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1840 res = -1;
1841 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1842 res = do_recursive_merge(r, base, next, base_label, next_label,
1843 &head, &msgbuf, opts);
1844 if (res < 0)
1845 goto leave;
1847 res |= write_message(msgbuf.buf, msgbuf.len,
1848 git_path_merge_msg(r), 0);
1849 } else {
1850 struct commit_list *common = NULL;
1851 struct commit_list *remotes = NULL;
1853 res = write_message(msgbuf.buf, msgbuf.len,
1854 git_path_merge_msg(r), 0);
1856 commit_list_insert(base, &common);
1857 commit_list_insert(next, &remotes);
1858 res |= try_merge_command(r, opts->strategy,
1859 opts->xopts_nr, (const char **)opts->xopts,
1860 common, oid_to_hex(&head), remotes);
1861 free_commit_list(common);
1862 free_commit_list(remotes);
1864 strbuf_release(&msgbuf);
1867 * If the merge was clean or if it failed due to conflict, we write
1868 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1869 * However, if the merge did not even start, then we don't want to
1870 * write it at all.
1872 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
1873 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
1874 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1875 res = -1;
1876 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
1877 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
1878 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1879 res = -1;
1881 if (res) {
1882 error(command == TODO_REVERT
1883 ? _("could not revert %s... %s")
1884 : _("could not apply %s... %s"),
1885 short_commit_name(commit), msg.subject);
1886 print_advice(res == 1, opts);
1887 repo_rerere(r, opts->allow_rerere_auto);
1888 goto leave;
1891 allow = allow_empty(r, opts, commit);
1892 if (allow < 0) {
1893 res = allow;
1894 goto leave;
1895 } else if (allow)
1896 flags |= ALLOW_EMPTY;
1897 if (!opts->no_commit) {
1898 fast_forward_edit:
1899 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1900 res = do_commit(r, msg_file, author, opts, flags);
1901 else
1902 res = error(_("unable to parse commit author"));
1905 if (!res && final_fixup) {
1906 unlink(rebase_path_fixup_msg());
1907 unlink(rebase_path_squash_msg());
1908 unlink(rebase_path_current_fixups());
1909 strbuf_reset(&opts->current_fixups);
1910 opts->current_fixup_count = 0;
1913 leave:
1914 free_message(commit, &msg);
1915 free(author);
1916 update_abort_safety_file();
1918 return res;
1921 static int prepare_revs(struct replay_opts *opts)
1924 * picking (but not reverting) ranges (but not individual revisions)
1925 * should be done in reverse
1927 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1928 opts->revs->reverse ^= 1;
1930 if (prepare_revision_walk(opts->revs))
1931 return error(_("revision walk setup failed"));
1933 return 0;
1936 static int read_and_refresh_cache(struct repository *r,
1937 struct replay_opts *opts)
1939 struct lock_file index_lock = LOCK_INIT;
1940 int index_fd = hold_locked_index(&index_lock, 0);
1941 if (read_index_preload(r->index, NULL, 0) < 0) {
1942 rollback_lock_file(&index_lock);
1943 return error(_("git %s: failed to read the index"),
1944 _(action_name(opts)));
1946 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
1947 if (index_fd >= 0) {
1948 if (write_locked_index(r->index, &index_lock,
1949 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
1950 return error(_("git %s: failed to refresh the index"),
1951 _(action_name(opts)));
1954 return 0;
1957 enum todo_item_flags {
1958 TODO_EDIT_MERGE_MSG = 1
1961 struct todo_item {
1962 enum todo_command command;
1963 struct commit *commit;
1964 unsigned int flags;
1965 const char *arg;
1966 int arg_len;
1967 size_t offset_in_buf;
1970 struct todo_list {
1971 struct strbuf buf;
1972 struct todo_item *items;
1973 int nr, alloc, current;
1974 int done_nr, total_nr;
1975 struct stat_data stat;
1978 #define TODO_LIST_INIT { STRBUF_INIT }
1980 static void todo_list_release(struct todo_list *todo_list)
1982 strbuf_release(&todo_list->buf);
1983 FREE_AND_NULL(todo_list->items);
1984 todo_list->nr = todo_list->alloc = 0;
1987 static struct todo_item *append_new_todo(struct todo_list *todo_list)
1989 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
1990 return todo_list->items + todo_list->nr++;
1993 static int parse_insn_line(struct todo_item *item, const char *bol, char *eol)
1995 struct object_id commit_oid;
1996 char *end_of_object_name;
1997 int i, saved, status, padding;
1999 item->flags = 0;
2001 /* left-trim */
2002 bol += strspn(bol, " \t");
2004 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2005 item->command = TODO_COMMENT;
2006 item->commit = NULL;
2007 item->arg = bol;
2008 item->arg_len = eol - bol;
2009 return 0;
2012 for (i = 0; i < TODO_COMMENT; i++)
2013 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
2014 item->command = i;
2015 break;
2016 } else if ((bol + 1 == eol || bol[1] == ' ') &&
2017 *bol == todo_command_info[i].c) {
2018 bol++;
2019 item->command = i;
2020 break;
2022 if (i >= TODO_COMMENT)
2023 return -1;
2025 /* Eat up extra spaces/ tabs before object name */
2026 padding = strspn(bol, " \t");
2027 bol += padding;
2029 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2030 if (bol != eol)
2031 return error(_("%s does not accept arguments: '%s'"),
2032 command_to_string(item->command), bol);
2033 item->commit = NULL;
2034 item->arg = bol;
2035 item->arg_len = eol - bol;
2036 return 0;
2039 if (!padding)
2040 return error(_("missing arguments for %s"),
2041 command_to_string(item->command));
2043 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2044 item->command == TODO_RESET) {
2045 item->commit = NULL;
2046 item->arg = bol;
2047 item->arg_len = (int)(eol - bol);
2048 return 0;
2051 if (item->command == TODO_MERGE) {
2052 if (skip_prefix(bol, "-C", &bol))
2053 bol += strspn(bol, " \t");
2054 else if (skip_prefix(bol, "-c", &bol)) {
2055 bol += strspn(bol, " \t");
2056 item->flags |= TODO_EDIT_MERGE_MSG;
2057 } else {
2058 item->flags |= TODO_EDIT_MERGE_MSG;
2059 item->commit = NULL;
2060 item->arg = bol;
2061 item->arg_len = (int)(eol - bol);
2062 return 0;
2066 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2067 saved = *end_of_object_name;
2068 *end_of_object_name = '\0';
2069 status = get_oid(bol, &commit_oid);
2070 *end_of_object_name = saved;
2072 item->arg = end_of_object_name + strspn(end_of_object_name, " \t");
2073 item->arg_len = (int)(eol - item->arg);
2075 if (status < 0)
2076 return -1;
2078 item->commit = lookup_commit_reference(the_repository, &commit_oid);
2079 return !item->commit;
2082 static int parse_insn_buffer(char *buf, struct todo_list *todo_list)
2084 struct todo_item *item;
2085 char *p = buf, *next_p;
2086 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2088 for (i = 1; *p; i++, p = next_p) {
2089 char *eol = strchrnul(p, '\n');
2091 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2093 if (p != eol && eol[-1] == '\r')
2094 eol--; /* strip Carriage Return */
2096 item = append_new_todo(todo_list);
2097 item->offset_in_buf = p - todo_list->buf.buf;
2098 if (parse_insn_line(item, p, eol)) {
2099 res = error(_("invalid line %d: %.*s"),
2100 i, (int)(eol - p), p);
2101 item->command = TODO_NOOP;
2104 if (fixup_okay)
2105 ; /* do nothing */
2106 else if (is_fixup(item->command))
2107 return error(_("cannot '%s' without a previous commit"),
2108 command_to_string(item->command));
2109 else if (!is_noop(item->command))
2110 fixup_okay = 1;
2113 return res;
2116 static int count_commands(struct todo_list *todo_list)
2118 int count = 0, i;
2120 for (i = 0; i < todo_list->nr; i++)
2121 if (todo_list->items[i].command != TODO_COMMENT)
2122 count++;
2124 return count;
2127 static int get_item_line_offset(struct todo_list *todo_list, int index)
2129 return index < todo_list->nr ?
2130 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2133 static const char *get_item_line(struct todo_list *todo_list, int index)
2135 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2138 static int get_item_line_length(struct todo_list *todo_list, int index)
2140 return get_item_line_offset(todo_list, index + 1)
2141 - get_item_line_offset(todo_list, index);
2144 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2146 int fd;
2147 ssize_t len;
2149 fd = open(path, O_RDONLY);
2150 if (fd < 0)
2151 return error_errno(_("could not open '%s'"), path);
2152 len = strbuf_read(sb, fd, 0);
2153 close(fd);
2154 if (len < 0)
2155 return error(_("could not read '%s'."), path);
2156 return len;
2159 static int read_populate_todo(struct todo_list *todo_list,
2160 struct replay_opts *opts)
2162 struct stat st;
2163 const char *todo_file = get_todo_path(opts);
2164 int res;
2166 strbuf_reset(&todo_list->buf);
2167 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2168 return -1;
2170 res = stat(todo_file, &st);
2171 if (res)
2172 return error(_("could not stat '%s'"), todo_file);
2173 fill_stat_data(&todo_list->stat, &st);
2175 res = parse_insn_buffer(todo_list->buf.buf, todo_list);
2176 if (res) {
2177 if (is_rebase_i(opts))
2178 return error(_("please fix this using "
2179 "'git rebase --edit-todo'."));
2180 return error(_("unusable instruction sheet: '%s'"), todo_file);
2183 if (!todo_list->nr &&
2184 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2185 return error(_("no commits parsed."));
2187 if (!is_rebase_i(opts)) {
2188 enum todo_command valid =
2189 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2190 int i;
2192 for (i = 0; i < todo_list->nr; i++)
2193 if (valid == todo_list->items[i].command)
2194 continue;
2195 else if (valid == TODO_PICK)
2196 return error(_("cannot cherry-pick during a revert."));
2197 else
2198 return error(_("cannot revert during a cherry-pick."));
2201 if (is_rebase_i(opts)) {
2202 struct todo_list done = TODO_LIST_INIT;
2203 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2205 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2206 !parse_insn_buffer(done.buf.buf, &done))
2207 todo_list->done_nr = count_commands(&done);
2208 else
2209 todo_list->done_nr = 0;
2211 todo_list->total_nr = todo_list->done_nr
2212 + count_commands(todo_list);
2213 todo_list_release(&done);
2215 if (f) {
2216 fprintf(f, "%d\n", todo_list->total_nr);
2217 fclose(f);
2221 return 0;
2224 static int git_config_string_dup(char **dest,
2225 const char *var, const char *value)
2227 if (!value)
2228 return config_error_nonbool(var);
2229 free(*dest);
2230 *dest = xstrdup(value);
2231 return 0;
2234 static int populate_opts_cb(const char *key, const char *value, void *data)
2236 struct replay_opts *opts = data;
2237 int error_flag = 1;
2239 if (!value)
2240 error_flag = 0;
2241 else if (!strcmp(key, "options.no-commit"))
2242 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2243 else if (!strcmp(key, "options.edit"))
2244 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2245 else if (!strcmp(key, "options.signoff"))
2246 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2247 else if (!strcmp(key, "options.record-origin"))
2248 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2249 else if (!strcmp(key, "options.allow-ff"))
2250 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2251 else if (!strcmp(key, "options.mainline"))
2252 opts->mainline = git_config_int(key, value);
2253 else if (!strcmp(key, "options.strategy"))
2254 git_config_string_dup(&opts->strategy, key, value);
2255 else if (!strcmp(key, "options.gpg-sign"))
2256 git_config_string_dup(&opts->gpg_sign, key, value);
2257 else if (!strcmp(key, "options.strategy-option")) {
2258 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2259 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2260 } else if (!strcmp(key, "options.allow-rerere-auto"))
2261 opts->allow_rerere_auto =
2262 git_config_bool_or_int(key, value, &error_flag) ?
2263 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2264 else
2265 return error(_("invalid key: %s"), key);
2267 if (!error_flag)
2268 return error(_("invalid value for %s: %s"), key, value);
2270 return 0;
2273 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2275 int i;
2276 char *strategy_opts_string = raw_opts;
2278 if (*strategy_opts_string == ' ')
2279 strategy_opts_string++;
2281 opts->xopts_nr = split_cmdline(strategy_opts_string,
2282 (const char ***)&opts->xopts);
2283 for (i = 0; i < opts->xopts_nr; i++) {
2284 const char *arg = opts->xopts[i];
2286 skip_prefix(arg, "--", &arg);
2287 opts->xopts[i] = xstrdup(arg);
2291 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2293 strbuf_reset(buf);
2294 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2295 return;
2296 opts->strategy = strbuf_detach(buf, NULL);
2297 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2298 return;
2300 parse_strategy_opts(opts, buf->buf);
2303 static int read_populate_opts(struct replay_opts *opts)
2305 if (is_rebase_i(opts)) {
2306 struct strbuf buf = STRBUF_INIT;
2308 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2309 if (!starts_with(buf.buf, "-S"))
2310 strbuf_reset(&buf);
2311 else {
2312 free(opts->gpg_sign);
2313 opts->gpg_sign = xstrdup(buf.buf + 2);
2315 strbuf_reset(&buf);
2318 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2319 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2320 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2321 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2322 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2323 strbuf_reset(&buf);
2326 if (file_exists(rebase_path_verbose()))
2327 opts->verbose = 1;
2329 if (file_exists(rebase_path_signoff())) {
2330 opts->allow_ff = 0;
2331 opts->signoff = 1;
2334 read_strategy_opts(opts, &buf);
2335 strbuf_release(&buf);
2337 if (read_oneliner(&opts->current_fixups,
2338 rebase_path_current_fixups(), 1)) {
2339 const char *p = opts->current_fixups.buf;
2340 opts->current_fixup_count = 1;
2341 while ((p = strchr(p, '\n'))) {
2342 opts->current_fixup_count++;
2343 p++;
2347 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2348 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2349 return error(_("unusable squash-onto"));
2350 opts->have_squash_onto = 1;
2353 return 0;
2356 if (!file_exists(git_path_opts_file()))
2357 return 0;
2359 * The function git_parse_source(), called from git_config_from_file(),
2360 * may die() in case of a syntactically incorrect file. We do not care
2361 * about this case, though, because we wrote that file ourselves, so we
2362 * are pretty certain that it is syntactically correct.
2364 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2365 return error(_("malformed options sheet: '%s'"),
2366 git_path_opts_file());
2367 return 0;
2370 static void write_strategy_opts(struct replay_opts *opts)
2372 int i;
2373 struct strbuf buf = STRBUF_INIT;
2375 for (i = 0; i < opts->xopts_nr; ++i)
2376 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2378 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2379 strbuf_release(&buf);
2382 int write_basic_state(struct replay_opts *opts, const char *head_name,
2383 const char *onto, const char *orig_head)
2385 const char *quiet = getenv("GIT_QUIET");
2387 if (head_name)
2388 write_file(rebase_path_head_name(), "%s\n", head_name);
2389 if (onto)
2390 write_file(rebase_path_onto(), "%s\n", onto);
2391 if (orig_head)
2392 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2394 if (quiet)
2395 write_file(rebase_path_quiet(), "%s\n", quiet);
2396 else
2397 write_file(rebase_path_quiet(), "\n");
2399 if (opts->verbose)
2400 write_file(rebase_path_verbose(), "%s", "");
2401 if (opts->strategy)
2402 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2403 if (opts->xopts_nr > 0)
2404 write_strategy_opts(opts);
2406 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2407 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2408 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2409 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2411 if (opts->gpg_sign)
2412 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2413 if (opts->signoff)
2414 write_file(rebase_path_signoff(), "--signoff\n");
2416 return 0;
2419 static int walk_revs_populate_todo(struct todo_list *todo_list,
2420 struct replay_opts *opts)
2422 enum todo_command command = opts->action == REPLAY_PICK ?
2423 TODO_PICK : TODO_REVERT;
2424 const char *command_string = todo_command_info[command].str;
2425 struct commit *commit;
2427 if (prepare_revs(opts))
2428 return -1;
2430 while ((commit = get_revision(opts->revs))) {
2431 struct todo_item *item = append_new_todo(todo_list);
2432 const char *commit_buffer = get_commit_buffer(commit, NULL);
2433 const char *subject;
2434 int subject_len;
2436 item->command = command;
2437 item->commit = commit;
2438 item->arg = NULL;
2439 item->arg_len = 0;
2440 item->offset_in_buf = todo_list->buf.len;
2441 subject_len = find_commit_subject(commit_buffer, &subject);
2442 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2443 short_commit_name(commit), subject_len, subject);
2444 unuse_commit_buffer(commit, commit_buffer);
2447 if (!todo_list->nr)
2448 return error(_("empty commit set passed"));
2450 return 0;
2453 static int create_seq_dir(void)
2455 if (file_exists(git_path_seq_dir())) {
2456 error(_("a cherry-pick or revert is already in progress"));
2457 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2458 return -1;
2459 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2460 return error_errno(_("could not create sequencer directory '%s'"),
2461 git_path_seq_dir());
2462 return 0;
2465 static int save_head(const char *head)
2467 struct lock_file head_lock = LOCK_INIT;
2468 struct strbuf buf = STRBUF_INIT;
2469 int fd;
2470 ssize_t written;
2472 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2473 if (fd < 0)
2474 return error_errno(_("could not lock HEAD"));
2475 strbuf_addf(&buf, "%s\n", head);
2476 written = write_in_full(fd, buf.buf, buf.len);
2477 strbuf_release(&buf);
2478 if (written < 0) {
2479 error_errno(_("could not write to '%s'"), git_path_head_file());
2480 rollback_lock_file(&head_lock);
2481 return -1;
2483 if (commit_lock_file(&head_lock) < 0)
2484 return error(_("failed to finalize '%s'"), git_path_head_file());
2485 return 0;
2488 static int rollback_is_safe(void)
2490 struct strbuf sb = STRBUF_INIT;
2491 struct object_id expected_head, actual_head;
2493 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2494 strbuf_trim(&sb);
2495 if (get_oid_hex(sb.buf, &expected_head)) {
2496 strbuf_release(&sb);
2497 die(_("could not parse %s"), git_path_abort_safety_file());
2499 strbuf_release(&sb);
2501 else if (errno == ENOENT)
2502 oidclr(&expected_head);
2503 else
2504 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2506 if (get_oid("HEAD", &actual_head))
2507 oidclr(&actual_head);
2509 return oideq(&actual_head, &expected_head);
2512 static int reset_for_rollback(const struct object_id *oid)
2514 const char *argv[4]; /* reset --merge <arg> + NULL */
2516 argv[0] = "reset";
2517 argv[1] = "--merge";
2518 argv[2] = oid_to_hex(oid);
2519 argv[3] = NULL;
2520 return run_command_v_opt(argv, RUN_GIT_CMD);
2523 static int rollback_single_pick(void)
2525 struct object_id head_oid;
2527 if (!file_exists(git_path_cherry_pick_head(the_repository)) &&
2528 !file_exists(git_path_revert_head(the_repository)))
2529 return error(_("no cherry-pick or revert in progress"));
2530 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2531 return error(_("cannot resolve HEAD"));
2532 if (is_null_oid(&head_oid))
2533 return error(_("cannot abort from a branch yet to be born"));
2534 return reset_for_rollback(&head_oid);
2537 int sequencer_rollback(struct replay_opts *opts)
2539 FILE *f;
2540 struct object_id oid;
2541 struct strbuf buf = STRBUF_INIT;
2542 const char *p;
2544 f = fopen(git_path_head_file(), "r");
2545 if (!f && errno == ENOENT) {
2547 * There is no multiple-cherry-pick in progress.
2548 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2549 * a single-cherry-pick in progress, abort that.
2551 return rollback_single_pick();
2553 if (!f)
2554 return error_errno(_("cannot open '%s'"), git_path_head_file());
2555 if (strbuf_getline_lf(&buf, f)) {
2556 error(_("cannot read '%s': %s"), git_path_head_file(),
2557 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2558 fclose(f);
2559 goto fail;
2561 fclose(f);
2562 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2563 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2564 git_path_head_file());
2565 goto fail;
2567 if (is_null_oid(&oid)) {
2568 error(_("cannot abort from a branch yet to be born"));
2569 goto fail;
2572 if (!rollback_is_safe()) {
2573 /* Do not error, just do not rollback */
2574 warning(_("You seem to have moved HEAD. "
2575 "Not rewinding, check your HEAD!"));
2576 } else
2577 if (reset_for_rollback(&oid))
2578 goto fail;
2579 strbuf_release(&buf);
2580 return sequencer_remove_state(opts);
2581 fail:
2582 strbuf_release(&buf);
2583 return -1;
2586 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2588 struct lock_file todo_lock = LOCK_INIT;
2589 const char *todo_path = get_todo_path(opts);
2590 int next = todo_list->current, offset, fd;
2593 * rebase -i writes "git-rebase-todo" without the currently executing
2594 * command, appending it to "done" instead.
2596 if (is_rebase_i(opts))
2597 next++;
2599 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2600 if (fd < 0)
2601 return error_errno(_("could not lock '%s'"), todo_path);
2602 offset = get_item_line_offset(todo_list, next);
2603 if (write_in_full(fd, todo_list->buf.buf + offset,
2604 todo_list->buf.len - offset) < 0)
2605 return error_errno(_("could not write to '%s'"), todo_path);
2606 if (commit_lock_file(&todo_lock) < 0)
2607 return error(_("failed to finalize '%s'"), todo_path);
2609 if (is_rebase_i(opts) && next > 0) {
2610 const char *done = rebase_path_done();
2611 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2612 int ret = 0;
2614 if (fd < 0)
2615 return 0;
2616 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2617 get_item_line_length(todo_list, next - 1))
2618 < 0)
2619 ret = error_errno(_("could not write to '%s'"), done);
2620 if (close(fd) < 0)
2621 ret = error_errno(_("failed to finalize '%s'"), done);
2622 return ret;
2624 return 0;
2627 static int save_opts(struct replay_opts *opts)
2629 const char *opts_file = git_path_opts_file();
2630 int res = 0;
2632 if (opts->no_commit)
2633 res |= git_config_set_in_file_gently(opts_file, "options.no-commit", "true");
2634 if (opts->edit)
2635 res |= git_config_set_in_file_gently(opts_file, "options.edit", "true");
2636 if (opts->signoff)
2637 res |= git_config_set_in_file_gently(opts_file, "options.signoff", "true");
2638 if (opts->record_origin)
2639 res |= git_config_set_in_file_gently(opts_file, "options.record-origin", "true");
2640 if (opts->allow_ff)
2641 res |= git_config_set_in_file_gently(opts_file, "options.allow-ff", "true");
2642 if (opts->mainline) {
2643 struct strbuf buf = STRBUF_INIT;
2644 strbuf_addf(&buf, "%d", opts->mainline);
2645 res |= git_config_set_in_file_gently(opts_file, "options.mainline", buf.buf);
2646 strbuf_release(&buf);
2648 if (opts->strategy)
2649 res |= git_config_set_in_file_gently(opts_file, "options.strategy", opts->strategy);
2650 if (opts->gpg_sign)
2651 res |= git_config_set_in_file_gently(opts_file, "options.gpg-sign", opts->gpg_sign);
2652 if (opts->xopts) {
2653 int i;
2654 for (i = 0; i < opts->xopts_nr; i++)
2655 res |= git_config_set_multivar_in_file_gently(opts_file,
2656 "options.strategy-option",
2657 opts->xopts[i], "^$", 0);
2659 if (opts->allow_rerere_auto)
2660 res |= git_config_set_in_file_gently(opts_file, "options.allow-rerere-auto",
2661 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2662 "true" : "false");
2663 return res;
2666 static int make_patch(struct repository *r,
2667 struct commit *commit,
2668 struct replay_opts *opts)
2670 struct strbuf buf = STRBUF_INIT;
2671 struct rev_info log_tree_opt;
2672 const char *subject, *p;
2673 int res = 0;
2675 p = short_commit_name(commit);
2676 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2677 return -1;
2678 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2679 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2680 res |= error(_("could not update %s"), "REBASE_HEAD");
2682 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2683 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2684 repo_init_revisions(r, &log_tree_opt, NULL);
2685 log_tree_opt.abbrev = 0;
2686 log_tree_opt.diff = 1;
2687 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2688 log_tree_opt.disable_stdin = 1;
2689 log_tree_opt.no_commit_id = 1;
2690 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2691 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2692 if (!log_tree_opt.diffopt.file)
2693 res |= error_errno(_("could not open '%s'"), buf.buf);
2694 else {
2695 res |= log_tree_commit(&log_tree_opt, commit);
2696 fclose(log_tree_opt.diffopt.file);
2698 strbuf_reset(&buf);
2700 strbuf_addf(&buf, "%s/message", get_dir(opts));
2701 if (!file_exists(buf.buf)) {
2702 const char *commit_buffer = get_commit_buffer(commit, NULL);
2703 find_commit_subject(commit_buffer, &subject);
2704 res |= write_message(subject, strlen(subject), buf.buf, 1);
2705 unuse_commit_buffer(commit, commit_buffer);
2707 strbuf_release(&buf);
2709 return res;
2712 static int intend_to_amend(void)
2714 struct object_id head;
2715 char *p;
2717 if (get_oid("HEAD", &head))
2718 return error(_("cannot read HEAD"));
2720 p = oid_to_hex(&head);
2721 return write_message(p, strlen(p), rebase_path_amend(), 1);
2724 static int error_with_patch(struct repository *r,
2725 struct commit *commit,
2726 const char *subject, int subject_len,
2727 struct replay_opts *opts,
2728 int exit_code, int to_amend)
2730 if (commit) {
2731 if (make_patch(r, commit, opts))
2732 return -1;
2733 } else if (copy_file(rebase_path_message(),
2734 git_path_merge_msg(r), 0666))
2735 return error(_("unable to copy '%s' to '%s'"),
2736 git_path_merge_msg(r), rebase_path_message());
2738 if (to_amend) {
2739 if (intend_to_amend())
2740 return -1;
2742 fprintf(stderr,
2743 _("You can amend the commit now, with\n"
2744 "\n"
2745 " git commit --amend %s\n"
2746 "\n"
2747 "Once you are satisfied with your changes, run\n"
2748 "\n"
2749 " git rebase --continue\n"),
2750 gpg_sign_opt_quoted(opts));
2751 } else if (exit_code) {
2752 if (commit)
2753 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
2754 short_commit_name(commit), subject_len, subject);
2755 else
2757 * We don't have the hash of the parent so
2758 * just print the line from the todo file.
2760 fprintf_ln(stderr, _("Could not merge %.*s"),
2761 subject_len, subject);
2764 return exit_code;
2767 static int error_failed_squash(struct repository *r,
2768 struct commit *commit,
2769 struct replay_opts *opts,
2770 int subject_len,
2771 const char *subject)
2773 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
2774 return error(_("could not copy '%s' to '%s'"),
2775 rebase_path_squash_msg(), rebase_path_message());
2776 unlink(git_path_merge_msg(r));
2777 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
2778 return error(_("could not copy '%s' to '%s'"),
2779 rebase_path_message(),
2780 git_path_merge_msg(r));
2781 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
2784 static int do_exec(struct repository *r, const char *command_line)
2786 struct argv_array child_env = ARGV_ARRAY_INIT;
2787 const char *child_argv[] = { NULL, NULL };
2788 int dirty, status;
2790 fprintf(stderr, "Executing: %s\n", command_line);
2791 child_argv[0] = command_line;
2792 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
2793 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
2794 absolute_path(get_git_work_tree()));
2795 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
2796 child_env.argv);
2798 /* force re-reading of the cache */
2799 if (discard_index(r->index) < 0 || read_index(r->index) < 0)
2800 return error(_("could not read index"));
2802 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
2804 if (status) {
2805 warning(_("execution failed: %s\n%s"
2806 "You can fix the problem, and then run\n"
2807 "\n"
2808 " git rebase --continue\n"
2809 "\n"),
2810 command_line,
2811 dirty ? N_("and made changes to the index and/or the "
2812 "working tree\n") : "");
2813 if (status == 127)
2814 /* command not found */
2815 status = 1;
2816 } else if (dirty) {
2817 warning(_("execution succeeded: %s\nbut "
2818 "left changes to the index and/or the working tree\n"
2819 "Commit or stash your changes, and then run\n"
2820 "\n"
2821 " git rebase --continue\n"
2822 "\n"), command_line);
2823 status = 1;
2826 argv_array_clear(&child_env);
2828 return status;
2831 static int safe_append(const char *filename, const char *fmt, ...)
2833 va_list ap;
2834 struct lock_file lock = LOCK_INIT;
2835 int fd = hold_lock_file_for_update(&lock, filename,
2836 LOCK_REPORT_ON_ERROR);
2837 struct strbuf buf = STRBUF_INIT;
2839 if (fd < 0)
2840 return -1;
2842 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
2843 error_errno(_("could not read '%s'"), filename);
2844 rollback_lock_file(&lock);
2845 return -1;
2847 strbuf_complete(&buf, '\n');
2848 va_start(ap, fmt);
2849 strbuf_vaddf(&buf, fmt, ap);
2850 va_end(ap);
2852 if (write_in_full(fd, buf.buf, buf.len) < 0) {
2853 error_errno(_("could not write to '%s'"), filename);
2854 strbuf_release(&buf);
2855 rollback_lock_file(&lock);
2856 return -1;
2858 if (commit_lock_file(&lock) < 0) {
2859 strbuf_release(&buf);
2860 rollback_lock_file(&lock);
2861 return error(_("failed to finalize '%s'"), filename);
2864 strbuf_release(&buf);
2865 return 0;
2868 static int do_label(struct repository *r, const char *name, int len)
2870 struct ref_store *refs = get_main_ref_store(r);
2871 struct ref_transaction *transaction;
2872 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
2873 struct strbuf msg = STRBUF_INIT;
2874 int ret = 0;
2875 struct object_id head_oid;
2877 if (len == 1 && *name == '#')
2878 return error(_("illegal label name: '%.*s'"), len, name);
2880 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
2881 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
2883 transaction = ref_store_transaction_begin(refs, &err);
2884 if (!transaction) {
2885 error("%s", err.buf);
2886 ret = -1;
2887 } else if (get_oid("HEAD", &head_oid)) {
2888 error(_("could not read HEAD"));
2889 ret = -1;
2890 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
2891 NULL, 0, msg.buf, &err) < 0 ||
2892 ref_transaction_commit(transaction, &err)) {
2893 error("%s", err.buf);
2894 ret = -1;
2896 ref_transaction_free(transaction);
2897 strbuf_release(&err);
2898 strbuf_release(&msg);
2900 if (!ret)
2901 ret = safe_append(rebase_path_refs_to_delete(),
2902 "%s\n", ref_name.buf);
2903 strbuf_release(&ref_name);
2905 return ret;
2908 static const char *reflog_message(struct replay_opts *opts,
2909 const char *sub_action, const char *fmt, ...);
2911 static int do_reset(struct repository *r,
2912 const char *name, int len,
2913 struct replay_opts *opts)
2915 struct strbuf ref_name = STRBUF_INIT;
2916 struct object_id oid;
2917 struct lock_file lock = LOCK_INIT;
2918 struct tree_desc desc;
2919 struct tree *tree;
2920 struct unpack_trees_options unpack_tree_opts;
2921 int ret = 0, i;
2923 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0)
2924 return -1;
2926 if (len == 10 && !strncmp("[new root]", name, len)) {
2927 if (!opts->have_squash_onto) {
2928 const char *hex;
2929 if (commit_tree("", 0, the_hash_algo->empty_tree,
2930 NULL, &opts->squash_onto,
2931 NULL, NULL))
2932 return error(_("writing fake root commit"));
2933 opts->have_squash_onto = 1;
2934 hex = oid_to_hex(&opts->squash_onto);
2935 if (write_message(hex, strlen(hex),
2936 rebase_path_squash_onto(), 0))
2937 return error(_("writing squash-onto"));
2939 oidcpy(&oid, &opts->squash_onto);
2940 } else {
2941 /* Determine the length of the label */
2942 for (i = 0; i < len; i++)
2943 if (isspace(name[i]))
2944 len = i;
2946 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
2947 if (get_oid(ref_name.buf, &oid) &&
2948 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
2949 error(_("could not read '%s'"), ref_name.buf);
2950 rollback_lock_file(&lock);
2951 strbuf_release(&ref_name);
2952 return -1;
2956 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
2957 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
2958 unpack_tree_opts.head_idx = 1;
2959 unpack_tree_opts.src_index = r->index;
2960 unpack_tree_opts.dst_index = r->index;
2961 unpack_tree_opts.fn = oneway_merge;
2962 unpack_tree_opts.merge = 1;
2963 unpack_tree_opts.update = 1;
2965 if (read_index_unmerged(r->index)) {
2966 rollback_lock_file(&lock);
2967 strbuf_release(&ref_name);
2968 return error_resolve_conflict(_(action_name(opts)));
2971 if (!fill_tree_descriptor(&desc, &oid)) {
2972 error(_("failed to find tree of %s"), oid_to_hex(&oid));
2973 rollback_lock_file(&lock);
2974 free((void *)desc.buffer);
2975 strbuf_release(&ref_name);
2976 return -1;
2979 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
2980 rollback_lock_file(&lock);
2981 free((void *)desc.buffer);
2982 strbuf_release(&ref_name);
2983 return -1;
2986 tree = parse_tree_indirect(&oid);
2987 prime_cache_tree(r->index, tree);
2989 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
2990 ret = error(_("could not write index"));
2991 free((void *)desc.buffer);
2993 if (!ret)
2994 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
2995 len, name), "HEAD", &oid,
2996 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
2998 strbuf_release(&ref_name);
2999 return ret;
3002 static struct commit *lookup_label(const char *label, int len,
3003 struct strbuf *buf)
3005 struct commit *commit;
3007 strbuf_reset(buf);
3008 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3009 commit = lookup_commit_reference_by_name(buf->buf);
3010 if (!commit) {
3011 /* fall back to non-rewritten ref or commit */
3012 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3013 commit = lookup_commit_reference_by_name(buf->buf);
3016 if (!commit)
3017 error(_("could not resolve '%s'"), buf->buf);
3019 return commit;
3022 static int do_merge(struct repository *r,
3023 struct commit *commit,
3024 const char *arg, int arg_len,
3025 int flags, struct replay_opts *opts)
3027 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3028 EDIT_MSG | VERIFY_MSG : 0;
3029 struct strbuf ref_name = STRBUF_INIT;
3030 struct commit *head_commit, *merge_commit, *i;
3031 struct commit_list *bases, *j, *reversed = NULL;
3032 struct commit_list *to_merge = NULL, **tail = &to_merge;
3033 struct merge_options o;
3034 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3035 static struct lock_file lock;
3036 const char *p;
3038 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
3039 ret = -1;
3040 goto leave_merge;
3043 head_commit = lookup_commit_reference_by_name("HEAD");
3044 if (!head_commit) {
3045 ret = error(_("cannot merge without a current revision"));
3046 goto leave_merge;
3050 * For octopus merges, the arg starts with the list of revisions to be
3051 * merged. The list is optionally followed by '#' and the oneline.
3053 merge_arg_len = oneline_offset = arg_len;
3054 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3055 if (!*p)
3056 break;
3057 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3058 p += 1 + strspn(p + 1, " \t\n");
3059 oneline_offset = p - arg;
3060 break;
3062 k = strcspn(p, " \t\n");
3063 if (!k)
3064 continue;
3065 merge_commit = lookup_label(p, k, &ref_name);
3066 if (!merge_commit) {
3067 ret = error(_("unable to parse '%.*s'"), k, p);
3068 goto leave_merge;
3070 tail = &commit_list_insert(merge_commit, tail)->next;
3071 p += k;
3072 merge_arg_len = p - arg;
3075 if (!to_merge) {
3076 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3077 goto leave_merge;
3080 if (opts->have_squash_onto &&
3081 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3083 * When the user tells us to "merge" something into a
3084 * "[new root]", let's simply fast-forward to the merge head.
3086 rollback_lock_file(&lock);
3087 if (to_merge->next)
3088 ret = error(_("octopus merge cannot be executed on "
3089 "top of a [new root]"));
3090 else
3091 ret = fast_forward_to(r, &to_merge->item->object.oid,
3092 &head_commit->object.oid, 0,
3093 opts);
3094 goto leave_merge;
3097 if (commit) {
3098 const char *message = get_commit_buffer(commit, NULL);
3099 const char *body;
3100 int len;
3102 if (!message) {
3103 ret = error(_("could not get commit message of '%s'"),
3104 oid_to_hex(&commit->object.oid));
3105 goto leave_merge;
3107 write_author_script(message);
3108 find_commit_subject(message, &body);
3109 len = strlen(body);
3110 ret = write_message(body, len, git_path_merge_msg(r), 0);
3111 unuse_commit_buffer(commit, message);
3112 if (ret) {
3113 error_errno(_("could not write '%s'"),
3114 git_path_merge_msg(r));
3115 goto leave_merge;
3117 } else {
3118 struct strbuf buf = STRBUF_INIT;
3119 int len;
3121 strbuf_addf(&buf, "author %s", git_author_info(0));
3122 write_author_script(buf.buf);
3123 strbuf_reset(&buf);
3125 if (oneline_offset < arg_len) {
3126 p = arg + oneline_offset;
3127 len = arg_len - oneline_offset;
3128 } else {
3129 strbuf_addf(&buf, "Merge %s '%.*s'",
3130 to_merge->next ? "branches" : "branch",
3131 merge_arg_len, arg);
3132 p = buf.buf;
3133 len = buf.len;
3136 ret = write_message(p, len, git_path_merge_msg(r), 0);
3137 strbuf_release(&buf);
3138 if (ret) {
3139 error_errno(_("could not write '%s'"),
3140 git_path_merge_msg(r));
3141 goto leave_merge;
3146 * If HEAD is not identical to the first parent of the original merge
3147 * commit, we cannot fast-forward.
3149 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3150 oideq(&commit->parents->item->object.oid,
3151 &head_commit->object.oid);
3154 * If any merge head is different from the original one, we cannot
3155 * fast-forward.
3157 if (can_fast_forward) {
3158 struct commit_list *p = commit->parents->next;
3160 for (j = to_merge; j && p; j = j->next, p = p->next)
3161 if (!oideq(&j->item->object.oid,
3162 &p->item->object.oid)) {
3163 can_fast_forward = 0;
3164 break;
3167 * If the number of merge heads differs from the original merge
3168 * commit, we cannot fast-forward.
3170 if (j || p)
3171 can_fast_forward = 0;
3174 if (can_fast_forward) {
3175 rollback_lock_file(&lock);
3176 ret = fast_forward_to(r, &commit->object.oid,
3177 &head_commit->object.oid, 0, opts);
3178 goto leave_merge;
3181 if (to_merge->next) {
3182 /* Octopus merge */
3183 struct child_process cmd = CHILD_PROCESS_INIT;
3185 if (read_env_script(&cmd.env_array)) {
3186 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3188 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3189 goto leave_merge;
3192 cmd.git_cmd = 1;
3193 argv_array_push(&cmd.args, "merge");
3194 argv_array_push(&cmd.args, "-s");
3195 argv_array_push(&cmd.args, "octopus");
3196 argv_array_push(&cmd.args, "--no-edit");
3197 argv_array_push(&cmd.args, "--no-ff");
3198 argv_array_push(&cmd.args, "--no-log");
3199 argv_array_push(&cmd.args, "--no-stat");
3200 argv_array_push(&cmd.args, "-F");
3201 argv_array_push(&cmd.args, git_path_merge_msg(r));
3202 if (opts->gpg_sign)
3203 argv_array_push(&cmd.args, opts->gpg_sign);
3205 /* Add the tips to be merged */
3206 for (j = to_merge; j; j = j->next)
3207 argv_array_push(&cmd.args,
3208 oid_to_hex(&j->item->object.oid));
3210 strbuf_release(&ref_name);
3211 unlink(git_path_cherry_pick_head(r));
3212 rollback_lock_file(&lock);
3214 rollback_lock_file(&lock);
3215 ret = run_command(&cmd);
3217 /* force re-reading of the cache */
3218 if (!ret && (discard_index(r->index) < 0 ||
3219 read_index(r->index) < 0))
3220 ret = error(_("could not read index"));
3221 goto leave_merge;
3224 merge_commit = to_merge->item;
3225 write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
3226 git_path_merge_head(r), 0);
3227 write_message("no-ff", 5, git_path_merge_mode(r), 0);
3229 bases = get_merge_bases(head_commit, merge_commit);
3230 if (bases && oideq(&merge_commit->object.oid,
3231 &bases->item->object.oid)) {
3232 ret = 0;
3233 /* skip merging an ancestor of HEAD */
3234 goto leave_merge;
3237 for (j = bases; j; j = j->next)
3238 commit_list_insert(j->item, &reversed);
3239 free_commit_list(bases);
3241 read_index(r->index);
3242 init_merge_options(&o);
3243 o.branch1 = "HEAD";
3244 o.branch2 = ref_name.buf;
3245 o.buffer_output = 2;
3247 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3248 if (ret <= 0)
3249 fputs(o.obuf.buf, stdout);
3250 strbuf_release(&o.obuf);
3251 if (ret < 0) {
3252 error(_("could not even attempt to merge '%.*s'"),
3253 merge_arg_len, arg);
3254 goto leave_merge;
3257 * The return value of merge_recursive() is 1 on clean, and 0 on
3258 * unclean merge.
3260 * Let's reverse that, so that do_merge() returns 0 upon success and
3261 * 1 upon failed merge (keeping the return value -1 for the cases where
3262 * we will want to reschedule the `merge` command).
3264 ret = !ret;
3266 if (r->index->cache_changed &&
3267 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
3268 ret = error(_("merge: Unable to write new index file"));
3269 goto leave_merge;
3272 rollback_lock_file(&lock);
3273 if (ret)
3274 repo_rerere(r, opts->allow_rerere_auto);
3275 else
3277 * In case of problems, we now want to return a positive
3278 * value (a negative one would indicate that the `merge`
3279 * command needs to be rescheduled).
3281 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3282 run_commit_flags);
3284 leave_merge:
3285 strbuf_release(&ref_name);
3286 rollback_lock_file(&lock);
3287 free_commit_list(to_merge);
3288 return ret;
3291 static int is_final_fixup(struct todo_list *todo_list)
3293 int i = todo_list->current;
3295 if (!is_fixup(todo_list->items[i].command))
3296 return 0;
3298 while (++i < todo_list->nr)
3299 if (is_fixup(todo_list->items[i].command))
3300 return 0;
3301 else if (!is_noop(todo_list->items[i].command))
3302 break;
3303 return 1;
3306 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3308 int i;
3310 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3311 if (!is_noop(todo_list->items[i].command))
3312 return todo_list->items[i].command;
3314 return -1;
3317 static int apply_autostash(struct replay_opts *opts)
3319 struct strbuf stash_sha1 = STRBUF_INIT;
3320 struct child_process child = CHILD_PROCESS_INIT;
3321 int ret = 0;
3323 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3324 strbuf_release(&stash_sha1);
3325 return 0;
3327 strbuf_trim(&stash_sha1);
3329 child.git_cmd = 1;
3330 child.no_stdout = 1;
3331 child.no_stderr = 1;
3332 argv_array_push(&child.args, "stash");
3333 argv_array_push(&child.args, "apply");
3334 argv_array_push(&child.args, stash_sha1.buf);
3335 if (!run_command(&child))
3336 fprintf(stderr, _("Applied autostash.\n"));
3337 else {
3338 struct child_process store = CHILD_PROCESS_INIT;
3340 store.git_cmd = 1;
3341 argv_array_push(&store.args, "stash");
3342 argv_array_push(&store.args, "store");
3343 argv_array_push(&store.args, "-m");
3344 argv_array_push(&store.args, "autostash");
3345 argv_array_push(&store.args, "-q");
3346 argv_array_push(&store.args, stash_sha1.buf);
3347 if (run_command(&store))
3348 ret = error(_("cannot store %s"), stash_sha1.buf);
3349 else
3350 fprintf(stderr,
3351 _("Applying autostash resulted in conflicts.\n"
3352 "Your changes are safe in the stash.\n"
3353 "You can run \"git stash pop\" or"
3354 " \"git stash drop\" at any time.\n"));
3357 strbuf_release(&stash_sha1);
3358 return ret;
3361 static const char *reflog_message(struct replay_opts *opts,
3362 const char *sub_action, const char *fmt, ...)
3364 va_list ap;
3365 static struct strbuf buf = STRBUF_INIT;
3367 va_start(ap, fmt);
3368 strbuf_reset(&buf);
3369 strbuf_addstr(&buf, action_name(opts));
3370 if (sub_action)
3371 strbuf_addf(&buf, " (%s)", sub_action);
3372 if (fmt) {
3373 strbuf_addstr(&buf, ": ");
3374 strbuf_vaddf(&buf, fmt, ap);
3376 va_end(ap);
3378 return buf.buf;
3381 static int run_git_checkout(struct replay_opts *opts, const char *commit,
3382 const char *action)
3384 struct child_process cmd = CHILD_PROCESS_INIT;
3386 cmd.git_cmd = 1;
3388 argv_array_push(&cmd.args, "checkout");
3389 argv_array_push(&cmd.args, commit);
3390 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3392 if (opts->verbose)
3393 return run_command(&cmd);
3394 else
3395 return run_command_silent_on_success(&cmd);
3398 int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit)
3400 const char *action;
3402 if (commit && *commit) {
3403 action = reflog_message(opts, "start", "checkout %s", commit);
3404 if (run_git_checkout(opts, commit, action))
3405 return error(_("could not checkout %s"), commit);
3408 return 0;
3411 static int checkout_onto(struct replay_opts *opts,
3412 const char *onto_name, const char *onto,
3413 const char *orig_head)
3415 struct object_id oid;
3416 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3418 if (get_oid(orig_head, &oid))
3419 return error(_("%s: not a valid OID"), orig_head);
3421 if (run_git_checkout(opts, onto, action)) {
3422 apply_autostash(opts);
3423 sequencer_remove_state(opts);
3424 return error(_("could not detach HEAD"));
3427 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3430 static int stopped_at_head(void)
3432 struct object_id head;
3433 struct commit *commit;
3434 struct commit_message message;
3436 if (get_oid("HEAD", &head) ||
3437 !(commit = lookup_commit(the_repository, &head)) ||
3438 parse_commit(commit) || get_message(commit, &message))
3439 fprintf(stderr, _("Stopped at HEAD\n"));
3440 else {
3441 fprintf(stderr, _("Stopped at %s\n"), message.label);
3442 free_message(commit, &message);
3444 return 0;
3448 static const char rescheduled_advice[] =
3449 N_("Could not execute the todo command\n"
3450 "\n"
3451 " %.*s"
3452 "\n"
3453 "It has been rescheduled; To edit the command before continuing, please\n"
3454 "edit the todo list first:\n"
3455 "\n"
3456 " git rebase --edit-todo\n"
3457 " git rebase --continue\n");
3459 static int pick_commits(struct repository *r,
3460 struct todo_list *todo_list,
3461 struct replay_opts *opts)
3463 int res = 0, reschedule = 0;
3465 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3466 if (opts->allow_ff)
3467 assert(!(opts->signoff || opts->no_commit ||
3468 opts->record_origin || opts->edit));
3469 if (read_and_refresh_cache(r, opts))
3470 return -1;
3472 while (todo_list->current < todo_list->nr) {
3473 struct todo_item *item = todo_list->items + todo_list->current;
3474 if (save_todo(todo_list, opts))
3475 return -1;
3476 if (is_rebase_i(opts)) {
3477 if (item->command != TODO_COMMENT) {
3478 FILE *f = fopen(rebase_path_msgnum(), "w");
3480 todo_list->done_nr++;
3482 if (f) {
3483 fprintf(f, "%d\n", todo_list->done_nr);
3484 fclose(f);
3486 fprintf(stderr, "Rebasing (%d/%d)%s",
3487 todo_list->done_nr,
3488 todo_list->total_nr,
3489 opts->verbose ? "\n" : "\r");
3491 unlink(rebase_path_message());
3492 unlink(rebase_path_author_script());
3493 unlink(rebase_path_stopped_sha());
3494 unlink(rebase_path_amend());
3495 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3497 if (item->command == TODO_BREAK)
3498 return stopped_at_head();
3500 if (item->command <= TODO_SQUASH) {
3501 if (is_rebase_i(opts))
3502 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3503 command_to_string(item->command), NULL),
3505 res = do_pick_commit(r, item->command, item->commit,
3506 opts, is_final_fixup(todo_list));
3507 if (is_rebase_i(opts) && res < 0) {
3508 /* Reschedule */
3509 advise(_(rescheduled_advice),
3510 get_item_line_length(todo_list,
3511 todo_list->current),
3512 get_item_line(todo_list,
3513 todo_list->current));
3514 todo_list->current--;
3515 if (save_todo(todo_list, opts))
3516 return -1;
3518 if (item->command == TODO_EDIT) {
3519 struct commit *commit = item->commit;
3520 if (!res)
3521 fprintf(stderr,
3522 _("Stopped at %s... %.*s\n"),
3523 short_commit_name(commit),
3524 item->arg_len, item->arg);
3525 return error_with_patch(r, commit,
3526 item->arg, item->arg_len, opts, res,
3527 !res);
3529 if (is_rebase_i(opts) && !res)
3530 record_in_rewritten(&item->commit->object.oid,
3531 peek_command(todo_list, 1));
3532 if (res && is_fixup(item->command)) {
3533 if (res == 1)
3534 intend_to_amend();
3535 return error_failed_squash(r, item->commit, opts,
3536 item->arg_len, item->arg);
3537 } else if (res && is_rebase_i(opts) && item->commit) {
3538 int to_amend = 0;
3539 struct object_id oid;
3542 * If we are rewording and have either
3543 * fast-forwarded already, or are about to
3544 * create a new root commit, we want to amend,
3545 * otherwise we do not.
3547 if (item->command == TODO_REWORD &&
3548 !get_oid("HEAD", &oid) &&
3549 (oideq(&item->commit->object.oid, &oid) ||
3550 (opts->have_squash_onto &&
3551 oideq(&opts->squash_onto, &oid))))
3552 to_amend = 1;
3554 return res | error_with_patch(r, item->commit,
3555 item->arg, item->arg_len, opts,
3556 res, to_amend);
3558 } else if (item->command == TODO_EXEC) {
3559 char *end_of_arg = (char *)(item->arg + item->arg_len);
3560 int saved = *end_of_arg;
3561 struct stat st;
3563 *end_of_arg = '\0';
3564 res = do_exec(r, item->arg);
3565 *end_of_arg = saved;
3567 /* Reread the todo file if it has changed. */
3568 if (res)
3569 ; /* fall through */
3570 else if (stat(get_todo_path(opts), &st))
3571 res = error_errno(_("could not stat '%s'"),
3572 get_todo_path(opts));
3573 else if (match_stat_data(&todo_list->stat, &st)) {
3574 todo_list_release(todo_list);
3575 if (read_populate_todo(todo_list, opts))
3576 res = -1; /* message was printed */
3577 /* `current` will be incremented below */
3578 todo_list->current = -1;
3580 } else if (item->command == TODO_LABEL) {
3581 if ((res = do_label(r, item->arg, item->arg_len)))
3582 reschedule = 1;
3583 } else if (item->command == TODO_RESET) {
3584 if ((res = do_reset(r, item->arg, item->arg_len, opts)))
3585 reschedule = 1;
3586 } else if (item->command == TODO_MERGE) {
3587 if ((res = do_merge(r, item->commit,
3588 item->arg, item->arg_len,
3589 item->flags, opts)) < 0)
3590 reschedule = 1;
3591 else if (item->commit)
3592 record_in_rewritten(&item->commit->object.oid,
3593 peek_command(todo_list, 1));
3594 if (res > 0)
3595 /* failed with merge conflicts */
3596 return error_with_patch(r, item->commit,
3597 item->arg,
3598 item->arg_len, opts,
3599 res, 0);
3600 } else if (!is_noop(item->command))
3601 return error(_("unknown command %d"), item->command);
3603 if (reschedule) {
3604 advise(_(rescheduled_advice),
3605 get_item_line_length(todo_list,
3606 todo_list->current),
3607 get_item_line(todo_list, todo_list->current));
3608 todo_list->current--;
3609 if (save_todo(todo_list, opts))
3610 return -1;
3611 if (item->commit)
3612 return error_with_patch(r,
3613 item->commit,
3614 item->arg,
3615 item->arg_len, opts,
3616 res, 0);
3619 todo_list->current++;
3620 if (res)
3621 return res;
3624 if (is_rebase_i(opts)) {
3625 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
3626 struct stat st;
3628 /* Stopped in the middle, as planned? */
3629 if (todo_list->current < todo_list->nr)
3630 return 0;
3632 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3633 starts_with(head_ref.buf, "refs/")) {
3634 const char *msg;
3635 struct object_id head, orig;
3636 int res;
3638 if (get_oid("HEAD", &head)) {
3639 res = error(_("cannot read HEAD"));
3640 cleanup_head_ref:
3641 strbuf_release(&head_ref);
3642 strbuf_release(&buf);
3643 return res;
3645 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
3646 get_oid_hex(buf.buf, &orig)) {
3647 res = error(_("could not read orig-head"));
3648 goto cleanup_head_ref;
3650 strbuf_reset(&buf);
3651 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3652 res = error(_("could not read 'onto'"));
3653 goto cleanup_head_ref;
3655 msg = reflog_message(opts, "finish", "%s onto %s",
3656 head_ref.buf, buf.buf);
3657 if (update_ref(msg, head_ref.buf, &head, &orig,
3658 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
3659 res = error(_("could not update %s"),
3660 head_ref.buf);
3661 goto cleanup_head_ref;
3663 msg = reflog_message(opts, "finish", "returning to %s",
3664 head_ref.buf);
3665 if (create_symref("HEAD", head_ref.buf, msg)) {
3666 res = error(_("could not update HEAD to %s"),
3667 head_ref.buf);
3668 goto cleanup_head_ref;
3670 strbuf_reset(&buf);
3673 if (opts->verbose) {
3674 struct rev_info log_tree_opt;
3675 struct object_id orig, head;
3677 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3678 repo_init_revisions(r, &log_tree_opt, NULL);
3679 log_tree_opt.diff = 1;
3680 log_tree_opt.diffopt.output_format =
3681 DIFF_FORMAT_DIFFSTAT;
3682 log_tree_opt.disable_stdin = 1;
3684 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
3685 !get_oid(buf.buf, &orig) &&
3686 !get_oid("HEAD", &head)) {
3687 diff_tree_oid(&orig, &head, "",
3688 &log_tree_opt.diffopt);
3689 log_tree_diff_flush(&log_tree_opt);
3692 flush_rewritten_pending();
3693 if (!stat(rebase_path_rewritten_list(), &st) &&
3694 st.st_size > 0) {
3695 struct child_process child = CHILD_PROCESS_INIT;
3696 const char *post_rewrite_hook =
3697 find_hook("post-rewrite");
3699 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
3700 child.git_cmd = 1;
3701 argv_array_push(&child.args, "notes");
3702 argv_array_push(&child.args, "copy");
3703 argv_array_push(&child.args, "--for-rewrite=rebase");
3704 /* we don't care if this copying failed */
3705 run_command(&child);
3707 if (post_rewrite_hook) {
3708 struct child_process hook = CHILD_PROCESS_INIT;
3710 hook.in = open(rebase_path_rewritten_list(),
3711 O_RDONLY);
3712 hook.stdout_to_stderr = 1;
3713 argv_array_push(&hook.args, post_rewrite_hook);
3714 argv_array_push(&hook.args, "rebase");
3715 /* we don't care if this hook failed */
3716 run_command(&hook);
3719 apply_autostash(opts);
3721 fprintf(stderr, "Successfully rebased and updated %s.\n",
3722 head_ref.buf);
3724 strbuf_release(&buf);
3725 strbuf_release(&head_ref);
3729 * Sequence of picks finished successfully; cleanup by
3730 * removing the .git/sequencer directory
3732 return sequencer_remove_state(opts);
3735 static int continue_single_pick(void)
3737 const char *argv[] = { "commit", NULL };
3739 if (!file_exists(git_path_cherry_pick_head(the_repository)) &&
3740 !file_exists(git_path_revert_head(the_repository)))
3741 return error(_("no cherry-pick or revert in progress"));
3742 return run_command_v_opt(argv, RUN_GIT_CMD);
3745 static int commit_staged_changes(struct repository *r,
3746 struct replay_opts *opts,
3747 struct todo_list *todo_list)
3749 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
3750 unsigned int final_fixup = 0, is_clean;
3752 if (has_unstaged_changes(r, 1))
3753 return error(_("cannot rebase: You have unstaged changes."));
3755 is_clean = !has_uncommitted_changes(r, 0);
3757 if (file_exists(rebase_path_amend())) {
3758 struct strbuf rev = STRBUF_INIT;
3759 struct object_id head, to_amend;
3761 if (get_oid("HEAD", &head))
3762 return error(_("cannot amend non-existing commit"));
3763 if (!read_oneliner(&rev, rebase_path_amend(), 0))
3764 return error(_("invalid file: '%s'"), rebase_path_amend());
3765 if (get_oid_hex(rev.buf, &to_amend))
3766 return error(_("invalid contents: '%s'"),
3767 rebase_path_amend());
3768 if (!is_clean && !oideq(&head, &to_amend))
3769 return error(_("\nYou have uncommitted changes in your "
3770 "working tree. Please, commit them\n"
3771 "first and then run 'git rebase "
3772 "--continue' again."));
3774 * When skipping a failed fixup/squash, we need to edit the
3775 * commit message, the current fixup list and count, and if it
3776 * was the last fixup/squash in the chain, we need to clean up
3777 * the commit message and if there was a squash, let the user
3778 * edit it.
3780 if (!is_clean || !opts->current_fixup_count)
3781 ; /* this is not the final fixup */
3782 else if (!oideq(&head, &to_amend) ||
3783 !file_exists(rebase_path_stopped_sha())) {
3784 /* was a final fixup or squash done manually? */
3785 if (!is_fixup(peek_command(todo_list, 0))) {
3786 unlink(rebase_path_fixup_msg());
3787 unlink(rebase_path_squash_msg());
3788 unlink(rebase_path_current_fixups());
3789 strbuf_reset(&opts->current_fixups);
3790 opts->current_fixup_count = 0;
3792 } else {
3793 /* we are in a fixup/squash chain */
3794 const char *p = opts->current_fixups.buf;
3795 int len = opts->current_fixups.len;
3797 opts->current_fixup_count--;
3798 if (!len)
3799 BUG("Incorrect current_fixups:\n%s", p);
3800 while (len && p[len - 1] != '\n')
3801 len--;
3802 strbuf_setlen(&opts->current_fixups, len);
3803 if (write_message(p, len, rebase_path_current_fixups(),
3804 0) < 0)
3805 return error(_("could not write file: '%s'"),
3806 rebase_path_current_fixups());
3809 * If a fixup/squash in a fixup/squash chain failed, the
3810 * commit message is already correct, no need to commit
3811 * it again.
3813 * Only if it is the final command in the fixup/squash
3814 * chain, and only if the chain is longer than a single
3815 * fixup/squash command (which was just skipped), do we
3816 * actually need to re-commit with a cleaned up commit
3817 * message.
3819 if (opts->current_fixup_count > 0 &&
3820 !is_fixup(peek_command(todo_list, 0))) {
3821 final_fixup = 1;
3823 * If there was not a single "squash" in the
3824 * chain, we only need to clean up the commit
3825 * message, no need to bother the user with
3826 * opening the commit message in the editor.
3828 if (!starts_with(p, "squash ") &&
3829 !strstr(p, "\nsquash "))
3830 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
3831 } else if (is_fixup(peek_command(todo_list, 0))) {
3833 * We need to update the squash message to skip
3834 * the latest commit message.
3836 struct commit *commit;
3837 const char *path = rebase_path_squash_msg();
3839 if (parse_head(&commit) ||
3840 !(p = get_commit_buffer(commit, NULL)) ||
3841 write_message(p, strlen(p), path, 0)) {
3842 unuse_commit_buffer(commit, p);
3843 return error(_("could not write file: "
3844 "'%s'"), path);
3846 unuse_commit_buffer(commit, p);
3850 strbuf_release(&rev);
3851 flags |= AMEND_MSG;
3854 if (is_clean) {
3855 const char *cherry_pick_head = git_path_cherry_pick_head(r);
3857 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
3858 return error(_("could not remove CHERRY_PICK_HEAD"));
3859 if (!final_fixup)
3860 return 0;
3863 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
3864 opts, flags))
3865 return error(_("could not commit staged changes."));
3866 unlink(rebase_path_amend());
3867 if (final_fixup) {
3868 unlink(rebase_path_fixup_msg());
3869 unlink(rebase_path_squash_msg());
3871 if (opts->current_fixup_count > 0) {
3873 * Whether final fixup or not, we just cleaned up the commit
3874 * message...
3876 unlink(rebase_path_current_fixups());
3877 strbuf_reset(&opts->current_fixups);
3878 opts->current_fixup_count = 0;
3880 return 0;
3883 int sequencer_continue(struct repository *r, struct replay_opts *opts)
3885 struct todo_list todo_list = TODO_LIST_INIT;
3886 int res;
3888 if (read_and_refresh_cache(r, opts))
3889 return -1;
3891 if (read_populate_opts(opts))
3892 return -1;
3893 if (is_rebase_i(opts)) {
3894 if ((res = read_populate_todo(&todo_list, opts)))
3895 goto release_todo_list;
3896 if (commit_staged_changes(r, opts, &todo_list))
3897 return -1;
3898 } else if (!file_exists(get_todo_path(opts)))
3899 return continue_single_pick();
3900 else if ((res = read_populate_todo(&todo_list, opts)))
3901 goto release_todo_list;
3903 if (!is_rebase_i(opts)) {
3904 /* Verify that the conflict has been resolved */
3905 if (file_exists(git_path_cherry_pick_head(r)) ||
3906 file_exists(git_path_revert_head(r))) {
3907 res = continue_single_pick();
3908 if (res)
3909 goto release_todo_list;
3911 if (index_differs_from("HEAD", NULL, 0)) {
3912 res = error_dirty_index(r->index, opts);
3913 goto release_todo_list;
3915 todo_list.current++;
3916 } else if (file_exists(rebase_path_stopped_sha())) {
3917 struct strbuf buf = STRBUF_INIT;
3918 struct object_id oid;
3920 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
3921 !get_oid_committish(buf.buf, &oid))
3922 record_in_rewritten(&oid, peek_command(&todo_list, 0));
3923 strbuf_release(&buf);
3926 res = pick_commits(r, &todo_list, opts);
3927 release_todo_list:
3928 todo_list_release(&todo_list);
3929 return res;
3932 static int single_pick(struct repository *r,
3933 struct commit *cmit,
3934 struct replay_opts *opts)
3936 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3937 return do_pick_commit(r, opts->action == REPLAY_PICK ?
3938 TODO_PICK : TODO_REVERT, cmit, opts, 0);
3941 int sequencer_pick_revisions(struct repository *r,
3942 struct replay_opts *opts)
3944 struct todo_list todo_list = TODO_LIST_INIT;
3945 struct object_id oid;
3946 int i, res;
3948 assert(opts->revs);
3949 if (read_and_refresh_cache(r, opts))
3950 return -1;
3952 for (i = 0; i < opts->revs->pending.nr; i++) {
3953 struct object_id oid;
3954 const char *name = opts->revs->pending.objects[i].name;
3956 /* This happens when using --stdin. */
3957 if (!strlen(name))
3958 continue;
3960 if (!get_oid(name, &oid)) {
3961 if (!lookup_commit_reference_gently(r, &oid, 1)) {
3962 enum object_type type = oid_object_info(r,
3963 &oid,
3964 NULL);
3965 return error(_("%s: can't cherry-pick a %s"),
3966 name, type_name(type));
3968 } else
3969 return error(_("%s: bad revision"), name);
3973 * If we were called as "git cherry-pick <commit>", just
3974 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
3975 * REVERT_HEAD, and don't touch the sequencer state.
3976 * This means it is possible to cherry-pick in the middle
3977 * of a cherry-pick sequence.
3979 if (opts->revs->cmdline.nr == 1 &&
3980 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
3981 opts->revs->no_walk &&
3982 !opts->revs->cmdline.rev->flags) {
3983 struct commit *cmit;
3984 if (prepare_revision_walk(opts->revs))
3985 return error(_("revision walk setup failed"));
3986 cmit = get_revision(opts->revs);
3987 if (!cmit)
3988 return error(_("empty commit set passed"));
3989 if (get_revision(opts->revs))
3990 BUG("unexpected extra commit from walk");
3991 return single_pick(r, cmit, opts);
3995 * Start a new cherry-pick/ revert sequence; but
3996 * first, make sure that an existing one isn't in
3997 * progress
4000 if (walk_revs_populate_todo(&todo_list, opts) ||
4001 create_seq_dir() < 0)
4002 return -1;
4003 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4004 return error(_("can't revert as initial commit"));
4005 if (save_head(oid_to_hex(&oid)))
4006 return -1;
4007 if (save_opts(opts))
4008 return -1;
4009 update_abort_safety_file();
4010 res = pick_commits(r, &todo_list, opts);
4011 todo_list_release(&todo_list);
4012 return res;
4015 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4017 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4018 struct strbuf sob = STRBUF_INIT;
4019 int has_footer;
4021 strbuf_addstr(&sob, sign_off_header);
4022 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
4023 getenv("GIT_COMMITTER_EMAIL")));
4024 strbuf_addch(&sob, '\n');
4026 if (!ignore_footer)
4027 strbuf_complete_line(msgbuf);
4030 * If the whole message buffer is equal to the sob, pretend that we
4031 * found a conforming footer with a matching sob
4033 if (msgbuf->len - ignore_footer == sob.len &&
4034 !strncmp(msgbuf->buf, sob.buf, sob.len))
4035 has_footer = 3;
4036 else
4037 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4039 if (!has_footer) {
4040 const char *append_newlines = NULL;
4041 size_t len = msgbuf->len - ignore_footer;
4043 if (!len) {
4045 * The buffer is completely empty. Leave foom for
4046 * the title and body to be filled in by the user.
4048 append_newlines = "\n\n";
4049 } else if (len == 1) {
4051 * Buffer contains a single newline. Add another
4052 * so that we leave room for the title and body.
4054 append_newlines = "\n";
4055 } else if (msgbuf->buf[len - 2] != '\n') {
4057 * Buffer ends with a single newline. Add another
4058 * so that there is an empty line between the message
4059 * body and the sob.
4061 append_newlines = "\n";
4062 } /* else, the buffer already ends with two newlines. */
4064 if (append_newlines)
4065 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4066 append_newlines, strlen(append_newlines));
4069 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4070 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4071 sob.buf, sob.len);
4073 strbuf_release(&sob);
4076 struct labels_entry {
4077 struct hashmap_entry entry;
4078 char label[FLEX_ARRAY];
4081 static int labels_cmp(const void *fndata, const struct labels_entry *a,
4082 const struct labels_entry *b, const void *key)
4084 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4087 struct string_entry {
4088 struct oidmap_entry entry;
4089 char string[FLEX_ARRAY];
4092 struct label_state {
4093 struct oidmap commit2label;
4094 struct hashmap labels;
4095 struct strbuf buf;
4098 static const char *label_oid(struct object_id *oid, const char *label,
4099 struct label_state *state)
4101 struct labels_entry *labels_entry;
4102 struct string_entry *string_entry;
4103 struct object_id dummy;
4104 size_t len;
4105 int i;
4107 string_entry = oidmap_get(&state->commit2label, oid);
4108 if (string_entry)
4109 return string_entry->string;
4112 * For "uninteresting" commits, i.e. commits that are not to be
4113 * rebased, and which can therefore not be labeled, we use a unique
4114 * abbreviation of the commit name. This is slightly more complicated
4115 * than calling find_unique_abbrev() because we also need to make
4116 * sure that the abbreviation does not conflict with any other
4117 * label.
4119 * We disallow "interesting" commits to be labeled by a string that
4120 * is a valid full-length hash, to ensure that we always can find an
4121 * abbreviation for any uninteresting commit's names that does not
4122 * clash with any other label.
4124 if (!label) {
4125 char *p;
4127 strbuf_reset(&state->buf);
4128 strbuf_grow(&state->buf, GIT_SHA1_HEXSZ);
4129 label = p = state->buf.buf;
4131 find_unique_abbrev_r(p, oid, default_abbrev);
4134 * We may need to extend the abbreviated hash so that there is
4135 * no conflicting label.
4137 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4138 size_t i = strlen(p) + 1;
4140 oid_to_hex_r(p, oid);
4141 for (; i < GIT_SHA1_HEXSZ; i++) {
4142 char save = p[i];
4143 p[i] = '\0';
4144 if (!hashmap_get_from_hash(&state->labels,
4145 strihash(p), p))
4146 break;
4147 p[i] = save;
4150 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
4151 !get_oid_hex(label, &dummy)) ||
4152 (len == 1 && *label == '#') ||
4153 hashmap_get_from_hash(&state->labels,
4154 strihash(label), label)) {
4156 * If the label already exists, or if the label is a valid full
4157 * OID, or the label is a '#' (which we use as a separator
4158 * between merge heads and oneline), we append a dash and a
4159 * number to make it unique.
4161 struct strbuf *buf = &state->buf;
4163 strbuf_reset(buf);
4164 strbuf_add(buf, label, len);
4166 for (i = 2; ; i++) {
4167 strbuf_setlen(buf, len);
4168 strbuf_addf(buf, "-%d", i);
4169 if (!hashmap_get_from_hash(&state->labels,
4170 strihash(buf->buf),
4171 buf->buf))
4172 break;
4175 label = buf->buf;
4178 FLEX_ALLOC_STR(labels_entry, label, label);
4179 hashmap_entry_init(labels_entry, strihash(label));
4180 hashmap_add(&state->labels, labels_entry);
4182 FLEX_ALLOC_STR(string_entry, string, label);
4183 oidcpy(&string_entry->entry.oid, oid);
4184 oidmap_put(&state->commit2label, string_entry);
4186 return string_entry->string;
4189 static int make_script_with_merges(struct pretty_print_context *pp,
4190 struct rev_info *revs, FILE *out,
4191 unsigned flags)
4193 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4194 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4195 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4196 struct strbuf label = STRBUF_INIT;
4197 struct commit_list *commits = NULL, **tail = &commits, *iter;
4198 struct commit_list *tips = NULL, **tips_tail = &tips;
4199 struct commit *commit;
4200 struct oidmap commit2todo = OIDMAP_INIT;
4201 struct string_entry *entry;
4202 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4203 shown = OIDSET_INIT;
4204 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4206 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4207 const char *cmd_pick = abbr ? "p" : "pick",
4208 *cmd_label = abbr ? "l" : "label",
4209 *cmd_reset = abbr ? "t" : "reset",
4210 *cmd_merge = abbr ? "m" : "merge";
4212 oidmap_init(&commit2todo, 0);
4213 oidmap_init(&state.commit2label, 0);
4214 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4215 strbuf_init(&state.buf, 32);
4217 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4218 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4219 FLEX_ALLOC_STR(entry, string, "onto");
4220 oidcpy(&entry->entry.oid, oid);
4221 oidmap_put(&state.commit2label, entry);
4225 * First phase:
4226 * - get onelines for all commits
4227 * - gather all branch tips (i.e. 2nd or later parents of merges)
4228 * - label all branch tips
4230 while ((commit = get_revision(revs))) {
4231 struct commit_list *to_merge;
4232 const char *p1, *p2;
4233 struct object_id *oid;
4234 int is_empty;
4236 tail = &commit_list_insert(commit, tail)->next;
4237 oidset_insert(&interesting, &commit->object.oid);
4239 is_empty = is_original_commit_empty(commit);
4240 if (!is_empty && (commit->object.flags & PATCHSAME))
4241 continue;
4243 strbuf_reset(&oneline);
4244 pretty_print_commit(pp, commit, &oneline);
4246 to_merge = commit->parents ? commit->parents->next : NULL;
4247 if (!to_merge) {
4248 /* non-merge commit: easy case */
4249 strbuf_reset(&buf);
4250 if (!keep_empty && is_empty)
4251 strbuf_addf(&buf, "%c ", comment_line_char);
4252 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4253 oid_to_hex(&commit->object.oid),
4254 oneline.buf);
4256 FLEX_ALLOC_STR(entry, string, buf.buf);
4257 oidcpy(&entry->entry.oid, &commit->object.oid);
4258 oidmap_put(&commit2todo, entry);
4260 continue;
4263 /* Create a label */
4264 strbuf_reset(&label);
4265 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4266 (p1 = strchr(p1, '\'')) &&
4267 (p2 = strchr(++p1, '\'')))
4268 strbuf_add(&label, p1, p2 - p1);
4269 else if (skip_prefix(oneline.buf, "Merge pull request ",
4270 &p1) &&
4271 (p1 = strstr(p1, " from ")))
4272 strbuf_addstr(&label, p1 + strlen(" from "));
4273 else
4274 strbuf_addbuf(&label, &oneline);
4276 for (p1 = label.buf; *p1; p1++)
4277 if (isspace(*p1))
4278 *(char *)p1 = '-';
4280 strbuf_reset(&buf);
4281 strbuf_addf(&buf, "%s -C %s",
4282 cmd_merge, oid_to_hex(&commit->object.oid));
4284 /* label the tips of merged branches */
4285 for (; to_merge; to_merge = to_merge->next) {
4286 oid = &to_merge->item->object.oid;
4287 strbuf_addch(&buf, ' ');
4289 if (!oidset_contains(&interesting, oid)) {
4290 strbuf_addstr(&buf, label_oid(oid, NULL,
4291 &state));
4292 continue;
4295 tips_tail = &commit_list_insert(to_merge->item,
4296 tips_tail)->next;
4298 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4300 strbuf_addf(&buf, " # %s", oneline.buf);
4302 FLEX_ALLOC_STR(entry, string, buf.buf);
4303 oidcpy(&entry->entry.oid, &commit->object.oid);
4304 oidmap_put(&commit2todo, entry);
4308 * Second phase:
4309 * - label branch points
4310 * - add HEAD to the branch tips
4312 for (iter = commits; iter; iter = iter->next) {
4313 struct commit_list *parent = iter->item->parents;
4314 for (; parent; parent = parent->next) {
4315 struct object_id *oid = &parent->item->object.oid;
4316 if (!oidset_contains(&interesting, oid))
4317 continue;
4318 if (oidset_insert(&child_seen, oid))
4319 label_oid(oid, "branch-point", &state);
4322 /* Add HEAD as implict "tip of branch" */
4323 if (!iter->next)
4324 tips_tail = &commit_list_insert(iter->item,
4325 tips_tail)->next;
4329 * Third phase: output the todo list. This is a bit tricky, as we
4330 * want to avoid jumping back and forth between revisions. To
4331 * accomplish that goal, we walk backwards from the branch tips,
4332 * gathering commits not yet shown, reversing the list on the fly,
4333 * then outputting that list (labeling revisions as needed).
4335 fprintf(out, "%s onto\n", cmd_label);
4336 for (iter = tips; iter; iter = iter->next) {
4337 struct commit_list *list = NULL, *iter2;
4339 commit = iter->item;
4340 if (oidset_contains(&shown, &commit->object.oid))
4341 continue;
4342 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4344 if (entry)
4345 fprintf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4346 else
4347 fprintf(out, "\n");
4349 while (oidset_contains(&interesting, &commit->object.oid) &&
4350 !oidset_contains(&shown, &commit->object.oid)) {
4351 commit_list_insert(commit, &list);
4352 if (!commit->parents) {
4353 commit = NULL;
4354 break;
4356 commit = commit->parents->item;
4359 if (!commit)
4360 fprintf(out, "%s %s\n", cmd_reset,
4361 rebase_cousins ? "onto" : "[new root]");
4362 else {
4363 const char *to = NULL;
4365 entry = oidmap_get(&state.commit2label,
4366 &commit->object.oid);
4367 if (entry)
4368 to = entry->string;
4369 else if (!rebase_cousins)
4370 to = label_oid(&commit->object.oid, NULL,
4371 &state);
4373 if (!to || !strcmp(to, "onto"))
4374 fprintf(out, "%s onto\n", cmd_reset);
4375 else {
4376 strbuf_reset(&oneline);
4377 pretty_print_commit(pp, commit, &oneline);
4378 fprintf(out, "%s %s # %s\n",
4379 cmd_reset, to, oneline.buf);
4383 for (iter2 = list; iter2; iter2 = iter2->next) {
4384 struct object_id *oid = &iter2->item->object.oid;
4385 entry = oidmap_get(&commit2todo, oid);
4386 /* only show if not already upstream */
4387 if (entry)
4388 fprintf(out, "%s\n", entry->string);
4389 entry = oidmap_get(&state.commit2label, oid);
4390 if (entry)
4391 fprintf(out, "%s %s\n",
4392 cmd_label, entry->string);
4393 oidset_insert(&shown, oid);
4396 free_commit_list(list);
4399 free_commit_list(commits);
4400 free_commit_list(tips);
4402 strbuf_release(&label);
4403 strbuf_release(&oneline);
4404 strbuf_release(&buf);
4406 oidmap_free(&commit2todo, 1);
4407 oidmap_free(&state.commit2label, 1);
4408 hashmap_free(&state.labels, 1);
4409 strbuf_release(&state.buf);
4411 return 0;
4414 int sequencer_make_script(struct repository *r, FILE *out,
4415 int argc, const char **argv,
4416 unsigned flags)
4418 char *format = NULL;
4419 struct pretty_print_context pp = {0};
4420 struct strbuf buf = STRBUF_INIT;
4421 struct rev_info revs;
4422 struct commit *commit;
4423 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4424 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4425 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4427 repo_init_revisions(r, &revs, NULL);
4428 revs.verbose_header = 1;
4429 if (!rebase_merges)
4430 revs.max_parents = 1;
4431 revs.cherry_mark = 1;
4432 revs.limited = 1;
4433 revs.reverse = 1;
4434 revs.right_only = 1;
4435 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4436 revs.topo_order = 1;
4438 revs.pretty_given = 1;
4439 git_config_get_string("rebase.instructionFormat", &format);
4440 if (!format || !*format) {
4441 free(format);
4442 format = xstrdup("%s");
4444 get_commit_format(format, &revs);
4445 free(format);
4446 pp.fmt = revs.commit_format;
4447 pp.output_encoding = get_log_output_encoding();
4449 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4450 return error(_("make_script: unhandled options"));
4452 if (prepare_revision_walk(&revs) < 0)
4453 return error(_("make_script: error preparing revisions"));
4455 if (rebase_merges)
4456 return make_script_with_merges(&pp, &revs, out, flags);
4458 while ((commit = get_revision(&revs))) {
4459 int is_empty = is_original_commit_empty(commit);
4461 if (!is_empty && (commit->object.flags & PATCHSAME))
4462 continue;
4463 strbuf_reset(&buf);
4464 if (!keep_empty && is_empty)
4465 strbuf_addf(&buf, "%c ", comment_line_char);
4466 strbuf_addf(&buf, "%s %s ", insn,
4467 oid_to_hex(&commit->object.oid));
4468 pretty_print_commit(&pp, commit, &buf);
4469 strbuf_addch(&buf, '\n');
4470 fputs(buf.buf, out);
4472 strbuf_release(&buf);
4473 return 0;
4477 * Add commands after pick and (series of) squash/fixup commands
4478 * in the todo list.
4480 int sequencer_add_exec_commands(const char *commands)
4482 const char *todo_file = rebase_path_todo();
4483 struct todo_list todo_list = TODO_LIST_INIT;
4484 struct strbuf *buf = &todo_list.buf;
4485 size_t offset = 0, commands_len = strlen(commands);
4486 int i, insert;
4488 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4489 return error(_("could not read '%s'."), todo_file);
4491 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
4492 todo_list_release(&todo_list);
4493 return error(_("unusable todo list: '%s'"), todo_file);
4497 * Insert <commands> after every pick. Here, fixup/squash chains
4498 * are considered part of the pick, so we insert the commands *after*
4499 * those chains if there are any.
4501 insert = -1;
4502 for (i = 0; i < todo_list.nr; i++) {
4503 enum todo_command command = todo_list.items[i].command;
4505 if (insert >= 0) {
4506 /* skip fixup/squash chains */
4507 if (command == TODO_COMMENT)
4508 continue;
4509 else if (is_fixup(command)) {
4510 insert = i + 1;
4511 continue;
4513 strbuf_insert(buf,
4514 todo_list.items[insert].offset_in_buf +
4515 offset, commands, commands_len);
4516 offset += commands_len;
4517 insert = -1;
4520 if (command == TODO_PICK || command == TODO_MERGE)
4521 insert = i + 1;
4524 /* insert or append final <commands> */
4525 if (insert >= 0 && insert < todo_list.nr)
4526 strbuf_insert(buf, todo_list.items[insert].offset_in_buf +
4527 offset, commands, commands_len);
4528 else if (insert >= 0 || !offset)
4529 strbuf_add(buf, commands, commands_len);
4531 i = write_message(buf->buf, buf->len, todo_file, 0);
4532 todo_list_release(&todo_list);
4533 return i;
4536 int transform_todos(unsigned flags)
4538 const char *todo_file = rebase_path_todo();
4539 struct todo_list todo_list = TODO_LIST_INIT;
4540 struct strbuf buf = STRBUF_INIT;
4541 struct todo_item *item;
4542 int i;
4544 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4545 return error(_("could not read '%s'."), todo_file);
4547 if (parse_insn_buffer(todo_list.buf.buf, &todo_list)) {
4548 todo_list_release(&todo_list);
4549 return error(_("unusable todo list: '%s'"), todo_file);
4552 for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
4553 /* if the item is not a command write it and continue */
4554 if (item->command >= TODO_COMMENT) {
4555 strbuf_addf(&buf, "%.*s\n", item->arg_len, item->arg);
4556 continue;
4559 /* add command to the buffer */
4560 if (flags & TODO_LIST_ABBREVIATE_CMDS)
4561 strbuf_addch(&buf, command_to_char(item->command));
4562 else
4563 strbuf_addstr(&buf, command_to_string(item->command));
4565 /* add commit id */
4566 if (item->commit) {
4567 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
4568 short_commit_name(item->commit) :
4569 oid_to_hex(&item->commit->object.oid);
4571 if (item->command == TODO_MERGE) {
4572 if (item->flags & TODO_EDIT_MERGE_MSG)
4573 strbuf_addstr(&buf, " -c");
4574 else
4575 strbuf_addstr(&buf, " -C");
4578 strbuf_addf(&buf, " %s", oid);
4581 /* add all the rest */
4582 if (!item->arg_len)
4583 strbuf_addch(&buf, '\n');
4584 else
4585 strbuf_addf(&buf, " %.*s\n", item->arg_len, item->arg);
4588 i = write_message(buf.buf, buf.len, todo_file, 0);
4589 todo_list_release(&todo_list);
4590 return i;
4593 enum missing_commit_check_level get_missing_commit_check_level(void)
4595 const char *value;
4597 if (git_config_get_value("rebase.missingcommitscheck", &value) ||
4598 !strcasecmp("ignore", value))
4599 return MISSING_COMMIT_CHECK_IGNORE;
4600 if (!strcasecmp("warn", value))
4601 return MISSING_COMMIT_CHECK_WARN;
4602 if (!strcasecmp("error", value))
4603 return MISSING_COMMIT_CHECK_ERROR;
4604 warning(_("unrecognized setting %s for option "
4605 "rebase.missingCommitsCheck. Ignoring."), value);
4606 return MISSING_COMMIT_CHECK_IGNORE;
4609 define_commit_slab(commit_seen, unsigned char);
4611 * Check if the user dropped some commits by mistake
4612 * Behaviour determined by rebase.missingCommitsCheck.
4613 * Check if there is an unrecognized command or a
4614 * bad SHA-1 in a command.
4616 int check_todo_list(void)
4618 enum missing_commit_check_level check_level = get_missing_commit_check_level();
4619 struct strbuf todo_file = STRBUF_INIT;
4620 struct todo_list todo_list = TODO_LIST_INIT;
4621 struct strbuf missing = STRBUF_INIT;
4622 int advise_to_edit_todo = 0, res = 0, i;
4623 struct commit_seen commit_seen;
4625 init_commit_seen(&commit_seen);
4627 strbuf_addstr(&todo_file, rebase_path_todo());
4628 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4629 res = -1;
4630 goto leave_check;
4632 advise_to_edit_todo = res =
4633 parse_insn_buffer(todo_list.buf.buf, &todo_list);
4635 if (res || check_level == MISSING_COMMIT_CHECK_IGNORE)
4636 goto leave_check;
4638 /* Mark the commits in git-rebase-todo as seen */
4639 for (i = 0; i < todo_list.nr; i++) {
4640 struct commit *commit = todo_list.items[i].commit;
4641 if (commit)
4642 *commit_seen_at(&commit_seen, commit) = 1;
4645 todo_list_release(&todo_list);
4646 strbuf_addstr(&todo_file, ".backup");
4647 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4648 res = -1;
4649 goto leave_check;
4651 strbuf_release(&todo_file);
4652 res = !!parse_insn_buffer(todo_list.buf.buf, &todo_list);
4654 /* Find commits in git-rebase-todo.backup yet unseen */
4655 for (i = todo_list.nr - 1; i >= 0; i--) {
4656 struct todo_item *item = todo_list.items + i;
4657 struct commit *commit = item->commit;
4658 if (commit && !*commit_seen_at(&commit_seen, commit)) {
4659 strbuf_addf(&missing, " - %s %.*s\n",
4660 short_commit_name(commit),
4661 item->arg_len, item->arg);
4662 *commit_seen_at(&commit_seen, commit) = 1;
4666 /* Warn about missing commits */
4667 if (!missing.len)
4668 goto leave_check;
4670 if (check_level == MISSING_COMMIT_CHECK_ERROR)
4671 advise_to_edit_todo = res = 1;
4673 fprintf(stderr,
4674 _("Warning: some commits may have been dropped accidentally.\n"
4675 "Dropped commits (newer to older):\n"));
4677 /* Make the list user-friendly and display */
4678 fputs(missing.buf, stderr);
4679 strbuf_release(&missing);
4681 fprintf(stderr, _("To avoid this message, use \"drop\" to "
4682 "explicitly remove a commit.\n\n"
4683 "Use 'git config rebase.missingCommitsCheck' to change "
4684 "the level of warnings.\n"
4685 "The possible behaviours are: ignore, warn, error.\n\n"));
4687 leave_check:
4688 clear_commit_seen(&commit_seen);
4689 strbuf_release(&todo_file);
4690 todo_list_release(&todo_list);
4692 if (advise_to_edit_todo)
4693 fprintf(stderr,
4694 _("You can fix this with 'git rebase --edit-todo' "
4695 "and then run 'git rebase --continue'.\n"
4696 "Or you can abort the rebase with 'git rebase"
4697 " --abort'.\n"));
4699 return res;
4702 static int rewrite_file(const char *path, const char *buf, size_t len)
4704 int rc = 0;
4705 int fd = open(path, O_WRONLY | O_TRUNC);
4706 if (fd < 0)
4707 return error_errno(_("could not open '%s' for writing"), path);
4708 if (write_in_full(fd, buf, len) < 0)
4709 rc = error_errno(_("could not write to '%s'"), path);
4710 if (close(fd) && !rc)
4711 rc = error_errno(_("could not close '%s'"), path);
4712 return rc;
4715 /* skip picking commits whose parents are unchanged */
4716 static int skip_unnecessary_picks(struct object_id *output_oid)
4718 const char *todo_file = rebase_path_todo();
4719 struct strbuf buf = STRBUF_INIT;
4720 struct todo_list todo_list = TODO_LIST_INIT;
4721 struct object_id *parent_oid;
4722 int fd, i;
4724 if (!read_oneliner(&buf, rebase_path_onto(), 0))
4725 return error(_("could not read 'onto'"));
4726 if (get_oid(buf.buf, output_oid)) {
4727 strbuf_release(&buf);
4728 return error(_("need a HEAD to fixup"));
4730 strbuf_release(&buf);
4732 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4733 return -1;
4734 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
4735 todo_list_release(&todo_list);
4736 return -1;
4739 for (i = 0; i < todo_list.nr; i++) {
4740 struct todo_item *item = todo_list.items + i;
4742 if (item->command >= TODO_NOOP)
4743 continue;
4744 if (item->command != TODO_PICK)
4745 break;
4746 if (parse_commit(item->commit)) {
4747 todo_list_release(&todo_list);
4748 return error(_("could not parse commit '%s'"),
4749 oid_to_hex(&item->commit->object.oid));
4751 if (!item->commit->parents)
4752 break; /* root commit */
4753 if (item->commit->parents->next)
4754 break; /* merge commit */
4755 parent_oid = &item->commit->parents->item->object.oid;
4756 if (!oideq(parent_oid, output_oid))
4757 break;
4758 oidcpy(output_oid, &item->commit->object.oid);
4760 if (i > 0) {
4761 int offset = get_item_line_offset(&todo_list, i);
4762 const char *done_path = rebase_path_done();
4764 fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
4765 if (fd < 0) {
4766 error_errno(_("could not open '%s' for writing"),
4767 done_path);
4768 todo_list_release(&todo_list);
4769 return -1;
4771 if (write_in_full(fd, todo_list.buf.buf, offset) < 0) {
4772 error_errno(_("could not write to '%s'"), done_path);
4773 todo_list_release(&todo_list);
4774 close(fd);
4775 return -1;
4777 close(fd);
4779 if (rewrite_file(rebase_path_todo(), todo_list.buf.buf + offset,
4780 todo_list.buf.len - offset) < 0) {
4781 todo_list_release(&todo_list);
4782 return -1;
4785 todo_list.current = i;
4786 if (is_fixup(peek_command(&todo_list, 0)))
4787 record_in_rewritten(output_oid, peek_command(&todo_list, 0));
4790 todo_list_release(&todo_list);
4792 return 0;
4795 int complete_action(struct replay_opts *opts, unsigned flags,
4796 const char *shortrevisions, const char *onto_name,
4797 const char *onto, const char *orig_head, const char *cmd,
4798 unsigned autosquash)
4800 const char *shortonto, *todo_file = rebase_path_todo();
4801 struct todo_list todo_list = TODO_LIST_INIT;
4802 struct strbuf *buf = &(todo_list.buf);
4803 struct object_id oid;
4804 struct stat st;
4806 get_oid(onto, &oid);
4807 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
4809 if (!lstat(todo_file, &st) && st.st_size == 0 &&
4810 write_message("noop\n", 5, todo_file, 0))
4811 return -1;
4813 if (autosquash && rearrange_squash())
4814 return -1;
4816 if (cmd && *cmd)
4817 sequencer_add_exec_commands(cmd);
4819 if (strbuf_read_file(buf, todo_file, 0) < 0)
4820 return error_errno(_("could not read '%s'."), todo_file);
4822 if (parse_insn_buffer(buf->buf, &todo_list)) {
4823 todo_list_release(&todo_list);
4824 return error(_("unusable todo list: '%s'"), todo_file);
4827 if (count_commands(&todo_list) == 0) {
4828 apply_autostash(opts);
4829 sequencer_remove_state(opts);
4830 todo_list_release(&todo_list);
4832 return error(_("nothing to do"));
4835 strbuf_addch(buf, '\n');
4836 strbuf_commented_addf(buf, Q_("Rebase %s onto %s (%d command)",
4837 "Rebase %s onto %s (%d commands)",
4838 count_commands(&todo_list)),
4839 shortrevisions, shortonto, count_commands(&todo_list));
4840 append_todo_help(0, flags & TODO_LIST_KEEP_EMPTY, buf);
4842 if (write_message(buf->buf, buf->len, todo_file, 0)) {
4843 todo_list_release(&todo_list);
4844 return -1;
4847 if (copy_file(rebase_path_todo_backup(), todo_file, 0666))
4848 return error(_("could not copy '%s' to '%s'."), todo_file,
4849 rebase_path_todo_backup());
4851 if (transform_todos(flags | TODO_LIST_SHORTEN_IDS))
4852 return error(_("could not transform the todo list"));
4854 strbuf_reset(buf);
4856 if (launch_sequence_editor(todo_file, buf, NULL)) {
4857 apply_autostash(opts);
4858 sequencer_remove_state(opts);
4859 todo_list_release(&todo_list);
4861 return -1;
4864 strbuf_stripspace(buf, 1);
4865 if (buf->len == 0) {
4866 apply_autostash(opts);
4867 sequencer_remove_state(opts);
4868 todo_list_release(&todo_list);
4870 return error(_("nothing to do"));
4873 todo_list_release(&todo_list);
4875 if (check_todo_list()) {
4876 checkout_onto(opts, onto_name, onto, orig_head);
4877 return -1;
4880 if (transform_todos(flags & ~(TODO_LIST_SHORTEN_IDS)))
4881 return error(_("could not transform the todo list"));
4883 if (opts->allow_ff && skip_unnecessary_picks(&oid))
4884 return error(_("could not skip unnecessary pick commands"));
4886 if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head))
4887 return -1;
4889 if (require_clean_work_tree(the_repository, "rebase", "", 1, 1))
4890 return -1;
4892 return sequencer_continue(the_repository, opts);
4895 struct subject2item_entry {
4896 struct hashmap_entry entry;
4897 int i;
4898 char subject[FLEX_ARRAY];
4901 static int subject2item_cmp(const void *fndata,
4902 const struct subject2item_entry *a,
4903 const struct subject2item_entry *b, const void *key)
4905 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
4908 define_commit_slab(commit_todo_item, struct todo_item *);
4911 * Rearrange the todo list that has both "pick commit-id msg" and "pick
4912 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
4913 * after the former, and change "pick" to "fixup"/"squash".
4915 * Note that if the config has specified a custom instruction format, each log
4916 * message will have to be retrieved from the commit (as the oneline in the
4917 * script cannot be trusted) in order to normalize the autosquash arrangement.
4919 int rearrange_squash(void)
4921 const char *todo_file = rebase_path_todo();
4922 struct todo_list todo_list = TODO_LIST_INIT;
4923 struct hashmap subject2item;
4924 int res = 0, rearranged = 0, *next, *tail, i;
4925 char **subjects;
4926 struct commit_todo_item commit_todo;
4928 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4929 return -1;
4930 if (parse_insn_buffer(todo_list.buf.buf, &todo_list) < 0) {
4931 todo_list_release(&todo_list);
4932 return -1;
4935 init_commit_todo_item(&commit_todo);
4937 * The hashmap maps onelines to the respective todo list index.
4939 * If any items need to be rearranged, the next[i] value will indicate
4940 * which item was moved directly after the i'th.
4942 * In that case, last[i] will indicate the index of the latest item to
4943 * be moved to appear after the i'th.
4945 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
4946 NULL, todo_list.nr);
4947 ALLOC_ARRAY(next, todo_list.nr);
4948 ALLOC_ARRAY(tail, todo_list.nr);
4949 ALLOC_ARRAY(subjects, todo_list.nr);
4950 for (i = 0; i < todo_list.nr; i++) {
4951 struct strbuf buf = STRBUF_INIT;
4952 struct todo_item *item = todo_list.items + i;
4953 const char *commit_buffer, *subject, *p;
4954 size_t subject_len;
4955 int i2 = -1;
4956 struct subject2item_entry *entry;
4958 next[i] = tail[i] = -1;
4959 if (!item->commit || item->command == TODO_DROP) {
4960 subjects[i] = NULL;
4961 continue;
4964 if (is_fixup(item->command)) {
4965 todo_list_release(&todo_list);
4966 clear_commit_todo_item(&commit_todo);
4967 return error(_("the script was already rearranged."));
4970 *commit_todo_item_at(&commit_todo, item->commit) = item;
4972 parse_commit(item->commit);
4973 commit_buffer = get_commit_buffer(item->commit, NULL);
4974 find_commit_subject(commit_buffer, &subject);
4975 format_subject(&buf, subject, " ");
4976 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
4977 unuse_commit_buffer(item->commit, commit_buffer);
4978 if ((skip_prefix(subject, "fixup! ", &p) ||
4979 skip_prefix(subject, "squash! ", &p))) {
4980 struct commit *commit2;
4982 for (;;) {
4983 while (isspace(*p))
4984 p++;
4985 if (!skip_prefix(p, "fixup! ", &p) &&
4986 !skip_prefix(p, "squash! ", &p))
4987 break;
4990 if ((entry = hashmap_get_from_hash(&subject2item,
4991 strhash(p), p)))
4992 /* found by title */
4993 i2 = entry->i;
4994 else if (!strchr(p, ' ') &&
4995 (commit2 =
4996 lookup_commit_reference_by_name(p)) &&
4997 *commit_todo_item_at(&commit_todo, commit2))
4998 /* found by commit name */
4999 i2 = *commit_todo_item_at(&commit_todo, commit2)
5000 - todo_list.items;
5001 else {
5002 /* copy can be a prefix of the commit subject */
5003 for (i2 = 0; i2 < i; i2++)
5004 if (subjects[i2] &&
5005 starts_with(subjects[i2], p))
5006 break;
5007 if (i2 == i)
5008 i2 = -1;
5011 if (i2 >= 0) {
5012 rearranged = 1;
5013 todo_list.items[i].command =
5014 starts_with(subject, "fixup!") ?
5015 TODO_FIXUP : TODO_SQUASH;
5016 if (next[i2] < 0)
5017 next[i2] = i;
5018 else
5019 next[tail[i2]] = i;
5020 tail[i2] = i;
5021 } else if (!hashmap_get_from_hash(&subject2item,
5022 strhash(subject), subject)) {
5023 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5024 entry->i = i;
5025 hashmap_entry_init(entry, strhash(entry->subject));
5026 hashmap_put(&subject2item, entry);
5030 if (rearranged) {
5031 struct strbuf buf = STRBUF_INIT;
5033 for (i = 0; i < todo_list.nr; i++) {
5034 enum todo_command command = todo_list.items[i].command;
5035 int cur = i;
5038 * Initially, all commands are 'pick's. If it is a
5039 * fixup or a squash now, we have rearranged it.
5041 if (is_fixup(command))
5042 continue;
5044 while (cur >= 0) {
5045 const char *bol =
5046 get_item_line(&todo_list, cur);
5047 const char *eol =
5048 get_item_line(&todo_list, cur + 1);
5050 /* replace 'pick', by 'fixup' or 'squash' */
5051 command = todo_list.items[cur].command;
5052 if (is_fixup(command)) {
5053 strbuf_addstr(&buf,
5054 todo_command_info[command].str);
5055 bol += strcspn(bol, " \t");
5058 strbuf_add(&buf, bol, eol - bol);
5060 cur = next[cur];
5064 res = rewrite_file(todo_file, buf.buf, buf.len);
5065 strbuf_release(&buf);
5068 free(next);
5069 free(tail);
5070 for (i = 0; i < todo_list.nr; i++)
5071 free(subjects[i]);
5072 free(subjects);
5073 hashmap_free(&subject2item, 1);
5074 todo_list_release(&todo_list);
5076 clear_commit_todo_item(&commit_todo);
5077 return res;