Merge branch 'la/quiltimport-keep-non-patch'
[git.git] / sequencer.c
blob4f1cb5e38fe77171cbcb7c070a1b5557d0bdcd6a
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(struct repository *r, int show_hint,
360 struct replay_opts *opts)
362 char *msg = getenv("GIT_CHERRY_PICK_HELP");
364 if (msg) {
365 fprintf(stderr, "%s\n", msg);
367 * A conflict has occurred but the porcelain
368 * (typically rebase --interactive) wants to take care
369 * of the commit itself so remove CHERRY_PICK_HEAD
371 unlink(git_path_cherry_pick_head(r));
372 return;
375 if (show_hint) {
376 if (opts->no_commit)
377 advise(_("after resolving the conflicts, mark the corrected paths\n"
378 "with 'git add <paths>' or 'git rm <paths>'"));
379 else
380 advise(_("after resolving the conflicts, mark the corrected paths\n"
381 "with 'git add <paths>' or 'git rm <paths>'\n"
382 "and commit the result with 'git commit'"));
386 int write_message(const void *buf, size_t len, const char *filename,
387 int append_eol)
389 struct lock_file msg_file = LOCK_INIT;
391 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
392 if (msg_fd < 0)
393 return error_errno(_("could not lock '%s'"), filename);
394 if (write_in_full(msg_fd, buf, len) < 0) {
395 error_errno(_("could not write to '%s'"), filename);
396 rollback_lock_file(&msg_file);
397 return -1;
399 if (append_eol && write(msg_fd, "\n", 1) < 0) {
400 error_errno(_("could not write eol to '%s'"), filename);
401 rollback_lock_file(&msg_file);
402 return -1;
404 if (commit_lock_file(&msg_file) < 0)
405 return error(_("failed to finalize '%s'"), filename);
407 return 0;
411 * Reads a file that was presumably written by a shell script, i.e. with an
412 * end-of-line marker that needs to be stripped.
414 * Note that only the last end-of-line marker is stripped, consistent with the
415 * behavior of "$(cat path)" in a shell script.
417 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
419 static int read_oneliner(struct strbuf *buf,
420 const char *path, int skip_if_empty)
422 int orig_len = buf->len;
424 if (!file_exists(path))
425 return 0;
427 if (strbuf_read_file(buf, path, 0) < 0) {
428 warning_errno(_("could not read '%s'"), path);
429 return 0;
432 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
433 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
434 --buf->len;
435 buf->buf[buf->len] = '\0';
438 if (skip_if_empty && buf->len == orig_len)
439 return 0;
441 return 1;
444 static struct tree *empty_tree(struct repository *r)
446 return lookup_tree(r, the_hash_algo->empty_tree);
449 static int error_dirty_index(struct index_state *istate, struct replay_opts *opts)
451 if (read_index_unmerged(istate))
452 return error_resolve_conflict(_(action_name(opts)));
454 error(_("your local changes would be overwritten by %s."),
455 _(action_name(opts)));
457 if (advice_commit_before_merge)
458 advise(_("commit your changes or stash them to proceed."));
459 return -1;
462 static void update_abort_safety_file(void)
464 struct object_id head;
466 /* Do nothing on a single-pick */
467 if (!file_exists(git_path_seq_dir()))
468 return;
470 if (!get_oid("HEAD", &head))
471 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
472 else
473 write_file(git_path_abort_safety_file(), "%s", "");
476 static int fast_forward_to(struct repository *r,
477 const struct object_id *to,
478 const struct object_id *from,
479 int unborn,
480 struct replay_opts *opts)
482 struct ref_transaction *transaction;
483 struct strbuf sb = STRBUF_INIT;
484 struct strbuf err = STRBUF_INIT;
486 read_index(r->index);
487 if (checkout_fast_forward(r, from, to, 1))
488 return -1; /* the callee should have complained already */
490 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
492 transaction = ref_transaction_begin(&err);
493 if (!transaction ||
494 ref_transaction_update(transaction, "HEAD",
495 to, unborn && !is_rebase_i(opts) ?
496 &null_oid : from,
497 0, sb.buf, &err) ||
498 ref_transaction_commit(transaction, &err)) {
499 ref_transaction_free(transaction);
500 error("%s", err.buf);
501 strbuf_release(&sb);
502 strbuf_release(&err);
503 return -1;
506 strbuf_release(&sb);
507 strbuf_release(&err);
508 ref_transaction_free(transaction);
509 update_abort_safety_file();
510 return 0;
513 void append_conflicts_hint(struct index_state *istate,
514 struct strbuf *msgbuf)
516 int i;
518 strbuf_addch(msgbuf, '\n');
519 strbuf_commented_addf(msgbuf, "Conflicts:\n");
520 for (i = 0; i < istate->cache_nr;) {
521 const struct cache_entry *ce = istate->cache[i++];
522 if (ce_stage(ce)) {
523 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
524 while (i < istate->cache_nr &&
525 !strcmp(ce->name, istate->cache[i]->name))
526 i++;
531 static int do_recursive_merge(struct repository *r,
532 struct commit *base, struct commit *next,
533 const char *base_label, const char *next_label,
534 struct object_id *head, struct strbuf *msgbuf,
535 struct replay_opts *opts)
537 struct merge_options o;
538 struct tree *result, *next_tree, *base_tree, *head_tree;
539 int clean;
540 char **xopt;
541 struct lock_file index_lock = LOCK_INIT;
543 if (hold_locked_index(&index_lock, LOCK_REPORT_ON_ERROR) < 0)
544 return -1;
546 read_index(r->index);
548 init_merge_options(&o);
549 o.ancestor = base ? base_label : "(empty tree)";
550 o.branch1 = "HEAD";
551 o.branch2 = next ? next_label : "(empty tree)";
552 if (is_rebase_i(opts))
553 o.buffer_output = 2;
554 o.show_rename_progress = 1;
556 head_tree = parse_tree_indirect(head);
557 next_tree = next ? get_commit_tree(next) : empty_tree(r);
558 base_tree = base ? get_commit_tree(base) : empty_tree(r);
560 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
561 parse_merge_opt(&o, *xopt);
563 clean = merge_trees(&o,
564 head_tree,
565 next_tree, base_tree, &result);
566 if (is_rebase_i(opts) && clean <= 0)
567 fputs(o.obuf.buf, stdout);
568 strbuf_release(&o.obuf);
569 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
570 if (clean < 0) {
571 rollback_lock_file(&index_lock);
572 return clean;
575 if (write_locked_index(r->index, &index_lock,
576 COMMIT_LOCK | SKIP_IF_UNCHANGED))
578 * TRANSLATORS: %s will be "revert", "cherry-pick" or
579 * "rebase -i".
581 return error(_("%s: Unable to write new index file"),
582 _(action_name(opts)));
584 if (!clean)
585 append_conflicts_hint(r->index, msgbuf);
587 return !clean;
590 static struct object_id *get_cache_tree_oid(struct index_state *istate)
592 if (!istate->cache_tree)
593 istate->cache_tree = cache_tree();
595 if (!cache_tree_fully_valid(istate->cache_tree))
596 if (cache_tree_update(istate, 0)) {
597 error(_("unable to update cache tree"));
598 return NULL;
601 return &istate->cache_tree->oid;
604 static int is_index_unchanged(struct repository *r)
606 struct object_id head_oid, *cache_tree_oid;
607 struct commit *head_commit;
608 struct index_state *istate = r->index;
610 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
611 return error(_("could not resolve HEAD commit"));
613 head_commit = lookup_commit(r, &head_oid);
616 * If head_commit is NULL, check_commit, called from
617 * lookup_commit, would have indicated that head_commit is not
618 * a commit object already. parse_commit() will return failure
619 * without further complaints in such a case. Otherwise, if
620 * the commit is invalid, parse_commit() will complain. So
621 * there is nothing for us to say here. Just return failure.
623 if (parse_commit(head_commit))
624 return -1;
626 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
627 return -1;
629 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
632 static int write_author_script(const char *message)
634 struct strbuf buf = STRBUF_INIT;
635 const char *eol;
636 int res;
638 for (;;)
639 if (!*message || starts_with(message, "\n")) {
640 missing_author:
641 /* Missing 'author' line? */
642 unlink(rebase_path_author_script());
643 return 0;
644 } else if (skip_prefix(message, "author ", &message))
645 break;
646 else if ((eol = strchr(message, '\n')))
647 message = eol + 1;
648 else
649 goto missing_author;
651 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
652 while (*message && *message != '\n' && *message != '\r')
653 if (skip_prefix(message, " <", &message))
654 break;
655 else if (*message != '\'')
656 strbuf_addch(&buf, *(message++));
657 else
658 strbuf_addf(&buf, "'\\%c'", *(message++));
659 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
660 while (*message && *message != '\n' && *message != '\r')
661 if (skip_prefix(message, "> ", &message))
662 break;
663 else if (*message != '\'')
664 strbuf_addch(&buf, *(message++));
665 else
666 strbuf_addf(&buf, "'\\%c'", *(message++));
667 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
668 while (*message && *message != '\n' && *message != '\r')
669 if (*message != '\'')
670 strbuf_addch(&buf, *(message++));
671 else
672 strbuf_addf(&buf, "'\\%c'", *(message++));
673 strbuf_addch(&buf, '\'');
674 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
675 strbuf_release(&buf);
676 return res;
680 * Take a series of KEY='VALUE' lines where VALUE part is
681 * sq-quoted, and append <KEY, VALUE> at the end of the string list
683 static int parse_key_value_squoted(char *buf, struct string_list *list)
685 while (*buf) {
686 struct string_list_item *item;
687 char *np;
688 char *cp = strchr(buf, '=');
689 if (!cp) {
690 np = strchrnul(buf, '\n');
691 return error(_("no key present in '%.*s'"),
692 (int) (np - buf), buf);
694 np = strchrnul(cp, '\n');
695 *cp++ = '\0';
696 item = string_list_append(list, buf);
698 buf = np + (*np == '\n');
699 *np = '\0';
700 cp = sq_dequote(cp);
701 if (!cp)
702 return error(_("unable to dequote value of '%s'"),
703 item->string);
704 item->util = xstrdup(cp);
706 return 0;
710 * Reads and parses the state directory's "author-script" file, and sets name,
711 * email and date accordingly.
712 * Returns 0 on success, -1 if the file could not be parsed.
714 * The author script is of the format:
716 * GIT_AUTHOR_NAME='$author_name'
717 * GIT_AUTHOR_EMAIL='$author_email'
718 * GIT_AUTHOR_DATE='$author_date'
720 * where $author_name, $author_email and $author_date are quoted. We are strict
721 * with our parsing, as the file was meant to be eval'd in the old
722 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
723 * from what this function expects, it is better to bail out than to do
724 * something that the user does not expect.
726 int read_author_script(const char *path, char **name, char **email, char **date,
727 int allow_missing)
729 struct strbuf buf = STRBUF_INIT;
730 struct string_list kv = STRING_LIST_INIT_DUP;
731 int retval = -1; /* assume failure */
732 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
734 if (strbuf_read_file(&buf, path, 256) <= 0) {
735 strbuf_release(&buf);
736 if (errno == ENOENT && allow_missing)
737 return 0;
738 else
739 return error_errno(_("could not open '%s' for reading"),
740 path);
743 if (parse_key_value_squoted(buf.buf, &kv))
744 goto finish;
746 for (i = 0; i < kv.nr; i++) {
747 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
748 if (name_i != -2)
749 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
750 else
751 name_i = i;
752 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
753 if (email_i != -2)
754 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
755 else
756 email_i = i;
757 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
758 if (date_i != -2)
759 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
760 else
761 date_i = i;
762 } else {
763 err = error(_("unknown variable '%s'"),
764 kv.items[i].string);
767 if (name_i == -2)
768 error(_("missing 'GIT_AUTHOR_NAME'"));
769 if (email_i == -2)
770 error(_("missing 'GIT_AUTHOR_EMAIL'"));
771 if (date_i == -2)
772 error(_("missing 'GIT_AUTHOR_DATE'"));
773 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
774 goto finish;
775 *name = kv.items[name_i].util;
776 *email = kv.items[email_i].util;
777 *date = kv.items[date_i].util;
778 retval = 0;
779 finish:
780 string_list_clear(&kv, !!retval);
781 strbuf_release(&buf);
782 return retval;
786 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
787 * file with shell quoting into struct argv_array. Returns -1 on
788 * error, 0 otherwise.
790 static int read_env_script(struct argv_array *env)
792 char *name, *email, *date;
794 if (read_author_script(rebase_path_author_script(),
795 &name, &email, &date, 0))
796 return -1;
798 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
799 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
800 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
801 free(name);
802 free(email);
803 free(date);
805 return 0;
808 static char *get_author(const char *message)
810 size_t len;
811 const char *a;
813 a = find_commit_header(message, "author", &len);
814 if (a)
815 return xmemdupz(a, len);
817 return NULL;
820 /* Read author-script and return an ident line (author <email> timestamp) */
821 static const char *read_author_ident(struct strbuf *buf)
823 struct strbuf out = STRBUF_INIT;
824 char *name, *email, *date;
826 if (read_author_script(rebase_path_author_script(),
827 &name, &email, &date, 0))
828 return NULL;
830 /* validate date since fmt_ident() will die() on bad value */
831 if (parse_date(date, &out)){
832 warning(_("invalid date format '%s' in '%s'"),
833 date, rebase_path_author_script());
834 strbuf_release(&out);
835 return NULL;
838 strbuf_reset(&out);
839 strbuf_addstr(&out, fmt_ident(name, email, date, 0));
840 strbuf_swap(buf, &out);
841 strbuf_release(&out);
842 free(name);
843 free(email);
844 free(date);
845 return buf->buf;
848 static const char staged_changes_advice[] =
849 N_("you have staged changes in your working tree\n"
850 "If these changes are meant to be squashed into the previous commit, run:\n"
851 "\n"
852 " git commit --amend %s\n"
853 "\n"
854 "If they are meant to go into a new commit, run:\n"
855 "\n"
856 " git commit %s\n"
857 "\n"
858 "In both cases, once you're done, continue with:\n"
859 "\n"
860 " git rebase --continue\n");
862 #define ALLOW_EMPTY (1<<0)
863 #define EDIT_MSG (1<<1)
864 #define AMEND_MSG (1<<2)
865 #define CLEANUP_MSG (1<<3)
866 #define VERIFY_MSG (1<<4)
867 #define CREATE_ROOT_COMMIT (1<<5)
869 static int run_command_silent_on_success(struct child_process *cmd)
871 struct strbuf buf = STRBUF_INIT;
872 int rc;
874 cmd->stdout_to_stderr = 1;
875 rc = pipe_command(cmd,
876 NULL, 0,
877 NULL, 0,
878 &buf, 0);
880 if (rc)
881 fputs(buf.buf, stderr);
882 strbuf_release(&buf);
883 return rc;
887 * If we are cherry-pick, and if the merge did not result in
888 * hand-editing, we will hit this commit and inherit the original
889 * author date and name.
891 * If we are revert, or if our cherry-pick results in a hand merge,
892 * we had better say that the current user is responsible for that.
894 * An exception is when run_git_commit() is called during an
895 * interactive rebase: in that case, we will want to retain the
896 * author metadata.
898 static int run_git_commit(struct repository *r,
899 const char *defmsg,
900 struct replay_opts *opts,
901 unsigned int flags)
903 struct child_process cmd = CHILD_PROCESS_INIT;
904 const char *value;
906 if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
907 struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
908 const char *author = NULL;
909 struct object_id root_commit, *cache_tree_oid;
910 int res = 0;
912 if (is_rebase_i(opts)) {
913 author = read_author_ident(&script);
914 if (!author) {
915 strbuf_release(&script);
916 return -1;
920 if (!defmsg)
921 BUG("root commit without message");
923 if (!(cache_tree_oid = get_cache_tree_oid(r->index)))
924 res = -1;
926 if (!res)
927 res = strbuf_read_file(&msg, defmsg, 0);
929 if (res <= 0)
930 res = error_errno(_("could not read '%s'"), defmsg);
931 else
932 res = commit_tree(msg.buf, msg.len, cache_tree_oid,
933 NULL, &root_commit, author,
934 opts->gpg_sign);
936 strbuf_release(&msg);
937 strbuf_release(&script);
938 if (!res) {
939 update_ref(NULL, "CHERRY_PICK_HEAD", &root_commit, NULL,
940 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR);
941 res = update_ref(NULL, "HEAD", &root_commit, NULL, 0,
942 UPDATE_REFS_MSG_ON_ERR);
944 return res < 0 ? error(_("writing root commit")) : 0;
947 cmd.git_cmd = 1;
949 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
950 const char *gpg_opt = gpg_sign_opt_quoted(opts);
952 return error(_(staged_changes_advice),
953 gpg_opt, gpg_opt);
956 argv_array_push(&cmd.args, "commit");
958 if (!(flags & VERIFY_MSG))
959 argv_array_push(&cmd.args, "-n");
960 if ((flags & AMEND_MSG))
961 argv_array_push(&cmd.args, "--amend");
962 if (opts->gpg_sign)
963 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
964 if (defmsg)
965 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
966 else if (!(flags & EDIT_MSG))
967 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
968 if ((flags & CLEANUP_MSG))
969 argv_array_push(&cmd.args, "--cleanup=strip");
970 if ((flags & EDIT_MSG))
971 argv_array_push(&cmd.args, "-e");
972 else if (!(flags & CLEANUP_MSG) &&
973 !opts->signoff && !opts->record_origin &&
974 git_config_get_value("commit.cleanup", &value))
975 argv_array_push(&cmd.args, "--cleanup=verbatim");
977 if ((flags & ALLOW_EMPTY))
978 argv_array_push(&cmd.args, "--allow-empty");
980 if (!(flags & EDIT_MSG))
981 argv_array_push(&cmd.args, "--allow-empty-message");
983 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
984 return run_command_silent_on_success(&cmd);
985 else
986 return run_command(&cmd);
989 static int rest_is_empty(const struct strbuf *sb, int start)
991 int i, eol;
992 const char *nl;
994 /* Check if the rest is just whitespace and Signed-off-by's. */
995 for (i = start; i < sb->len; i++) {
996 nl = memchr(sb->buf + i, '\n', sb->len - i);
997 if (nl)
998 eol = nl - sb->buf;
999 else
1000 eol = sb->len;
1002 if (strlen(sign_off_header) <= eol - i &&
1003 starts_with(sb->buf + i, sign_off_header)) {
1004 i = eol;
1005 continue;
1007 while (i < eol)
1008 if (!isspace(sb->buf[i++]))
1009 return 0;
1012 return 1;
1016 * Find out if the message in the strbuf contains only whitespace and
1017 * Signed-off-by lines.
1019 int message_is_empty(const struct strbuf *sb,
1020 enum commit_msg_cleanup_mode cleanup_mode)
1022 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1023 return 0;
1024 return rest_is_empty(sb, 0);
1028 * See if the user edited the message in the editor or left what
1029 * was in the template intact
1031 int template_untouched(const struct strbuf *sb, const char *template_file,
1032 enum commit_msg_cleanup_mode cleanup_mode)
1034 struct strbuf tmpl = STRBUF_INIT;
1035 const char *start;
1037 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1038 return 0;
1040 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1041 return 0;
1043 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1044 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1045 start = sb->buf;
1046 strbuf_release(&tmpl);
1047 return rest_is_empty(sb, start - sb->buf);
1050 int update_head_with_reflog(const struct commit *old_head,
1051 const struct object_id *new_head,
1052 const char *action, const struct strbuf *msg,
1053 struct strbuf *err)
1055 struct ref_transaction *transaction;
1056 struct strbuf sb = STRBUF_INIT;
1057 const char *nl;
1058 int ret = 0;
1060 if (action) {
1061 strbuf_addstr(&sb, action);
1062 strbuf_addstr(&sb, ": ");
1065 nl = strchr(msg->buf, '\n');
1066 if (nl) {
1067 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1068 } else {
1069 strbuf_addbuf(&sb, msg);
1070 strbuf_addch(&sb, '\n');
1073 transaction = ref_transaction_begin(err);
1074 if (!transaction ||
1075 ref_transaction_update(transaction, "HEAD", new_head,
1076 old_head ? &old_head->object.oid : &null_oid,
1077 0, sb.buf, err) ||
1078 ref_transaction_commit(transaction, err)) {
1079 ret = -1;
1081 ref_transaction_free(transaction);
1082 strbuf_release(&sb);
1084 return ret;
1087 static int run_rewrite_hook(const struct object_id *oldoid,
1088 const struct object_id *newoid)
1090 struct child_process proc = CHILD_PROCESS_INIT;
1091 const char *argv[3];
1092 int code;
1093 struct strbuf sb = STRBUF_INIT;
1095 argv[0] = find_hook("post-rewrite");
1096 if (!argv[0])
1097 return 0;
1099 argv[1] = "amend";
1100 argv[2] = NULL;
1102 proc.argv = argv;
1103 proc.in = -1;
1104 proc.stdout_to_stderr = 1;
1106 code = start_command(&proc);
1107 if (code)
1108 return code;
1109 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1110 sigchain_push(SIGPIPE, SIG_IGN);
1111 write_in_full(proc.in, sb.buf, sb.len);
1112 close(proc.in);
1113 strbuf_release(&sb);
1114 sigchain_pop(SIGPIPE);
1115 return finish_command(&proc);
1118 void commit_post_rewrite(const struct commit *old_head,
1119 const struct object_id *new_head)
1121 struct notes_rewrite_cfg *cfg;
1123 cfg = init_copy_notes_for_rewrite("amend");
1124 if (cfg) {
1125 /* we are amending, so old_head is not NULL */
1126 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1127 finish_copy_notes_for_rewrite(cfg, "Notes added by 'git commit --amend'");
1129 run_rewrite_hook(&old_head->object.oid, new_head);
1132 static int run_prepare_commit_msg_hook(struct repository *r,
1133 struct strbuf *msg,
1134 const char *commit)
1136 struct argv_array hook_env = ARGV_ARRAY_INIT;
1137 int ret;
1138 const char *name;
1140 name = git_path_commit_editmsg();
1141 if (write_message(msg->buf, msg->len, name, 0))
1142 return -1;
1144 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", r->index_file);
1145 argv_array_push(&hook_env, "GIT_EDITOR=:");
1146 if (commit)
1147 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1148 "commit", commit, NULL);
1149 else
1150 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1151 "message", NULL);
1152 if (ret)
1153 ret = error(_("'prepare-commit-msg' hook failed"));
1154 argv_array_clear(&hook_env);
1156 return ret;
1159 static const char implicit_ident_advice_noconfig[] =
1160 N_("Your name and email address were configured automatically based\n"
1161 "on your username and hostname. Please check that they are accurate.\n"
1162 "You can suppress this message by setting them explicitly. Run the\n"
1163 "following command and follow the instructions in your editor to edit\n"
1164 "your configuration file:\n"
1165 "\n"
1166 " git config --global --edit\n"
1167 "\n"
1168 "After doing this, you may fix the identity used for this commit with:\n"
1169 "\n"
1170 " git commit --amend --reset-author\n");
1172 static const char implicit_ident_advice_config[] =
1173 N_("Your name and email address were configured automatically based\n"
1174 "on your username and hostname. Please check that they are accurate.\n"
1175 "You can suppress this message by setting them explicitly:\n"
1176 "\n"
1177 " git config --global user.name \"Your Name\"\n"
1178 " git config --global user.email you@example.com\n"
1179 "\n"
1180 "After doing this, you may fix the identity used for this commit with:\n"
1181 "\n"
1182 " git commit --amend --reset-author\n");
1184 static const char *implicit_ident_advice(void)
1186 char *user_config = expand_user_path("~/.gitconfig", 0);
1187 char *xdg_config = xdg_config_home("config");
1188 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1190 free(user_config);
1191 free(xdg_config);
1193 if (config_exists)
1194 return _(implicit_ident_advice_config);
1195 else
1196 return _(implicit_ident_advice_noconfig);
1200 void print_commit_summary(struct repository *r,
1201 const char *prefix,
1202 const struct object_id *oid,
1203 unsigned int flags)
1205 struct rev_info rev;
1206 struct commit *commit;
1207 struct strbuf format = STRBUF_INIT;
1208 const char *head;
1209 struct pretty_print_context pctx = {0};
1210 struct strbuf author_ident = STRBUF_INIT;
1211 struct strbuf committer_ident = STRBUF_INIT;
1213 commit = lookup_commit(r, oid);
1214 if (!commit)
1215 die(_("couldn't look up newly created commit"));
1216 if (parse_commit(commit))
1217 die(_("could not parse newly created commit"));
1219 strbuf_addstr(&format, "format:%h] %s");
1221 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1222 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1223 if (strbuf_cmp(&author_ident, &committer_ident)) {
1224 strbuf_addstr(&format, "\n Author: ");
1225 strbuf_addbuf_percentquote(&format, &author_ident);
1227 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1228 struct strbuf date = STRBUF_INIT;
1230 format_commit_message(commit, "%ad", &date, &pctx);
1231 strbuf_addstr(&format, "\n Date: ");
1232 strbuf_addbuf_percentquote(&format, &date);
1233 strbuf_release(&date);
1235 if (!committer_ident_sufficiently_given()) {
1236 strbuf_addstr(&format, "\n Committer: ");
1237 strbuf_addbuf_percentquote(&format, &committer_ident);
1238 if (advice_implicit_identity) {
1239 strbuf_addch(&format, '\n');
1240 strbuf_addstr(&format, implicit_ident_advice());
1243 strbuf_release(&author_ident);
1244 strbuf_release(&committer_ident);
1246 repo_init_revisions(r, &rev, prefix);
1247 setup_revisions(0, NULL, &rev, NULL);
1249 rev.diff = 1;
1250 rev.diffopt.output_format =
1251 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1253 rev.verbose_header = 1;
1254 rev.show_root_diff = 1;
1255 get_commit_format(format.buf, &rev);
1256 rev.always_show_header = 0;
1257 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
1258 rev.diffopt.break_opt = 0;
1259 diff_setup_done(&rev.diffopt);
1261 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1262 if (!head)
1263 die_errno(_("unable to resolve HEAD after creating commit"));
1264 if (!strcmp(head, "HEAD"))
1265 head = _("detached HEAD");
1266 else
1267 skip_prefix(head, "refs/heads/", &head);
1268 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1269 _(" (root-commit)") : "");
1271 if (!log_tree_commit(&rev, commit)) {
1272 rev.always_show_header = 1;
1273 rev.use_terminator = 1;
1274 log_tree_commit(&rev, commit);
1277 strbuf_release(&format);
1280 static int parse_head(struct repository *r, struct commit **head)
1282 struct commit *current_head;
1283 struct object_id oid;
1285 if (get_oid("HEAD", &oid)) {
1286 current_head = NULL;
1287 } else {
1288 current_head = lookup_commit_reference(r, &oid);
1289 if (!current_head)
1290 return error(_("could not parse HEAD"));
1291 if (!oideq(&oid, &current_head->object.oid)) {
1292 warning(_("HEAD %s is not a commit!"),
1293 oid_to_hex(&oid));
1295 if (parse_commit(current_head))
1296 return error(_("could not parse HEAD commit"));
1298 *head = current_head;
1300 return 0;
1304 * Try to commit without forking 'git commit'. In some cases we need
1305 * to run 'git commit' to display an error message
1307 * Returns:
1308 * -1 - error unable to commit
1309 * 0 - success
1310 * 1 - run 'git commit'
1312 static int try_to_commit(struct repository *r,
1313 struct strbuf *msg, const char *author,
1314 struct replay_opts *opts, unsigned int flags,
1315 struct object_id *oid)
1317 struct object_id tree;
1318 struct commit *current_head;
1319 struct commit_list *parents = NULL;
1320 struct commit_extra_header *extra = NULL;
1321 struct strbuf err = STRBUF_INIT;
1322 struct strbuf commit_msg = STRBUF_INIT;
1323 char *amend_author = NULL;
1324 const char *hook_commit = NULL;
1325 enum commit_msg_cleanup_mode cleanup;
1326 int res = 0;
1328 if (parse_head(r, &current_head))
1329 return -1;
1331 if (flags & AMEND_MSG) {
1332 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1333 const char *out_enc = get_commit_output_encoding();
1334 const char *message = logmsg_reencode(current_head, NULL,
1335 out_enc);
1337 if (!msg) {
1338 const char *orig_message = NULL;
1340 find_commit_subject(message, &orig_message);
1341 msg = &commit_msg;
1342 strbuf_addstr(msg, orig_message);
1343 hook_commit = "HEAD";
1345 author = amend_author = get_author(message);
1346 unuse_commit_buffer(current_head, message);
1347 if (!author) {
1348 res = error(_("unable to parse commit author"));
1349 goto out;
1351 parents = copy_commit_list(current_head->parents);
1352 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1353 } else if (current_head) {
1354 commit_list_insert(current_head, &parents);
1357 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
1358 res = error(_("git write-tree failed to write a tree"));
1359 goto out;
1362 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1363 get_commit_tree_oid(current_head) :
1364 the_hash_algo->empty_tree, &tree)) {
1365 res = 1; /* run 'git commit' to display error message */
1366 goto out;
1369 if (find_hook("prepare-commit-msg")) {
1370 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
1371 if (res)
1372 goto out;
1373 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1374 2048) < 0) {
1375 res = error_errno(_("unable to read commit message "
1376 "from '%s'"),
1377 git_path_commit_editmsg());
1378 goto out;
1380 msg = &commit_msg;
1383 cleanup = (flags & CLEANUP_MSG) ? COMMIT_MSG_CLEANUP_ALL :
1384 opts->default_msg_cleanup;
1386 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1387 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
1388 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
1389 res = 1; /* run 'git commit' to display error message */
1390 goto out;
1393 reset_ident_date();
1395 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1396 oid, author, opts->gpg_sign, extra)) {
1397 res = error(_("failed to write commit object"));
1398 goto out;
1401 if (update_head_with_reflog(current_head, oid,
1402 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1403 res = error("%s", err.buf);
1404 goto out;
1407 if (flags & AMEND_MSG)
1408 commit_post_rewrite(current_head, oid);
1410 out:
1411 free_commit_extra_headers(extra);
1412 strbuf_release(&err);
1413 strbuf_release(&commit_msg);
1414 free(amend_author);
1416 return res;
1419 static int do_commit(struct repository *r,
1420 const char *msg_file, const char *author,
1421 struct replay_opts *opts, unsigned int flags)
1423 int res = 1;
1425 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG) &&
1426 !(flags & CREATE_ROOT_COMMIT)) {
1427 struct object_id oid;
1428 struct strbuf sb = STRBUF_INIT;
1430 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1431 return error_errno(_("unable to read commit message "
1432 "from '%s'"),
1433 msg_file);
1435 res = try_to_commit(r, msg_file ? &sb : NULL,
1436 author, opts, flags, &oid);
1437 strbuf_release(&sb);
1438 if (!res) {
1439 unlink(git_path_cherry_pick_head(r));
1440 unlink(git_path_merge_msg(r));
1441 if (!is_rebase_i(opts))
1442 print_commit_summary(r, NULL, &oid,
1443 SUMMARY_SHOW_AUTHOR_DATE);
1444 return res;
1447 if (res == 1)
1448 return run_git_commit(r, msg_file, opts, flags);
1450 return res;
1453 static int is_original_commit_empty(struct commit *commit)
1455 const struct object_id *ptree_oid;
1457 if (parse_commit(commit))
1458 return error(_("could not parse commit %s"),
1459 oid_to_hex(&commit->object.oid));
1460 if (commit->parents) {
1461 struct commit *parent = commit->parents->item;
1462 if (parse_commit(parent))
1463 return error(_("could not parse parent commit %s"),
1464 oid_to_hex(&parent->object.oid));
1465 ptree_oid = get_commit_tree_oid(parent);
1466 } else {
1467 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
1470 return oideq(ptree_oid, get_commit_tree_oid(commit));
1474 * Do we run "git commit" with "--allow-empty"?
1476 static int allow_empty(struct repository *r,
1477 struct replay_opts *opts,
1478 struct commit *commit)
1480 int index_unchanged, empty_commit;
1483 * Three cases:
1485 * (1) we do not allow empty at all and error out.
1487 * (2) we allow ones that were initially empty, but
1488 * forbid the ones that become empty;
1490 * (3) we allow both.
1492 if (!opts->allow_empty)
1493 return 0; /* let "git commit" barf as necessary */
1495 index_unchanged = is_index_unchanged(r);
1496 if (index_unchanged < 0)
1497 return index_unchanged;
1498 if (!index_unchanged)
1499 return 0; /* we do not have to say --allow-empty */
1501 if (opts->keep_redundant_commits)
1502 return 1;
1504 empty_commit = is_original_commit_empty(commit);
1505 if (empty_commit < 0)
1506 return empty_commit;
1507 if (!empty_commit)
1508 return 0;
1509 else
1510 return 1;
1514 * Note that ordering matters in this enum. Not only must it match the mapping
1515 * below, it is also divided into several sections that matter. When adding
1516 * new commands, make sure you add it in the right section.
1518 enum todo_command {
1519 /* commands that handle commits */
1520 TODO_PICK = 0,
1521 TODO_REVERT,
1522 TODO_EDIT,
1523 TODO_REWORD,
1524 TODO_FIXUP,
1525 TODO_SQUASH,
1526 /* commands that do something else than handling a single commit */
1527 TODO_EXEC,
1528 TODO_BREAK,
1529 TODO_LABEL,
1530 TODO_RESET,
1531 TODO_MERGE,
1532 /* commands that do nothing but are counted for reporting progress */
1533 TODO_NOOP,
1534 TODO_DROP,
1535 /* comments (not counted for reporting progress) */
1536 TODO_COMMENT
1539 static struct {
1540 char c;
1541 const char *str;
1542 } todo_command_info[] = {
1543 { 'p', "pick" },
1544 { 0, "revert" },
1545 { 'e', "edit" },
1546 { 'r', "reword" },
1547 { 'f', "fixup" },
1548 { 's', "squash" },
1549 { 'x', "exec" },
1550 { 'b', "break" },
1551 { 'l', "label" },
1552 { 't', "reset" },
1553 { 'm', "merge" },
1554 { 0, "noop" },
1555 { 'd', "drop" },
1556 { 0, NULL }
1559 static const char *command_to_string(const enum todo_command command)
1561 if (command < TODO_COMMENT)
1562 return todo_command_info[command].str;
1563 die(_("unknown command: %d"), command);
1566 static char command_to_char(const enum todo_command command)
1568 if (command < TODO_COMMENT && todo_command_info[command].c)
1569 return todo_command_info[command].c;
1570 return comment_line_char;
1573 static int is_noop(const enum todo_command command)
1575 return TODO_NOOP <= command;
1578 static int is_fixup(enum todo_command command)
1580 return command == TODO_FIXUP || command == TODO_SQUASH;
1583 /* Does this command create a (non-merge) commit? */
1584 static int is_pick_or_similar(enum todo_command command)
1586 switch (command) {
1587 case TODO_PICK:
1588 case TODO_REVERT:
1589 case TODO_EDIT:
1590 case TODO_REWORD:
1591 case TODO_FIXUP:
1592 case TODO_SQUASH:
1593 return 1;
1594 default:
1595 return 0;
1599 static int update_squash_messages(struct repository *r,
1600 enum todo_command command,
1601 struct commit *commit,
1602 struct replay_opts *opts)
1604 struct strbuf buf = STRBUF_INIT;
1605 int res;
1606 const char *message, *body;
1608 if (opts->current_fixup_count > 0) {
1609 struct strbuf header = STRBUF_INIT;
1610 char *eol;
1612 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
1613 return error(_("could not read '%s'"),
1614 rebase_path_squash_msg());
1616 eol = buf.buf[0] != comment_line_char ?
1617 buf.buf : strchrnul(buf.buf, '\n');
1619 strbuf_addf(&header, "%c ", comment_line_char);
1620 strbuf_addf(&header, _("This is a combination of %d commits."),
1621 opts->current_fixup_count + 2);
1622 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1623 strbuf_release(&header);
1624 } else {
1625 struct object_id head;
1626 struct commit *head_commit;
1627 const char *head_message, *body;
1629 if (get_oid("HEAD", &head))
1630 return error(_("need a HEAD to fixup"));
1631 if (!(head_commit = lookup_commit_reference(r, &head)))
1632 return error(_("could not read HEAD"));
1633 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1634 return error(_("could not read HEAD's commit message"));
1636 find_commit_subject(head_message, &body);
1637 if (write_message(body, strlen(body),
1638 rebase_path_fixup_msg(), 0)) {
1639 unuse_commit_buffer(head_commit, head_message);
1640 return error(_("cannot write '%s'"),
1641 rebase_path_fixup_msg());
1644 strbuf_addf(&buf, "%c ", comment_line_char);
1645 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
1646 strbuf_addf(&buf, "\n%c ", comment_line_char);
1647 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1648 strbuf_addstr(&buf, "\n\n");
1649 strbuf_addstr(&buf, body);
1651 unuse_commit_buffer(head_commit, head_message);
1654 if (!(message = get_commit_buffer(commit, NULL)))
1655 return error(_("could not read commit message of %s"),
1656 oid_to_hex(&commit->object.oid));
1657 find_commit_subject(message, &body);
1659 if (command == TODO_SQUASH) {
1660 unlink(rebase_path_fixup_msg());
1661 strbuf_addf(&buf, "\n%c ", comment_line_char);
1662 strbuf_addf(&buf, _("This is the commit message #%d:"),
1663 ++opts->current_fixup_count + 1);
1664 strbuf_addstr(&buf, "\n\n");
1665 strbuf_addstr(&buf, body);
1666 } else if (command == TODO_FIXUP) {
1667 strbuf_addf(&buf, "\n%c ", comment_line_char);
1668 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
1669 ++opts->current_fixup_count + 1);
1670 strbuf_addstr(&buf, "\n\n");
1671 strbuf_add_commented_lines(&buf, body, strlen(body));
1672 } else
1673 return error(_("unknown command: %d"), command);
1674 unuse_commit_buffer(commit, message);
1676 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1677 strbuf_release(&buf);
1679 if (!res) {
1680 strbuf_addf(&opts->current_fixups, "%s%s %s",
1681 opts->current_fixups.len ? "\n" : "",
1682 command_to_string(command),
1683 oid_to_hex(&commit->object.oid));
1684 res = write_message(opts->current_fixups.buf,
1685 opts->current_fixups.len,
1686 rebase_path_current_fixups(), 0);
1689 return res;
1692 static void flush_rewritten_pending(void)
1694 struct strbuf buf = STRBUF_INIT;
1695 struct object_id newoid;
1696 FILE *out;
1698 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1699 !get_oid("HEAD", &newoid) &&
1700 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1701 char *bol = buf.buf, *eol;
1703 while (*bol) {
1704 eol = strchrnul(bol, '\n');
1705 fprintf(out, "%.*s %s\n", (int)(eol - bol),
1706 bol, oid_to_hex(&newoid));
1707 if (!*eol)
1708 break;
1709 bol = eol + 1;
1711 fclose(out);
1712 unlink(rebase_path_rewritten_pending());
1714 strbuf_release(&buf);
1717 static void record_in_rewritten(struct object_id *oid,
1718 enum todo_command next_command)
1720 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
1722 if (!out)
1723 return;
1725 fprintf(out, "%s\n", oid_to_hex(oid));
1726 fclose(out);
1728 if (!is_fixup(next_command))
1729 flush_rewritten_pending();
1732 static int do_pick_commit(struct repository *r,
1733 enum todo_command command,
1734 struct commit *commit,
1735 struct replay_opts *opts,
1736 int final_fixup)
1738 unsigned int flags = opts->edit ? EDIT_MSG : 0;
1739 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
1740 struct object_id head;
1741 struct commit *base, *next, *parent;
1742 const char *base_label, *next_label;
1743 char *author = NULL;
1744 struct commit_message msg = { NULL, NULL, NULL, NULL };
1745 struct strbuf msgbuf = STRBUF_INIT;
1746 int res, unborn = 0, allow;
1748 if (opts->no_commit) {
1750 * We do not intend to commit immediately. We just want to
1751 * merge the differences in, so let's compute the tree
1752 * that represents the "current" state for merge-recursive
1753 * to work on.
1755 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
1756 return error(_("your index file is unmerged."));
1757 } else {
1758 unborn = get_oid("HEAD", &head);
1759 /* Do we want to generate a root commit? */
1760 if (is_pick_or_similar(command) && opts->have_squash_onto &&
1761 oideq(&head, &opts->squash_onto)) {
1762 if (is_fixup(command))
1763 return error(_("cannot fixup root commit"));
1764 flags |= CREATE_ROOT_COMMIT;
1765 unborn = 1;
1766 } else if (unborn)
1767 oidcpy(&head, the_hash_algo->empty_tree);
1768 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
1769 NULL, 0))
1770 return error_dirty_index(r->index, opts);
1772 discard_index(r->index);
1774 if (!commit->parents)
1775 parent = NULL;
1776 else if (commit->parents->next) {
1777 /* Reverting or cherry-picking a merge commit */
1778 int cnt;
1779 struct commit_list *p;
1781 if (!opts->mainline)
1782 return error(_("commit %s is a merge but no -m option was given."),
1783 oid_to_hex(&commit->object.oid));
1785 for (cnt = 1, p = commit->parents;
1786 cnt != opts->mainline && p;
1787 cnt++)
1788 p = p->next;
1789 if (cnt != opts->mainline || !p)
1790 return error(_("commit %s does not have parent %d"),
1791 oid_to_hex(&commit->object.oid), opts->mainline);
1792 parent = p->item;
1793 } else if (0 < opts->mainline)
1794 return error(_("mainline was specified but commit %s is not a merge."),
1795 oid_to_hex(&commit->object.oid));
1796 else
1797 parent = commit->parents->item;
1799 if (get_message(commit, &msg) != 0)
1800 return error(_("cannot get commit message for %s"),
1801 oid_to_hex(&commit->object.oid));
1803 if (opts->allow_ff && !is_fixup(command) &&
1804 ((parent && oideq(&parent->object.oid, &head)) ||
1805 (!parent && unborn))) {
1806 if (is_rebase_i(opts))
1807 write_author_script(msg.message);
1808 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
1809 opts);
1810 if (res || command != TODO_REWORD)
1811 goto leave;
1812 flags |= EDIT_MSG | AMEND_MSG | VERIFY_MSG;
1813 msg_file = NULL;
1814 goto fast_forward_edit;
1816 if (parent && parse_commit(parent) < 0)
1817 /* TRANSLATORS: The first %s will be a "todo" command like
1818 "revert" or "pick", the second %s a SHA1. */
1819 return error(_("%s: cannot parse parent commit %s"),
1820 command_to_string(command),
1821 oid_to_hex(&parent->object.oid));
1824 * "commit" is an existing commit. We would want to apply
1825 * the difference it introduces since its first parent "prev"
1826 * on top of the current HEAD if we are cherry-pick. Or the
1827 * reverse of it if we are revert.
1830 if (command == TODO_REVERT) {
1831 base = commit;
1832 base_label = msg.label;
1833 next = parent;
1834 next_label = msg.parent_label;
1835 strbuf_addstr(&msgbuf, "Revert \"");
1836 strbuf_addstr(&msgbuf, msg.subject);
1837 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
1838 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1840 if (commit->parents && commit->parents->next) {
1841 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
1842 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
1844 strbuf_addstr(&msgbuf, ".\n");
1845 } else {
1846 const char *p;
1848 base = parent;
1849 base_label = msg.parent_label;
1850 next = commit;
1851 next_label = msg.label;
1853 /* Append the commit log message to msgbuf. */
1854 if (find_commit_subject(msg.message, &p))
1855 strbuf_addstr(&msgbuf, p);
1857 if (opts->record_origin) {
1858 strbuf_complete_line(&msgbuf);
1859 if (!has_conforming_footer(&msgbuf, NULL, 0))
1860 strbuf_addch(&msgbuf, '\n');
1861 strbuf_addstr(&msgbuf, cherry_picked_prefix);
1862 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
1863 strbuf_addstr(&msgbuf, ")\n");
1865 if (!is_fixup(command))
1866 author = get_author(msg.message);
1869 if (command == TODO_REWORD)
1870 flags |= EDIT_MSG | VERIFY_MSG;
1871 else if (is_fixup(command)) {
1872 if (update_squash_messages(r, command, commit, opts))
1873 return -1;
1874 flags |= AMEND_MSG;
1875 if (!final_fixup)
1876 msg_file = rebase_path_squash_msg();
1877 else if (file_exists(rebase_path_fixup_msg())) {
1878 flags |= CLEANUP_MSG;
1879 msg_file = rebase_path_fixup_msg();
1880 } else {
1881 const char *dest = git_path_squash_msg(r);
1882 unlink(dest);
1883 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1884 return error(_("could not rename '%s' to '%s'"),
1885 rebase_path_squash_msg(), dest);
1886 unlink(git_path_merge_msg(r));
1887 msg_file = dest;
1888 flags |= EDIT_MSG;
1892 if (opts->signoff && !is_fixup(command))
1893 append_signoff(&msgbuf, 0, 0);
1895 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1896 res = -1;
1897 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
1898 res = do_recursive_merge(r, base, next, base_label, next_label,
1899 &head, &msgbuf, opts);
1900 if (res < 0)
1901 goto leave;
1903 res |= write_message(msgbuf.buf, msgbuf.len,
1904 git_path_merge_msg(r), 0);
1905 } else {
1906 struct commit_list *common = NULL;
1907 struct commit_list *remotes = NULL;
1909 res = write_message(msgbuf.buf, msgbuf.len,
1910 git_path_merge_msg(r), 0);
1912 commit_list_insert(base, &common);
1913 commit_list_insert(next, &remotes);
1914 res |= try_merge_command(r, opts->strategy,
1915 opts->xopts_nr, (const char **)opts->xopts,
1916 common, oid_to_hex(&head), remotes);
1917 free_commit_list(common);
1918 free_commit_list(remotes);
1920 strbuf_release(&msgbuf);
1923 * If the merge was clean or if it failed due to conflict, we write
1924 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1925 * However, if the merge did not even start, then we don't want to
1926 * write it at all.
1928 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
1929 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
1930 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1931 res = -1;
1932 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
1933 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
1934 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
1935 res = -1;
1937 if (res) {
1938 error(command == TODO_REVERT
1939 ? _("could not revert %s... %s")
1940 : _("could not apply %s... %s"),
1941 short_commit_name(commit), msg.subject);
1942 print_advice(r, res == 1, opts);
1943 repo_rerere(r, opts->allow_rerere_auto);
1944 goto leave;
1947 allow = allow_empty(r, opts, commit);
1948 if (allow < 0) {
1949 res = allow;
1950 goto leave;
1951 } else if (allow)
1952 flags |= ALLOW_EMPTY;
1953 if (!opts->no_commit) {
1954 fast_forward_edit:
1955 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
1956 res = do_commit(r, msg_file, author, opts, flags);
1957 else
1958 res = error(_("unable to parse commit author"));
1961 if (!res && final_fixup) {
1962 unlink(rebase_path_fixup_msg());
1963 unlink(rebase_path_squash_msg());
1964 unlink(rebase_path_current_fixups());
1965 strbuf_reset(&opts->current_fixups);
1966 opts->current_fixup_count = 0;
1969 leave:
1970 free_message(commit, &msg);
1971 free(author);
1972 update_abort_safety_file();
1974 return res;
1977 static int prepare_revs(struct replay_opts *opts)
1980 * picking (but not reverting) ranges (but not individual revisions)
1981 * should be done in reverse
1983 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
1984 opts->revs->reverse ^= 1;
1986 if (prepare_revision_walk(opts->revs))
1987 return error(_("revision walk setup failed"));
1989 return 0;
1992 static int read_and_refresh_cache(struct repository *r,
1993 struct replay_opts *opts)
1995 struct lock_file index_lock = LOCK_INIT;
1996 int index_fd = hold_locked_index(&index_lock, 0);
1997 if (read_index(r->index) < 0) {
1998 rollback_lock_file(&index_lock);
1999 return error(_("git %s: failed to read the index"),
2000 _(action_name(opts)));
2002 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
2003 if (index_fd >= 0) {
2004 if (write_locked_index(r->index, &index_lock,
2005 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
2006 return error(_("git %s: failed to refresh the index"),
2007 _(action_name(opts)));
2010 return 0;
2013 enum todo_item_flags {
2014 TODO_EDIT_MERGE_MSG = 1
2017 struct todo_item {
2018 enum todo_command command;
2019 struct commit *commit;
2020 unsigned int flags;
2021 const char *arg;
2022 int arg_len;
2023 size_t offset_in_buf;
2026 struct todo_list {
2027 struct strbuf buf;
2028 struct todo_item *items;
2029 int nr, alloc, current;
2030 int done_nr, total_nr;
2031 struct stat_data stat;
2034 #define TODO_LIST_INIT { STRBUF_INIT }
2036 static void todo_list_release(struct todo_list *todo_list)
2038 strbuf_release(&todo_list->buf);
2039 FREE_AND_NULL(todo_list->items);
2040 todo_list->nr = todo_list->alloc = 0;
2043 static struct todo_item *append_new_todo(struct todo_list *todo_list)
2045 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2046 return todo_list->items + todo_list->nr++;
2049 static int parse_insn_line(struct repository *r, struct todo_item *item,
2050 const char *bol, char *eol)
2052 struct object_id commit_oid;
2053 char *end_of_object_name;
2054 int i, saved, status, padding;
2056 item->flags = 0;
2058 /* left-trim */
2059 bol += strspn(bol, " \t");
2061 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
2062 item->command = TODO_COMMENT;
2063 item->commit = NULL;
2064 item->arg = bol;
2065 item->arg_len = eol - bol;
2066 return 0;
2069 for (i = 0; i < TODO_COMMENT; i++)
2070 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
2071 item->command = i;
2072 break;
2073 } else if ((bol + 1 == eol || bol[1] == ' ') &&
2074 *bol == todo_command_info[i].c) {
2075 bol++;
2076 item->command = i;
2077 break;
2079 if (i >= TODO_COMMENT)
2080 return -1;
2082 /* Eat up extra spaces/ tabs before object name */
2083 padding = strspn(bol, " \t");
2084 bol += padding;
2086 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
2087 if (bol != eol)
2088 return error(_("%s does not accept arguments: '%s'"),
2089 command_to_string(item->command), bol);
2090 item->commit = NULL;
2091 item->arg = bol;
2092 item->arg_len = eol - bol;
2093 return 0;
2096 if (!padding)
2097 return error(_("missing arguments for %s"),
2098 command_to_string(item->command));
2100 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2101 item->command == TODO_RESET) {
2102 item->commit = NULL;
2103 item->arg = bol;
2104 item->arg_len = (int)(eol - bol);
2105 return 0;
2108 if (item->command == TODO_MERGE) {
2109 if (skip_prefix(bol, "-C", &bol))
2110 bol += strspn(bol, " \t");
2111 else if (skip_prefix(bol, "-c", &bol)) {
2112 bol += strspn(bol, " \t");
2113 item->flags |= TODO_EDIT_MERGE_MSG;
2114 } else {
2115 item->flags |= TODO_EDIT_MERGE_MSG;
2116 item->commit = NULL;
2117 item->arg = bol;
2118 item->arg_len = (int)(eol - bol);
2119 return 0;
2123 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
2124 saved = *end_of_object_name;
2125 *end_of_object_name = '\0';
2126 status = get_oid(bol, &commit_oid);
2127 *end_of_object_name = saved;
2129 item->arg = end_of_object_name + strspn(end_of_object_name, " \t");
2130 item->arg_len = (int)(eol - item->arg);
2132 if (status < 0)
2133 return -1;
2135 item->commit = lookup_commit_reference(r, &commit_oid);
2136 return !item->commit;
2139 static int parse_insn_buffer(struct repository *r, char *buf,
2140 struct todo_list *todo_list)
2142 struct todo_item *item;
2143 char *p = buf, *next_p;
2144 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
2146 for (i = 1; *p; i++, p = next_p) {
2147 char *eol = strchrnul(p, '\n');
2149 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2151 if (p != eol && eol[-1] == '\r')
2152 eol--; /* strip Carriage Return */
2154 item = append_new_todo(todo_list);
2155 item->offset_in_buf = p - todo_list->buf.buf;
2156 if (parse_insn_line(r, item, p, eol)) {
2157 res = error(_("invalid line %d: %.*s"),
2158 i, (int)(eol - p), p);
2159 item->command = TODO_NOOP;
2162 if (fixup_okay)
2163 ; /* do nothing */
2164 else if (is_fixup(item->command))
2165 return error(_("cannot '%s' without a previous commit"),
2166 command_to_string(item->command));
2167 else if (!is_noop(item->command))
2168 fixup_okay = 1;
2171 return res;
2174 static int count_commands(struct todo_list *todo_list)
2176 int count = 0, i;
2178 for (i = 0; i < todo_list->nr; i++)
2179 if (todo_list->items[i].command != TODO_COMMENT)
2180 count++;
2182 return count;
2185 static int get_item_line_offset(struct todo_list *todo_list, int index)
2187 return index < todo_list->nr ?
2188 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2191 static const char *get_item_line(struct todo_list *todo_list, int index)
2193 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2196 static int get_item_line_length(struct todo_list *todo_list, int index)
2198 return get_item_line_offset(todo_list, index + 1)
2199 - get_item_line_offset(todo_list, index);
2202 static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2204 int fd;
2205 ssize_t len;
2207 fd = open(path, O_RDONLY);
2208 if (fd < 0)
2209 return error_errno(_("could not open '%s'"), path);
2210 len = strbuf_read(sb, fd, 0);
2211 close(fd);
2212 if (len < 0)
2213 return error(_("could not read '%s'."), path);
2214 return len;
2217 static int read_populate_todo(struct repository *r,
2218 struct todo_list *todo_list,
2219 struct replay_opts *opts)
2221 struct stat st;
2222 const char *todo_file = get_todo_path(opts);
2223 int res;
2225 strbuf_reset(&todo_list->buf);
2226 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2227 return -1;
2229 res = stat(todo_file, &st);
2230 if (res)
2231 return error(_("could not stat '%s'"), todo_file);
2232 fill_stat_data(&todo_list->stat, &st);
2234 res = parse_insn_buffer(r, todo_list->buf.buf, todo_list);
2235 if (res) {
2236 if (is_rebase_i(opts))
2237 return error(_("please fix this using "
2238 "'git rebase --edit-todo'."));
2239 return error(_("unusable instruction sheet: '%s'"), todo_file);
2242 if (!todo_list->nr &&
2243 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2244 return error(_("no commits parsed."));
2246 if (!is_rebase_i(opts)) {
2247 enum todo_command valid =
2248 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2249 int i;
2251 for (i = 0; i < todo_list->nr; i++)
2252 if (valid == todo_list->items[i].command)
2253 continue;
2254 else if (valid == TODO_PICK)
2255 return error(_("cannot cherry-pick during a revert."));
2256 else
2257 return error(_("cannot revert during a cherry-pick."));
2260 if (is_rebase_i(opts)) {
2261 struct todo_list done = TODO_LIST_INIT;
2262 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
2264 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
2265 !parse_insn_buffer(r, done.buf.buf, &done))
2266 todo_list->done_nr = count_commands(&done);
2267 else
2268 todo_list->done_nr = 0;
2270 todo_list->total_nr = todo_list->done_nr
2271 + count_commands(todo_list);
2272 todo_list_release(&done);
2274 if (f) {
2275 fprintf(f, "%d\n", todo_list->total_nr);
2276 fclose(f);
2280 return 0;
2283 static int git_config_string_dup(char **dest,
2284 const char *var, const char *value)
2286 if (!value)
2287 return config_error_nonbool(var);
2288 free(*dest);
2289 *dest = xstrdup(value);
2290 return 0;
2293 static int populate_opts_cb(const char *key, const char *value, void *data)
2295 struct replay_opts *opts = data;
2296 int error_flag = 1;
2298 if (!value)
2299 error_flag = 0;
2300 else if (!strcmp(key, "options.no-commit"))
2301 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2302 else if (!strcmp(key, "options.edit"))
2303 opts->edit = git_config_bool_or_int(key, value, &error_flag);
2304 else if (!strcmp(key, "options.signoff"))
2305 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2306 else if (!strcmp(key, "options.record-origin"))
2307 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2308 else if (!strcmp(key, "options.allow-ff"))
2309 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2310 else if (!strcmp(key, "options.mainline"))
2311 opts->mainline = git_config_int(key, value);
2312 else if (!strcmp(key, "options.strategy"))
2313 git_config_string_dup(&opts->strategy, key, value);
2314 else if (!strcmp(key, "options.gpg-sign"))
2315 git_config_string_dup(&opts->gpg_sign, key, value);
2316 else if (!strcmp(key, "options.strategy-option")) {
2317 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2318 opts->xopts[opts->xopts_nr++] = xstrdup(value);
2319 } else if (!strcmp(key, "options.allow-rerere-auto"))
2320 opts->allow_rerere_auto =
2321 git_config_bool_or_int(key, value, &error_flag) ?
2322 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
2323 else
2324 return error(_("invalid key: %s"), key);
2326 if (!error_flag)
2327 return error(_("invalid value for %s: %s"), key, value);
2329 return 0;
2332 void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
2334 int i;
2335 char *strategy_opts_string = raw_opts;
2337 if (*strategy_opts_string == ' ')
2338 strategy_opts_string++;
2340 opts->xopts_nr = split_cmdline(strategy_opts_string,
2341 (const char ***)&opts->xopts);
2342 for (i = 0; i < opts->xopts_nr; i++) {
2343 const char *arg = opts->xopts[i];
2345 skip_prefix(arg, "--", &arg);
2346 opts->xopts[i] = xstrdup(arg);
2350 static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2352 strbuf_reset(buf);
2353 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2354 return;
2355 opts->strategy = strbuf_detach(buf, NULL);
2356 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2357 return;
2359 parse_strategy_opts(opts, buf->buf);
2362 static int read_populate_opts(struct replay_opts *opts)
2364 if (is_rebase_i(opts)) {
2365 struct strbuf buf = STRBUF_INIT;
2367 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2368 if (!starts_with(buf.buf, "-S"))
2369 strbuf_reset(&buf);
2370 else {
2371 free(opts->gpg_sign);
2372 opts->gpg_sign = xstrdup(buf.buf + 2);
2374 strbuf_reset(&buf);
2377 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2378 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2379 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2380 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2381 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2382 strbuf_reset(&buf);
2385 if (file_exists(rebase_path_verbose()))
2386 opts->verbose = 1;
2388 if (file_exists(rebase_path_signoff())) {
2389 opts->allow_ff = 0;
2390 opts->signoff = 1;
2393 read_strategy_opts(opts, &buf);
2394 strbuf_release(&buf);
2396 if (read_oneliner(&opts->current_fixups,
2397 rebase_path_current_fixups(), 1)) {
2398 const char *p = opts->current_fixups.buf;
2399 opts->current_fixup_count = 1;
2400 while ((p = strchr(p, '\n'))) {
2401 opts->current_fixup_count++;
2402 p++;
2406 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2407 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2408 return error(_("unusable squash-onto"));
2409 opts->have_squash_onto = 1;
2412 return 0;
2415 if (!file_exists(git_path_opts_file()))
2416 return 0;
2418 * The function git_parse_source(), called from git_config_from_file(),
2419 * may die() in case of a syntactically incorrect file. We do not care
2420 * about this case, though, because we wrote that file ourselves, so we
2421 * are pretty certain that it is syntactically correct.
2423 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
2424 return error(_("malformed options sheet: '%s'"),
2425 git_path_opts_file());
2426 return 0;
2429 static void write_strategy_opts(struct replay_opts *opts)
2431 int i;
2432 struct strbuf buf = STRBUF_INIT;
2434 for (i = 0; i < opts->xopts_nr; ++i)
2435 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2437 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2438 strbuf_release(&buf);
2441 int write_basic_state(struct replay_opts *opts, const char *head_name,
2442 const char *onto, const char *orig_head)
2444 const char *quiet = getenv("GIT_QUIET");
2446 if (head_name)
2447 write_file(rebase_path_head_name(), "%s\n", head_name);
2448 if (onto)
2449 write_file(rebase_path_onto(), "%s\n", onto);
2450 if (orig_head)
2451 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2453 if (quiet)
2454 write_file(rebase_path_quiet(), "%s\n", quiet);
2455 else
2456 write_file(rebase_path_quiet(), "\n");
2458 if (opts->verbose)
2459 write_file(rebase_path_verbose(), "%s", "");
2460 if (opts->strategy)
2461 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2462 if (opts->xopts_nr > 0)
2463 write_strategy_opts(opts);
2465 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2466 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2467 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2468 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2470 if (opts->gpg_sign)
2471 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2472 if (opts->signoff)
2473 write_file(rebase_path_signoff(), "--signoff\n");
2475 return 0;
2478 static int walk_revs_populate_todo(struct todo_list *todo_list,
2479 struct replay_opts *opts)
2481 enum todo_command command = opts->action == REPLAY_PICK ?
2482 TODO_PICK : TODO_REVERT;
2483 const char *command_string = todo_command_info[command].str;
2484 struct commit *commit;
2486 if (prepare_revs(opts))
2487 return -1;
2489 while ((commit = get_revision(opts->revs))) {
2490 struct todo_item *item = append_new_todo(todo_list);
2491 const char *commit_buffer = get_commit_buffer(commit, NULL);
2492 const char *subject;
2493 int subject_len;
2495 item->command = command;
2496 item->commit = commit;
2497 item->arg = NULL;
2498 item->arg_len = 0;
2499 item->offset_in_buf = todo_list->buf.len;
2500 subject_len = find_commit_subject(commit_buffer, &subject);
2501 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2502 short_commit_name(commit), subject_len, subject);
2503 unuse_commit_buffer(commit, commit_buffer);
2506 if (!todo_list->nr)
2507 return error(_("empty commit set passed"));
2509 return 0;
2512 static int create_seq_dir(void)
2514 if (file_exists(git_path_seq_dir())) {
2515 error(_("a cherry-pick or revert is already in progress"));
2516 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2517 return -1;
2518 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2519 return error_errno(_("could not create sequencer directory '%s'"),
2520 git_path_seq_dir());
2521 return 0;
2524 static int save_head(const char *head)
2526 struct lock_file head_lock = LOCK_INIT;
2527 struct strbuf buf = STRBUF_INIT;
2528 int fd;
2529 ssize_t written;
2531 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
2532 if (fd < 0)
2533 return error_errno(_("could not lock HEAD"));
2534 strbuf_addf(&buf, "%s\n", head);
2535 written = write_in_full(fd, buf.buf, buf.len);
2536 strbuf_release(&buf);
2537 if (written < 0) {
2538 error_errno(_("could not write to '%s'"), git_path_head_file());
2539 rollback_lock_file(&head_lock);
2540 return -1;
2542 if (commit_lock_file(&head_lock) < 0)
2543 return error(_("failed to finalize '%s'"), git_path_head_file());
2544 return 0;
2547 static int rollback_is_safe(void)
2549 struct strbuf sb = STRBUF_INIT;
2550 struct object_id expected_head, actual_head;
2552 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2553 strbuf_trim(&sb);
2554 if (get_oid_hex(sb.buf, &expected_head)) {
2555 strbuf_release(&sb);
2556 die(_("could not parse %s"), git_path_abort_safety_file());
2558 strbuf_release(&sb);
2560 else if (errno == ENOENT)
2561 oidclr(&expected_head);
2562 else
2563 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2565 if (get_oid("HEAD", &actual_head))
2566 oidclr(&actual_head);
2568 return oideq(&actual_head, &expected_head);
2571 static int reset_for_rollback(const struct object_id *oid)
2573 const char *argv[4]; /* reset --merge <arg> + NULL */
2575 argv[0] = "reset";
2576 argv[1] = "--merge";
2577 argv[2] = oid_to_hex(oid);
2578 argv[3] = NULL;
2579 return run_command_v_opt(argv, RUN_GIT_CMD);
2582 static int rollback_single_pick(struct repository *r)
2584 struct object_id head_oid;
2586 if (!file_exists(git_path_cherry_pick_head(r)) &&
2587 !file_exists(git_path_revert_head(r)))
2588 return error(_("no cherry-pick or revert in progress"));
2589 if (read_ref_full("HEAD", 0, &head_oid, NULL))
2590 return error(_("cannot resolve HEAD"));
2591 if (is_null_oid(&head_oid))
2592 return error(_("cannot abort from a branch yet to be born"));
2593 return reset_for_rollback(&head_oid);
2596 int sequencer_rollback(struct repository *r, struct replay_opts *opts)
2598 FILE *f;
2599 struct object_id oid;
2600 struct strbuf buf = STRBUF_INIT;
2601 const char *p;
2603 f = fopen(git_path_head_file(), "r");
2604 if (!f && errno == ENOENT) {
2606 * There is no multiple-cherry-pick in progress.
2607 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2608 * a single-cherry-pick in progress, abort that.
2610 return rollback_single_pick(r);
2612 if (!f)
2613 return error_errno(_("cannot open '%s'"), git_path_head_file());
2614 if (strbuf_getline_lf(&buf, f)) {
2615 error(_("cannot read '%s': %s"), git_path_head_file(),
2616 ferror(f) ? strerror(errno) : _("unexpected end of file"));
2617 fclose(f);
2618 goto fail;
2620 fclose(f);
2621 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
2622 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2623 git_path_head_file());
2624 goto fail;
2626 if (is_null_oid(&oid)) {
2627 error(_("cannot abort from a branch yet to be born"));
2628 goto fail;
2631 if (!rollback_is_safe()) {
2632 /* Do not error, just do not rollback */
2633 warning(_("You seem to have moved HEAD. "
2634 "Not rewinding, check your HEAD!"));
2635 } else
2636 if (reset_for_rollback(&oid))
2637 goto fail;
2638 strbuf_release(&buf);
2639 return sequencer_remove_state(opts);
2640 fail:
2641 strbuf_release(&buf);
2642 return -1;
2645 static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
2647 struct lock_file todo_lock = LOCK_INIT;
2648 const char *todo_path = get_todo_path(opts);
2649 int next = todo_list->current, offset, fd;
2652 * rebase -i writes "git-rebase-todo" without the currently executing
2653 * command, appending it to "done" instead.
2655 if (is_rebase_i(opts))
2656 next++;
2658 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
2659 if (fd < 0)
2660 return error_errno(_("could not lock '%s'"), todo_path);
2661 offset = get_item_line_offset(todo_list, next);
2662 if (write_in_full(fd, todo_list->buf.buf + offset,
2663 todo_list->buf.len - offset) < 0)
2664 return error_errno(_("could not write to '%s'"), todo_path);
2665 if (commit_lock_file(&todo_lock) < 0)
2666 return error(_("failed to finalize '%s'"), todo_path);
2668 if (is_rebase_i(opts) && next > 0) {
2669 const char *done = rebase_path_done();
2670 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2671 int ret = 0;
2673 if (fd < 0)
2674 return 0;
2675 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2676 get_item_line_length(todo_list, next - 1))
2677 < 0)
2678 ret = error_errno(_("could not write to '%s'"), done);
2679 if (close(fd) < 0)
2680 ret = error_errno(_("failed to finalize '%s'"), done);
2681 return ret;
2683 return 0;
2686 static int save_opts(struct replay_opts *opts)
2688 const char *opts_file = git_path_opts_file();
2689 int res = 0;
2691 if (opts->no_commit)
2692 res |= git_config_set_in_file_gently(opts_file, "options.no-commit", "true");
2693 if (opts->edit)
2694 res |= git_config_set_in_file_gently(opts_file, "options.edit", "true");
2695 if (opts->signoff)
2696 res |= git_config_set_in_file_gently(opts_file, "options.signoff", "true");
2697 if (opts->record_origin)
2698 res |= git_config_set_in_file_gently(opts_file, "options.record-origin", "true");
2699 if (opts->allow_ff)
2700 res |= git_config_set_in_file_gently(opts_file, "options.allow-ff", "true");
2701 if (opts->mainline) {
2702 struct strbuf buf = STRBUF_INIT;
2703 strbuf_addf(&buf, "%d", opts->mainline);
2704 res |= git_config_set_in_file_gently(opts_file, "options.mainline", buf.buf);
2705 strbuf_release(&buf);
2707 if (opts->strategy)
2708 res |= git_config_set_in_file_gently(opts_file, "options.strategy", opts->strategy);
2709 if (opts->gpg_sign)
2710 res |= git_config_set_in_file_gently(opts_file, "options.gpg-sign", opts->gpg_sign);
2711 if (opts->xopts) {
2712 int i;
2713 for (i = 0; i < opts->xopts_nr; i++)
2714 res |= git_config_set_multivar_in_file_gently(opts_file,
2715 "options.strategy-option",
2716 opts->xopts[i], "^$", 0);
2718 if (opts->allow_rerere_auto)
2719 res |= git_config_set_in_file_gently(opts_file, "options.allow-rerere-auto",
2720 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2721 "true" : "false");
2722 return res;
2725 static int make_patch(struct repository *r,
2726 struct commit *commit,
2727 struct replay_opts *opts)
2729 struct strbuf buf = STRBUF_INIT;
2730 struct rev_info log_tree_opt;
2731 const char *subject, *p;
2732 int res = 0;
2734 p = short_commit_name(commit);
2735 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2736 return -1;
2737 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2738 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2739 res |= error(_("could not update %s"), "REBASE_HEAD");
2741 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2742 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
2743 repo_init_revisions(r, &log_tree_opt, NULL);
2744 log_tree_opt.abbrev = 0;
2745 log_tree_opt.diff = 1;
2746 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2747 log_tree_opt.disable_stdin = 1;
2748 log_tree_opt.no_commit_id = 1;
2749 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2750 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2751 if (!log_tree_opt.diffopt.file)
2752 res |= error_errno(_("could not open '%s'"), buf.buf);
2753 else {
2754 res |= log_tree_commit(&log_tree_opt, commit);
2755 fclose(log_tree_opt.diffopt.file);
2757 strbuf_reset(&buf);
2759 strbuf_addf(&buf, "%s/message", get_dir(opts));
2760 if (!file_exists(buf.buf)) {
2761 const char *commit_buffer = get_commit_buffer(commit, NULL);
2762 find_commit_subject(commit_buffer, &subject);
2763 res |= write_message(subject, strlen(subject), buf.buf, 1);
2764 unuse_commit_buffer(commit, commit_buffer);
2766 strbuf_release(&buf);
2768 return res;
2771 static int intend_to_amend(void)
2773 struct object_id head;
2774 char *p;
2776 if (get_oid("HEAD", &head))
2777 return error(_("cannot read HEAD"));
2779 p = oid_to_hex(&head);
2780 return write_message(p, strlen(p), rebase_path_amend(), 1);
2783 static int error_with_patch(struct repository *r,
2784 struct commit *commit,
2785 const char *subject, int subject_len,
2786 struct replay_opts *opts,
2787 int exit_code, int to_amend)
2789 if (commit) {
2790 if (make_patch(r, commit, opts))
2791 return -1;
2792 } else if (copy_file(rebase_path_message(),
2793 git_path_merge_msg(r), 0666))
2794 return error(_("unable to copy '%s' to '%s'"),
2795 git_path_merge_msg(r), rebase_path_message());
2797 if (to_amend) {
2798 if (intend_to_amend())
2799 return -1;
2801 fprintf(stderr,
2802 _("You can amend the commit now, with\n"
2803 "\n"
2804 " git commit --amend %s\n"
2805 "\n"
2806 "Once you are satisfied with your changes, run\n"
2807 "\n"
2808 " git rebase --continue\n"),
2809 gpg_sign_opt_quoted(opts));
2810 } else if (exit_code) {
2811 if (commit)
2812 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
2813 short_commit_name(commit), subject_len, subject);
2814 else
2816 * We don't have the hash of the parent so
2817 * just print the line from the todo file.
2819 fprintf_ln(stderr, _("Could not merge %.*s"),
2820 subject_len, subject);
2823 return exit_code;
2826 static int error_failed_squash(struct repository *r,
2827 struct commit *commit,
2828 struct replay_opts *opts,
2829 int subject_len,
2830 const char *subject)
2832 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
2833 return error(_("could not copy '%s' to '%s'"),
2834 rebase_path_squash_msg(), rebase_path_message());
2835 unlink(git_path_merge_msg(r));
2836 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
2837 return error(_("could not copy '%s' to '%s'"),
2838 rebase_path_message(),
2839 git_path_merge_msg(r));
2840 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
2843 static int do_exec(struct repository *r, const char *command_line)
2845 struct argv_array child_env = ARGV_ARRAY_INIT;
2846 const char *child_argv[] = { NULL, NULL };
2847 int dirty, status;
2849 fprintf(stderr, "Executing: %s\n", command_line);
2850 child_argv[0] = command_line;
2851 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
2852 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
2853 absolute_path(get_git_work_tree()));
2854 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
2855 child_env.argv);
2857 /* force re-reading of the cache */
2858 if (discard_index(r->index) < 0 || read_index(r->index) < 0)
2859 return error(_("could not read index"));
2861 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
2863 if (status) {
2864 warning(_("execution failed: %s\n%s"
2865 "You can fix the problem, and then run\n"
2866 "\n"
2867 " git rebase --continue\n"
2868 "\n"),
2869 command_line,
2870 dirty ? N_("and made changes to the index and/or the "
2871 "working tree\n") : "");
2872 if (status == 127)
2873 /* command not found */
2874 status = 1;
2875 } else if (dirty) {
2876 warning(_("execution succeeded: %s\nbut "
2877 "left changes to the index and/or the working tree\n"
2878 "Commit or stash your changes, and then run\n"
2879 "\n"
2880 " git rebase --continue\n"
2881 "\n"), command_line);
2882 status = 1;
2885 argv_array_clear(&child_env);
2887 return status;
2890 static int safe_append(const char *filename, const char *fmt, ...)
2892 va_list ap;
2893 struct lock_file lock = LOCK_INIT;
2894 int fd = hold_lock_file_for_update(&lock, filename,
2895 LOCK_REPORT_ON_ERROR);
2896 struct strbuf buf = STRBUF_INIT;
2898 if (fd < 0)
2899 return -1;
2901 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
2902 error_errno(_("could not read '%s'"), filename);
2903 rollback_lock_file(&lock);
2904 return -1;
2906 strbuf_complete(&buf, '\n');
2907 va_start(ap, fmt);
2908 strbuf_vaddf(&buf, fmt, ap);
2909 va_end(ap);
2911 if (write_in_full(fd, buf.buf, buf.len) < 0) {
2912 error_errno(_("could not write to '%s'"), filename);
2913 strbuf_release(&buf);
2914 rollback_lock_file(&lock);
2915 return -1;
2917 if (commit_lock_file(&lock) < 0) {
2918 strbuf_release(&buf);
2919 rollback_lock_file(&lock);
2920 return error(_("failed to finalize '%s'"), filename);
2923 strbuf_release(&buf);
2924 return 0;
2927 static int do_label(struct repository *r, const char *name, int len)
2929 struct ref_store *refs = get_main_ref_store(r);
2930 struct ref_transaction *transaction;
2931 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
2932 struct strbuf msg = STRBUF_INIT;
2933 int ret = 0;
2934 struct object_id head_oid;
2936 if (len == 1 && *name == '#')
2937 return error(_("illegal label name: '%.*s'"), len, name);
2939 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
2940 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
2942 transaction = ref_store_transaction_begin(refs, &err);
2943 if (!transaction) {
2944 error("%s", err.buf);
2945 ret = -1;
2946 } else if (get_oid("HEAD", &head_oid)) {
2947 error(_("could not read HEAD"));
2948 ret = -1;
2949 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
2950 NULL, 0, msg.buf, &err) < 0 ||
2951 ref_transaction_commit(transaction, &err)) {
2952 error("%s", err.buf);
2953 ret = -1;
2955 ref_transaction_free(transaction);
2956 strbuf_release(&err);
2957 strbuf_release(&msg);
2959 if (!ret)
2960 ret = safe_append(rebase_path_refs_to_delete(),
2961 "%s\n", ref_name.buf);
2962 strbuf_release(&ref_name);
2964 return ret;
2967 static const char *reflog_message(struct replay_opts *opts,
2968 const char *sub_action, const char *fmt, ...);
2970 static int do_reset(struct repository *r,
2971 const char *name, int len,
2972 struct replay_opts *opts)
2974 struct strbuf ref_name = STRBUF_INIT;
2975 struct object_id oid;
2976 struct lock_file lock = LOCK_INIT;
2977 struct tree_desc desc;
2978 struct tree *tree;
2979 struct unpack_trees_options unpack_tree_opts;
2980 int ret = 0;
2982 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0)
2983 return -1;
2985 if (len == 10 && !strncmp("[new root]", name, len)) {
2986 if (!opts->have_squash_onto) {
2987 const char *hex;
2988 if (commit_tree("", 0, the_hash_algo->empty_tree,
2989 NULL, &opts->squash_onto,
2990 NULL, NULL))
2991 return error(_("writing fake root commit"));
2992 opts->have_squash_onto = 1;
2993 hex = oid_to_hex(&opts->squash_onto);
2994 if (write_message(hex, strlen(hex),
2995 rebase_path_squash_onto(), 0))
2996 return error(_("writing squash-onto"));
2998 oidcpy(&oid, &opts->squash_onto);
2999 } else {
3000 int i;
3002 /* Determine the length of the label */
3003 for (i = 0; i < len; i++)
3004 if (isspace(name[i]))
3005 break;
3006 len = i;
3008 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3009 if (get_oid(ref_name.buf, &oid) &&
3010 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
3011 error(_("could not read '%s'"), ref_name.buf);
3012 rollback_lock_file(&lock);
3013 strbuf_release(&ref_name);
3014 return -1;
3018 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
3019 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3020 unpack_tree_opts.head_idx = 1;
3021 unpack_tree_opts.src_index = r->index;
3022 unpack_tree_opts.dst_index = r->index;
3023 unpack_tree_opts.fn = oneway_merge;
3024 unpack_tree_opts.merge = 1;
3025 unpack_tree_opts.update = 1;
3027 if (read_index_unmerged(r->index)) {
3028 rollback_lock_file(&lock);
3029 strbuf_release(&ref_name);
3030 return error_resolve_conflict(_(action_name(opts)));
3033 if (!fill_tree_descriptor(&desc, &oid)) {
3034 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3035 rollback_lock_file(&lock);
3036 free((void *)desc.buffer);
3037 strbuf_release(&ref_name);
3038 return -1;
3041 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3042 rollback_lock_file(&lock);
3043 free((void *)desc.buffer);
3044 strbuf_release(&ref_name);
3045 return -1;
3048 tree = parse_tree_indirect(&oid);
3049 prime_cache_tree(r, r->index, tree);
3051 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
3052 ret = error(_("could not write index"));
3053 free((void *)desc.buffer);
3055 if (!ret)
3056 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3057 len, name), "HEAD", &oid,
3058 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3060 strbuf_release(&ref_name);
3061 return ret;
3064 static struct commit *lookup_label(const char *label, int len,
3065 struct strbuf *buf)
3067 struct commit *commit;
3069 strbuf_reset(buf);
3070 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3071 commit = lookup_commit_reference_by_name(buf->buf);
3072 if (!commit) {
3073 /* fall back to non-rewritten ref or commit */
3074 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3075 commit = lookup_commit_reference_by_name(buf->buf);
3078 if (!commit)
3079 error(_("could not resolve '%s'"), buf->buf);
3081 return commit;
3084 static int do_merge(struct repository *r,
3085 struct commit *commit,
3086 const char *arg, int arg_len,
3087 int flags, struct replay_opts *opts)
3089 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3090 EDIT_MSG | VERIFY_MSG : 0;
3091 struct strbuf ref_name = STRBUF_INIT;
3092 struct commit *head_commit, *merge_commit, *i;
3093 struct commit_list *bases, *j, *reversed = NULL;
3094 struct commit_list *to_merge = NULL, **tail = &to_merge;
3095 struct merge_options o;
3096 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
3097 static struct lock_file lock;
3098 const char *p;
3100 if (hold_locked_index(&lock, LOCK_REPORT_ON_ERROR) < 0) {
3101 ret = -1;
3102 goto leave_merge;
3105 head_commit = lookup_commit_reference_by_name("HEAD");
3106 if (!head_commit) {
3107 ret = error(_("cannot merge without a current revision"));
3108 goto leave_merge;
3112 * For octopus merges, the arg starts with the list of revisions to be
3113 * merged. The list is optionally followed by '#' and the oneline.
3115 merge_arg_len = oneline_offset = arg_len;
3116 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3117 if (!*p)
3118 break;
3119 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3120 p += 1 + strspn(p + 1, " \t\n");
3121 oneline_offset = p - arg;
3122 break;
3124 k = strcspn(p, " \t\n");
3125 if (!k)
3126 continue;
3127 merge_commit = lookup_label(p, k, &ref_name);
3128 if (!merge_commit) {
3129 ret = error(_("unable to parse '%.*s'"), k, p);
3130 goto leave_merge;
3132 tail = &commit_list_insert(merge_commit, tail)->next;
3133 p += k;
3134 merge_arg_len = p - arg;
3137 if (!to_merge) {
3138 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
3139 goto leave_merge;
3142 if (opts->have_squash_onto &&
3143 oideq(&head_commit->object.oid, &opts->squash_onto)) {
3145 * When the user tells us to "merge" something into a
3146 * "[new root]", let's simply fast-forward to the merge head.
3148 rollback_lock_file(&lock);
3149 if (to_merge->next)
3150 ret = error(_("octopus merge cannot be executed on "
3151 "top of a [new root]"));
3152 else
3153 ret = fast_forward_to(r, &to_merge->item->object.oid,
3154 &head_commit->object.oid, 0,
3155 opts);
3156 goto leave_merge;
3159 if (commit) {
3160 const char *message = get_commit_buffer(commit, NULL);
3161 const char *body;
3162 int len;
3164 if (!message) {
3165 ret = error(_("could not get commit message of '%s'"),
3166 oid_to_hex(&commit->object.oid));
3167 goto leave_merge;
3169 write_author_script(message);
3170 find_commit_subject(message, &body);
3171 len = strlen(body);
3172 ret = write_message(body, len, git_path_merge_msg(r), 0);
3173 unuse_commit_buffer(commit, message);
3174 if (ret) {
3175 error_errno(_("could not write '%s'"),
3176 git_path_merge_msg(r));
3177 goto leave_merge;
3179 } else {
3180 struct strbuf buf = STRBUF_INIT;
3181 int len;
3183 strbuf_addf(&buf, "author %s", git_author_info(0));
3184 write_author_script(buf.buf);
3185 strbuf_reset(&buf);
3187 if (oneline_offset < arg_len) {
3188 p = arg + oneline_offset;
3189 len = arg_len - oneline_offset;
3190 } else {
3191 strbuf_addf(&buf, "Merge %s '%.*s'",
3192 to_merge->next ? "branches" : "branch",
3193 merge_arg_len, arg);
3194 p = buf.buf;
3195 len = buf.len;
3198 ret = write_message(p, len, git_path_merge_msg(r), 0);
3199 strbuf_release(&buf);
3200 if (ret) {
3201 error_errno(_("could not write '%s'"),
3202 git_path_merge_msg(r));
3203 goto leave_merge;
3208 * If HEAD is not identical to the first parent of the original merge
3209 * commit, we cannot fast-forward.
3211 can_fast_forward = opts->allow_ff && commit && commit->parents &&
3212 oideq(&commit->parents->item->object.oid,
3213 &head_commit->object.oid);
3216 * If any merge head is different from the original one, we cannot
3217 * fast-forward.
3219 if (can_fast_forward) {
3220 struct commit_list *p = commit->parents->next;
3222 for (j = to_merge; j && p; j = j->next, p = p->next)
3223 if (!oideq(&j->item->object.oid,
3224 &p->item->object.oid)) {
3225 can_fast_forward = 0;
3226 break;
3229 * If the number of merge heads differs from the original merge
3230 * commit, we cannot fast-forward.
3232 if (j || p)
3233 can_fast_forward = 0;
3236 if (can_fast_forward) {
3237 rollback_lock_file(&lock);
3238 ret = fast_forward_to(r, &commit->object.oid,
3239 &head_commit->object.oid, 0, opts);
3240 goto leave_merge;
3243 if (to_merge->next) {
3244 /* Octopus merge */
3245 struct child_process cmd = CHILD_PROCESS_INIT;
3247 if (read_env_script(&cmd.env_array)) {
3248 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3250 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3251 goto leave_merge;
3254 cmd.git_cmd = 1;
3255 argv_array_push(&cmd.args, "merge");
3256 argv_array_push(&cmd.args, "-s");
3257 argv_array_push(&cmd.args, "octopus");
3258 argv_array_push(&cmd.args, "--no-edit");
3259 argv_array_push(&cmd.args, "--no-ff");
3260 argv_array_push(&cmd.args, "--no-log");
3261 argv_array_push(&cmd.args, "--no-stat");
3262 argv_array_push(&cmd.args, "-F");
3263 argv_array_push(&cmd.args, git_path_merge_msg(r));
3264 if (opts->gpg_sign)
3265 argv_array_push(&cmd.args, opts->gpg_sign);
3267 /* Add the tips to be merged */
3268 for (j = to_merge; j; j = j->next)
3269 argv_array_push(&cmd.args,
3270 oid_to_hex(&j->item->object.oid));
3272 strbuf_release(&ref_name);
3273 unlink(git_path_cherry_pick_head(r));
3274 rollback_lock_file(&lock);
3276 rollback_lock_file(&lock);
3277 ret = run_command(&cmd);
3279 /* force re-reading of the cache */
3280 if (!ret && (discard_index(r->index) < 0 ||
3281 read_index(r->index) < 0))
3282 ret = error(_("could not read index"));
3283 goto leave_merge;
3286 merge_commit = to_merge->item;
3287 bases = get_merge_bases(head_commit, merge_commit);
3288 if (bases && oideq(&merge_commit->object.oid,
3289 &bases->item->object.oid)) {
3290 ret = 0;
3291 /* skip merging an ancestor of HEAD */
3292 goto leave_merge;
3295 write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
3296 git_path_merge_head(r), 0);
3297 write_message("no-ff", 5, git_path_merge_mode(r), 0);
3299 for (j = bases; j; j = j->next)
3300 commit_list_insert(j->item, &reversed);
3301 free_commit_list(bases);
3303 read_index(r->index);
3304 init_merge_options(&o);
3305 o.branch1 = "HEAD";
3306 o.branch2 = ref_name.buf;
3307 o.buffer_output = 2;
3309 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3310 if (ret <= 0)
3311 fputs(o.obuf.buf, stdout);
3312 strbuf_release(&o.obuf);
3313 if (ret < 0) {
3314 error(_("could not even attempt to merge '%.*s'"),
3315 merge_arg_len, arg);
3316 goto leave_merge;
3319 * The return value of merge_recursive() is 1 on clean, and 0 on
3320 * unclean merge.
3322 * Let's reverse that, so that do_merge() returns 0 upon success and
3323 * 1 upon failed merge (keeping the return value -1 for the cases where
3324 * we will want to reschedule the `merge` command).
3326 ret = !ret;
3328 if (r->index->cache_changed &&
3329 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
3330 ret = error(_("merge: Unable to write new index file"));
3331 goto leave_merge;
3334 rollback_lock_file(&lock);
3335 if (ret)
3336 repo_rerere(r, opts->allow_rerere_auto);
3337 else
3339 * In case of problems, we now want to return a positive
3340 * value (a negative one would indicate that the `merge`
3341 * command needs to be rescheduled).
3343 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3344 run_commit_flags);
3346 leave_merge:
3347 strbuf_release(&ref_name);
3348 rollback_lock_file(&lock);
3349 free_commit_list(to_merge);
3350 return ret;
3353 static int is_final_fixup(struct todo_list *todo_list)
3355 int i = todo_list->current;
3357 if (!is_fixup(todo_list->items[i].command))
3358 return 0;
3360 while (++i < todo_list->nr)
3361 if (is_fixup(todo_list->items[i].command))
3362 return 0;
3363 else if (!is_noop(todo_list->items[i].command))
3364 break;
3365 return 1;
3368 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3370 int i;
3372 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3373 if (!is_noop(todo_list->items[i].command))
3374 return todo_list->items[i].command;
3376 return -1;
3379 static int apply_autostash(struct replay_opts *opts)
3381 struct strbuf stash_sha1 = STRBUF_INIT;
3382 struct child_process child = CHILD_PROCESS_INIT;
3383 int ret = 0;
3385 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3386 strbuf_release(&stash_sha1);
3387 return 0;
3389 strbuf_trim(&stash_sha1);
3391 child.git_cmd = 1;
3392 child.no_stdout = 1;
3393 child.no_stderr = 1;
3394 argv_array_push(&child.args, "stash");
3395 argv_array_push(&child.args, "apply");
3396 argv_array_push(&child.args, stash_sha1.buf);
3397 if (!run_command(&child))
3398 fprintf(stderr, _("Applied autostash.\n"));
3399 else {
3400 struct child_process store = CHILD_PROCESS_INIT;
3402 store.git_cmd = 1;
3403 argv_array_push(&store.args, "stash");
3404 argv_array_push(&store.args, "store");
3405 argv_array_push(&store.args, "-m");
3406 argv_array_push(&store.args, "autostash");
3407 argv_array_push(&store.args, "-q");
3408 argv_array_push(&store.args, stash_sha1.buf);
3409 if (run_command(&store))
3410 ret = error(_("cannot store %s"), stash_sha1.buf);
3411 else
3412 fprintf(stderr,
3413 _("Applying autostash resulted in conflicts.\n"
3414 "Your changes are safe in the stash.\n"
3415 "You can run \"git stash pop\" or"
3416 " \"git stash drop\" at any time.\n"));
3419 strbuf_release(&stash_sha1);
3420 return ret;
3423 static const char *reflog_message(struct replay_opts *opts,
3424 const char *sub_action, const char *fmt, ...)
3426 va_list ap;
3427 static struct strbuf buf = STRBUF_INIT;
3429 va_start(ap, fmt);
3430 strbuf_reset(&buf);
3431 strbuf_addstr(&buf, action_name(opts));
3432 if (sub_action)
3433 strbuf_addf(&buf, " (%s)", sub_action);
3434 if (fmt) {
3435 strbuf_addstr(&buf, ": ");
3436 strbuf_vaddf(&buf, fmt, ap);
3438 va_end(ap);
3440 return buf.buf;
3443 static int run_git_checkout(struct replay_opts *opts, const char *commit,
3444 const char *action)
3446 struct child_process cmd = CHILD_PROCESS_INIT;
3448 cmd.git_cmd = 1;
3450 argv_array_push(&cmd.args, "checkout");
3451 argv_array_push(&cmd.args, commit);
3452 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3454 if (opts->verbose)
3455 return run_command(&cmd);
3456 else
3457 return run_command_silent_on_success(&cmd);
3460 int prepare_branch_to_be_rebased(struct replay_opts *opts, const char *commit)
3462 const char *action;
3464 if (commit && *commit) {
3465 action = reflog_message(opts, "start", "checkout %s", commit);
3466 if (run_git_checkout(opts, commit, action))
3467 return error(_("could not checkout %s"), commit);
3470 return 0;
3473 static int checkout_onto(struct replay_opts *opts,
3474 const char *onto_name, const char *onto,
3475 const char *orig_head)
3477 struct object_id oid;
3478 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3480 if (get_oid(orig_head, &oid))
3481 return error(_("%s: not a valid OID"), orig_head);
3483 if (run_git_checkout(opts, onto, action)) {
3484 apply_autostash(opts);
3485 sequencer_remove_state(opts);
3486 return error(_("could not detach HEAD"));
3489 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3492 static int stopped_at_head(struct repository *r)
3494 struct object_id head;
3495 struct commit *commit;
3496 struct commit_message message;
3498 if (get_oid("HEAD", &head) ||
3499 !(commit = lookup_commit(r, &head)) ||
3500 parse_commit(commit) || get_message(commit, &message))
3501 fprintf(stderr, _("Stopped at HEAD\n"));
3502 else {
3503 fprintf(stderr, _("Stopped at %s\n"), message.label);
3504 free_message(commit, &message);
3506 return 0;
3510 static const char rescheduled_advice[] =
3511 N_("Could not execute the todo command\n"
3512 "\n"
3513 " %.*s"
3514 "\n"
3515 "It has been rescheduled; To edit the command before continuing, please\n"
3516 "edit the todo list first:\n"
3517 "\n"
3518 " git rebase --edit-todo\n"
3519 " git rebase --continue\n");
3521 static int pick_commits(struct repository *r,
3522 struct todo_list *todo_list,
3523 struct replay_opts *opts)
3525 int res = 0, reschedule = 0;
3527 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3528 if (opts->allow_ff)
3529 assert(!(opts->signoff || opts->no_commit ||
3530 opts->record_origin || opts->edit));
3531 if (read_and_refresh_cache(r, opts))
3532 return -1;
3534 while (todo_list->current < todo_list->nr) {
3535 struct todo_item *item = todo_list->items + todo_list->current;
3536 if (save_todo(todo_list, opts))
3537 return -1;
3538 if (is_rebase_i(opts)) {
3539 if (item->command != TODO_COMMENT) {
3540 FILE *f = fopen(rebase_path_msgnum(), "w");
3542 todo_list->done_nr++;
3544 if (f) {
3545 fprintf(f, "%d\n", todo_list->done_nr);
3546 fclose(f);
3548 fprintf(stderr, "Rebasing (%d/%d)%s",
3549 todo_list->done_nr,
3550 todo_list->total_nr,
3551 opts->verbose ? "\n" : "\r");
3553 unlink(rebase_path_message());
3554 unlink(rebase_path_author_script());
3555 unlink(rebase_path_stopped_sha());
3556 unlink(rebase_path_amend());
3557 unlink(git_path_merge_head(the_repository));
3558 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
3560 if (item->command == TODO_BREAK)
3561 return stopped_at_head(r);
3563 if (item->command <= TODO_SQUASH) {
3564 if (is_rebase_i(opts))
3565 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3566 command_to_string(item->command), NULL),
3568 res = do_pick_commit(r, item->command, item->commit,
3569 opts, is_final_fixup(todo_list));
3570 if (is_rebase_i(opts) && res < 0) {
3571 /* Reschedule */
3572 advise(_(rescheduled_advice),
3573 get_item_line_length(todo_list,
3574 todo_list->current),
3575 get_item_line(todo_list,
3576 todo_list->current));
3577 todo_list->current--;
3578 if (save_todo(todo_list, opts))
3579 return -1;
3581 if (item->command == TODO_EDIT) {
3582 struct commit *commit = item->commit;
3583 if (!res)
3584 fprintf(stderr,
3585 _("Stopped at %s... %.*s\n"),
3586 short_commit_name(commit),
3587 item->arg_len, item->arg);
3588 return error_with_patch(r, commit,
3589 item->arg, item->arg_len, opts, res,
3590 !res);
3592 if (is_rebase_i(opts) && !res)
3593 record_in_rewritten(&item->commit->object.oid,
3594 peek_command(todo_list, 1));
3595 if (res && is_fixup(item->command)) {
3596 if (res == 1)
3597 intend_to_amend();
3598 return error_failed_squash(r, item->commit, opts,
3599 item->arg_len, item->arg);
3600 } else if (res && is_rebase_i(opts) && item->commit) {
3601 int to_amend = 0;
3602 struct object_id oid;
3605 * If we are rewording and have either
3606 * fast-forwarded already, or are about to
3607 * create a new root commit, we want to amend,
3608 * otherwise we do not.
3610 if (item->command == TODO_REWORD &&
3611 !get_oid("HEAD", &oid) &&
3612 (oideq(&item->commit->object.oid, &oid) ||
3613 (opts->have_squash_onto &&
3614 oideq(&opts->squash_onto, &oid))))
3615 to_amend = 1;
3617 return res | error_with_patch(r, item->commit,
3618 item->arg, item->arg_len, opts,
3619 res, to_amend);
3621 } else if (item->command == TODO_EXEC) {
3622 char *end_of_arg = (char *)(item->arg + item->arg_len);
3623 int saved = *end_of_arg;
3624 struct stat st;
3626 *end_of_arg = '\0';
3627 res = do_exec(r, item->arg);
3628 *end_of_arg = saved;
3630 /* Reread the todo file if it has changed. */
3631 if (res)
3632 ; /* fall through */
3633 else if (stat(get_todo_path(opts), &st))
3634 res = error_errno(_("could not stat '%s'"),
3635 get_todo_path(opts));
3636 else if (match_stat_data(&todo_list->stat, &st)) {
3637 todo_list_release(todo_list);
3638 if (read_populate_todo(r, todo_list, opts))
3639 res = -1; /* message was printed */
3640 /* `current` will be incremented below */
3641 todo_list->current = -1;
3643 } else if (item->command == TODO_LABEL) {
3644 if ((res = do_label(r, item->arg, item->arg_len)))
3645 reschedule = 1;
3646 } else if (item->command == TODO_RESET) {
3647 if ((res = do_reset(r, item->arg, item->arg_len, opts)))
3648 reschedule = 1;
3649 } else if (item->command == TODO_MERGE) {
3650 if ((res = do_merge(r, item->commit,
3651 item->arg, item->arg_len,
3652 item->flags, opts)) < 0)
3653 reschedule = 1;
3654 else if (item->commit)
3655 record_in_rewritten(&item->commit->object.oid,
3656 peek_command(todo_list, 1));
3657 if (res > 0)
3658 /* failed with merge conflicts */
3659 return error_with_patch(r, item->commit,
3660 item->arg,
3661 item->arg_len, opts,
3662 res, 0);
3663 } else if (!is_noop(item->command))
3664 return error(_("unknown command %d"), item->command);
3666 if (reschedule) {
3667 advise(_(rescheduled_advice),
3668 get_item_line_length(todo_list,
3669 todo_list->current),
3670 get_item_line(todo_list, todo_list->current));
3671 todo_list->current--;
3672 if (save_todo(todo_list, opts))
3673 return -1;
3674 if (item->commit)
3675 return error_with_patch(r,
3676 item->commit,
3677 item->arg,
3678 item->arg_len, opts,
3679 res, 0);
3682 todo_list->current++;
3683 if (res)
3684 return res;
3687 if (is_rebase_i(opts)) {
3688 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
3689 struct stat st;
3691 /* Stopped in the middle, as planned? */
3692 if (todo_list->current < todo_list->nr)
3693 return 0;
3695 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3696 starts_with(head_ref.buf, "refs/")) {
3697 const char *msg;
3698 struct object_id head, orig;
3699 int res;
3701 if (get_oid("HEAD", &head)) {
3702 res = error(_("cannot read HEAD"));
3703 cleanup_head_ref:
3704 strbuf_release(&head_ref);
3705 strbuf_release(&buf);
3706 return res;
3708 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
3709 get_oid_hex(buf.buf, &orig)) {
3710 res = error(_("could not read orig-head"));
3711 goto cleanup_head_ref;
3713 strbuf_reset(&buf);
3714 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3715 res = error(_("could not read 'onto'"));
3716 goto cleanup_head_ref;
3718 msg = reflog_message(opts, "finish", "%s onto %s",
3719 head_ref.buf, buf.buf);
3720 if (update_ref(msg, head_ref.buf, &head, &orig,
3721 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
3722 res = error(_("could not update %s"),
3723 head_ref.buf);
3724 goto cleanup_head_ref;
3726 msg = reflog_message(opts, "finish", "returning to %s",
3727 head_ref.buf);
3728 if (create_symref("HEAD", head_ref.buf, msg)) {
3729 res = error(_("could not update HEAD to %s"),
3730 head_ref.buf);
3731 goto cleanup_head_ref;
3733 strbuf_reset(&buf);
3736 if (opts->verbose) {
3737 struct rev_info log_tree_opt;
3738 struct object_id orig, head;
3740 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
3741 repo_init_revisions(r, &log_tree_opt, NULL);
3742 log_tree_opt.diff = 1;
3743 log_tree_opt.diffopt.output_format =
3744 DIFF_FORMAT_DIFFSTAT;
3745 log_tree_opt.disable_stdin = 1;
3747 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
3748 !get_oid(buf.buf, &orig) &&
3749 !get_oid("HEAD", &head)) {
3750 diff_tree_oid(&orig, &head, "",
3751 &log_tree_opt.diffopt);
3752 log_tree_diff_flush(&log_tree_opt);
3755 flush_rewritten_pending();
3756 if (!stat(rebase_path_rewritten_list(), &st) &&
3757 st.st_size > 0) {
3758 struct child_process child = CHILD_PROCESS_INIT;
3759 const char *post_rewrite_hook =
3760 find_hook("post-rewrite");
3762 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
3763 child.git_cmd = 1;
3764 argv_array_push(&child.args, "notes");
3765 argv_array_push(&child.args, "copy");
3766 argv_array_push(&child.args, "--for-rewrite=rebase");
3767 /* we don't care if this copying failed */
3768 run_command(&child);
3770 if (post_rewrite_hook) {
3771 struct child_process hook = CHILD_PROCESS_INIT;
3773 hook.in = open(rebase_path_rewritten_list(),
3774 O_RDONLY);
3775 hook.stdout_to_stderr = 1;
3776 argv_array_push(&hook.args, post_rewrite_hook);
3777 argv_array_push(&hook.args, "rebase");
3778 /* we don't care if this hook failed */
3779 run_command(&hook);
3782 apply_autostash(opts);
3784 fprintf(stderr, "Successfully rebased and updated %s.\n",
3785 head_ref.buf);
3787 strbuf_release(&buf);
3788 strbuf_release(&head_ref);
3792 * Sequence of picks finished successfully; cleanup by
3793 * removing the .git/sequencer directory
3795 return sequencer_remove_state(opts);
3798 static int continue_single_pick(struct repository *r)
3800 const char *argv[] = { "commit", NULL };
3802 if (!file_exists(git_path_cherry_pick_head(r)) &&
3803 !file_exists(git_path_revert_head(r)))
3804 return error(_("no cherry-pick or revert in progress"));
3805 return run_command_v_opt(argv, RUN_GIT_CMD);
3808 static int commit_staged_changes(struct repository *r,
3809 struct replay_opts *opts,
3810 struct todo_list *todo_list)
3812 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
3813 unsigned int final_fixup = 0, is_clean;
3815 if (has_unstaged_changes(r, 1))
3816 return error(_("cannot rebase: You have unstaged changes."));
3818 is_clean = !has_uncommitted_changes(r, 0);
3820 if (file_exists(rebase_path_amend())) {
3821 struct strbuf rev = STRBUF_INIT;
3822 struct object_id head, to_amend;
3824 if (get_oid("HEAD", &head))
3825 return error(_("cannot amend non-existing commit"));
3826 if (!read_oneliner(&rev, rebase_path_amend(), 0))
3827 return error(_("invalid file: '%s'"), rebase_path_amend());
3828 if (get_oid_hex(rev.buf, &to_amend))
3829 return error(_("invalid contents: '%s'"),
3830 rebase_path_amend());
3831 if (!is_clean && !oideq(&head, &to_amend))
3832 return error(_("\nYou have uncommitted changes in your "
3833 "working tree. Please, commit them\n"
3834 "first and then run 'git rebase "
3835 "--continue' again."));
3837 * When skipping a failed fixup/squash, we need to edit the
3838 * commit message, the current fixup list and count, and if it
3839 * was the last fixup/squash in the chain, we need to clean up
3840 * the commit message and if there was a squash, let the user
3841 * edit it.
3843 if (!is_clean || !opts->current_fixup_count)
3844 ; /* this is not the final fixup */
3845 else if (!oideq(&head, &to_amend) ||
3846 !file_exists(rebase_path_stopped_sha())) {
3847 /* was a final fixup or squash done manually? */
3848 if (!is_fixup(peek_command(todo_list, 0))) {
3849 unlink(rebase_path_fixup_msg());
3850 unlink(rebase_path_squash_msg());
3851 unlink(rebase_path_current_fixups());
3852 strbuf_reset(&opts->current_fixups);
3853 opts->current_fixup_count = 0;
3855 } else {
3856 /* we are in a fixup/squash chain */
3857 const char *p = opts->current_fixups.buf;
3858 int len = opts->current_fixups.len;
3860 opts->current_fixup_count--;
3861 if (!len)
3862 BUG("Incorrect current_fixups:\n%s", p);
3863 while (len && p[len - 1] != '\n')
3864 len--;
3865 strbuf_setlen(&opts->current_fixups, len);
3866 if (write_message(p, len, rebase_path_current_fixups(),
3867 0) < 0)
3868 return error(_("could not write file: '%s'"),
3869 rebase_path_current_fixups());
3872 * If a fixup/squash in a fixup/squash chain failed, the
3873 * commit message is already correct, no need to commit
3874 * it again.
3876 * Only if it is the final command in the fixup/squash
3877 * chain, and only if the chain is longer than a single
3878 * fixup/squash command (which was just skipped), do we
3879 * actually need to re-commit with a cleaned up commit
3880 * message.
3882 if (opts->current_fixup_count > 0 &&
3883 !is_fixup(peek_command(todo_list, 0))) {
3884 final_fixup = 1;
3886 * If there was not a single "squash" in the
3887 * chain, we only need to clean up the commit
3888 * message, no need to bother the user with
3889 * opening the commit message in the editor.
3891 if (!starts_with(p, "squash ") &&
3892 !strstr(p, "\nsquash "))
3893 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
3894 } else if (is_fixup(peek_command(todo_list, 0))) {
3896 * We need to update the squash message to skip
3897 * the latest commit message.
3899 struct commit *commit;
3900 const char *path = rebase_path_squash_msg();
3902 if (parse_head(r, &commit) ||
3903 !(p = get_commit_buffer(commit, NULL)) ||
3904 write_message(p, strlen(p), path, 0)) {
3905 unuse_commit_buffer(commit, p);
3906 return error(_("could not write file: "
3907 "'%s'"), path);
3909 unuse_commit_buffer(commit, p);
3913 strbuf_release(&rev);
3914 flags |= AMEND_MSG;
3917 if (is_clean) {
3918 const char *cherry_pick_head = git_path_cherry_pick_head(r);
3920 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
3921 return error(_("could not remove CHERRY_PICK_HEAD"));
3922 if (!final_fixup)
3923 return 0;
3926 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
3927 opts, flags))
3928 return error(_("could not commit staged changes."));
3929 unlink(rebase_path_amend());
3930 unlink(git_path_merge_head(the_repository));
3931 if (final_fixup) {
3932 unlink(rebase_path_fixup_msg());
3933 unlink(rebase_path_squash_msg());
3935 if (opts->current_fixup_count > 0) {
3937 * Whether final fixup or not, we just cleaned up the commit
3938 * message...
3940 unlink(rebase_path_current_fixups());
3941 strbuf_reset(&opts->current_fixups);
3942 opts->current_fixup_count = 0;
3944 return 0;
3947 int sequencer_continue(struct repository *r, struct replay_opts *opts)
3949 struct todo_list todo_list = TODO_LIST_INIT;
3950 int res;
3952 if (read_and_refresh_cache(r, opts))
3953 return -1;
3955 if (read_populate_opts(opts))
3956 return -1;
3957 if (is_rebase_i(opts)) {
3958 if ((res = read_populate_todo(r, &todo_list, opts)))
3959 goto release_todo_list;
3960 if (commit_staged_changes(r, opts, &todo_list))
3961 return -1;
3962 } else if (!file_exists(get_todo_path(opts)))
3963 return continue_single_pick(r);
3964 else if ((res = read_populate_todo(r, &todo_list, opts)))
3965 goto release_todo_list;
3967 if (!is_rebase_i(opts)) {
3968 /* Verify that the conflict has been resolved */
3969 if (file_exists(git_path_cherry_pick_head(r)) ||
3970 file_exists(git_path_revert_head(r))) {
3971 res = continue_single_pick(r);
3972 if (res)
3973 goto release_todo_list;
3975 if (index_differs_from(r, "HEAD", NULL, 0)) {
3976 res = error_dirty_index(r->index, opts);
3977 goto release_todo_list;
3979 todo_list.current++;
3980 } else if (file_exists(rebase_path_stopped_sha())) {
3981 struct strbuf buf = STRBUF_INIT;
3982 struct object_id oid;
3984 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
3985 !get_oid_committish(buf.buf, &oid))
3986 record_in_rewritten(&oid, peek_command(&todo_list, 0));
3987 strbuf_release(&buf);
3990 res = pick_commits(r, &todo_list, opts);
3991 release_todo_list:
3992 todo_list_release(&todo_list);
3993 return res;
3996 static int single_pick(struct repository *r,
3997 struct commit *cmit,
3998 struct replay_opts *opts)
4000 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
4001 return do_pick_commit(r, opts->action == REPLAY_PICK ?
4002 TODO_PICK : TODO_REVERT, cmit, opts, 0);
4005 int sequencer_pick_revisions(struct repository *r,
4006 struct replay_opts *opts)
4008 struct todo_list todo_list = TODO_LIST_INIT;
4009 struct object_id oid;
4010 int i, res;
4012 assert(opts->revs);
4013 if (read_and_refresh_cache(r, opts))
4014 return -1;
4016 for (i = 0; i < opts->revs->pending.nr; i++) {
4017 struct object_id oid;
4018 const char *name = opts->revs->pending.objects[i].name;
4020 /* This happens when using --stdin. */
4021 if (!strlen(name))
4022 continue;
4024 if (!get_oid(name, &oid)) {
4025 if (!lookup_commit_reference_gently(r, &oid, 1)) {
4026 enum object_type type = oid_object_info(r,
4027 &oid,
4028 NULL);
4029 return error(_("%s: can't cherry-pick a %s"),
4030 name, type_name(type));
4032 } else
4033 return error(_("%s: bad revision"), name);
4037 * If we were called as "git cherry-pick <commit>", just
4038 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4039 * REVERT_HEAD, and don't touch the sequencer state.
4040 * This means it is possible to cherry-pick in the middle
4041 * of a cherry-pick sequence.
4043 if (opts->revs->cmdline.nr == 1 &&
4044 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4045 opts->revs->no_walk &&
4046 !opts->revs->cmdline.rev->flags) {
4047 struct commit *cmit;
4048 if (prepare_revision_walk(opts->revs))
4049 return error(_("revision walk setup failed"));
4050 cmit = get_revision(opts->revs);
4051 if (!cmit)
4052 return error(_("empty commit set passed"));
4053 if (get_revision(opts->revs))
4054 BUG("unexpected extra commit from walk");
4055 return single_pick(r, cmit, opts);
4059 * Start a new cherry-pick/ revert sequence; but
4060 * first, make sure that an existing one isn't in
4061 * progress
4064 if (walk_revs_populate_todo(&todo_list, opts) ||
4065 create_seq_dir() < 0)
4066 return -1;
4067 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
4068 return error(_("can't revert as initial commit"));
4069 if (save_head(oid_to_hex(&oid)))
4070 return -1;
4071 if (save_opts(opts))
4072 return -1;
4073 update_abort_safety_file();
4074 res = pick_commits(r, &todo_list, opts);
4075 todo_list_release(&todo_list);
4076 return res;
4079 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
4081 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
4082 struct strbuf sob = STRBUF_INIT;
4083 int has_footer;
4085 strbuf_addstr(&sob, sign_off_header);
4086 strbuf_addstr(&sob, fmt_name(getenv("GIT_COMMITTER_NAME"),
4087 getenv("GIT_COMMITTER_EMAIL")));
4088 strbuf_addch(&sob, '\n');
4090 if (!ignore_footer)
4091 strbuf_complete_line(msgbuf);
4094 * If the whole message buffer is equal to the sob, pretend that we
4095 * found a conforming footer with a matching sob
4097 if (msgbuf->len - ignore_footer == sob.len &&
4098 !strncmp(msgbuf->buf, sob.buf, sob.len))
4099 has_footer = 3;
4100 else
4101 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4103 if (!has_footer) {
4104 const char *append_newlines = NULL;
4105 size_t len = msgbuf->len - ignore_footer;
4107 if (!len) {
4109 * The buffer is completely empty. Leave foom for
4110 * the title and body to be filled in by the user.
4112 append_newlines = "\n\n";
4113 } else if (len == 1) {
4115 * Buffer contains a single newline. Add another
4116 * so that we leave room for the title and body.
4118 append_newlines = "\n";
4119 } else if (msgbuf->buf[len - 2] != '\n') {
4121 * Buffer ends with a single newline. Add another
4122 * so that there is an empty line between the message
4123 * body and the sob.
4125 append_newlines = "\n";
4126 } /* else, the buffer already ends with two newlines. */
4128 if (append_newlines)
4129 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4130 append_newlines, strlen(append_newlines));
4133 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4134 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4135 sob.buf, sob.len);
4137 strbuf_release(&sob);
4140 struct labels_entry {
4141 struct hashmap_entry entry;
4142 char label[FLEX_ARRAY];
4145 static int labels_cmp(const void *fndata, const struct labels_entry *a,
4146 const struct labels_entry *b, const void *key)
4148 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4151 struct string_entry {
4152 struct oidmap_entry entry;
4153 char string[FLEX_ARRAY];
4156 struct label_state {
4157 struct oidmap commit2label;
4158 struct hashmap labels;
4159 struct strbuf buf;
4162 static const char *label_oid(struct object_id *oid, const char *label,
4163 struct label_state *state)
4165 struct labels_entry *labels_entry;
4166 struct string_entry *string_entry;
4167 struct object_id dummy;
4168 size_t len;
4169 int i;
4171 string_entry = oidmap_get(&state->commit2label, oid);
4172 if (string_entry)
4173 return string_entry->string;
4176 * For "uninteresting" commits, i.e. commits that are not to be
4177 * rebased, and which can therefore not be labeled, we use a unique
4178 * abbreviation of the commit name. This is slightly more complicated
4179 * than calling find_unique_abbrev() because we also need to make
4180 * sure that the abbreviation does not conflict with any other
4181 * label.
4183 * We disallow "interesting" commits to be labeled by a string that
4184 * is a valid full-length hash, to ensure that we always can find an
4185 * abbreviation for any uninteresting commit's names that does not
4186 * clash with any other label.
4188 if (!label) {
4189 char *p;
4191 strbuf_reset(&state->buf);
4192 strbuf_grow(&state->buf, GIT_SHA1_HEXSZ);
4193 label = p = state->buf.buf;
4195 find_unique_abbrev_r(p, oid, default_abbrev);
4198 * We may need to extend the abbreviated hash so that there is
4199 * no conflicting label.
4201 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4202 size_t i = strlen(p) + 1;
4204 oid_to_hex_r(p, oid);
4205 for (; i < GIT_SHA1_HEXSZ; i++) {
4206 char save = p[i];
4207 p[i] = '\0';
4208 if (!hashmap_get_from_hash(&state->labels,
4209 strihash(p), p))
4210 break;
4211 p[i] = save;
4214 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
4215 !get_oid_hex(label, &dummy)) ||
4216 (len == 1 && *label == '#') ||
4217 hashmap_get_from_hash(&state->labels,
4218 strihash(label), label)) {
4220 * If the label already exists, or if the label is a valid full
4221 * OID, or the label is a '#' (which we use as a separator
4222 * between merge heads and oneline), we append a dash and a
4223 * number to make it unique.
4225 struct strbuf *buf = &state->buf;
4227 strbuf_reset(buf);
4228 strbuf_add(buf, label, len);
4230 for (i = 2; ; i++) {
4231 strbuf_setlen(buf, len);
4232 strbuf_addf(buf, "-%d", i);
4233 if (!hashmap_get_from_hash(&state->labels,
4234 strihash(buf->buf),
4235 buf->buf))
4236 break;
4239 label = buf->buf;
4242 FLEX_ALLOC_STR(labels_entry, label, label);
4243 hashmap_entry_init(labels_entry, strihash(label));
4244 hashmap_add(&state->labels, labels_entry);
4246 FLEX_ALLOC_STR(string_entry, string, label);
4247 oidcpy(&string_entry->entry.oid, oid);
4248 oidmap_put(&state->commit2label, string_entry);
4250 return string_entry->string;
4253 static int make_script_with_merges(struct pretty_print_context *pp,
4254 struct rev_info *revs, FILE *out,
4255 unsigned flags)
4257 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4258 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
4259 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4260 struct strbuf label = STRBUF_INIT;
4261 struct commit_list *commits = NULL, **tail = &commits, *iter;
4262 struct commit_list *tips = NULL, **tips_tail = &tips;
4263 struct commit *commit;
4264 struct oidmap commit2todo = OIDMAP_INIT;
4265 struct string_entry *entry;
4266 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4267 shown = OIDSET_INIT;
4268 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4270 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4271 const char *cmd_pick = abbr ? "p" : "pick",
4272 *cmd_label = abbr ? "l" : "label",
4273 *cmd_reset = abbr ? "t" : "reset",
4274 *cmd_merge = abbr ? "m" : "merge";
4276 oidmap_init(&commit2todo, 0);
4277 oidmap_init(&state.commit2label, 0);
4278 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4279 strbuf_init(&state.buf, 32);
4281 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4282 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4283 FLEX_ALLOC_STR(entry, string, "onto");
4284 oidcpy(&entry->entry.oid, oid);
4285 oidmap_put(&state.commit2label, entry);
4289 * First phase:
4290 * - get onelines for all commits
4291 * - gather all branch tips (i.e. 2nd or later parents of merges)
4292 * - label all branch tips
4294 while ((commit = get_revision(revs))) {
4295 struct commit_list *to_merge;
4296 const char *p1, *p2;
4297 struct object_id *oid;
4298 int is_empty;
4300 tail = &commit_list_insert(commit, tail)->next;
4301 oidset_insert(&interesting, &commit->object.oid);
4303 is_empty = is_original_commit_empty(commit);
4304 if (!is_empty && (commit->object.flags & PATCHSAME))
4305 continue;
4307 strbuf_reset(&oneline);
4308 pretty_print_commit(pp, commit, &oneline);
4310 to_merge = commit->parents ? commit->parents->next : NULL;
4311 if (!to_merge) {
4312 /* non-merge commit: easy case */
4313 strbuf_reset(&buf);
4314 if (!keep_empty && is_empty)
4315 strbuf_addf(&buf, "%c ", comment_line_char);
4316 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4317 oid_to_hex(&commit->object.oid),
4318 oneline.buf);
4320 FLEX_ALLOC_STR(entry, string, buf.buf);
4321 oidcpy(&entry->entry.oid, &commit->object.oid);
4322 oidmap_put(&commit2todo, entry);
4324 continue;
4327 /* Create a label */
4328 strbuf_reset(&label);
4329 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4330 (p1 = strchr(p1, '\'')) &&
4331 (p2 = strchr(++p1, '\'')))
4332 strbuf_add(&label, p1, p2 - p1);
4333 else if (skip_prefix(oneline.buf, "Merge pull request ",
4334 &p1) &&
4335 (p1 = strstr(p1, " from ")))
4336 strbuf_addstr(&label, p1 + strlen(" from "));
4337 else
4338 strbuf_addbuf(&label, &oneline);
4340 for (p1 = label.buf; *p1; p1++)
4341 if (isspace(*p1))
4342 *(char *)p1 = '-';
4344 strbuf_reset(&buf);
4345 strbuf_addf(&buf, "%s -C %s",
4346 cmd_merge, oid_to_hex(&commit->object.oid));
4348 /* label the tips of merged branches */
4349 for (; to_merge; to_merge = to_merge->next) {
4350 oid = &to_merge->item->object.oid;
4351 strbuf_addch(&buf, ' ');
4353 if (!oidset_contains(&interesting, oid)) {
4354 strbuf_addstr(&buf, label_oid(oid, NULL,
4355 &state));
4356 continue;
4359 tips_tail = &commit_list_insert(to_merge->item,
4360 tips_tail)->next;
4362 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4364 strbuf_addf(&buf, " # %s", oneline.buf);
4366 FLEX_ALLOC_STR(entry, string, buf.buf);
4367 oidcpy(&entry->entry.oid, &commit->object.oid);
4368 oidmap_put(&commit2todo, entry);
4372 * Second phase:
4373 * - label branch points
4374 * - add HEAD to the branch tips
4376 for (iter = commits; iter; iter = iter->next) {
4377 struct commit_list *parent = iter->item->parents;
4378 for (; parent; parent = parent->next) {
4379 struct object_id *oid = &parent->item->object.oid;
4380 if (!oidset_contains(&interesting, oid))
4381 continue;
4382 if (oidset_insert(&child_seen, oid))
4383 label_oid(oid, "branch-point", &state);
4386 /* Add HEAD as implict "tip of branch" */
4387 if (!iter->next)
4388 tips_tail = &commit_list_insert(iter->item,
4389 tips_tail)->next;
4393 * Third phase: output the todo list. This is a bit tricky, as we
4394 * want to avoid jumping back and forth between revisions. To
4395 * accomplish that goal, we walk backwards from the branch tips,
4396 * gathering commits not yet shown, reversing the list on the fly,
4397 * then outputting that list (labeling revisions as needed).
4399 fprintf(out, "%s onto\n", cmd_label);
4400 for (iter = tips; iter; iter = iter->next) {
4401 struct commit_list *list = NULL, *iter2;
4403 commit = iter->item;
4404 if (oidset_contains(&shown, &commit->object.oid))
4405 continue;
4406 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4408 if (entry)
4409 fprintf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
4410 else
4411 fprintf(out, "\n");
4413 while (oidset_contains(&interesting, &commit->object.oid) &&
4414 !oidset_contains(&shown, &commit->object.oid)) {
4415 commit_list_insert(commit, &list);
4416 if (!commit->parents) {
4417 commit = NULL;
4418 break;
4420 commit = commit->parents->item;
4423 if (!commit)
4424 fprintf(out, "%s %s\n", cmd_reset,
4425 rebase_cousins ? "onto" : "[new root]");
4426 else {
4427 const char *to = NULL;
4429 entry = oidmap_get(&state.commit2label,
4430 &commit->object.oid);
4431 if (entry)
4432 to = entry->string;
4433 else if (!rebase_cousins)
4434 to = label_oid(&commit->object.oid, NULL,
4435 &state);
4437 if (!to || !strcmp(to, "onto"))
4438 fprintf(out, "%s onto\n", cmd_reset);
4439 else {
4440 strbuf_reset(&oneline);
4441 pretty_print_commit(pp, commit, &oneline);
4442 fprintf(out, "%s %s # %s\n",
4443 cmd_reset, to, oneline.buf);
4447 for (iter2 = list; iter2; iter2 = iter2->next) {
4448 struct object_id *oid = &iter2->item->object.oid;
4449 entry = oidmap_get(&commit2todo, oid);
4450 /* only show if not already upstream */
4451 if (entry)
4452 fprintf(out, "%s\n", entry->string);
4453 entry = oidmap_get(&state.commit2label, oid);
4454 if (entry)
4455 fprintf(out, "%s %s\n",
4456 cmd_label, entry->string);
4457 oidset_insert(&shown, oid);
4460 free_commit_list(list);
4463 free_commit_list(commits);
4464 free_commit_list(tips);
4466 strbuf_release(&label);
4467 strbuf_release(&oneline);
4468 strbuf_release(&buf);
4470 oidmap_free(&commit2todo, 1);
4471 oidmap_free(&state.commit2label, 1);
4472 hashmap_free(&state.labels, 1);
4473 strbuf_release(&state.buf);
4475 return 0;
4478 int sequencer_make_script(struct repository *r, FILE *out,
4479 int argc, const char **argv,
4480 unsigned flags)
4482 char *format = NULL;
4483 struct pretty_print_context pp = {0};
4484 struct strbuf buf = STRBUF_INIT;
4485 struct rev_info revs;
4486 struct commit *commit;
4487 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
4488 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
4489 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
4491 repo_init_revisions(r, &revs, NULL);
4492 revs.verbose_header = 1;
4493 if (!rebase_merges)
4494 revs.max_parents = 1;
4495 revs.cherry_mark = 1;
4496 revs.limited = 1;
4497 revs.reverse = 1;
4498 revs.right_only = 1;
4499 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4500 revs.topo_order = 1;
4502 revs.pretty_given = 1;
4503 git_config_get_string("rebase.instructionFormat", &format);
4504 if (!format || !*format) {
4505 free(format);
4506 format = xstrdup("%s");
4508 get_commit_format(format, &revs);
4509 free(format);
4510 pp.fmt = revs.commit_format;
4511 pp.output_encoding = get_log_output_encoding();
4513 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4514 return error(_("make_script: unhandled options"));
4516 if (prepare_revision_walk(&revs) < 0)
4517 return error(_("make_script: error preparing revisions"));
4519 if (rebase_merges)
4520 return make_script_with_merges(&pp, &revs, out, flags);
4522 while ((commit = get_revision(&revs))) {
4523 int is_empty = is_original_commit_empty(commit);
4525 if (!is_empty && (commit->object.flags & PATCHSAME))
4526 continue;
4527 strbuf_reset(&buf);
4528 if (!keep_empty && is_empty)
4529 strbuf_addf(&buf, "%c ", comment_line_char);
4530 strbuf_addf(&buf, "%s %s ", insn,
4531 oid_to_hex(&commit->object.oid));
4532 pretty_print_commit(&pp, commit, &buf);
4533 strbuf_addch(&buf, '\n');
4534 fputs(buf.buf, out);
4536 strbuf_release(&buf);
4537 return 0;
4541 * Add commands after pick and (series of) squash/fixup commands
4542 * in the todo list.
4544 int sequencer_add_exec_commands(struct repository *r,
4545 const char *commands)
4547 const char *todo_file = rebase_path_todo();
4548 struct todo_list todo_list = TODO_LIST_INIT;
4549 struct strbuf *buf = &todo_list.buf;
4550 size_t offset = 0, commands_len = strlen(commands);
4551 int i, insert;
4553 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4554 return error(_("could not read '%s'."), todo_file);
4556 if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
4557 todo_list_release(&todo_list);
4558 return error(_("unusable todo list: '%s'"), todo_file);
4562 * Insert <commands> after every pick. Here, fixup/squash chains
4563 * are considered part of the pick, so we insert the commands *after*
4564 * those chains if there are any.
4566 insert = -1;
4567 for (i = 0; i < todo_list.nr; i++) {
4568 enum todo_command command = todo_list.items[i].command;
4570 if (insert >= 0) {
4571 /* skip fixup/squash chains */
4572 if (command == TODO_COMMENT)
4573 continue;
4574 else if (is_fixup(command)) {
4575 insert = i + 1;
4576 continue;
4578 strbuf_insert(buf,
4579 todo_list.items[insert].offset_in_buf +
4580 offset, commands, commands_len);
4581 offset += commands_len;
4582 insert = -1;
4585 if (command == TODO_PICK || command == TODO_MERGE)
4586 insert = i + 1;
4589 /* insert or append final <commands> */
4590 if (insert >= 0 && insert < todo_list.nr)
4591 strbuf_insert(buf, todo_list.items[insert].offset_in_buf +
4592 offset, commands, commands_len);
4593 else if (insert >= 0 || !offset)
4594 strbuf_add(buf, commands, commands_len);
4596 i = write_message(buf->buf, buf->len, todo_file, 0);
4597 todo_list_release(&todo_list);
4598 return i;
4601 int transform_todos(struct repository *r, unsigned flags)
4603 const char *todo_file = rebase_path_todo();
4604 struct todo_list todo_list = TODO_LIST_INIT;
4605 struct strbuf buf = STRBUF_INIT;
4606 struct todo_item *item;
4607 int i;
4609 if (strbuf_read_file(&todo_list.buf, todo_file, 0) < 0)
4610 return error(_("could not read '%s'."), todo_file);
4612 if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list)) {
4613 todo_list_release(&todo_list);
4614 return error(_("unusable todo list: '%s'"), todo_file);
4617 for (item = todo_list.items, i = 0; i < todo_list.nr; i++, item++) {
4618 /* if the item is not a command write it and continue */
4619 if (item->command >= TODO_COMMENT) {
4620 strbuf_addf(&buf, "%.*s\n", item->arg_len, item->arg);
4621 continue;
4624 /* add command to the buffer */
4625 if (flags & TODO_LIST_ABBREVIATE_CMDS)
4626 strbuf_addch(&buf, command_to_char(item->command));
4627 else
4628 strbuf_addstr(&buf, command_to_string(item->command));
4630 /* add commit id */
4631 if (item->commit) {
4632 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
4633 short_commit_name(item->commit) :
4634 oid_to_hex(&item->commit->object.oid);
4636 if (item->command == TODO_MERGE) {
4637 if (item->flags & TODO_EDIT_MERGE_MSG)
4638 strbuf_addstr(&buf, " -c");
4639 else
4640 strbuf_addstr(&buf, " -C");
4643 strbuf_addf(&buf, " %s", oid);
4646 /* add all the rest */
4647 if (!item->arg_len)
4648 strbuf_addch(&buf, '\n');
4649 else
4650 strbuf_addf(&buf, " %.*s\n", item->arg_len, item->arg);
4653 i = write_message(buf.buf, buf.len, todo_file, 0);
4654 todo_list_release(&todo_list);
4655 return i;
4658 enum missing_commit_check_level get_missing_commit_check_level(void)
4660 const char *value;
4662 if (git_config_get_value("rebase.missingcommitscheck", &value) ||
4663 !strcasecmp("ignore", value))
4664 return MISSING_COMMIT_CHECK_IGNORE;
4665 if (!strcasecmp("warn", value))
4666 return MISSING_COMMIT_CHECK_WARN;
4667 if (!strcasecmp("error", value))
4668 return MISSING_COMMIT_CHECK_ERROR;
4669 warning(_("unrecognized setting %s for option "
4670 "rebase.missingCommitsCheck. Ignoring."), value);
4671 return MISSING_COMMIT_CHECK_IGNORE;
4674 define_commit_slab(commit_seen, unsigned char);
4676 * Check if the user dropped some commits by mistake
4677 * Behaviour determined by rebase.missingCommitsCheck.
4678 * Check if there is an unrecognized command or a
4679 * bad SHA-1 in a command.
4681 int check_todo_list(struct repository *r)
4683 enum missing_commit_check_level check_level = get_missing_commit_check_level();
4684 struct strbuf todo_file = STRBUF_INIT;
4685 struct todo_list todo_list = TODO_LIST_INIT;
4686 struct strbuf missing = STRBUF_INIT;
4687 int advise_to_edit_todo = 0, res = 0, i;
4688 struct commit_seen commit_seen;
4690 init_commit_seen(&commit_seen);
4692 strbuf_addstr(&todo_file, rebase_path_todo());
4693 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4694 res = -1;
4695 goto leave_check;
4697 advise_to_edit_todo = res =
4698 parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
4700 if (res || check_level == MISSING_COMMIT_CHECK_IGNORE)
4701 goto leave_check;
4703 /* Mark the commits in git-rebase-todo as seen */
4704 for (i = 0; i < todo_list.nr; i++) {
4705 struct commit *commit = todo_list.items[i].commit;
4706 if (commit)
4707 *commit_seen_at(&commit_seen, commit) = 1;
4710 todo_list_release(&todo_list);
4711 strbuf_addstr(&todo_file, ".backup");
4712 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file.buf) < 0) {
4713 res = -1;
4714 goto leave_check;
4716 strbuf_release(&todo_file);
4717 res = !!parse_insn_buffer(r, todo_list.buf.buf, &todo_list);
4719 /* Find commits in git-rebase-todo.backup yet unseen */
4720 for (i = todo_list.nr - 1; i >= 0; i--) {
4721 struct todo_item *item = todo_list.items + i;
4722 struct commit *commit = item->commit;
4723 if (commit && !*commit_seen_at(&commit_seen, commit)) {
4724 strbuf_addf(&missing, " - %s %.*s\n",
4725 short_commit_name(commit),
4726 item->arg_len, item->arg);
4727 *commit_seen_at(&commit_seen, commit) = 1;
4731 /* Warn about missing commits */
4732 if (!missing.len)
4733 goto leave_check;
4735 if (check_level == MISSING_COMMIT_CHECK_ERROR)
4736 advise_to_edit_todo = res = 1;
4738 fprintf(stderr,
4739 _("Warning: some commits may have been dropped accidentally.\n"
4740 "Dropped commits (newer to older):\n"));
4742 /* Make the list user-friendly and display */
4743 fputs(missing.buf, stderr);
4744 strbuf_release(&missing);
4746 fprintf(stderr, _("To avoid this message, use \"drop\" to "
4747 "explicitly remove a commit.\n\n"
4748 "Use 'git config rebase.missingCommitsCheck' to change "
4749 "the level of warnings.\n"
4750 "The possible behaviours are: ignore, warn, error.\n\n"));
4752 leave_check:
4753 clear_commit_seen(&commit_seen);
4754 strbuf_release(&todo_file);
4755 todo_list_release(&todo_list);
4757 if (advise_to_edit_todo)
4758 fprintf(stderr,
4759 _("You can fix this with 'git rebase --edit-todo' "
4760 "and then run 'git rebase --continue'.\n"
4761 "Or you can abort the rebase with 'git rebase"
4762 " --abort'.\n"));
4764 return res;
4767 static int rewrite_file(const char *path, const char *buf, size_t len)
4769 int rc = 0;
4770 int fd = open(path, O_WRONLY | O_TRUNC);
4771 if (fd < 0)
4772 return error_errno(_("could not open '%s' for writing"), path);
4773 if (write_in_full(fd, buf, len) < 0)
4774 rc = error_errno(_("could not write to '%s'"), path);
4775 if (close(fd) && !rc)
4776 rc = error_errno(_("could not close '%s'"), path);
4777 return rc;
4780 /* skip picking commits whose parents are unchanged */
4781 static int skip_unnecessary_picks(struct repository *r, struct object_id *output_oid)
4783 const char *todo_file = rebase_path_todo();
4784 struct strbuf buf = STRBUF_INIT;
4785 struct todo_list todo_list = TODO_LIST_INIT;
4786 struct object_id *parent_oid;
4787 int fd, i;
4789 if (!read_oneliner(&buf, rebase_path_onto(), 0))
4790 return error(_("could not read 'onto'"));
4791 if (get_oid(buf.buf, output_oid)) {
4792 strbuf_release(&buf);
4793 return error(_("need a HEAD to fixup"));
4795 strbuf_release(&buf);
4797 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4798 return -1;
4799 if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
4800 todo_list_release(&todo_list);
4801 return -1;
4804 for (i = 0; i < todo_list.nr; i++) {
4805 struct todo_item *item = todo_list.items + i;
4807 if (item->command >= TODO_NOOP)
4808 continue;
4809 if (item->command != TODO_PICK)
4810 break;
4811 if (parse_commit(item->commit)) {
4812 todo_list_release(&todo_list);
4813 return error(_("could not parse commit '%s'"),
4814 oid_to_hex(&item->commit->object.oid));
4816 if (!item->commit->parents)
4817 break; /* root commit */
4818 if (item->commit->parents->next)
4819 break; /* merge commit */
4820 parent_oid = &item->commit->parents->item->object.oid;
4821 if (!oideq(parent_oid, output_oid))
4822 break;
4823 oidcpy(output_oid, &item->commit->object.oid);
4825 if (i > 0) {
4826 int offset = get_item_line_offset(&todo_list, i);
4827 const char *done_path = rebase_path_done();
4829 fd = open(done_path, O_CREAT | O_WRONLY | O_APPEND, 0666);
4830 if (fd < 0) {
4831 error_errno(_("could not open '%s' for writing"),
4832 done_path);
4833 todo_list_release(&todo_list);
4834 return -1;
4836 if (write_in_full(fd, todo_list.buf.buf, offset) < 0) {
4837 error_errno(_("could not write to '%s'"), done_path);
4838 todo_list_release(&todo_list);
4839 close(fd);
4840 return -1;
4842 close(fd);
4844 if (rewrite_file(rebase_path_todo(), todo_list.buf.buf + offset,
4845 todo_list.buf.len - offset) < 0) {
4846 todo_list_release(&todo_list);
4847 return -1;
4850 todo_list.current = i;
4851 if (is_fixup(peek_command(&todo_list, 0)))
4852 record_in_rewritten(output_oid, peek_command(&todo_list, 0));
4855 todo_list_release(&todo_list);
4857 return 0;
4860 int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
4861 const char *shortrevisions, const char *onto_name,
4862 const char *onto, const char *orig_head, const char *cmd,
4863 unsigned autosquash)
4865 const char *shortonto, *todo_file = rebase_path_todo();
4866 struct todo_list todo_list = TODO_LIST_INIT;
4867 struct strbuf *buf = &(todo_list.buf);
4868 struct object_id oid;
4869 struct stat st;
4871 get_oid(onto, &oid);
4872 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
4874 if (!lstat(todo_file, &st) && st.st_size == 0 &&
4875 write_message("noop\n", 5, todo_file, 0))
4876 return -1;
4878 if (autosquash && rearrange_squash(r))
4879 return -1;
4881 if (cmd && *cmd)
4882 sequencer_add_exec_commands(r, cmd);
4884 if (strbuf_read_file(buf, todo_file, 0) < 0)
4885 return error_errno(_("could not read '%s'."), todo_file);
4887 if (parse_insn_buffer(r, buf->buf, &todo_list)) {
4888 todo_list_release(&todo_list);
4889 return error(_("unusable todo list: '%s'"), todo_file);
4892 if (count_commands(&todo_list) == 0) {
4893 apply_autostash(opts);
4894 sequencer_remove_state(opts);
4895 todo_list_release(&todo_list);
4897 return error(_("nothing to do"));
4900 strbuf_addch(buf, '\n');
4901 strbuf_commented_addf(buf, Q_("Rebase %s onto %s (%d command)",
4902 "Rebase %s onto %s (%d commands)",
4903 count_commands(&todo_list)),
4904 shortrevisions, shortonto, count_commands(&todo_list));
4905 append_todo_help(0, flags & TODO_LIST_KEEP_EMPTY, buf);
4907 if (write_message(buf->buf, buf->len, todo_file, 0)) {
4908 todo_list_release(&todo_list);
4909 return -1;
4912 if (copy_file(rebase_path_todo_backup(), todo_file, 0666))
4913 return error(_("could not copy '%s' to '%s'."), todo_file,
4914 rebase_path_todo_backup());
4916 if (transform_todos(r, flags | TODO_LIST_SHORTEN_IDS))
4917 return error(_("could not transform the todo list"));
4919 strbuf_reset(buf);
4921 if (launch_sequence_editor(todo_file, buf, NULL)) {
4922 apply_autostash(opts);
4923 sequencer_remove_state(opts);
4924 todo_list_release(&todo_list);
4926 return -1;
4929 strbuf_stripspace(buf, 1);
4930 if (buf->len == 0) {
4931 apply_autostash(opts);
4932 sequencer_remove_state(opts);
4933 todo_list_release(&todo_list);
4935 return error(_("nothing to do"));
4938 todo_list_release(&todo_list);
4940 if (check_todo_list(r)) {
4941 checkout_onto(opts, onto_name, onto, orig_head);
4942 return -1;
4945 if (transform_todos(r, flags & ~(TODO_LIST_SHORTEN_IDS)))
4946 return error(_("could not transform the todo list"));
4948 if (opts->allow_ff && skip_unnecessary_picks(r, &oid))
4949 return error(_("could not skip unnecessary pick commands"));
4951 if (checkout_onto(opts, onto_name, oid_to_hex(&oid), orig_head))
4952 return -1;
4954 if (require_clean_work_tree(r, "rebase", "", 1, 1))
4955 return -1;
4957 return sequencer_continue(r, opts);
4960 struct subject2item_entry {
4961 struct hashmap_entry entry;
4962 int i;
4963 char subject[FLEX_ARRAY];
4966 static int subject2item_cmp(const void *fndata,
4967 const struct subject2item_entry *a,
4968 const struct subject2item_entry *b, const void *key)
4970 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
4973 define_commit_slab(commit_todo_item, struct todo_item *);
4976 * Rearrange the todo list that has both "pick commit-id msg" and "pick
4977 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
4978 * after the former, and change "pick" to "fixup"/"squash".
4980 * Note that if the config has specified a custom instruction format, each log
4981 * message will have to be retrieved from the commit (as the oneline in the
4982 * script cannot be trusted) in order to normalize the autosquash arrangement.
4984 int rearrange_squash(struct repository *r)
4986 const char *todo_file = rebase_path_todo();
4987 struct todo_list todo_list = TODO_LIST_INIT;
4988 struct hashmap subject2item;
4989 int res = 0, rearranged = 0, *next, *tail, i;
4990 char **subjects;
4991 struct commit_todo_item commit_todo;
4993 if (strbuf_read_file_or_whine(&todo_list.buf, todo_file) < 0)
4994 return -1;
4995 if (parse_insn_buffer(r, todo_list.buf.buf, &todo_list) < 0) {
4996 todo_list_release(&todo_list);
4997 return -1;
5000 init_commit_todo_item(&commit_todo);
5002 * The hashmap maps onelines to the respective todo list index.
5004 * If any items need to be rearranged, the next[i] value will indicate
5005 * which item was moved directly after the i'th.
5007 * In that case, last[i] will indicate the index of the latest item to
5008 * be moved to appear after the i'th.
5010 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
5011 NULL, todo_list.nr);
5012 ALLOC_ARRAY(next, todo_list.nr);
5013 ALLOC_ARRAY(tail, todo_list.nr);
5014 ALLOC_ARRAY(subjects, todo_list.nr);
5015 for (i = 0; i < todo_list.nr; i++) {
5016 struct strbuf buf = STRBUF_INIT;
5017 struct todo_item *item = todo_list.items + i;
5018 const char *commit_buffer, *subject, *p;
5019 size_t subject_len;
5020 int i2 = -1;
5021 struct subject2item_entry *entry;
5023 next[i] = tail[i] = -1;
5024 if (!item->commit || item->command == TODO_DROP) {
5025 subjects[i] = NULL;
5026 continue;
5029 if (is_fixup(item->command)) {
5030 todo_list_release(&todo_list);
5031 clear_commit_todo_item(&commit_todo);
5032 return error(_("the script was already rearranged."));
5035 *commit_todo_item_at(&commit_todo, item->commit) = item;
5037 parse_commit(item->commit);
5038 commit_buffer = get_commit_buffer(item->commit, NULL);
5039 find_commit_subject(commit_buffer, &subject);
5040 format_subject(&buf, subject, " ");
5041 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5042 unuse_commit_buffer(item->commit, commit_buffer);
5043 if ((skip_prefix(subject, "fixup! ", &p) ||
5044 skip_prefix(subject, "squash! ", &p))) {
5045 struct commit *commit2;
5047 for (;;) {
5048 while (isspace(*p))
5049 p++;
5050 if (!skip_prefix(p, "fixup! ", &p) &&
5051 !skip_prefix(p, "squash! ", &p))
5052 break;
5055 if ((entry = hashmap_get_from_hash(&subject2item,
5056 strhash(p), p)))
5057 /* found by title */
5058 i2 = entry->i;
5059 else if (!strchr(p, ' ') &&
5060 (commit2 =
5061 lookup_commit_reference_by_name(p)) &&
5062 *commit_todo_item_at(&commit_todo, commit2))
5063 /* found by commit name */
5064 i2 = *commit_todo_item_at(&commit_todo, commit2)
5065 - todo_list.items;
5066 else {
5067 /* copy can be a prefix of the commit subject */
5068 for (i2 = 0; i2 < i; i2++)
5069 if (subjects[i2] &&
5070 starts_with(subjects[i2], p))
5071 break;
5072 if (i2 == i)
5073 i2 = -1;
5076 if (i2 >= 0) {
5077 rearranged = 1;
5078 todo_list.items[i].command =
5079 starts_with(subject, "fixup!") ?
5080 TODO_FIXUP : TODO_SQUASH;
5081 if (next[i2] < 0)
5082 next[i2] = i;
5083 else
5084 next[tail[i2]] = i;
5085 tail[i2] = i;
5086 } else if (!hashmap_get_from_hash(&subject2item,
5087 strhash(subject), subject)) {
5088 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5089 entry->i = i;
5090 hashmap_entry_init(entry, strhash(entry->subject));
5091 hashmap_put(&subject2item, entry);
5095 if (rearranged) {
5096 struct strbuf buf = STRBUF_INIT;
5098 for (i = 0; i < todo_list.nr; i++) {
5099 enum todo_command command = todo_list.items[i].command;
5100 int cur = i;
5103 * Initially, all commands are 'pick's. If it is a
5104 * fixup or a squash now, we have rearranged it.
5106 if (is_fixup(command))
5107 continue;
5109 while (cur >= 0) {
5110 const char *bol =
5111 get_item_line(&todo_list, cur);
5112 const char *eol =
5113 get_item_line(&todo_list, cur + 1);
5115 /* replace 'pick', by 'fixup' or 'squash' */
5116 command = todo_list.items[cur].command;
5117 if (is_fixup(command)) {
5118 strbuf_addstr(&buf,
5119 todo_command_info[command].str);
5120 bol += strcspn(bol, " \t");
5123 strbuf_add(&buf, bol, eol - bol);
5125 cur = next[cur];
5129 res = rewrite_file(todo_file, buf.buf, buf.len);
5130 strbuf_release(&buf);
5133 free(next);
5134 free(tail);
5135 for (i = 0; i < todo_list.nr; i++)
5136 free(subjects[i]);
5137 free(subjects);
5138 hashmap_free(&subject2item, 1);
5139 todo_list_release(&todo_list);
5141 clear_commit_todo_item(&commit_todo);
5142 return res;