]> git.ipfire.org Git - thirdparty/git.git/blame - sequencer.c
rebase -i: check for updated todo after squash and reword
[thirdparty/git.git] / sequencer.c
CommitLineData
26ae337b 1#include "cache.h"
b2141fc1 2#include "config.h"
697cc8ef 3#include "lockfile.h"
26ae337b 4#include "dir.h"
cbd53a21 5#include "object-store.h"
043a4492
RR
6#include "object.h"
7#include "commit.h"
0505d604 8#include "sequencer.h"
043a4492
RR
9#include "tag.h"
10#include "run-command.h"
d807c4a0 11#include "exec-cmd.h"
043a4492
RR
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"
b27cfb0d 19#include "argv-array.h"
a1c75762 20#include "quote.h"
967dfd4d 21#include "trailer.h"
56dc3ab0 22#include "log-tree.h"
311af526 23#include "wt-status.h"
c44a4c65 24#include "hashmap.h"
a87a6f3c
PW
25#include "notes-utils.h"
26#include "sigchain.h"
9055e401
JS
27#include "unpack-trees.h"
28#include "worktree.h"
1644c73c
JS
29#include "oidmap.h"
30#include "oidset.h"
8315bd20 31#include "commit-slab.h"
65b5f948 32#include "alias.h"
64043556 33#include "commit-reach.h"
b97e1873 34#include "rebase-interactive.h"
043a4492
RR
35
36#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
26ae337b 37
5fe81438 38static const char sign_off_header[] = "Signed-off-by: ";
cd650a4e 39static const char cherry_picked_prefix[] = "(cherry picked from commit ";
5ed75e2a 40
66618a50
PW
41GIT_PATH_FUNC(git_path_commit_editmsg, "COMMIT_EDITMSG")
42
8a2a0f53
JS
43GIT_PATH_FUNC(git_path_seq_dir, "sequencer")
44
45static GIT_PATH_FUNC(git_path_todo_file, "sequencer/todo")
46static GIT_PATH_FUNC(git_path_opts_file, "sequencer/opts")
47static GIT_PATH_FUNC(git_path_head_file, "sequencer/head")
1e41229d 48static GIT_PATH_FUNC(git_path_abort_safety_file, "sequencer/abort-safety")
f932729c 49
84583957
JS
50static GIT_PATH_FUNC(rebase_path, "rebase-merge")
51/*
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'.
56 */
44b776c3 57GIT_PATH_FUNC(rebase_path_todo, "rebase-merge/git-rebase-todo")
a930eb03 58GIT_PATH_FUNC(rebase_path_todo_backup, "rebase-merge/git-rebase-todo.backup")
b97e1873 59
1df6df0c
JS
60/*
61 * The rebase command lines that have already been processed. A line
62 * is moved here when it is first handled, before any associated user
63 * actions.
64 */
65static GIT_PATH_FUNC(rebase_path_done, "rebase-merge/done")
ef80069a
JS
66/*
67 * The file to keep track of how many commands were already processed (e.g.
68 * for the prompt).
69 */
9ad36356 70static GIT_PATH_FUNC(rebase_path_msgnum, "rebase-merge/msgnum")
ef80069a
JS
71/*
72 * The file to keep track of how many commands are to be processed in total
73 * (e.g. for the prompt).
74 */
9ad36356 75static GIT_PATH_FUNC(rebase_path_msgtotal, "rebase-merge/end")
6e98de72
JS
76/*
77 * The commit message that is planned to be used for any changes that
78 * need to be committed following a user interaction.
79 */
80static GIT_PATH_FUNC(rebase_path_message, "rebase-merge/message")
81/*
82 * The file into which is accumulated the suggested commit message for
83 * squash/fixup commands. When the first of a series of squash/fixups
84 * is seen, the file is created and the commit message from the
85 * previous commit and from the first squash/fixup commit are written
86 * to it. The commit message for each subsequent squash/fixup commit
87 * is appended to the file as it is processed.
6e98de72
JS
88 */
89static GIT_PATH_FUNC(rebase_path_squash_msg, "rebase-merge/message-squash")
90/*
91 * If the current series of squash/fixups has not yet included a squash
92 * command, then this file exists and holds the commit message of the
93 * original "pick" commit. (If the series ends without a "squash"
94 * command, then this can be used as the commit message of the combined
95 * commit without opening the editor.)
96 */
97static GIT_PATH_FUNC(rebase_path_fixup_msg, "rebase-merge/message-fixup")
e12a7ef5
JS
98/*
99 * This file contains the list fixup/squash commands that have been
100 * accumulated into message-fixup or message-squash so far.
101 */
102static GIT_PATH_FUNC(rebase_path_current_fixups, "rebase-merge/current-fixups")
b5a67045
JS
103/*
104 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
105 * GIT_AUTHOR_DATE that will be used for the commit that is currently
106 * being rebased.
107 */
108static GIT_PATH_FUNC(rebase_path_author_script, "rebase-merge/author-script")
56dc3ab0
JS
109/*
110 * When an "edit" rebase command is being processed, the SHA1 of the
111 * commit to be edited is recorded in this file. When "git rebase
112 * --continue" is executed, if there are any staged changes then they
113 * will be amended to the HEAD commit, but only provided the HEAD
114 * commit is still the commit to be edited. When any other rebase
115 * command is processed, this file is deleted.
116 */
117static GIT_PATH_FUNC(rebase_path_amend, "rebase-merge/amend")
118/*
119 * When we stop at a given patch via the "edit" command, this file contains
120 * the abbreviated commit name of the corresponding patch.
121 */
122static GIT_PATH_FUNC(rebase_path_stopped_sha, "rebase-merge/stopped-sha")
25cb8df9
JS
123/*
124 * For the post-rewrite hook, we make a list of rewritten commits and
125 * their new sha1s. The rewritten-pending list keeps the sha1s of
126 * commits that have been processed, but not committed yet,
127 * e.g. because they are waiting for a 'squash' command.
128 */
129static GIT_PATH_FUNC(rebase_path_rewritten_list, "rebase-merge/rewritten-list")
130static GIT_PATH_FUNC(rebase_path_rewritten_pending,
131 "rebase-merge/rewritten-pending")
9055e401 132
d87d48b2
JS
133/*
134 * The path of the file containig the OID of the "squash onto" commit, i.e.
135 * the dummy commit used for `reset [new root]`.
136 */
137static GIT_PATH_FUNC(rebase_path_squash_onto, "rebase-merge/squash-onto")
138
9055e401
JS
139/*
140 * The path of the file listing refs that need to be deleted after the rebase
141 * finishes. This is used by the `label` command to record the need for cleanup.
142 */
143static GIT_PATH_FUNC(rebase_path_refs_to_delete, "rebase-merge/refs-to-delete")
144
a1c75762
JS
145/*
146 * The following files are written by git-rebase just after parsing the
65850686 147 * command-line.
a1c75762
JS
148 */
149static GIT_PATH_FUNC(rebase_path_gpg_sign_opt, "rebase-merge/gpg_sign_opt")
556907f1
JS
150static GIT_PATH_FUNC(rebase_path_orig_head, "rebase-merge/orig-head")
151static GIT_PATH_FUNC(rebase_path_verbose, "rebase-merge/verbose")
899b49c4 152static GIT_PATH_FUNC(rebase_path_quiet, "rebase-merge/quiet")
a852ec7f 153static GIT_PATH_FUNC(rebase_path_signoff, "rebase-merge/signoff")
4b83ce9f
JS
154static GIT_PATH_FUNC(rebase_path_head_name, "rebase-merge/head-name")
155static GIT_PATH_FUNC(rebase_path_onto, "rebase-merge/onto")
796c7972 156static GIT_PATH_FUNC(rebase_path_autostash, "rebase-merge/autostash")
ca6c6b45
JS
157static GIT_PATH_FUNC(rebase_path_strategy, "rebase-merge/strategy")
158static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
9b6d7a62 159static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
d421afa0 160static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec, "rebase-merge/reschedule-failed-exec")
b5a67045 161
28d6daed
PW
162static int git_sequencer_config(const char *k, const char *v, void *cb)
163{
164 struct replay_opts *opts = cb;
165 int status;
166
167 if (!strcmp(k, "commit.cleanup")) {
168 const char *s;
169
170 status = git_config_string(&s, k, v);
171 if (status)
172 return status;
173
d74f3e58 174 if (!strcmp(s, "verbatim")) {
28d6daed 175 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
d74f3e58
PW
176 opts->explicit_cleanup = 1;
177 } else if (!strcmp(s, "whitespace")) {
28d6daed 178 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
d74f3e58
PW
179 opts->explicit_cleanup = 1;
180 } else if (!strcmp(s, "strip")) {
28d6daed 181 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
d74f3e58
PW
182 opts->explicit_cleanup = 1;
183 } else if (!strcmp(s, "scissors")) {
1a2b985f 184 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
d74f3e58
PW
185 opts->explicit_cleanup = 1;
186 } else {
28d6daed
PW
187 warning(_("invalid commit message cleanup mode '%s'"),
188 s);
d74f3e58 189 }
28d6daed 190
f40f3c16 191 free((char *)s);
28d6daed
PW
192 return status;
193 }
194
195 if (!strcmp(k, "commit.gpgsign")) {
ed1e5282 196 opts->gpg_sign = git_config_bool(k, v) ? xstrdup("") : NULL;
28d6daed
PW
197 return 0;
198 }
199
200 status = git_gpg_config(k, v, NULL);
201 if (status)
202 return status;
203
204 return git_diff_basic_config(k, v, NULL);
205}
206
207void sequencer_init_config(struct replay_opts *opts)
208{
209 opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
210 git_config(git_sequencer_config, opts);
211}
212
b5a67045
JS
213static inline int is_rebase_i(const struct replay_opts *opts)
214{
84583957 215 return opts->action == REPLAY_INTERACTIVE_REBASE;
b5a67045
JS
216}
217
285abf56
JS
218static const char *get_dir(const struct replay_opts *opts)
219{
84583957
JS
220 if (is_rebase_i(opts))
221 return rebase_path();
285abf56
JS
222 return git_path_seq_dir();
223}
224
c0246501
JS
225static const char *get_todo_path(const struct replay_opts *opts)
226{
84583957
JS
227 if (is_rebase_i(opts))
228 return rebase_path_todo();
c0246501
JS
229 return git_path_todo_file();
230}
231
bab4d109
BC
232/*
233 * Returns 0 for non-conforming footer
234 * Returns 1 for conforming footer
235 * Returns 2 when sob exists within conforming footer
236 * Returns 3 when sob exists within conforming footer as last entry
237 */
238static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
66e83d9b 239 size_t ignore_footer)
b971e04f 240{
00a21f5c 241 struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
967dfd4d 242 struct trailer_info info;
a3b636e2 243 size_t i;
967dfd4d 244 int found_sob = 0, found_sob_last = 0;
b971e04f 245
ffce7f59
JK
246 opts.no_divider = 1;
247
00a21f5c 248 trailer_info_get(&info, sb->buf, &opts);
b971e04f 249
967dfd4d 250 if (info.trailer_start == info.trailer_end)
b971e04f
BC
251 return 0;
252
967dfd4d
JT
253 for (i = 0; i < info.trailer_nr; i++)
254 if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
255 found_sob = 1;
256 if (i == info.trailer_nr - 1)
257 found_sob_last = 1;
258 }
b971e04f 259
967dfd4d 260 trailer_info_release(&info);
bab4d109 261
967dfd4d 262 if (found_sob_last)
bab4d109
BC
263 return 3;
264 if (found_sob)
265 return 2;
b971e04f
BC
266 return 1;
267}
5ed75e2a 268
a1c75762
JS
269static const char *gpg_sign_opt_quoted(struct replay_opts *opts)
270{
271 static struct strbuf buf = STRBUF_INIT;
272
273 strbuf_reset(&buf);
274 if (opts->gpg_sign)
275 sq_quotef(&buf, "-S%s", opts->gpg_sign);
276 return buf.buf;
277}
278
2863584f 279int sequencer_remove_state(struct replay_opts *opts)
26ae337b 280{
9055e401 281 struct strbuf buf = STRBUF_INIT;
37e9ee5c 282 int i, ret = 0;
03a4e260 283
9055e401
JS
284 if (is_rebase_i(opts) &&
285 strbuf_read_file(&buf, rebase_path_refs_to_delete(), 0) > 0) {
286 char *p = buf.buf;
287 while (*p) {
288 char *eol = strchr(p, '\n');
289 if (eol)
290 *eol = '\0';
37e9ee5c 291 if (delete_ref("(rebase -i) cleanup", p, NULL, 0) < 0) {
9055e401 292 warning(_("could not delete '%s'"), p);
37e9ee5c
PW
293 ret = -1;
294 }
9055e401
JS
295 if (!eol)
296 break;
297 p = eol + 1;
298 }
299 }
300
03a4e260
JS
301 free(opts->gpg_sign);
302 free(opts->strategy);
303 for (i = 0; i < opts->xopts_nr; i++)
304 free(opts->xopts[i]);
305 free(opts->xopts);
e12a7ef5 306 strbuf_release(&opts->current_fixups);
26ae337b 307
9055e401
JS
308 strbuf_reset(&buf);
309 strbuf_addstr(&buf, get_dir(opts));
37e9ee5c
PW
310 if (remove_dir_recursively(&buf, 0))
311 ret = error(_("could not remove '%s'"), buf.buf);
9055e401 312 strbuf_release(&buf);
2863584f 313
37e9ee5c 314 return ret;
26ae337b 315}
043a4492
RR
316
317static const char *action_name(const struct replay_opts *opts)
318{
84583957
JS
319 switch (opts->action) {
320 case REPLAY_REVERT:
321 return N_("revert");
322 case REPLAY_PICK:
323 return N_("cherry-pick");
324 case REPLAY_INTERACTIVE_REBASE:
325 return N_("rebase -i");
326 }
1a07e59c 327 die(_("unknown action: %d"), opts->action);
043a4492
RR
328}
329
043a4492
RR
330struct commit_message {
331 char *parent_label;
7b35eaf8
JK
332 char *label;
333 char *subject;
043a4492
RR
334 const char *message;
335};
336
39755964
JS
337static const char *short_commit_name(struct commit *commit)
338{
aab9583f 339 return find_unique_abbrev(&commit->object.oid, DEFAULT_ABBREV);
39755964
JS
340}
341
043a4492
RR
342static int get_message(struct commit *commit, struct commit_message *out)
343{
043a4492 344 const char *abbrev, *subject;
7b35eaf8 345 int subject_len;
043a4492 346
7b35eaf8 347 out->message = logmsg_reencode(commit, NULL, get_commit_output_encoding());
39755964 348 abbrev = short_commit_name(commit);
043a4492
RR
349
350 subject_len = find_commit_subject(out->message, &subject);
351
7b35eaf8
JK
352 out->subject = xmemdupz(subject, subject_len);
353 out->label = xstrfmt("%s... %s", abbrev, out->subject);
354 out->parent_label = xstrfmt("parent of %s", out->label);
355
043a4492
RR
356 return 0;
357}
358
d74a4e57 359static void free_message(struct commit *commit, struct commit_message *msg)
043a4492
RR
360{
361 free(msg->parent_label);
7b35eaf8
JK
362 free(msg->label);
363 free(msg->subject);
b66103c3 364 unuse_commit_buffer(commit, msg->message);
043a4492
RR
365}
366
005af339
NTND
367static void print_advice(struct repository *r, int show_hint,
368 struct replay_opts *opts)
043a4492
RR
369{
370 char *msg = getenv("GIT_CHERRY_PICK_HELP");
371
372 if (msg) {
373 fprintf(stderr, "%s\n", msg);
374 /*
41ccfdd9 375 * A conflict has occurred but the porcelain
043a4492
RR
376 * (typically rebase --interactive) wants to take care
377 * of the commit itself so remove CHERRY_PICK_HEAD
378 */
005af339 379 unlink(git_path_cherry_pick_head(r));
043a4492
RR
380 return;
381 }
382
ed727b19
PH
383 if (show_hint) {
384 if (opts->no_commit)
385 advise(_("after resolving the conflicts, mark the corrected paths\n"
386 "with 'git add <paths>' or 'git rm <paths>'"));
387 else
388 advise(_("after resolving the conflicts, mark the corrected paths\n"
389 "with 'git add <paths>' or 'git rm <paths>'\n"
390 "and commit the result with 'git commit'"));
391 }
043a4492
RR
392}
393
ddb81e50
AG
394static int write_message(const void *buf, size_t len, const char *filename,
395 int append_eol)
043a4492 396{
14bca6c6 397 struct lock_file msg_file = LOCK_INIT;
043a4492 398
4ef3d8f0
JS
399 int msg_fd = hold_lock_file_for_update(&msg_file, filename, 0);
400 if (msg_fd < 0)
93b3df6f 401 return error_errno(_("could not lock '%s'"), filename);
75871495 402 if (write_in_full(msg_fd, buf, len) < 0) {
bf5c0571 403 error_errno(_("could not write to '%s'"), filename);
4f66c837 404 rollback_lock_file(&msg_file);
bf5c0571 405 return -1;
4f66c837 406 }
f56fffef 407 if (append_eol && write(msg_fd, "\n", 1) < 0) {
bf5c0571 408 error_errno(_("could not write eol to '%s'"), filename);
f56fffef 409 rollback_lock_file(&msg_file);
bf5c0571 410 return -1;
f56fffef 411 }
350292a1
412 if (commit_lock_file(&msg_file) < 0)
413 return error(_("failed to finalize '%s'"), filename);
4ef3d8f0
JS
414
415 return 0;
043a4492
RR
416}
417
1dfc84e9
JS
418/*
419 * Reads a file that was presumably written by a shell script, i.e. with an
420 * end-of-line marker that needs to be stripped.
421 *
422 * Note that only the last end-of-line marker is stripped, consistent with the
423 * behavior of "$(cat path)" in a shell script.
424 *
425 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
426 */
427static int read_oneliner(struct strbuf *buf,
428 const char *path, int skip_if_empty)
429{
430 int orig_len = buf->len;
431
432 if (!file_exists(path))
433 return 0;
434
435 if (strbuf_read_file(buf, path, 0) < 0) {
436 warning_errno(_("could not read '%s'"), path);
437 return 0;
438 }
439
440 if (buf->len > orig_len && buf->buf[buf->len - 1] == '\n') {
441 if (--buf->len > orig_len && buf->buf[buf->len - 1] == '\r')
442 --buf->len;
443 buf->buf[buf->len] = '\0';
444 }
445
446 if (skip_if_empty && buf->len == orig_len)
447 return 0;
448
449 return 1;
450}
451
005af339 452static struct tree *empty_tree(struct repository *r)
043a4492 453{
005af339 454 return lookup_tree(r, the_hash_algo->empty_tree);
043a4492
RR
455}
456
e1ff0a32 457static int error_dirty_index(struct repository *repo, struct replay_opts *opts)
043a4492 458{
e1ff0a32 459 if (repo_read_index_unmerged(repo))
c28cbc5e 460 return error_resolve_conflict(_(action_name(opts)));
043a4492 461
93b3df6f 462 error(_("your local changes would be overwritten by %s."),
c28cbc5e 463 _(action_name(opts)));
043a4492
RR
464
465 if (advice_commit_before_merge)
93b3df6f 466 advise(_("commit your changes or stash them to proceed."));
043a4492
RR
467 return -1;
468}
469
1e41229d
SB
470static void update_abort_safety_file(void)
471{
472 struct object_id head;
473
474 /* Do nothing on a single-pick */
475 if (!file_exists(git_path_seq_dir()))
476 return;
477
478 if (!get_oid("HEAD", &head))
479 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head));
480 else
481 write_file(git_path_abort_safety_file(), "%s", "");
482}
483
f11c9580
NTND
484static int fast_forward_to(struct repository *r,
485 const struct object_id *to,
486 const struct object_id *from,
487 int unborn,
488 struct replay_opts *opts)
043a4492 489{
d668d16c 490 struct ref_transaction *transaction;
eb4be1cb 491 struct strbuf sb = STRBUF_INIT;
d668d16c 492 struct strbuf err = STRBUF_INIT;
043a4492 493
e1ff0a32 494 repo_read_index(r);
f11c9580 495 if (checkout_fast_forward(r, from, to, 1))
0e408fc3 496 return -1; /* the callee should have complained already */
651ab9f5 497
c28cbc5e 498 strbuf_addf(&sb, _("%s: fast-forward"), _(action_name(opts)));
d668d16c
RS
499
500 transaction = ref_transaction_begin(&err);
501 if (!transaction ||
502 ref_transaction_update(transaction, "HEAD",
d87d48b2
JS
503 to, unborn && !is_rebase_i(opts) ?
504 &null_oid : from,
1d147bdf 505 0, sb.buf, &err) ||
db7516ab 506 ref_transaction_commit(transaction, &err)) {
d668d16c
RS
507 ref_transaction_free(transaction);
508 error("%s", err.buf);
509 strbuf_release(&sb);
510 strbuf_release(&err);
511 return -1;
512 }
651ab9f5 513
eb4be1cb 514 strbuf_release(&sb);
d668d16c
RS
515 strbuf_release(&err);
516 ref_transaction_free(transaction);
1e41229d 517 update_abort_safety_file();
d668d16c 518 return 0;
043a4492
RR
519}
520
f29cd862
DL
521enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
522 int use_editor)
523{
524 if (!cleanup_arg || !strcmp(cleanup_arg, "default"))
525 return use_editor ? COMMIT_MSG_CLEANUP_ALL :
526 COMMIT_MSG_CLEANUP_SPACE;
527 else if (!strcmp(cleanup_arg, "verbatim"))
528 return COMMIT_MSG_CLEANUP_NONE;
529 else if (!strcmp(cleanup_arg, "whitespace"))
530 return COMMIT_MSG_CLEANUP_SPACE;
531 else if (!strcmp(cleanup_arg, "strip"))
532 return COMMIT_MSG_CLEANUP_ALL;
533 else if (!strcmp(cleanup_arg, "scissors"))
534 return use_editor ? COMMIT_MSG_CLEANUP_SCISSORS :
535 COMMIT_MSG_CLEANUP_SPACE;
536 else
537 die(_("Invalid cleanup mode %s"), cleanup_arg);
538}
539
dc42e9a8
PW
540/*
541 * NB using int rather than enum cleanup_mode to stop clang's
542 * -Wtautological-constant-out-of-range-compare complaining that the comparison
543 * is always true.
544 */
545static const char *describe_cleanup_mode(int cleanup_mode)
546{
547 static const char *modes[] = { "whitespace",
548 "verbatim",
549 "scissors",
550 "strip" };
551
552 if (cleanup_mode < ARRAY_SIZE(modes))
553 return modes[cleanup_mode];
554
555 BUG("invalid cleanup_mode provided (%d)", cleanup_mode);
556}
557
f11c9580 558void append_conflicts_hint(struct index_state *istate,
1a2b985f 559 struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
75c961b7
JH
560{
561 int i;
562
1a2b985f
DL
563 if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
564 strbuf_addch(msgbuf, '\n');
565 wt_status_append_cut_line(msgbuf);
566 strbuf_addch(msgbuf, comment_line_char);
567 }
568
261f315b
JH
569 strbuf_addch(msgbuf, '\n');
570 strbuf_commented_addf(msgbuf, "Conflicts:\n");
f11c9580
NTND
571 for (i = 0; i < istate->cache_nr;) {
572 const struct cache_entry *ce = istate->cache[i++];
75c961b7 573 if (ce_stage(ce)) {
261f315b 574 strbuf_commented_addf(msgbuf, "\t%s\n", ce->name);
f11c9580
NTND
575 while (i < istate->cache_nr &&
576 !strcmp(ce->name, istate->cache[i]->name))
75c961b7
JH
577 i++;
578 }
579 }
580}
581
f11c9580
NTND
582static int do_recursive_merge(struct repository *r,
583 struct commit *base, struct commit *next,
043a4492 584 const char *base_label, const char *next_label,
48be4c62 585 struct object_id *head, struct strbuf *msgbuf,
043a4492
RR
586 struct replay_opts *opts)
587{
588 struct merge_options o;
589 struct tree *result, *next_tree, *base_tree, *head_tree;
03b86647 590 int clean;
03a4e260 591 char **xopt;
14bca6c6 592 struct lock_file index_lock = LOCK_INIT;
043a4492 593
3a95f31d 594 if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
bd588867 595 return -1;
043a4492 596
e1ff0a32 597 repo_read_index(r);
043a4492 598
0d6caa2d 599 init_merge_options(&o, r);
043a4492
RR
600 o.ancestor = base ? base_label : "(empty tree)";
601 o.branch1 = "HEAD";
602 o.branch2 = next ? next_label : "(empty tree)";
62fdb652
JS
603 if (is_rebase_i(opts))
604 o.buffer_output = 2;
9268cf4a 605 o.show_rename_progress = 1;
043a4492
RR
606
607 head_tree = parse_tree_indirect(head);
005af339
NTND
608 next_tree = next ? get_commit_tree(next) : empty_tree(r);
609 base_tree = base ? get_commit_tree(base) : empty_tree(r);
043a4492
RR
610
611 for (xopt = opts->xopts; xopt != opts->xopts + opts->xopts_nr; xopt++)
612 parse_merge_opt(&o, *xopt);
613
614 clean = merge_trees(&o,
615 head_tree,
616 next_tree, base_tree, &result);
62fdb652
JS
617 if (is_rebase_i(opts) && clean <= 0)
618 fputs(o.obuf.buf, stdout);
548009c0 619 strbuf_release(&o.obuf);
b520abf1 620 diff_warn_rename_limit("merge.renamelimit", o.needed_rename_limit, 0);
64816524
621 if (clean < 0) {
622 rollback_lock_file(&index_lock);
f241ff0d 623 return clean;
64816524 624 }
043a4492 625
f11c9580 626 if (write_locked_index(r->index, &index_lock,
61000814 627 COMMIT_LOCK | SKIP_IF_UNCHANGED))
66f5f6dc
ÆAB
628 /*
629 * TRANSLATORS: %s will be "revert", "cherry-pick" or
84583957
JS
630 * "rebase -i".
631 */
c527b55e 632 return error(_("%s: Unable to write new index file"),
c28cbc5e 633 _(action_name(opts)));
043a4492 634
75c961b7 635 if (!clean)
1a2b985f
DL
636 append_conflicts_hint(r->index, msgbuf,
637 opts->default_msg_cleanup);
043a4492
RR
638
639 return !clean;
640}
641
f11c9580 642static struct object_id *get_cache_tree_oid(struct index_state *istate)
ba97aea1 643{
f11c9580
NTND
644 if (!istate->cache_tree)
645 istate->cache_tree = cache_tree();
ba97aea1 646
f11c9580
NTND
647 if (!cache_tree_fully_valid(istate->cache_tree))
648 if (cache_tree_update(istate, 0)) {
ba97aea1
JS
649 error(_("unable to update cache tree"));
650 return NULL;
651 }
652
f11c9580 653 return &istate->cache_tree->oid;
ba97aea1
JS
654}
655
005af339 656static int is_index_unchanged(struct repository *r)
b27cfb0d 657{
ba97aea1 658 struct object_id head_oid, *cache_tree_oid;
b27cfb0d 659 struct commit *head_commit;
005af339 660 struct index_state *istate = r->index;
b27cfb0d 661
49e61479 662 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &head_oid, NULL))
aee42e1f 663 return error(_("could not resolve HEAD commit"));
b27cfb0d 664
005af339 665 head_commit = lookup_commit(r, &head_oid);
4b580061
NH
666
667 /*
668 * If head_commit is NULL, check_commit, called from
669 * lookup_commit, would have indicated that head_commit is not
670 * a commit object already. parse_commit() will return failure
671 * without further complaints in such a case. Otherwise, if
672 * the commit is invalid, parse_commit() will complain. So
673 * there is nothing for us to say here. Just return failure.
674 */
675 if (parse_commit(head_commit))
676 return -1;
b27cfb0d 677
f11c9580 678 if (!(cache_tree_oid = get_cache_tree_oid(istate)))
ba97aea1 679 return -1;
b27cfb0d 680
4a7e27e9 681 return oideq(cache_tree_oid, get_commit_tree_oid(head_commit));
b27cfb0d
NH
682}
683
0473f28a
JS
684static int write_author_script(const char *message)
685{
686 struct strbuf buf = STRBUF_INIT;
687 const char *eol;
688 int res;
689
690 for (;;)
691 if (!*message || starts_with(message, "\n")) {
692missing_author:
693 /* Missing 'author' line? */
694 unlink(rebase_path_author_script());
695 return 0;
696 } else if (skip_prefix(message, "author ", &message))
697 break;
698 else if ((eol = strchr(message, '\n')))
699 message = eol + 1;
700 else
701 goto missing_author;
702
703 strbuf_addstr(&buf, "GIT_AUTHOR_NAME='");
704 while (*message && *message != '\n' && *message != '\r')
705 if (skip_prefix(message, " <", &message))
706 break;
707 else if (*message != '\'')
708 strbuf_addch(&buf, *(message++));
709 else
4aa5ff94 710 strbuf_addf(&buf, "'\\%c'", *(message++));
0473f28a
JS
711 strbuf_addstr(&buf, "'\nGIT_AUTHOR_EMAIL='");
712 while (*message && *message != '\n' && *message != '\r')
713 if (skip_prefix(message, "> ", &message))
714 break;
715 else if (*message != '\'')
716 strbuf_addch(&buf, *(message++));
717 else
4aa5ff94 718 strbuf_addf(&buf, "'\\%c'", *(message++));
0473f28a
JS
719 strbuf_addstr(&buf, "'\nGIT_AUTHOR_DATE='@");
720 while (*message && *message != '\n' && *message != '\r')
721 if (*message != '\'')
722 strbuf_addch(&buf, *(message++));
723 else
4aa5ff94 724 strbuf_addf(&buf, "'\\%c'", *(message++));
0f16c09a 725 strbuf_addch(&buf, '\'');
0473f28a
JS
726 res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
727 strbuf_release(&buf);
728 return res;
729}
730
bcd33ec2
PW
731/**
732 * Take a series of KEY='VALUE' lines where VALUE part is
733 * sq-quoted, and append <KEY, VALUE> at the end of the string list
734 */
735static int parse_key_value_squoted(char *buf, struct string_list *list)
736{
737 while (*buf) {
738 struct string_list_item *item;
739 char *np;
740 char *cp = strchr(buf, '=');
741 if (!cp) {
742 np = strchrnul(buf, '\n');
743 return error(_("no key present in '%.*s'"),
744 (int) (np - buf), buf);
745 }
746 np = strchrnul(cp, '\n');
747 *cp++ = '\0';
748 item = string_list_append(list, buf);
749
750 buf = np + (*np == '\n');
751 *np = '\0';
752 cp = sq_dequote(cp);
753 if (!cp)
754 return error(_("unable to dequote value of '%s'"),
755 item->string);
756 item->util = xstrdup(cp);
757 }
758 return 0;
759}
4aa5ff94 760
bcd33ec2
PW
761/**
762 * Reads and parses the state directory's "author-script" file, and sets name,
763 * email and date accordingly.
764 * Returns 0 on success, -1 if the file could not be parsed.
765 *
766 * The author script is of the format:
767 *
768 * GIT_AUTHOR_NAME='$author_name'
769 * GIT_AUTHOR_EMAIL='$author_email'
770 * GIT_AUTHOR_DATE='$author_date'
771 *
772 * where $author_name, $author_email and $author_date are quoted. We are strict
773 * with our parsing, as the file was meant to be eval'd in the old
774 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
775 * from what this function expects, it is better to bail out than to do
776 * something that the user does not expect.
4aa5ff94 777 */
bcd33ec2
PW
778int read_author_script(const char *path, char **name, char **email, char **date,
779 int allow_missing)
4aa5ff94 780{
bcd33ec2
PW
781 struct strbuf buf = STRBUF_INIT;
782 struct string_list kv = STRING_LIST_INIT_DUP;
783 int retval = -1; /* assume failure */
784 int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
4aa5ff94 785
bcd33ec2
PW
786 if (strbuf_read_file(&buf, path, 256) <= 0) {
787 strbuf_release(&buf);
788 if (errno == ENOENT && allow_missing)
789 return 0;
790 else
791 return error_errno(_("could not open '%s' for reading"),
792 path);
793 }
794
795 if (parse_key_value_squoted(buf.buf, &kv))
796 goto finish;
797
798 for (i = 0; i < kv.nr; i++) {
799 if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
800 if (name_i != -2)
801 name_i = error(_("'GIT_AUTHOR_NAME' already given"));
802 else
803 name_i = i;
804 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_EMAIL")) {
805 if (email_i != -2)
806 email_i = error(_("'GIT_AUTHOR_EMAIL' already given"));
807 else
808 email_i = i;
809 } else if (!strcmp(kv.items[i].string, "GIT_AUTHOR_DATE")) {
810 if (date_i != -2)
811 date_i = error(_("'GIT_AUTHOR_DATE' already given"));
812 else
813 date_i = i;
814 } else {
815 err = error(_("unknown variable '%s'"),
816 kv.items[i].string);
817 }
818 }
819 if (name_i == -2)
820 error(_("missing 'GIT_AUTHOR_NAME'"));
821 if (email_i == -2)
822 error(_("missing 'GIT_AUTHOR_EMAIL'"));
823 if (date_i == -2)
824 error(_("missing 'GIT_AUTHOR_DATE'"));
825 if (date_i < 0 || email_i < 0 || date_i < 0 || err)
826 goto finish;
827 *name = kv.items[name_i].util;
828 *email = kv.items[email_i].util;
829 *date = kv.items[date_i].util;
830 retval = 0;
831finish:
832 string_list_clear(&kv, !!retval);
833 strbuf_release(&buf);
834 return retval;
4aa5ff94
PW
835}
836
b5a67045 837/*
4d010a75
PW
838 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
839 * file with shell quoting into struct argv_array. Returns -1 on
840 * error, 0 otherwise.
b5a67045 841 */
a2a20b0d 842static int read_env_script(struct argv_array *env)
b5a67045 843{
4d010a75 844 char *name, *email, *date;
b5a67045 845
4d010a75
PW
846 if (read_author_script(rebase_path_author_script(),
847 &name, &email, &date, 0))
a2a20b0d 848 return -1;
b5a67045 849
4d010a75
PW
850 argv_array_pushf(env, "GIT_AUTHOR_NAME=%s", name);
851 argv_array_pushf(env, "GIT_AUTHOR_EMAIL=%s", email);
852 argv_array_pushf(env, "GIT_AUTHOR_DATE=%s", date);
853 free(name);
854 free(email);
855 free(date);
b5a67045 856
a2a20b0d 857 return 0;
b5a67045
JS
858}
859
356ee465
PW
860static char *get_author(const char *message)
861{
862 size_t len;
863 const char *a;
864
865 a = find_commit_header(message, "author", &len);
866 if (a)
867 return xmemdupz(a, len);
868
869 return NULL;
870}
871
d87d48b2
JS
872/* Read author-script and return an ident line (author <email> timestamp) */
873static const char *read_author_ident(struct strbuf *buf)
874{
67f16e3d 875 struct strbuf out = STRBUF_INIT;
4d010a75 876 char *name, *email, *date;
d87d48b2 877
4d010a75
PW
878 if (read_author_script(rebase_path_author_script(),
879 &name, &email, &date, 0))
d87d48b2
JS
880 return NULL;
881
5522bbac 882 /* validate date since fmt_ident() will die() on bad value */
4d010a75 883 if (parse_date(date, &out)){
5522bbac 884 warning(_("invalid date format '%s' in '%s'"),
4d010a75 885 date, rebase_path_author_script());
5522bbac
ES
886 strbuf_release(&out);
887 return NULL;
888 }
889
890 strbuf_reset(&out);
39ab4d09 891 strbuf_addstr(&out, fmt_ident(name, email, WANT_AUTHOR_IDENT, date, 0));
67f16e3d
ES
892 strbuf_swap(buf, &out);
893 strbuf_release(&out);
4d010a75
PW
894 free(name);
895 free(email);
896 free(date);
d87d48b2
JS
897 return buf->buf;
898}
899
791eb870
JS
900static const char staged_changes_advice[] =
901N_("you have staged changes in your working tree\n"
902"If these changes are meant to be squashed into the previous commit, run:\n"
903"\n"
904" git commit --amend %s\n"
905"\n"
906"If they are meant to go into a new commit, run:\n"
907"\n"
908" git commit %s\n"
909"\n"
910"In both cases, once you're done, continue with:\n"
911"\n"
912" git rebase --continue\n");
913
789b3eff
JS
914#define ALLOW_EMPTY (1<<0)
915#define EDIT_MSG (1<<1)
916#define AMEND_MSG (1<<2)
917#define CLEANUP_MSG (1<<3)
b92ff6e8 918#define VERIFY_MSG (1<<4)
d87d48b2 919#define CREATE_ROOT_COMMIT (1<<5)
789b3eff 920
34bec2c4
AG
921static int run_command_silent_on_success(struct child_process *cmd)
922{
923 struct strbuf buf = STRBUF_INIT;
924 int rc;
925
926 cmd->stdout_to_stderr = 1;
927 rc = pipe_command(cmd,
928 NULL, 0,
929 NULL, 0,
930 &buf, 0);
931
932 if (rc)
933 fputs(buf.buf, stderr);
934 strbuf_release(&buf);
935 return rc;
936}
937
043a4492
RR
938/*
939 * If we are cherry-pick, and if the merge did not result in
940 * hand-editing, we will hit this commit and inherit the original
941 * author date and name.
b5a67045 942 *
043a4492
RR
943 * If we are revert, or if our cherry-pick results in a hand merge,
944 * we had better say that the current user is responsible for that.
b5a67045
JS
945 *
946 * An exception is when run_git_commit() is called during an
947 * interactive rebase: in that case, we will want to retain the
948 * author metadata.
043a4492 949 */
f11c9580
NTND
950static int run_git_commit(struct repository *r,
951 const char *defmsg,
952 struct replay_opts *opts,
789b3eff 953 unsigned int flags)
043a4492 954{
07d968ef 955 struct child_process cmd = CHILD_PROCESS_INIT;
b27cfb0d 956
76fda6eb 957 if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
d87d48b2 958 struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
5dfcfe1e 959 const char *author = NULL;
d87d48b2
JS
960 struct object_id root_commit, *cache_tree_oid;
961 int res = 0;
962
5dfcfe1e
PW
963 if (is_rebase_i(opts)) {
964 author = read_author_ident(&script);
965 if (!author) {
966 strbuf_release(&script);
967 return -1;
968 }
969 }
970
d87d48b2
JS
971 if (!defmsg)
972 BUG("root commit without message");
973
f11c9580 974 if (!(cache_tree_oid = get_cache_tree_oid(r->index)))
d87d48b2
JS
975 res = -1;
976
977 if (!res)
978 res = strbuf_read_file(&msg, defmsg, 0);
979
980 if (res <= 0)
981 res = error_errno(_("could not read '%s'"), defmsg);
982 else
983 res = commit_tree(msg.buf, msg.len, cache_tree_oid,
984 NULL, &root_commit, author,
985 opts->gpg_sign);
986
987 strbuf_release(&msg);
988 strbuf_release(&script);
450efe2d 989 if (!res)
d87d48b2
JS
990 res = update_ref(NULL, "HEAD", &root_commit, NULL, 0,
991 UPDATE_REFS_MSG_ON_ERR);
450efe2d 992
d87d48b2
JS
993 return res < 0 ? error(_("writing root commit")) : 0;
994 }
995
07d968ef
JS
996 cmd.git_cmd = 1;
997
34bec2c4
AG
998 if (is_rebase_i(opts) && read_env_script(&cmd.env_array)) {
999 const char *gpg_opt = gpg_sign_opt_quoted(opts);
a1c75762 1000
34bec2c4
AG
1001 return error(_(staged_changes_advice),
1002 gpg_opt, gpg_opt);
b5a67045
JS
1003 }
1004
07d968ef 1005 argv_array_push(&cmd.args, "commit");
043a4492 1006
b92ff6e8
JS
1007 if (!(flags & VERIFY_MSG))
1008 argv_array_push(&cmd.args, "-n");
789b3eff 1009 if ((flags & AMEND_MSG))
07d968ef 1010 argv_array_push(&cmd.args, "--amend");
3bdd5522 1011 if (opts->gpg_sign)
07d968ef 1012 argv_array_pushf(&cmd.args, "-S%s", opts->gpg_sign);
b5a67045 1013 if (defmsg)
07d968ef 1014 argv_array_pushl(&cmd.args, "-F", defmsg, NULL);
dc4b5bc3
JS
1015 else if (!(flags & EDIT_MSG))
1016 argv_array_pushl(&cmd.args, "-C", "HEAD", NULL);
789b3eff 1017 if ((flags & CLEANUP_MSG))
07d968ef 1018 argv_array_push(&cmd.args, "--cleanup=strip");
789b3eff 1019 if ((flags & EDIT_MSG))
07d968ef 1020 argv_array_push(&cmd.args, "-e");
789b3eff 1021 else if (!(flags & CLEANUP_MSG) &&
0009426d 1022 !opts->signoff && !opts->record_origin &&
1a2b985f 1023 !opts->explicit_cleanup)
07d968ef 1024 argv_array_push(&cmd.args, "--cleanup=verbatim");
b27cfb0d 1025
789b3eff 1026 if ((flags & ALLOW_EMPTY))
07d968ef 1027 argv_array_push(&cmd.args, "--allow-empty");
df478b74 1028
a3ec9eaf 1029 if (!(flags & EDIT_MSG))
07d968ef 1030 argv_array_push(&cmd.args, "--allow-empty-message");
4bee9584 1031
34bec2c4
AG
1032 if (is_rebase_i(opts) && !(flags & EDIT_MSG))
1033 return run_command_silent_on_success(&cmd);
1034 else
1035 return run_command(&cmd);
b27cfb0d
NH
1036}
1037
d0aaa46f
PW
1038static int rest_is_empty(const struct strbuf *sb, int start)
1039{
1040 int i, eol;
1041 const char *nl;
1042
1043 /* Check if the rest is just whitespace and Signed-off-by's. */
1044 for (i = start; i < sb->len; i++) {
1045 nl = memchr(sb->buf + i, '\n', sb->len - i);
1046 if (nl)
1047 eol = nl - sb->buf;
1048 else
1049 eol = sb->len;
1050
1051 if (strlen(sign_off_header) <= eol - i &&
1052 starts_with(sb->buf + i, sign_off_header)) {
1053 i = eol;
1054 continue;
1055 }
1056 while (i < eol)
1057 if (!isspace(sb->buf[i++]))
1058 return 0;
1059 }
1060
1061 return 1;
1062}
1063
f29cd862
DL
1064void cleanup_message(struct strbuf *msgbuf,
1065 enum commit_msg_cleanup_mode cleanup_mode, int verbose)
1066{
1067 if (verbose || /* Truncate the message just before the diff, if any. */
1068 cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
1069 strbuf_setlen(msgbuf, wt_status_locate_end(msgbuf->buf, msgbuf->len));
1070 if (cleanup_mode != COMMIT_MSG_CLEANUP_NONE)
1071 strbuf_stripspace(msgbuf, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1072}
1073
d0aaa46f
PW
1074/*
1075 * Find out if the message in the strbuf contains only whitespace and
1076 * Signed-off-by lines.
1077 */
1078int message_is_empty(const struct strbuf *sb,
1079 enum commit_msg_cleanup_mode cleanup_mode)
1080{
1081 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1082 return 0;
1083 return rest_is_empty(sb, 0);
1084}
1085
1086/*
1087 * See if the user edited the message in the editor or left what
1088 * was in the template intact
1089 */
1090int template_untouched(const struct strbuf *sb, const char *template_file,
1091 enum commit_msg_cleanup_mode cleanup_mode)
1092{
1093 struct strbuf tmpl = STRBUF_INIT;
1094 const char *start;
1095
1096 if (cleanup_mode == COMMIT_MSG_CLEANUP_NONE && sb->len)
1097 return 0;
1098
1099 if (!template_file || strbuf_read_file(&tmpl, template_file, 0) <= 0)
1100 return 0;
1101
1102 strbuf_stripspace(&tmpl, cleanup_mode == COMMIT_MSG_CLEANUP_ALL);
1103 if (!skip_prefix(sb->buf, tmpl.buf, &start))
1104 start = sb->buf;
1105 strbuf_release(&tmpl);
1106 return rest_is_empty(sb, start - sb->buf);
1107}
1108
0505d604
PW
1109int update_head_with_reflog(const struct commit *old_head,
1110 const struct object_id *new_head,
1111 const char *action, const struct strbuf *msg,
1112 struct strbuf *err)
1113{
1114 struct ref_transaction *transaction;
1115 struct strbuf sb = STRBUF_INIT;
1116 const char *nl;
1117 int ret = 0;
1118
1119 if (action) {
1120 strbuf_addstr(&sb, action);
1121 strbuf_addstr(&sb, ": ");
1122 }
1123
1124 nl = strchr(msg->buf, '\n');
1125 if (nl) {
1126 strbuf_add(&sb, msg->buf, nl + 1 - msg->buf);
1127 } else {
1128 strbuf_addbuf(&sb, msg);
1129 strbuf_addch(&sb, '\n');
1130 }
1131
1132 transaction = ref_transaction_begin(err);
1133 if (!transaction ||
1134 ref_transaction_update(transaction, "HEAD", new_head,
1135 old_head ? &old_head->object.oid : &null_oid,
1136 0, sb.buf, err) ||
1137 ref_transaction_commit(transaction, err)) {
1138 ret = -1;
1139 }
1140 ref_transaction_free(transaction);
1141 strbuf_release(&sb);
1142
1143 return ret;
1144}
1145
a87a6f3c
PW
1146static int run_rewrite_hook(const struct object_id *oldoid,
1147 const struct object_id *newoid)
1148{
1149 struct child_process proc = CHILD_PROCESS_INIT;
1150 const char *argv[3];
1151 int code;
1152 struct strbuf sb = STRBUF_INIT;
1153
1154 argv[0] = find_hook("post-rewrite");
1155 if (!argv[0])
1156 return 0;
1157
1158 argv[1] = "amend";
1159 argv[2] = NULL;
1160
1161 proc.argv = argv;
1162 proc.in = -1;
1163 proc.stdout_to_stderr = 1;
6206286e 1164 proc.trace2_hook_name = "post-rewrite";
a87a6f3c
PW
1165
1166 code = start_command(&proc);
1167 if (code)
1168 return code;
1169 strbuf_addf(&sb, "%s %s\n", oid_to_hex(oldoid), oid_to_hex(newoid));
1170 sigchain_push(SIGPIPE, SIG_IGN);
1171 write_in_full(proc.in, sb.buf, sb.len);
1172 close(proc.in);
1173 strbuf_release(&sb);
1174 sigchain_pop(SIGPIPE);
1175 return finish_command(&proc);
1176}
1177
1d18d758
NTND
1178void commit_post_rewrite(struct repository *r,
1179 const struct commit *old_head,
a87a6f3c
PW
1180 const struct object_id *new_head)
1181{
1182 struct notes_rewrite_cfg *cfg;
1183
1184 cfg = init_copy_notes_for_rewrite("amend");
1185 if (cfg) {
1186 /* we are amending, so old_head is not NULL */
1187 copy_note_for_rewrite(cfg, &old_head->object.oid, new_head);
1d18d758 1188 finish_copy_notes_for_rewrite(r, cfg, "Notes added by 'git commit --amend'");
a87a6f3c
PW
1189 }
1190 run_rewrite_hook(&old_head->object.oid, new_head);
1191}
1192
f11c9580
NTND
1193static int run_prepare_commit_msg_hook(struct repository *r,
1194 struct strbuf *msg,
1195 const char *commit)
66618a50
PW
1196{
1197 struct argv_array hook_env = ARGV_ARRAY_INIT;
1198 int ret;
1199 const char *name;
1200
1201 name = git_path_commit_editmsg();
1202 if (write_message(msg->buf, msg->len, name, 0))
1203 return -1;
1204
f11c9580 1205 argv_array_pushf(&hook_env, "GIT_INDEX_FILE=%s", r->index_file);
66618a50
PW
1206 argv_array_push(&hook_env, "GIT_EDITOR=:");
1207 if (commit)
1208 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1209 "commit", commit, NULL);
1210 else
1211 ret = run_hook_le(hook_env.argv, "prepare-commit-msg", name,
1212 "message", NULL);
1213 if (ret)
1214 ret = error(_("'prepare-commit-msg' hook failed"));
1215 argv_array_clear(&hook_env);
1216
1217 return ret;
1218}
1219
e47c6caf
PW
1220static const char implicit_ident_advice_noconfig[] =
1221N_("Your name and email address were configured automatically based\n"
1222"on your username and hostname. Please check that they are accurate.\n"
1223"You can suppress this message by setting them explicitly. Run the\n"
1224"following command and follow the instructions in your editor to edit\n"
1225"your configuration file:\n"
1226"\n"
1227" git config --global --edit\n"
1228"\n"
1229"After doing this, you may fix the identity used for this commit with:\n"
1230"\n"
1231" git commit --amend --reset-author\n");
1232
1233static const char implicit_ident_advice_config[] =
1234N_("Your name and email address were configured automatically based\n"
1235"on your username and hostname. Please check that they are accurate.\n"
1236"You can suppress this message by setting them explicitly:\n"
1237"\n"
1238" git config --global user.name \"Your Name\"\n"
1239" git config --global user.email you@example.com\n"
1240"\n"
1241"After doing this, you may fix the identity used for this commit with:\n"
1242"\n"
1243" git commit --amend --reset-author\n");
1244
1245static const char *implicit_ident_advice(void)
1246{
1247 char *user_config = expand_user_path("~/.gitconfig", 0);
1248 char *xdg_config = xdg_config_home("config");
1249 int config_exists = file_exists(user_config) || file_exists(xdg_config);
1250
1251 free(user_config);
1252 free(xdg_config);
1253
1254 if (config_exists)
1255 return _(implicit_ident_advice_config);
1256 else
1257 return _(implicit_ident_advice_noconfig);
1258
1259}
1260
f11c9580
NTND
1261void print_commit_summary(struct repository *r,
1262 const char *prefix,
1263 const struct object_id *oid,
e47c6caf
PW
1264 unsigned int flags)
1265{
1266 struct rev_info rev;
1267 struct commit *commit;
1268 struct strbuf format = STRBUF_INIT;
1269 const char *head;
1270 struct pretty_print_context pctx = {0};
1271 struct strbuf author_ident = STRBUF_INIT;
1272 struct strbuf committer_ident = STRBUF_INIT;
1273
f11c9580 1274 commit = lookup_commit(r, oid);
e47c6caf
PW
1275 if (!commit)
1276 die(_("couldn't look up newly created commit"));
1277 if (parse_commit(commit))
1278 die(_("could not parse newly created commit"));
1279
1280 strbuf_addstr(&format, "format:%h] %s");
1281
1282 format_commit_message(commit, "%an <%ae>", &author_ident, &pctx);
1283 format_commit_message(commit, "%cn <%ce>", &committer_ident, &pctx);
1284 if (strbuf_cmp(&author_ident, &committer_ident)) {
1285 strbuf_addstr(&format, "\n Author: ");
1286 strbuf_addbuf_percentquote(&format, &author_ident);
1287 }
1288 if (flags & SUMMARY_SHOW_AUTHOR_DATE) {
1289 struct strbuf date = STRBUF_INIT;
1290
1291 format_commit_message(commit, "%ad", &date, &pctx);
1292 strbuf_addstr(&format, "\n Date: ");
1293 strbuf_addbuf_percentquote(&format, &date);
1294 strbuf_release(&date);
1295 }
1296 if (!committer_ident_sufficiently_given()) {
1297 strbuf_addstr(&format, "\n Committer: ");
1298 strbuf_addbuf_percentquote(&format, &committer_ident);
1299 if (advice_implicit_identity) {
1300 strbuf_addch(&format, '\n');
1301 strbuf_addstr(&format, implicit_ident_advice());
1302 }
1303 }
1304 strbuf_release(&author_ident);
1305 strbuf_release(&committer_ident);
1306
f11c9580 1307 repo_init_revisions(r, &rev, prefix);
e47c6caf
PW
1308 setup_revisions(0, NULL, &rev, NULL);
1309
1310 rev.diff = 1;
1311 rev.diffopt.output_format =
1312 DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY;
1313
1314 rev.verbose_header = 1;
1315 rev.show_root_diff = 1;
1316 get_commit_format(format.buf, &rev);
1317 rev.always_show_header = 0;
0f57f731 1318 rev.diffopt.detect_rename = DIFF_DETECT_RENAME;
e47c6caf
PW
1319 rev.diffopt.break_opt = 0;
1320 diff_setup_done(&rev.diffopt);
1321
1322 head = resolve_ref_unsafe("HEAD", 0, NULL, NULL);
1323 if (!head)
1324 die_errno(_("unable to resolve HEAD after creating commit"));
1325 if (!strcmp(head, "HEAD"))
1326 head = _("detached HEAD");
1327 else
1328 skip_prefix(head, "refs/heads/", &head);
1329 printf("[%s%s ", head, (flags & SUMMARY_INITIAL_COMMIT) ?
1330 _(" (root-commit)") : "");
1331
1332 if (!log_tree_commit(&rev, commit)) {
1333 rev.always_show_header = 1;
1334 rev.use_terminator = 1;
1335 log_tree_commit(&rev, commit);
1336 }
1337
1338 strbuf_release(&format);
1339}
1340
005af339 1341static int parse_head(struct repository *r, struct commit **head)
356ee465
PW
1342{
1343 struct commit *current_head;
1344 struct object_id oid;
1345
1346 if (get_oid("HEAD", &oid)) {
1347 current_head = NULL;
1348 } else {
005af339 1349 current_head = lookup_commit_reference(r, &oid);
356ee465
PW
1350 if (!current_head)
1351 return error(_("could not parse HEAD"));
9001dc2a 1352 if (!oideq(&oid, &current_head->object.oid)) {
356ee465
PW
1353 warning(_("HEAD %s is not a commit!"),
1354 oid_to_hex(&oid));
1355 }
1356 if (parse_commit(current_head))
1357 return error(_("could not parse HEAD commit"));
1358 }
1359 *head = current_head;
1360
1361 return 0;
1362}
1363
1364/*
1365 * Try to commit without forking 'git commit'. In some cases we need
1366 * to run 'git commit' to display an error message
1367 *
1368 * Returns:
1369 * -1 - error unable to commit
1370 * 0 - success
1371 * 1 - run 'git commit'
1372 */
f11c9580
NTND
1373static int try_to_commit(struct repository *r,
1374 struct strbuf *msg, const char *author,
356ee465
PW
1375 struct replay_opts *opts, unsigned int flags,
1376 struct object_id *oid)
1377{
1378 struct object_id tree;
1379 struct commit *current_head;
1380 struct commit_list *parents = NULL;
1381 struct commit_extra_header *extra = NULL;
1382 struct strbuf err = STRBUF_INIT;
66618a50 1383 struct strbuf commit_msg = STRBUF_INIT;
356ee465 1384 char *amend_author = NULL;
66618a50 1385 const char *hook_commit = NULL;
356ee465
PW
1386 enum commit_msg_cleanup_mode cleanup;
1387 int res = 0;
1388
005af339 1389 if (parse_head(r, &current_head))
356ee465
PW
1390 return -1;
1391
1392 if (flags & AMEND_MSG) {
1393 const char *exclude_gpgsig[] = { "gpgsig", NULL };
1394 const char *out_enc = get_commit_output_encoding();
1395 const char *message = logmsg_reencode(current_head, NULL,
1396 out_enc);
1397
1398 if (!msg) {
1399 const char *orig_message = NULL;
1400
1401 find_commit_subject(message, &orig_message);
66618a50 1402 msg = &commit_msg;
356ee465 1403 strbuf_addstr(msg, orig_message);
66618a50 1404 hook_commit = "HEAD";
356ee465
PW
1405 }
1406 author = amend_author = get_author(message);
1407 unuse_commit_buffer(current_head, message);
1408 if (!author) {
1409 res = error(_("unable to parse commit author"));
1410 goto out;
1411 }
1412 parents = copy_commit_list(current_head->parents);
1413 extra = read_commit_extra_headers(current_head, exclude_gpgsig);
1414 } else if (current_head) {
1415 commit_list_insert(current_head, &parents);
1416 }
1417
f11c9580 1418 if (write_index_as_tree(&tree, r->index, r->index_file, 0, NULL)) {
356ee465
PW
1419 res = error(_("git write-tree failed to write a tree"));
1420 goto out;
1421 }
1422
4a7e27e9
JK
1423 if (!(flags & ALLOW_EMPTY) && oideq(current_head ?
1424 get_commit_tree_oid(current_head) :
1425 the_hash_algo->empty_tree, &tree)) {
356ee465
PW
1426 res = 1; /* run 'git commit' to display error message */
1427 goto out;
1428 }
1429
66618a50 1430 if (find_hook("prepare-commit-msg")) {
f11c9580 1431 res = run_prepare_commit_msg_hook(r, msg, hook_commit);
66618a50
PW
1432 if (res)
1433 goto out;
1434 if (strbuf_read_file(&commit_msg, git_path_commit_editmsg(),
1435 2048) < 0) {
1436 res = error_errno(_("unable to read commit message "
1437 "from '%s'"),
1438 git_path_commit_editmsg());
1439 goto out;
1440 }
1441 msg = &commit_msg;
1442 }
1443
d74f3e58
PW
1444 if (flags & CLEANUP_MSG)
1445 cleanup = COMMIT_MSG_CLEANUP_ALL;
1446 else if ((opts->signoff || opts->record_origin) &&
1447 !opts->explicit_cleanup)
1448 cleanup = COMMIT_MSG_CLEANUP_SPACE;
1449 else
1450 cleanup = opts->default_msg_cleanup;
66618a50
PW
1451
1452 if (cleanup != COMMIT_MSG_CLEANUP_NONE)
1453 strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
a3ec9eaf 1454 if ((flags & EDIT_MSG) && message_is_empty(msg, cleanup)) {
66618a50
PW
1455 res = 1; /* run 'git commit' to display error message */
1456 goto out;
1457 }
1458
12f7babd
JS
1459 reset_ident_date();
1460
8be8342b
JH
1461 if (commit_tree_extended(msg->buf, msg->len, &tree, parents,
1462 oid, author, opts->gpg_sign, extra)) {
356ee465
PW
1463 res = error(_("failed to write commit object"));
1464 goto out;
1465 }
1466
1467 if (update_head_with_reflog(current_head, oid,
1468 getenv("GIT_REFLOG_ACTION"), msg, &err)) {
1469 res = error("%s", err.buf);
1470 goto out;
1471 }
1472
1473 if (flags & AMEND_MSG)
1d18d758 1474 commit_post_rewrite(r, current_head, oid);
356ee465
PW
1475
1476out:
1477 free_commit_extra_headers(extra);
1478 strbuf_release(&err);
66618a50 1479 strbuf_release(&commit_msg);
356ee465
PW
1480 free(amend_author);
1481
1482 return res;
1483}
1484
f11c9580
NTND
1485static int do_commit(struct repository *r,
1486 const char *msg_file, const char *author,
356ee465
PW
1487 struct replay_opts *opts, unsigned int flags)
1488{
1489 int res = 1;
1490
d87d48b2
JS
1491 if (!(flags & EDIT_MSG) && !(flags & VERIFY_MSG) &&
1492 !(flags & CREATE_ROOT_COMMIT)) {
356ee465
PW
1493 struct object_id oid;
1494 struct strbuf sb = STRBUF_INIT;
1495
1496 if (msg_file && strbuf_read_file(&sb, msg_file, 2048) < 0)
1497 return error_errno(_("unable to read commit message "
1498 "from '%s'"),
1499 msg_file);
1500
f11c9580
NTND
1501 res = try_to_commit(r, msg_file ? &sb : NULL,
1502 author, opts, flags, &oid);
356ee465
PW
1503 strbuf_release(&sb);
1504 if (!res) {
f11c9580
NTND
1505 unlink(git_path_cherry_pick_head(r));
1506 unlink(git_path_merge_msg(r));
356ee465 1507 if (!is_rebase_i(opts))
f11c9580 1508 print_commit_summary(r, NULL, &oid,
356ee465
PW
1509 SUMMARY_SHOW_AUTHOR_DATE);
1510 return res;
1511 }
1512 }
1513 if (res == 1)
f11c9580 1514 return run_git_commit(r, msg_file, opts, flags);
356ee465
PW
1515
1516 return res;
1517}
1518
b27cfb0d
NH
1519static int is_original_commit_empty(struct commit *commit)
1520{
092bbcdf 1521 const struct object_id *ptree_oid;
b27cfb0d
NH
1522
1523 if (parse_commit(commit))
aee42e1f 1524 return error(_("could not parse commit %s"),
f2fd0760 1525 oid_to_hex(&commit->object.oid));
b27cfb0d
NH
1526 if (commit->parents) {
1527 struct commit *parent = commit->parents->item;
1528 if (parse_commit(parent))
aee42e1f 1529 return error(_("could not parse parent commit %s"),
f2fd0760 1530 oid_to_hex(&parent->object.oid));
2e27bd77 1531 ptree_oid = get_commit_tree_oid(parent);
b27cfb0d 1532 } else {
eb0ccfd7 1533 ptree_oid = the_hash_algo->empty_tree; /* commit is root */
043a4492 1534 }
043a4492 1535
4a7e27e9 1536 return oideq(ptree_oid, get_commit_tree_oid(commit));
043a4492
RR
1537}
1538
ac2b0e8f
JH
1539/*
1540 * Do we run "git commit" with "--allow-empty"?
1541 */
f11c9580
NTND
1542static int allow_empty(struct repository *r,
1543 struct replay_opts *opts,
1544 struct commit *commit)
ac2b0e8f
JH
1545{
1546 int index_unchanged, empty_commit;
1547
1548 /*
1549 * Three cases:
1550 *
1551 * (1) we do not allow empty at all and error out.
1552 *
1553 * (2) we allow ones that were initially empty, but
1554 * forbid the ones that become empty;
1555 *
1556 * (3) we allow both.
1557 */
1558 if (!opts->allow_empty)
1559 return 0; /* let "git commit" barf as necessary */
1560
005af339 1561 index_unchanged = is_index_unchanged(r);
ac2b0e8f
JH
1562 if (index_unchanged < 0)
1563 return index_unchanged;
1564 if (!index_unchanged)
1565 return 0; /* we do not have to say --allow-empty */
1566
1567 if (opts->keep_redundant_commits)
1568 return 1;
1569
1570 empty_commit = is_original_commit_empty(commit);
1571 if (empty_commit < 0)
1572 return empty_commit;
1573 if (!empty_commit)
1574 return 0;
1575 else
1576 return 1;
1577}
1578
414697a9
JS
1579static struct {
1580 char c;
1581 const char *str;
1582} todo_command_info[] = {
1583 { 'p', "pick" },
1584 { 0, "revert" },
1585 { 'e', "edit" },
04efc8b5 1586 { 'r', "reword" },
414697a9
JS
1587 { 'f', "fixup" },
1588 { 's', "squash" },
1589 { 'x', "exec" },
71f82465 1590 { 'b', "break" },
9055e401
JS
1591 { 'l', "label" },
1592 { 't', "reset" },
4c68e7dd 1593 { 'm', "merge" },
b3fdd581 1594 { 0, "noop" },
ac191470
JS
1595 { 'd', "drop" },
1596 { 0, NULL }
004fefa7
JS
1597};
1598
1599static const char *command_to_string(const enum todo_command command)
1600{
ac191470 1601 if (command < TODO_COMMENT)
414697a9 1602 return todo_command_info[command].str;
02127c63 1603 die(_("unknown command: %d"), command);
004fefa7
JS
1604}
1605
ee5462d6 1606static char command_to_char(const enum todo_command command)
d8ae6c84
LB
1607{
1608 if (command < TODO_COMMENT && todo_command_info[command].c)
1609 return todo_command_info[command].c;
1610 return comment_line_char;
1611}
1612
25c43667
JS
1613static int is_noop(const enum todo_command command)
1614{
b3fdd581 1615 return TODO_NOOP <= command;
25c43667 1616}
004fefa7 1617
6e98de72
JS
1618static int is_fixup(enum todo_command command)
1619{
1620 return command == TODO_FIXUP || command == TODO_SQUASH;
1621}
1622
d87d48b2
JS
1623/* Does this command create a (non-merge) commit? */
1624static int is_pick_or_similar(enum todo_command command)
1625{
1626 switch (command) {
1627 case TODO_PICK:
1628 case TODO_REVERT:
1629 case TODO_EDIT:
1630 case TODO_REWORD:
1631 case TODO_FIXUP:
1632 case TODO_SQUASH:
1633 return 1;
1634 default:
1635 return 0;
1636 }
1637}
1638
005af339
NTND
1639static int update_squash_messages(struct repository *r,
1640 enum todo_command command,
1641 struct commit *commit,
1642 struct replay_opts *opts)
6e98de72
JS
1643{
1644 struct strbuf buf = STRBUF_INIT;
e12a7ef5 1645 int res;
6e98de72
JS
1646 const char *message, *body;
1647
e12a7ef5 1648 if (opts->current_fixup_count > 0) {
6e98de72 1649 struct strbuf header = STRBUF_INIT;
e12a7ef5 1650 char *eol;
6e98de72 1651
e12a7ef5 1652 if (strbuf_read_file(&buf, rebase_path_squash_msg(), 9) <= 0)
6e98de72
JS
1653 return error(_("could not read '%s'"),
1654 rebase_path_squash_msg());
1655
e12a7ef5
JS
1656 eol = buf.buf[0] != comment_line_char ?
1657 buf.buf : strchrnul(buf.buf, '\n');
6e98de72
JS
1658
1659 strbuf_addf(&header, "%c ", comment_line_char);
e12a7ef5
JS
1660 strbuf_addf(&header, _("This is a combination of %d commits."),
1661 opts->current_fixup_count + 2);
6e98de72
JS
1662 strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len);
1663 strbuf_release(&header);
1664 } else {
33d66df3 1665 struct object_id head;
6e98de72
JS
1666 struct commit *head_commit;
1667 const char *head_message, *body;
1668
33d66df3 1669 if (get_oid("HEAD", &head))
6e98de72 1670 return error(_("need a HEAD to fixup"));
005af339 1671 if (!(head_commit = lookup_commit_reference(r, &head)))
6e98de72
JS
1672 return error(_("could not read HEAD"));
1673 if (!(head_message = get_commit_buffer(head_commit, NULL)))
1674 return error(_("could not read HEAD's commit message"));
1675
1676 find_commit_subject(head_message, &body);
1677 if (write_message(body, strlen(body),
1678 rebase_path_fixup_msg(), 0)) {
1679 unuse_commit_buffer(head_commit, head_message);
1680 return error(_("cannot write '%s'"),
1681 rebase_path_fixup_msg());
1682 }
1683
6e98de72 1684 strbuf_addf(&buf, "%c ", comment_line_char);
e12a7ef5 1685 strbuf_addf(&buf, _("This is a combination of %d commits."), 2);
6e98de72
JS
1686 strbuf_addf(&buf, "\n%c ", comment_line_char);
1687 strbuf_addstr(&buf, _("This is the 1st commit message:"));
1688 strbuf_addstr(&buf, "\n\n");
1689 strbuf_addstr(&buf, body);
1690
1691 unuse_commit_buffer(head_commit, head_message);
1692 }
1693
1694 if (!(message = get_commit_buffer(commit, NULL)))
1695 return error(_("could not read commit message of %s"),
1696 oid_to_hex(&commit->object.oid));
1697 find_commit_subject(message, &body);
1698
1699 if (command == TODO_SQUASH) {
1700 unlink(rebase_path_fixup_msg());
1701 strbuf_addf(&buf, "\n%c ", comment_line_char);
e12a7ef5 1702 strbuf_addf(&buf, _("This is the commit message #%d:"),
dd2e36eb 1703 ++opts->current_fixup_count + 1);
6e98de72
JS
1704 strbuf_addstr(&buf, "\n\n");
1705 strbuf_addstr(&buf, body);
1706 } else if (command == TODO_FIXUP) {
1707 strbuf_addf(&buf, "\n%c ", comment_line_char);
1708 strbuf_addf(&buf, _("The commit message #%d will be skipped:"),
dd2e36eb 1709 ++opts->current_fixup_count + 1);
6e98de72
JS
1710 strbuf_addstr(&buf, "\n\n");
1711 strbuf_add_commented_lines(&buf, body, strlen(body));
1712 } else
1713 return error(_("unknown command: %d"), command);
1714 unuse_commit_buffer(commit, message);
1715
1716 res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0);
1717 strbuf_release(&buf);
e12a7ef5
JS
1718
1719 if (!res) {
1720 strbuf_addf(&opts->current_fixups, "%s%s %s",
1721 opts->current_fixups.len ? "\n" : "",
1722 command_to_string(command),
1723 oid_to_hex(&commit->object.oid));
1724 res = write_message(opts->current_fixups.buf,
1725 opts->current_fixups.len,
1726 rebase_path_current_fixups(), 0);
1727 }
1728
6e98de72
JS
1729 return res;
1730}
1731
3b335762
NTND
1732static void flush_rewritten_pending(void)
1733{
25cb8df9 1734 struct strbuf buf = STRBUF_INIT;
092bbcdf 1735 struct object_id newoid;
25cb8df9
JS
1736 FILE *out;
1737
092bbcdf 1738 if (strbuf_read_file(&buf, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ + 1) * 2) > 0 &&
1739 !get_oid("HEAD", &newoid) &&
e9d983f1 1740 (out = fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
25cb8df9
JS
1741 char *bol = buf.buf, *eol;
1742
1743 while (*bol) {
1744 eol = strchrnul(bol, '\n');
1745 fprintf(out, "%.*s %s\n", (int)(eol - bol),
092bbcdf 1746 bol, oid_to_hex(&newoid));
25cb8df9
JS
1747 if (!*eol)
1748 break;
1749 bol = eol + 1;
1750 }
1751 fclose(out);
1752 unlink(rebase_path_rewritten_pending());
1753 }
1754 strbuf_release(&buf);
1755}
1756
1757static void record_in_rewritten(struct object_id *oid,
3b335762
NTND
1758 enum todo_command next_command)
1759{
e9d983f1 1760 FILE *out = fopen_or_warn(rebase_path_rewritten_pending(), "a");
25cb8df9
JS
1761
1762 if (!out)
1763 return;
1764
1765 fprintf(out, "%s\n", oid_to_hex(oid));
1766 fclose(out);
1767
1768 if (!is_fixup(next_command))
1769 flush_rewritten_pending();
1770}
1771
f11c9580
NTND
1772static int do_pick_commit(struct repository *r,
1773 enum todo_command command,
1774 struct commit *commit,
1775 struct replay_opts *opts,
a47ba3c7 1776 int final_fixup, int *check_todo)
043a4492 1777{
789b3eff 1778 unsigned int flags = opts->edit ? EDIT_MSG : 0;
f11c9580 1779 const char *msg_file = opts->edit ? NULL : git_path_merge_msg(r);
ace976b2 1780 struct object_id head;
043a4492
RR
1781 struct commit *base, *next, *parent;
1782 const char *base_label, *next_label;
356ee465 1783 char *author = NULL;
d74a4e57 1784 struct commit_message msg = { NULL, NULL, NULL, NULL };
043a4492 1785 struct strbuf msgbuf = STRBUF_INIT;
450efe2d 1786 int res, unborn = 0, reword = 0, allow;
043a4492
RR
1787
1788 if (opts->no_commit) {
1789 /*
1790 * We do not intend to commit immediately. We just want to
1791 * merge the differences in, so let's compute the tree
1792 * that represents the "current" state for merge-recursive
1793 * to work on.
1794 */
f11c9580 1795 if (write_index_as_tree(&head, r->index, r->index_file, 0, NULL))
93b3df6f 1796 return error(_("your index file is unmerged."));
043a4492 1797 } else {
ace976b2 1798 unborn = get_oid("HEAD", &head);
d87d48b2
JS
1799 /* Do we want to generate a root commit? */
1800 if (is_pick_or_similar(command) && opts->have_squash_onto &&
4a7e27e9 1801 oideq(&head, &opts->squash_onto)) {
d87d48b2
JS
1802 if (is_fixup(command))
1803 return error(_("cannot fixup root commit"));
1804 flags |= CREATE_ROOT_COMMIT;
1805 unborn = 1;
1806 } else if (unborn)
eb0ccfd7 1807 oidcpy(&head, the_hash_algo->empty_tree);
ffc00a48 1808 if (index_differs_from(r, unborn ? empty_tree_oid_hex() : "HEAD",
02f2f56b 1809 NULL, 0))
e1ff0a32 1810 return error_dirty_index(r, opts);
043a4492 1811 }
f11c9580 1812 discard_index(r->index);
043a4492 1813
637666c8 1814 if (!commit->parents)
043a4492 1815 parent = NULL;
043a4492
RR
1816 else if (commit->parents->next) {
1817 /* Reverting or cherry-picking a merge commit */
1818 int cnt;
1819 struct commit_list *p;
1820
1821 if (!opts->mainline)
93b3df6f 1822 return error(_("commit %s is a merge but no -m option was given."),
f2fd0760 1823 oid_to_hex(&commit->object.oid));
043a4492
RR
1824
1825 for (cnt = 1, p = commit->parents;
1826 cnt != opts->mainline && p;
1827 cnt++)
1828 p = p->next;
1829 if (cnt != opts->mainline || !p)
93b3df6f 1830 return error(_("commit %s does not have parent %d"),
f2fd0760 1831 oid_to_hex(&commit->object.oid), opts->mainline);
043a4492 1832 parent = p->item;
37897bfc
SO
1833 } else if (1 < opts->mainline)
1834 /*
1835 * Non-first parent explicitly specified as mainline for
1836 * non-merge commit
1837 */
1838 return error(_("commit %s does not have parent %d"),
1839 oid_to_hex(&commit->object.oid), opts->mainline);
043a4492
RR
1840 else
1841 parent = commit->parents->item;
1842
bcbb68be
JS
1843 if (get_message(commit, &msg) != 0)
1844 return error(_("cannot get commit message for %s"),
1845 oid_to_hex(&commit->object.oid));
1846
6e98de72 1847 if (opts->allow_ff && !is_fixup(command) &&
4a7e27e9 1848 ((parent && oideq(&parent->object.oid, &head)) ||
bcbb68be
JS
1849 (!parent && unborn))) {
1850 if (is_rebase_i(opts))
1851 write_author_script(msg.message);
f11c9580 1852 res = fast_forward_to(r, &commit->object.oid, &head, unborn,
bcbb68be
JS
1853 opts);
1854 if (res || command != TODO_REWORD)
1855 goto leave;
450efe2d 1856 reword = 1;
bcbb68be
JS
1857 msg_file = NULL;
1858 goto fast_forward_edit;
1859 }
043a4492 1860 if (parent && parse_commit(parent) < 0)
004fefa7
JS
1861 /* TRANSLATORS: The first %s will be a "todo" command like
1862 "revert" or "pick", the second %s a SHA1. */
043a4492 1863 return error(_("%s: cannot parse parent commit %s"),
004fefa7
JS
1864 command_to_string(command),
1865 oid_to_hex(&parent->object.oid));
043a4492 1866
043a4492
RR
1867 /*
1868 * "commit" is an existing commit. We would want to apply
1869 * the difference it introduces since its first parent "prev"
1870 * on top of the current HEAD if we are cherry-pick. Or the
1871 * reverse of it if we are revert.
1872 */
1873
004fefa7 1874 if (command == TODO_REVERT) {
043a4492
RR
1875 base = commit;
1876 base_label = msg.label;
1877 next = parent;
1878 next_label = msg.parent_label;
1879 strbuf_addstr(&msgbuf, "Revert \"");
1880 strbuf_addstr(&msgbuf, msg.subject);
1881 strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
f2fd0760 1882 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
043a4492
RR
1883
1884 if (commit->parents && commit->parents->next) {
1885 strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
f2fd0760 1886 strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
043a4492
RR
1887 }
1888 strbuf_addstr(&msgbuf, ".\n");
1889 } else {
1890 const char *p;
1891
1892 base = parent;
1893 base_label = msg.parent_label;
1894 next = commit;
1895 next_label = msg.label;
1896
23aa5142
JS
1897 /* Append the commit log message to msgbuf. */
1898 if (find_commit_subject(msg.message, &p))
1899 strbuf_addstr(&msgbuf, p);
043a4492
RR
1900
1901 if (opts->record_origin) {
44dc738a 1902 strbuf_complete_line(&msgbuf);
bab4d109 1903 if (!has_conforming_footer(&msgbuf, NULL, 0))
b971e04f 1904 strbuf_addch(&msgbuf, '\n');
cd650a4e 1905 strbuf_addstr(&msgbuf, cherry_picked_prefix);
f2fd0760 1906 strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
043a4492
RR
1907 strbuf_addstr(&msgbuf, ")\n");
1908 }
356ee465
PW
1909 if (!is_fixup(command))
1910 author = get_author(msg.message);
043a4492
RR
1911 }
1912
04efc8b5 1913 if (command == TODO_REWORD)
450efe2d 1914 reword = 1;
04efc8b5 1915 else if (is_fixup(command)) {
005af339 1916 if (update_squash_messages(r, command, commit, opts))
6e98de72 1917 return -1;
789b3eff 1918 flags |= AMEND_MSG;
6e98de72
JS
1919 if (!final_fixup)
1920 msg_file = rebase_path_squash_msg();
1921 else if (file_exists(rebase_path_fixup_msg())) {
789b3eff 1922 flags |= CLEANUP_MSG;
6e98de72
JS
1923 msg_file = rebase_path_fixup_msg();
1924 } else {
f11c9580 1925 const char *dest = git_path_squash_msg(r);
6e98de72
JS
1926 unlink(dest);
1927 if (copy_file(dest, rebase_path_squash_msg(), 0666))
1928 return error(_("could not rename '%s' to '%s'"),
1929 rebase_path_squash_msg(), dest);
f11c9580 1930 unlink(git_path_merge_msg(r));
6e98de72 1931 msg_file = dest;
789b3eff 1932 flags |= EDIT_MSG;
6e98de72
JS
1933 }
1934 }
1935
a852ec7f 1936 if (opts->signoff && !is_fixup(command))
b34eeea3
PW
1937 append_signoff(&msgbuf, 0, 0);
1938
0473f28a
JS
1939 if (is_rebase_i(opts) && write_author_script(msg.message) < 0)
1940 res = -1;
1941 else if (!opts->strategy || !strcmp(opts->strategy, "recursive") || command == TODO_REVERT) {
f11c9580 1942 res = do_recursive_merge(r, base, next, base_label, next_label,
48be4c62 1943 &head, &msgbuf, opts);
f241ff0d 1944 if (res < 0)
19517fb9
SB
1945 goto leave;
1946
75871495 1947 res |= write_message(msgbuf.buf, msgbuf.len,
f11c9580 1948 git_path_merge_msg(r), 0);
043a4492
RR
1949 } else {
1950 struct commit_list *common = NULL;
1951 struct commit_list *remotes = NULL;
1952
75871495 1953 res = write_message(msgbuf.buf, msgbuf.len,
f11c9580 1954 git_path_merge_msg(r), 0);
043a4492
RR
1955
1956 commit_list_insert(base, &common);
1957 commit_list_insert(next, &remotes);
f11c9580 1958 res |= try_merge_command(r, opts->strategy,
03a4e260 1959 opts->xopts_nr, (const char **)opts->xopts,
ace976b2 1960 common, oid_to_hex(&head), remotes);
043a4492
RR
1961 free_commit_list(common);
1962 free_commit_list(remotes);
1963 }
452202c7 1964 strbuf_release(&msgbuf);
043a4492
RR
1965
1966 /*
1967 * If the merge was clean or if it failed due to conflict, we write
1968 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1969 * However, if the merge did not even start, then we don't want to
1970 * write it at all.
1971 */
004fefa7 1972 if (command == TODO_PICK && !opts->no_commit && (res == 0 || res == 1) &&
ae077771 1973 update_ref(NULL, "CHERRY_PICK_HEAD", &commit->object.oid, NULL,
91774afc 1974 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
dbfad033 1975 res = -1;
004fefa7 1976 if (command == TODO_REVERT && ((opts->no_commit && res == 0) || res == 1) &&
ae077771 1977 update_ref(NULL, "REVERT_HEAD", &commit->object.oid, NULL,
91774afc 1978 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
dbfad033 1979 res = -1;
043a4492
RR
1980
1981 if (res) {
004fefa7 1982 error(command == TODO_REVERT
043a4492
RR
1983 ? _("could not revert %s... %s")
1984 : _("could not apply %s... %s"),
39755964 1985 short_commit_name(commit), msg.subject);
005af339 1986 print_advice(r, res == 1, opts);
f11c9580 1987 repo_rerere(r, opts->allow_rerere_auto);
c8d1351d 1988 goto leave;
043a4492
RR
1989 }
1990
f11c9580 1991 allow = allow_empty(r, opts, commit);
706728a3
FC
1992 if (allow < 0) {
1993 res = allow;
1994 goto leave;
789b3eff
JS
1995 } else if (allow)
1996 flags |= ALLOW_EMPTY;
356ee465 1997 if (!opts->no_commit) {
356ee465 1998 if (author || command == TODO_REVERT || (flags & AMEND_MSG))
f11c9580 1999 res = do_commit(r, msg_file, author, opts, flags);
356ee465
PW
2000 else
2001 res = error(_("unable to parse commit author"));
a47ba3c7
PW
2002 *check_todo = !!(flags & EDIT_MSG);
2003 if (!res && reword) {
450efe2d
PW
2004fast_forward_edit:
2005 res = run_git_commit(r, NULL, opts, EDIT_MSG |
2006 VERIFY_MSG | AMEND_MSG |
2007 (flags & ALLOW_EMPTY));
a47ba3c7
PW
2008 *check_todo = 1;
2009 }
356ee465 2010 }
6e98de72 2011
450efe2d 2012
6e98de72
JS
2013 if (!res && final_fixup) {
2014 unlink(rebase_path_fixup_msg());
2015 unlink(rebase_path_squash_msg());
e12a7ef5
JS
2016 unlink(rebase_path_current_fixups());
2017 strbuf_reset(&opts->current_fixups);
2018 opts->current_fixup_count = 0;
6e98de72 2019 }
c8d1351d
FC
2020
2021leave:
d74a4e57 2022 free_message(commit, &msg);
356ee465 2023 free(author);
1e41229d 2024 update_abort_safety_file();
043a4492
RR
2025
2026 return res;
2027}
2028
c3e8618c 2029static int prepare_revs(struct replay_opts *opts)
043a4492 2030{
a73e22e9
MZ
2031 /*
2032 * picking (but not reverting) ranges (but not individual revisions)
2033 * should be done in reverse
2034 */
2035 if (opts->action == REPLAY_PICK && !opts->revs->no_walk)
043a4492
RR
2036 opts->revs->reverse ^= 1;
2037
2038 if (prepare_revision_walk(opts->revs))
c3e8618c 2039 return error(_("revision walk setup failed"));
043a4492 2040
c3e8618c 2041 return 0;
043a4492
RR
2042}
2043
f11c9580
NTND
2044static int read_and_refresh_cache(struct repository *r,
2045 struct replay_opts *opts)
043a4492 2046{
14bca6c6 2047 struct lock_file index_lock = LOCK_INIT;
3a95f31d
NTND
2048 int index_fd = repo_hold_locked_index(r, &index_lock, 0);
2049 if (repo_read_index(r) < 0) {
49fb937e 2050 rollback_lock_file(&index_lock);
0d9c6dc9 2051 return error(_("git %s: failed to read the index"),
c28cbc5e 2052 _(action_name(opts)));
49fb937e 2053 }
f11c9580 2054 refresh_index(r->index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
61000814 2055 if (index_fd >= 0) {
f11c9580 2056 if (write_locked_index(r->index, &index_lock,
61000814 2057 COMMIT_LOCK | SKIP_IF_UNCHANGED)) {
0d9c6dc9 2058 return error(_("git %s: failed to refresh the index"),
c28cbc5e 2059 _(action_name(opts)));
49fb937e 2060 }
043a4492 2061 }
0d9c6dc9 2062 return 0;
043a4492
RR
2063}
2064
4c68e7dd
JS
2065enum todo_item_flags {
2066 TODO_EDIT_MERGE_MSG = 1
2067};
2068
5d94d545 2069void todo_list_release(struct todo_list *todo_list)
043a4492 2070{
004fefa7 2071 strbuf_release(&todo_list->buf);
6a83d902 2072 FREE_AND_NULL(todo_list->items);
004fefa7
JS
2073 todo_list->nr = todo_list->alloc = 0;
2074}
043a4492 2075
004fefa7
JS
2076static struct todo_item *append_new_todo(struct todo_list *todo_list)
2077{
2078 ALLOC_GROW(todo_list->items, todo_list->nr + 1, todo_list->alloc);
2079 return todo_list->items + todo_list->nr++;
043a4492
RR
2080}
2081
6ad656db
AG
2082const char *todo_item_get_arg(struct todo_list *todo_list,
2083 struct todo_item *item)
2084{
2085 return todo_list->buf.buf + item->arg_offset;
2086}
2087
005af339 2088static int parse_insn_line(struct repository *r, struct todo_item *item,
6ad656db 2089 const char *buf, const char *bol, char *eol)
043a4492 2090{
1e43ed98 2091 struct object_id commit_oid;
043a4492 2092 char *end_of_object_name;
004fefa7
JS
2093 int i, saved, status, padding;
2094
4c68e7dd
JS
2095 item->flags = 0;
2096
8f8550b3
JS
2097 /* left-trim */
2098 bol += strspn(bol, " \t");
2099
25c43667 2100 if (bol == eol || *bol == '\r' || *bol == comment_line_char) {
ac191470 2101 item->command = TODO_COMMENT;
25c43667 2102 item->commit = NULL;
6ad656db 2103 item->arg_offset = bol - buf;
25c43667
JS
2104 item->arg_len = eol - bol;
2105 return 0;
2106 }
2107
ac191470 2108 for (i = 0; i < TODO_COMMENT; i++)
414697a9
JS
2109 if (skip_prefix(bol, todo_command_info[i].str, &bol)) {
2110 item->command = i;
2111 break;
3a4a4cab
JS
2112 } else if ((bol + 1 == eol || bol[1] == ' ') &&
2113 *bol == todo_command_info[i].c) {
414697a9 2114 bol++;
004fefa7
JS
2115 item->command = i;
2116 break;
2117 }
ac191470 2118 if (i >= TODO_COMMENT)
004fefa7 2119 return -1;
043a4492 2120
66afa24f
JS
2121 /* Eat up extra spaces/ tabs before object name */
2122 padding = strspn(bol, " \t");
2123 bol += padding;
2124
71f82465 2125 if (item->command == TODO_NOOP || item->command == TODO_BREAK) {
66afa24f
JS
2126 if (bol != eol)
2127 return error(_("%s does not accept arguments: '%s'"),
2128 command_to_string(item->command), bol);
25c43667 2129 item->commit = NULL;
6ad656db 2130 item->arg_offset = bol - buf;
25c43667
JS
2131 item->arg_len = eol - bol;
2132 return 0;
2133 }
2134
043a4492 2135 if (!padding)
66afa24f
JS
2136 return error(_("missing arguments for %s"),
2137 command_to_string(item->command));
043a4492 2138
9055e401
JS
2139 if (item->command == TODO_EXEC || item->command == TODO_LABEL ||
2140 item->command == TODO_RESET) {
7dcbb3cb 2141 item->commit = NULL;
6ad656db 2142 item->arg_offset = bol - buf;
311af526
JS
2143 item->arg_len = (int)(eol - bol);
2144 return 0;
2145 }
2146
4c68e7dd
JS
2147 if (item->command == TODO_MERGE) {
2148 if (skip_prefix(bol, "-C", &bol))
2149 bol += strspn(bol, " \t");
2150 else if (skip_prefix(bol, "-c", &bol)) {
2151 bol += strspn(bol, " \t");
2152 item->flags |= TODO_EDIT_MERGE_MSG;
2153 } else {
2154 item->flags |= TODO_EDIT_MERGE_MSG;
2155 item->commit = NULL;
6ad656db 2156 item->arg_offset = bol - buf;
4c68e7dd
JS
2157 item->arg_len = (int)(eol - bol);
2158 return 0;
2159 }
2160 }
2161
004fefa7 2162 end_of_object_name = (char *) bol + strcspn(bol, " \t\n");
043a4492
RR
2163 saved = *end_of_object_name;
2164 *end_of_object_name = '\0';
1e43ed98 2165 status = get_oid(bol, &commit_oid);
043a4492
RR
2166 *end_of_object_name = saved;
2167
6ad656db
AG
2168 bol = end_of_object_name + strspn(end_of_object_name, " \t");
2169 item->arg_offset = bol - buf;
2170 item->arg_len = (int)(eol - bol);
c22f7dfb 2171
043a4492 2172 if (status < 0)
8b637cda
JS
2173 return error(_("could not parse '%.*s'"),
2174 (int)(end_of_object_name - bol), bol);
043a4492 2175
005af339 2176 item->commit = lookup_commit_reference(r, &commit_oid);
004fefa7 2177 return !item->commit;
043a4492
RR
2178}
2179
4a72486d
PW
2180int sequencer_get_last_command(struct repository *r, enum replay_action *action)
2181{
2182 struct todo_item item;
2183 char *eol;
2184 const char *todo_file;
2185 struct strbuf buf = STRBUF_INIT;
2186 int ret = -1;
2187
2188 todo_file = git_path_todo_file();
2189 if (strbuf_read_file(&buf, todo_file, 0) < 0) {
2190 if (errno == ENOENT)
2191 return -1;
2192 else
2193 return error_errno("unable to open '%s'", todo_file);
2194 }
2195 eol = strchrnul(buf.buf, '\n');
2196 if (buf.buf != eol && eol[-1] == '\r')
2197 eol--; /* strip Carriage Return */
b51a0fdc 2198 if (parse_insn_line(r, &item, buf.buf, buf.buf, eol))
4a72486d
PW
2199 goto fail;
2200 if (item.command == TODO_PICK)
2201 *action = REPLAY_PICK;
2202 else if (item.command == TODO_REVERT)
2203 *action = REPLAY_REVERT;
2204 else
2205 goto fail;
2206
2207 ret = 0;
2208
2209 fail:
2210 strbuf_release(&buf);
2211
2212 return ret;
2213}
2214
5d94d545
AG
2215int todo_list_parse_insn_buffer(struct repository *r, char *buf,
2216 struct todo_list *todo_list)
043a4492 2217{
004fefa7
JS
2218 struct todo_item *item;
2219 char *p = buf, *next_p;
6e98de72 2220 int i, res = 0, fixup_okay = file_exists(rebase_path_done());
043a4492 2221
2b71595d
AG
2222 todo_list->current = todo_list->nr = 0;
2223
004fefa7 2224 for (i = 1; *p; i++, p = next_p) {
043a4492 2225 char *eol = strchrnul(p, '\n');
004fefa7
JS
2226
2227 next_p = *eol ? eol + 1 /* skip LF */ : eol;
2228
6307041d
JS
2229 if (p != eol && eol[-1] == '\r')
2230 eol--; /* strip Carriage Return */
2231
004fefa7
JS
2232 item = append_new_todo(todo_list);
2233 item->offset_in_buf = p - todo_list->buf.buf;
6ad656db 2234 if (parse_insn_line(r, item, buf, p, eol)) {
93b3df6f 2235 res = error(_("invalid line %d: %.*s"),
004fefa7 2236 i, (int)(eol - p), p);
2b71595d 2237 item->command = TODO_COMMENT + 1;
6ad656db 2238 item->arg_offset = p - buf;
2b71595d
AG
2239 item->arg_len = (int)(eol - p);
2240 item->commit = NULL;
004fefa7 2241 }
6e98de72
JS
2242
2243 if (fixup_okay)
2244 ; /* do nothing */
2245 else if (is_fixup(item->command))
2246 return error(_("cannot '%s' without a previous commit"),
2247 command_to_string(item->command));
2248 else if (!is_noop(item->command))
2249 fixup_okay = 1;
043a4492 2250 }
52865279 2251
004fefa7 2252 return res;
043a4492
RR
2253}
2254
968492e4
JS
2255static int count_commands(struct todo_list *todo_list)
2256{
2257 int count = 0, i;
2258
2259 for (i = 0; i < todo_list->nr; i++)
2260 if (todo_list->items[i].command != TODO_COMMENT)
2261 count++;
2262
2263 return count;
2264}
2265
a01c2a5f
JS
2266static int get_item_line_offset(struct todo_list *todo_list, int index)
2267{
2268 return index < todo_list->nr ?
2269 todo_list->items[index].offset_in_buf : todo_list->buf.len;
2270}
2271
2272static const char *get_item_line(struct todo_list *todo_list, int index)
2273{
2274 return todo_list->buf.buf + get_item_line_offset(todo_list, index);
2275}
2276
2277static int get_item_line_length(struct todo_list *todo_list, int index)
2278{
2279 return get_item_line_offset(todo_list, index + 1)
2280 - get_item_line_offset(todo_list, index);
2281}
2282
87805600
RS
2283static ssize_t strbuf_read_file_or_whine(struct strbuf *sb, const char *path)
2284{
2285 int fd;
2286 ssize_t len;
2287
2288 fd = open(path, O_RDONLY);
2289 if (fd < 0)
2290 return error_errno(_("could not open '%s'"), path);
2291 len = strbuf_read(sb, fd, 0);
2292 close(fd);
2293 if (len < 0)
2294 return error(_("could not read '%s'."), path);
2295 return len;
2296}
2297
b07d9bfd
PW
2298static int have_finished_the_last_pick(void)
2299{
2300 struct strbuf buf = STRBUF_INIT;
2301 const char *eol;
2302 const char *todo_path = git_path_todo_file();
2303 int ret = 0;
2304
2305 if (strbuf_read_file(&buf, todo_path, 0) < 0) {
2306 if (errno == ENOENT) {
2307 return 0;
2308 } else {
2309 error_errno("unable to open '%s'", todo_path);
2310 return 0;
2311 }
2312 }
2313 /* If there is only one line then we are done */
2314 eol = strchr(buf.buf, '\n');
2315 if (!eol || !eol[1])
2316 ret = 1;
2317
2318 strbuf_release(&buf);
2319
2320 return ret;
2321}
2322
2323void sequencer_post_commit_cleanup(struct repository *r)
2324{
2325 struct replay_opts opts = REPLAY_OPTS_INIT;
2326 int need_cleanup = 0;
2327
2328 if (file_exists(git_path_cherry_pick_head(r))) {
2329 unlink(git_path_cherry_pick_head(r));
2330 opts.action = REPLAY_PICK;
2331 need_cleanup = 1;
2332 }
2333
2334 if (file_exists(git_path_revert_head(r))) {
2335 unlink(git_path_revert_head(r));
2336 opts.action = REPLAY_REVERT;
2337 need_cleanup = 1;
2338 }
2339
2340 if (!need_cleanup)
2341 return;
2342
2343 if (!have_finished_the_last_pick())
2344 return;
2345
2346 sequencer_remove_state(&opts);
2347}
2348
005af339
NTND
2349static int read_populate_todo(struct repository *r,
2350 struct todo_list *todo_list,
2351 struct replay_opts *opts)
043a4492 2352{
54fd3243 2353 struct stat st;
c0246501 2354 const char *todo_file = get_todo_path(opts);
87805600 2355 int res;
043a4492 2356
004fefa7 2357 strbuf_reset(&todo_list->buf);
87805600
RS
2358 if (strbuf_read_file_or_whine(&todo_list->buf, todo_file) < 0)
2359 return -1;
043a4492 2360
54fd3243
SH
2361 res = stat(todo_file, &st);
2362 if (res)
2363 return error(_("could not stat '%s'"), todo_file);
2364 fill_stat_data(&todo_list->stat, &st);
2365
5d94d545 2366 res = todo_list_parse_insn_buffer(r, todo_list->buf.buf, todo_list);
27fdbb96
JS
2367 if (res) {
2368 if (is_rebase_i(opts))
2369 return error(_("please fix this using "
2370 "'git rebase --edit-todo'."));
93b3df6f 2371 return error(_("unusable instruction sheet: '%s'"), todo_file);
27fdbb96 2372 }
2eeaf1b3 2373
52865279
JS
2374 if (!todo_list->nr &&
2375 (!is_rebase_i(opts) || !file_exists(rebase_path_done())))
2376 return error(_("no commits parsed."));
2377
2eeaf1b3 2378 if (!is_rebase_i(opts)) {
004fefa7
JS
2379 enum todo_command valid =
2380 opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
2381 int i;
2382
2383 for (i = 0; i < todo_list->nr; i++)
2384 if (valid == todo_list->items[i].command)
2385 continue;
2386 else if (valid == TODO_PICK)
93b3df6f 2387 return error(_("cannot cherry-pick during a revert."));
004fefa7 2388 else
93b3df6f 2389 return error(_("cannot revert during a cherry-pick."));
004fefa7
JS
2390 }
2391
968492e4
JS
2392 if (is_rebase_i(opts)) {
2393 struct todo_list done = TODO_LIST_INIT;
e9d983f1 2394 FILE *f = fopen_or_warn(rebase_path_msgtotal(), "w");
968492e4
JS
2395
2396 if (strbuf_read_file(&done.buf, rebase_path_done(), 0) > 0 &&
5d94d545 2397 !todo_list_parse_insn_buffer(r, done.buf.buf, &done))
968492e4
JS
2398 todo_list->done_nr = count_commands(&done);
2399 else
2400 todo_list->done_nr = 0;
2401
2402 todo_list->total_nr = todo_list->done_nr
2403 + count_commands(todo_list);
968492e4 2404 todo_list_release(&done);
ef80069a
JS
2405
2406 if (f) {
2407 fprintf(f, "%d\n", todo_list->total_nr);
2408 fclose(f);
2409 }
968492e4
JS
2410 }
2411
0ae42a03 2412 return 0;
043a4492
RR
2413}
2414
03a4e260
JS
2415static int git_config_string_dup(char **dest,
2416 const char *var, const char *value)
2417{
2418 if (!value)
2419 return config_error_nonbool(var);
2420 free(*dest);
2421 *dest = xstrdup(value);
2422 return 0;
2423}
2424
043a4492
RR
2425static int populate_opts_cb(const char *key, const char *value, void *data)
2426{
2427 struct replay_opts *opts = data;
2428 int error_flag = 1;
2429
2430 if (!value)
2431 error_flag = 0;
2432 else if (!strcmp(key, "options.no-commit"))
2433 opts->no_commit = git_config_bool_or_int(key, value, &error_flag);
2434 else if (!strcmp(key, "options.edit"))
2435 opts->edit = git_config_bool_or_int(key, value, &error_flag);
6860ce5d
PW
2436 else if (!strcmp(key, "options.allow-empty"))
2437 opts->allow_empty =
2438 git_config_bool_or_int(key, value, &error_flag);
2439 else if (!strcmp(key, "options.allow-empty-message"))
2440 opts->allow_empty_message =
2441 git_config_bool_or_int(key, value, &error_flag);
2442 else if (!strcmp(key, "options.keep-redundant-commits"))
2443 opts->keep_redundant_commits =
2444 git_config_bool_or_int(key, value, &error_flag);
043a4492
RR
2445 else if (!strcmp(key, "options.signoff"))
2446 opts->signoff = git_config_bool_or_int(key, value, &error_flag);
2447 else if (!strcmp(key, "options.record-origin"))
2448 opts->record_origin = git_config_bool_or_int(key, value, &error_flag);
2449 else if (!strcmp(key, "options.allow-ff"))
2450 opts->allow_ff = git_config_bool_or_int(key, value, &error_flag);
2451 else if (!strcmp(key, "options.mainline"))
2452 opts->mainline = git_config_int(key, value);
2453 else if (!strcmp(key, "options.strategy"))
03a4e260 2454 git_config_string_dup(&opts->strategy, key, value);
3253553e 2455 else if (!strcmp(key, "options.gpg-sign"))
03a4e260 2456 git_config_string_dup(&opts->gpg_sign, key, value);
043a4492
RR
2457 else if (!strcmp(key, "options.strategy-option")) {
2458 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
2459 opts->xopts[opts->xopts_nr++] = xstrdup(value);
8d8cb4b0
PW
2460 } else if (!strcmp(key, "options.allow-rerere-auto"))
2461 opts->allow_rerere_auto =
2462 git_config_bool_or_int(key, value, &error_flag) ?
2463 RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
dc42e9a8
PW
2464 else if (!strcmp(key, "options.default-msg-cleanup")) {
2465 opts->explicit_cleanup = 1;
2466 opts->default_msg_cleanup = get_cleanup_mode(value, 1);
2467 } else
93b3df6f 2468 return error(_("invalid key: %s"), key);
043a4492
RR
2469
2470 if (!error_flag)
93b3df6f 2471 return error(_("invalid value for %s: %s"), key, value);
043a4492
RR
2472
2473 return 0;
2474}
2475
65850686 2476void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
ca6c6b45
JS
2477{
2478 int i;
65850686 2479 char *strategy_opts_string = raw_opts;
ca6c6b45 2480
0060041d
EN
2481 if (*strategy_opts_string == ' ')
2482 strategy_opts_string++;
65850686 2483
0060041d
EN
2484 opts->xopts_nr = split_cmdline(strategy_opts_string,
2485 (const char ***)&opts->xopts);
ca6c6b45
JS
2486 for (i = 0; i < opts->xopts_nr; i++) {
2487 const char *arg = opts->xopts[i];
2488
2489 skip_prefix(arg, "--", &arg);
2490 opts->xopts[i] = xstrdup(arg);
2491 }
2492}
2493
65850686
AG
2494static void read_strategy_opts(struct replay_opts *opts, struct strbuf *buf)
2495{
2496 strbuf_reset(buf);
2497 if (!read_oneliner(buf, rebase_path_strategy(), 0))
2498 return;
2499 opts->strategy = strbuf_detach(buf, NULL);
2500 if (!read_oneliner(buf, rebase_path_strategy_opts(), 0))
2501 return;
2502
2503 parse_strategy_opts(opts, buf->buf);
2504}
2505
5adf9bdc 2506static int read_populate_opts(struct replay_opts *opts)
043a4492 2507{
a1c75762
JS
2508 if (is_rebase_i(opts)) {
2509 struct strbuf buf = STRBUF_INIT;
2510
2511 if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
2512 if (!starts_with(buf.buf, "-S"))
2513 strbuf_reset(&buf);
2514 else {
2515 free(opts->gpg_sign);
2516 opts->gpg_sign = xstrdup(buf.buf + 2);
2517 }
9b6d7a62
PW
2518 strbuf_reset(&buf);
2519 }
2520
2521 if (read_oneliner(&buf, rebase_path_allow_rerere_autoupdate(), 1)) {
2522 if (!strcmp(buf.buf, "--rerere-autoupdate"))
2523 opts->allow_rerere_auto = RERERE_AUTOUPDATE;
2524 else if (!strcmp(buf.buf, "--no-rerere-autoupdate"))
2525 opts->allow_rerere_auto = RERERE_NOAUTOUPDATE;
2526 strbuf_reset(&buf);
a1c75762 2527 }
a1c75762 2528
556907f1
JS
2529 if (file_exists(rebase_path_verbose()))
2530 opts->verbose = 1;
2531
899b49c4
EN
2532 if (file_exists(rebase_path_quiet()))
2533 opts->quiet = 1;
2534
a852ec7f
PW
2535 if (file_exists(rebase_path_signoff())) {
2536 opts->allow_ff = 0;
2537 opts->signoff = 1;
2538 }
2539
d421afa0
JS
2540 if (file_exists(rebase_path_reschedule_failed_exec()))
2541 opts->reschedule_failed_exec = 1;
2542
ca6c6b45
JS
2543 read_strategy_opts(opts, &buf);
2544 strbuf_release(&buf);
2545
e12a7ef5
JS
2546 if (read_oneliner(&opts->current_fixups,
2547 rebase_path_current_fixups(), 1)) {
2548 const char *p = opts->current_fixups.buf;
2549 opts->current_fixup_count = 1;
2550 while ((p = strchr(p, '\n'))) {
2551 opts->current_fixup_count++;
2552 p++;
2553 }
2554 }
2555
d87d48b2
JS
2556 if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
2557 if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
2558 return error(_("unusable squash-onto"));
2559 opts->have_squash_onto = 1;
2560 }
2561
b5a67045 2562 return 0;
a1c75762 2563 }
b5a67045 2564
f932729c 2565 if (!file_exists(git_path_opts_file()))
0d00da7b
JS
2566 return 0;
2567 /*
2568 * The function git_parse_source(), called from git_config_from_file(),
2569 * may die() in case of a syntactically incorrect file. We do not care
2570 * about this case, though, because we wrote that file ourselves, so we
2571 * are pretty certain that it is syntactically correct.
2572 */
5adf9bdc 2573 if (git_config_from_file(populate_opts_cb, git_path_opts_file(), opts) < 0)
93b3df6f 2574 return error(_("malformed options sheet: '%s'"),
0d00da7b
JS
2575 git_path_opts_file());
2576 return 0;
043a4492
RR
2577}
2578
65850686
AG
2579static void write_strategy_opts(struct replay_opts *opts)
2580{
2581 int i;
2582 struct strbuf buf = STRBUF_INIT;
2583
2584 for (i = 0; i < opts->xopts_nr; ++i)
2585 strbuf_addf(&buf, " --%s", opts->xopts[i]);
2586
2587 write_file(rebase_path_strategy_opts(), "%s\n", buf.buf);
2588 strbuf_release(&buf);
2589}
2590
2591int write_basic_state(struct replay_opts *opts, const char *head_name,
7d3488eb 2592 struct commit *onto, const char *orig_head)
65850686
AG
2593{
2594 const char *quiet = getenv("GIT_QUIET");
2595
2596 if (head_name)
2597 write_file(rebase_path_head_name(), "%s\n", head_name);
2598 if (onto)
7d3488eb
PW
2599 write_file(rebase_path_onto(), "%s\n",
2600 oid_to_hex(&onto->object.oid));
65850686
AG
2601 if (orig_head)
2602 write_file(rebase_path_orig_head(), "%s\n", orig_head);
2603
2604 if (quiet)
2605 write_file(rebase_path_quiet(), "%s\n", quiet);
65850686 2606 if (opts->verbose)
4af51741 2607 write_file(rebase_path_verbose(), "%s", "");
65850686
AG
2608 if (opts->strategy)
2609 write_file(rebase_path_strategy(), "%s\n", opts->strategy);
2610 if (opts->xopts_nr > 0)
2611 write_strategy_opts(opts);
2612
2613 if (opts->allow_rerere_auto == RERERE_AUTOUPDATE)
2614 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2615 else if (opts->allow_rerere_auto == RERERE_NOAUTOUPDATE)
2616 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2617
2618 if (opts->gpg_sign)
2619 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts->gpg_sign);
2620 if (opts->signoff)
2621 write_file(rebase_path_signoff(), "--signoff\n");
d421afa0
JS
2622 if (opts->reschedule_failed_exec)
2623 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
65850686
AG
2624
2625 return 0;
2626}
2627
004fefa7 2628static int walk_revs_populate_todo(struct todo_list *todo_list,
043a4492
RR
2629 struct replay_opts *opts)
2630{
004fefa7
JS
2631 enum todo_command command = opts->action == REPLAY_PICK ?
2632 TODO_PICK : TODO_REVERT;
414697a9 2633 const char *command_string = todo_command_info[command].str;
043a4492 2634 struct commit *commit;
043a4492 2635
34b0528b
JS
2636 if (prepare_revs(opts))
2637 return -1;
043a4492 2638
004fefa7
JS
2639 while ((commit = get_revision(opts->revs))) {
2640 struct todo_item *item = append_new_todo(todo_list);
2641 const char *commit_buffer = get_commit_buffer(commit, NULL);
2642 const char *subject;
2643 int subject_len;
2644
2645 item->command = command;
2646 item->commit = commit;
6ad656db 2647 item->arg_offset = 0;
c22f7dfb 2648 item->arg_len = 0;
004fefa7
JS
2649 item->offset_in_buf = todo_list->buf.len;
2650 subject_len = find_commit_subject(commit_buffer, &subject);
2651 strbuf_addf(&todo_list->buf, "%s %s %.*s\n", command_string,
2652 short_commit_name(commit), subject_len, subject);
2653 unuse_commit_buffer(commit, commit_buffer);
2654 }
8530c739
JK
2655
2656 if (!todo_list->nr)
2657 return error(_("empty commit set passed"));
2658
34b0528b 2659 return 0;
043a4492
RR
2660}
2661
2662static int create_seq_dir(void)
2663{
f932729c 2664 if (file_exists(git_path_seq_dir())) {
043a4492
RR
2665 error(_("a cherry-pick or revert is already in progress"));
2666 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2667 return -1;
a70d8f80 2668 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
93b3df6f 2669 return error_errno(_("could not create sequencer directory '%s'"),
f6e82b0d 2670 git_path_seq_dir());
043a4492
RR
2671 return 0;
2672}
2673
311fd397 2674static int save_head(const char *head)
043a4492 2675{
14bca6c6 2676 struct lock_file head_lock = LOCK_INIT;
043a4492
RR
2677 struct strbuf buf = STRBUF_INIT;
2678 int fd;
ed3f9a12 2679 ssize_t written;
043a4492 2680
311fd397 2681 fd = hold_lock_file_for_update(&head_lock, git_path_head_file(), 0);
350292a1 2682 if (fd < 0)
93b3df6f 2683 return error_errno(_("could not lock HEAD"));
043a4492 2684 strbuf_addf(&buf, "%s\n", head);
ed3f9a12
RS
2685 written = write_in_full(fd, buf.buf, buf.len);
2686 strbuf_release(&buf);
2687 if (written < 0) {
bf5c0571 2688 error_errno(_("could not write to '%s'"), git_path_head_file());
311fd397 2689 rollback_lock_file(&head_lock);
bf5c0571 2690 return -1;
311fd397 2691 }
350292a1
2692 if (commit_lock_file(&head_lock) < 0)
2693 return error(_("failed to finalize '%s'"), git_path_head_file());
311fd397 2694 return 0;
043a4492
RR
2695}
2696
1e41229d
SB
2697static int rollback_is_safe(void)
2698{
2699 struct strbuf sb = STRBUF_INIT;
2700 struct object_id expected_head, actual_head;
2701
2702 if (strbuf_read_file(&sb, git_path_abort_safety_file(), 0) >= 0) {
2703 strbuf_trim(&sb);
2704 if (get_oid_hex(sb.buf, &expected_head)) {
2705 strbuf_release(&sb);
2706 die(_("could not parse %s"), git_path_abort_safety_file());
2707 }
2708 strbuf_release(&sb);
2709 }
2710 else if (errno == ENOENT)
2711 oidclr(&expected_head);
2712 else
2713 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2714
2715 if (get_oid("HEAD", &actual_head))
2716 oidclr(&actual_head);
2717
4a7e27e9 2718 return oideq(&actual_head, &expected_head);
1e41229d
SB
2719}
2720
092bbcdf 2721static int reset_for_rollback(const struct object_id *oid)
043a4492
RR
2722{
2723 const char *argv[4]; /* reset --merge <arg> + NULL */
1e41229d 2724
043a4492
RR
2725 argv[0] = "reset";
2726 argv[1] = "--merge";
092bbcdf 2727 argv[2] = oid_to_hex(oid);
043a4492
RR
2728 argv[3] = NULL;
2729 return run_command_v_opt(argv, RUN_GIT_CMD);
2730}
2731
005af339 2732static int rollback_single_pick(struct repository *r)
043a4492 2733{
092bbcdf 2734 struct object_id head_oid;
043a4492 2735
005af339
NTND
2736 if (!file_exists(git_path_cherry_pick_head(r)) &&
2737 !file_exists(git_path_revert_head(r)))
043a4492 2738 return error(_("no cherry-pick or revert in progress"));
34c290a6 2739 if (read_ref_full("HEAD", 0, &head_oid, NULL))
043a4492 2740 return error(_("cannot resolve HEAD"));
092bbcdf 2741 if (is_null_oid(&head_oid))
043a4492 2742 return error(_("cannot abort from a branch yet to be born"));
092bbcdf 2743 return reset_for_rollback(&head_oid);
043a4492
RR
2744}
2745
005af339 2746int sequencer_rollback(struct repository *r, struct replay_opts *opts)
043a4492 2747{
043a4492 2748 FILE *f;
092bbcdf 2749 struct object_id oid;
043a4492 2750 struct strbuf buf = STRBUF_INIT;
092bbcdf 2751 const char *p;
043a4492 2752
f932729c 2753 f = fopen(git_path_head_file(), "r");
043a4492
RR
2754 if (!f && errno == ENOENT) {
2755 /*
2756 * There is no multiple-cherry-pick in progress.
2757 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2758 * a single-cherry-pick in progress, abort that.
2759 */
005af339 2760 return rollback_single_pick(r);
043a4492
RR
2761 }
2762 if (!f)
f7ed1953 2763 return error_errno(_("cannot open '%s'"), git_path_head_file());
8f309aeb 2764 if (strbuf_getline_lf(&buf, f)) {
f7ed1953 2765 error(_("cannot read '%s': %s"), git_path_head_file(),
f932729c 2766 ferror(f) ? strerror(errno) : _("unexpected end of file"));
043a4492
RR
2767 fclose(f);
2768 goto fail;
2769 }
2770 fclose(f);
092bbcdf 2771 if (parse_oid_hex(buf.buf, &oid, &p) || *p != '\0') {
043a4492 2772 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
f932729c 2773 git_path_head_file());
043a4492
RR
2774 goto fail;
2775 }
092bbcdf 2776 if (is_null_oid(&oid)) {
0f974e21
MG
2777 error(_("cannot abort from a branch yet to be born"));
2778 goto fail;
2779 }
1e41229d
SB
2780
2781 if (!rollback_is_safe()) {
2782 /* Do not error, just do not rollback */
2783 warning(_("You seem to have moved HEAD. "
2784 "Not rewinding, check your HEAD!"));
2785 } else
092bbcdf 2786 if (reset_for_rollback(&oid))
043a4492 2787 goto fail;
043a4492 2788 strbuf_release(&buf);
2863584f 2789 return sequencer_remove_state(opts);
043a4492
RR
2790fail:
2791 strbuf_release(&buf);
2792 return -1;
2793}
2794
004fefa7 2795static int save_todo(struct todo_list *todo_list, struct replay_opts *opts)
043a4492 2796{
14bca6c6 2797 struct lock_file todo_lock = LOCK_INIT;
004fefa7
JS
2798 const char *todo_path = get_todo_path(opts);
2799 int next = todo_list->current, offset, fd;
043a4492 2800
84583957
JS
2801 /*
2802 * rebase -i writes "git-rebase-todo" without the currently executing
2803 * command, appending it to "done" instead.
2804 */
2805 if (is_rebase_i(opts))
2806 next++;
2807
004fefa7 2808 fd = hold_lock_file_for_update(&todo_lock, todo_path, 0);
221675de 2809 if (fd < 0)
93b3df6f 2810 return error_errno(_("could not lock '%s'"), todo_path);
a01c2a5f 2811 offset = get_item_line_offset(todo_list, next);
004fefa7
JS
2812 if (write_in_full(fd, todo_list->buf.buf + offset,
2813 todo_list->buf.len - offset) < 0)
93b3df6f 2814 return error_errno(_("could not write to '%s'"), todo_path);
004fefa7 2815 if (commit_lock_file(&todo_lock) < 0)
350292a1 2816 return error(_("failed to finalize '%s'"), todo_path);
1df6df0c 2817
a01c2a5f
JS
2818 if (is_rebase_i(opts) && next > 0) {
2819 const char *done = rebase_path_done();
2820 int fd = open(done, O_CREAT | O_WRONLY | O_APPEND, 0666);
2821 int ret = 0;
1df6df0c 2822
a01c2a5f
JS
2823 if (fd < 0)
2824 return 0;
2825 if (write_in_full(fd, get_item_line(todo_list, next - 1),
2826 get_item_line_length(todo_list, next - 1))
2827 < 0)
2828 ret = error_errno(_("could not write to '%s'"), done);
2829 if (close(fd) < 0)
2830 ret = error_errno(_("failed to finalize '%s'"), done);
2831 return ret;
1df6df0c 2832 }
221675de 2833 return 0;
043a4492
RR
2834}
2835
88d5a271 2836static int save_opts(struct replay_opts *opts)
043a4492 2837{
f932729c 2838 const char *opts_file = git_path_opts_file();
88d5a271 2839 int res = 0;
043a4492
RR
2840
2841 if (opts->no_commit)
f59199d5
PW
2842 res |= git_config_set_in_file_gently(opts_file,
2843 "options.no-commit", "true");
043a4492 2844 if (opts->edit)
f59199d5
PW
2845 res |= git_config_set_in_file_gently(opts_file,
2846 "options.edit", "true");
6860ce5d
PW
2847 if (opts->allow_empty)
2848 res |= git_config_set_in_file_gently(opts_file,
2849 "options.allow-empty", "true");
2850 if (opts->allow_empty_message)
2851 res |= git_config_set_in_file_gently(opts_file,
2852 "options.allow-empty-message", "true");
2853 if (opts->keep_redundant_commits)
2854 res |= git_config_set_in_file_gently(opts_file,
2855 "options.keep-redundant-commits", "true");
043a4492 2856 if (opts->signoff)
f59199d5
PW
2857 res |= git_config_set_in_file_gently(opts_file,
2858 "options.signoff", "true");
043a4492 2859 if (opts->record_origin)
f59199d5
PW
2860 res |= git_config_set_in_file_gently(opts_file,
2861 "options.record-origin", "true");
043a4492 2862 if (opts->allow_ff)
f59199d5
PW
2863 res |= git_config_set_in_file_gently(opts_file,
2864 "options.allow-ff", "true");
043a4492
RR
2865 if (opts->mainline) {
2866 struct strbuf buf = STRBUF_INIT;
2867 strbuf_addf(&buf, "%d", opts->mainline);
f59199d5
PW
2868 res |= git_config_set_in_file_gently(opts_file,
2869 "options.mainline", buf.buf);
043a4492
RR
2870 strbuf_release(&buf);
2871 }
2872 if (opts->strategy)
f59199d5
PW
2873 res |= git_config_set_in_file_gently(opts_file,
2874 "options.strategy", opts->strategy);
3253553e 2875 if (opts->gpg_sign)
f59199d5
PW
2876 res |= git_config_set_in_file_gently(opts_file,
2877 "options.gpg-sign", opts->gpg_sign);
043a4492
RR
2878 if (opts->xopts) {
2879 int i;
2880 for (i = 0; i < opts->xopts_nr; i++)
88d5a271 2881 res |= git_config_set_multivar_in_file_gently(opts_file,
f59199d5
PW
2882 "options.strategy-option",
2883 opts->xopts[i], "^$", 0);
043a4492 2884 }
8d8cb4b0 2885 if (opts->allow_rerere_auto)
f59199d5
PW
2886 res |= git_config_set_in_file_gently(opts_file,
2887 "options.allow-rerere-auto",
2888 opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
2889 "true" : "false");
dc42e9a8
PW
2890
2891 if (opts->explicit_cleanup)
2892 res |= git_config_set_in_file_gently(opts_file,
2893 "options.default-msg-cleanup",
2894 describe_cleanup_mode(opts->default_msg_cleanup));
88d5a271 2895 return res;
043a4492
RR
2896}
2897
f11c9580
NTND
2898static int make_patch(struct repository *r,
2899 struct commit *commit,
2900 struct replay_opts *opts)
56dc3ab0
JS
2901{
2902 struct strbuf buf = STRBUF_INIT;
2903 struct rev_info log_tree_opt;
2904 const char *subject, *p;
2905 int res = 0;
2906
2907 p = short_commit_name(commit);
2908 if (write_message(p, strlen(p), rebase_path_stopped_sha(), 1) < 0)
2909 return -1;
fbd7a232
NTND
2910 if (update_ref("rebase", "REBASE_HEAD", &commit->object.oid,
2911 NULL, REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR))
2912 res |= error(_("could not update %s"), "REBASE_HEAD");
56dc3ab0
JS
2913
2914 strbuf_addf(&buf, "%s/patch", get_dir(opts));
2915 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
f11c9580 2916 repo_init_revisions(r, &log_tree_opt, NULL);
56dc3ab0
JS
2917 log_tree_opt.abbrev = 0;
2918 log_tree_opt.diff = 1;
2919 log_tree_opt.diffopt.output_format = DIFF_FORMAT_PATCH;
2920 log_tree_opt.disable_stdin = 1;
2921 log_tree_opt.no_commit_id = 1;
2922 log_tree_opt.diffopt.file = fopen(buf.buf, "w");
2923 log_tree_opt.diffopt.use_color = GIT_COLOR_NEVER;
2924 if (!log_tree_opt.diffopt.file)
2925 res |= error_errno(_("could not open '%s'"), buf.buf);
2926 else {
2927 res |= log_tree_commit(&log_tree_opt, commit);
2928 fclose(log_tree_opt.diffopt.file);
2929 }
2930 strbuf_reset(&buf);
2931
2932 strbuf_addf(&buf, "%s/message", get_dir(opts));
2933 if (!file_exists(buf.buf)) {
2934 const char *commit_buffer = get_commit_buffer(commit, NULL);
2935 find_commit_subject(commit_buffer, &subject);
2936 res |= write_message(subject, strlen(subject), buf.buf, 1);
2937 unuse_commit_buffer(commit, commit_buffer);
2938 }
2939 strbuf_release(&buf);
2940
2941 return res;
2942}
2943
2944static int intend_to_amend(void)
2945{
092bbcdf 2946 struct object_id head;
56dc3ab0
JS
2947 char *p;
2948
092bbcdf 2949 if (get_oid("HEAD", &head))
56dc3ab0
JS
2950 return error(_("cannot read HEAD"));
2951
092bbcdf 2952 p = oid_to_hex(&head);
56dc3ab0
JS
2953 return write_message(p, strlen(p), rebase_path_amend(), 1);
2954}
2955
f11c9580
NTND
2956static int error_with_patch(struct repository *r,
2957 struct commit *commit,
2958 const char *subject, int subject_len,
2959 struct replay_opts *opts,
2960 int exit_code, int to_amend)
56dc3ab0 2961{
bc9238bb 2962 if (commit) {
f11c9580 2963 if (make_patch(r, commit, opts))
bc9238bb 2964 return -1;
5a5c5e95 2965 } else if (copy_file(rebase_path_message(),
f11c9580 2966 git_path_merge_msg(r), 0666))
bc9238bb 2967 return error(_("unable to copy '%s' to '%s'"),
f11c9580 2968 git_path_merge_msg(r), rebase_path_message());
56dc3ab0
JS
2969
2970 if (to_amend) {
2971 if (intend_to_amend())
2972 return -1;
2973
02127c63
NTND
2974 fprintf(stderr,
2975 _("You can amend the commit now, with\n"
2976 "\n"
2977 " git commit --amend %s\n"
2978 "\n"
2979 "Once you are satisfied with your changes, run\n"
2980 "\n"
2981 " git rebase --continue\n"),
2982 gpg_sign_opt_quoted(opts));
bc9238bb
PW
2983 } else if (exit_code) {
2984 if (commit)
5a5c5e95
JH
2985 fprintf_ln(stderr, _("Could not apply %s... %.*s"),
2986 short_commit_name(commit), subject_len, subject);
bc9238bb
PW
2987 else
2988 /*
2989 * We don't have the hash of the parent so
2990 * just print the line from the todo file.
2991 */
5a5c5e95
JH
2992 fprintf_ln(stderr, _("Could not merge %.*s"),
2993 subject_len, subject);
bc9238bb 2994 }
56dc3ab0
JS
2995
2996 return exit_code;
2997}
2998
f11c9580
NTND
2999static int error_failed_squash(struct repository *r,
3000 struct commit *commit,
3001 struct replay_opts *opts,
3002 int subject_len,
3003 const char *subject)
6e98de72 3004{
e12a7ef5
JS
3005 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3006 return error(_("could not copy '%s' to '%s'"),
6e98de72 3007 rebase_path_squash_msg(), rebase_path_message());
f11c9580
NTND
3008 unlink(git_path_merge_msg(r));
3009 if (copy_file(git_path_merge_msg(r), rebase_path_message(), 0666))
6e98de72 3010 return error(_("could not copy '%s' to '%s'"),
102de880 3011 rebase_path_message(),
f11c9580
NTND
3012 git_path_merge_msg(r));
3013 return error_with_patch(r, commit, subject, subject_len, opts, 1, 0);
6e98de72
JS
3014}
3015
f11c9580 3016static int do_exec(struct repository *r, const char *command_line)
311af526 3017{
09d7b6c6 3018 struct argv_array child_env = ARGV_ARRAY_INIT;
311af526
JS
3019 const char *child_argv[] = { NULL, NULL };
3020 int dirty, status;
3021
3022 fprintf(stderr, "Executing: %s\n", command_line);
3023 child_argv[0] = command_line;
09d7b6c6 3024 argv_array_pushf(&child_env, "GIT_DIR=%s", absolute_path(get_git_dir()));
ab5e67d7 3025 argv_array_pushf(&child_env, "GIT_WORK_TREE=%s",
3026 absolute_path(get_git_work_tree()));
09d7b6c6
JK
3027 status = run_command_v_opt_cd_env(child_argv, RUN_USING_SHELL, NULL,
3028 child_env.argv);
311af526
JS
3029
3030 /* force re-reading of the cache */
e1ff0a32 3031 if (discard_index(r->index) < 0 || repo_read_index(r) < 0)
311af526
JS
3032 return error(_("could not read index"));
3033
f11c9580 3034 dirty = require_clean_work_tree(r, "rebase", NULL, 1, 1);
311af526
JS
3035
3036 if (status) {
3037 warning(_("execution failed: %s\n%s"
3038 "You can fix the problem, and then run\n"
3039 "\n"
3040 " git rebase --continue\n"
3041 "\n"),
3042 command_line,
3043 dirty ? N_("and made changes to the index and/or the "
3044 "working tree\n") : "");
3045 if (status == 127)
3046 /* command not found */
3047 status = 1;
3048 } else if (dirty) {
3049 warning(_("execution succeeded: %s\nbut "
3050 "left changes to the index and/or the working tree\n"
3051 "Commit or stash your changes, and then run\n"
3052 "\n"
3053 " git rebase --continue\n"
3054 "\n"), command_line);
3055 status = 1;
3056 }
3057
09d7b6c6
JK
3058 argv_array_clear(&child_env);
3059
311af526
JS
3060 return status;
3061}
3062
9055e401
JS
3063static int safe_append(const char *filename, const char *fmt, ...)
3064{
3065 va_list ap;
3066 struct lock_file lock = LOCK_INIT;
3067 int fd = hold_lock_file_for_update(&lock, filename,
3068 LOCK_REPORT_ON_ERROR);
3069 struct strbuf buf = STRBUF_INIT;
3070
3071 if (fd < 0)
3072 return -1;
3073
3074 if (strbuf_read_file(&buf, filename, 0) < 0 && errno != ENOENT) {
3075 error_errno(_("could not read '%s'"), filename);
3076 rollback_lock_file(&lock);
3077 return -1;
3078 }
3079 strbuf_complete(&buf, '\n');
3080 va_start(ap, fmt);
3081 strbuf_vaddf(&buf, fmt, ap);
3082 va_end(ap);
3083
3084 if (write_in_full(fd, buf.buf, buf.len) < 0) {
3085 error_errno(_("could not write to '%s'"), filename);
3086 strbuf_release(&buf);
3087 rollback_lock_file(&lock);
3088 return -1;
3089 }
3090 if (commit_lock_file(&lock) < 0) {
3091 strbuf_release(&buf);
3092 rollback_lock_file(&lock);
3093 return error(_("failed to finalize '%s'"), filename);
3094 }
3095
3096 strbuf_release(&buf);
3097 return 0;
3098}
3099
f11c9580 3100static int do_label(struct repository *r, const char *name, int len)
9055e401 3101{
f11c9580 3102 struct ref_store *refs = get_main_ref_store(r);
9055e401
JS
3103 struct ref_transaction *transaction;
3104 struct strbuf ref_name = STRBUF_INIT, err = STRBUF_INIT;
3105 struct strbuf msg = STRBUF_INIT;
3106 int ret = 0;
3107 struct object_id head_oid;
3108
3109 if (len == 1 && *name == '#')
02127c63 3110 return error(_("illegal label name: '%.*s'"), len, name);
9055e401
JS
3111
3112 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3113 strbuf_addf(&msg, "rebase -i (label) '%.*s'", len, name);
3114
3115 transaction = ref_store_transaction_begin(refs, &err);
3116 if (!transaction) {
3117 error("%s", err.buf);
3118 ret = -1;
3119 } else if (get_oid("HEAD", &head_oid)) {
3120 error(_("could not read HEAD"));
3121 ret = -1;
3122 } else if (ref_transaction_update(transaction, ref_name.buf, &head_oid,
3123 NULL, 0, msg.buf, &err) < 0 ||
3124 ref_transaction_commit(transaction, &err)) {
3125 error("%s", err.buf);
3126 ret = -1;
3127 }
3128 ref_transaction_free(transaction);
3129 strbuf_release(&err);
3130 strbuf_release(&msg);
3131
3132 if (!ret)
3133 ret = safe_append(rebase_path_refs_to_delete(),
3134 "%s\n", ref_name.buf);
3135 strbuf_release(&ref_name);
3136
3137 return ret;
3138}
3139
3140static const char *reflog_message(struct replay_opts *opts,
3141 const char *sub_action, const char *fmt, ...);
3142
f11c9580
NTND
3143static int do_reset(struct repository *r,
3144 const char *name, int len,
3145 struct replay_opts *opts)
9055e401
JS
3146{
3147 struct strbuf ref_name = STRBUF_INIT;
3148 struct object_id oid;
3149 struct lock_file lock = LOCK_INIT;
3150 struct tree_desc desc;
3151 struct tree *tree;
3152 struct unpack_trees_options unpack_tree_opts;
71571cd7 3153 int ret = 0;
9055e401 3154
3a95f31d 3155 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0)
9055e401
JS
3156 return -1;
3157
ebddf393
JS
3158 if (len == 10 && !strncmp("[new root]", name, len)) {
3159 if (!opts->have_squash_onto) {
3160 const char *hex;
3161 if (commit_tree("", 0, the_hash_algo->empty_tree,
3162 NULL, &opts->squash_onto,
3163 NULL, NULL))
3164 return error(_("writing fake root commit"));
3165 opts->have_squash_onto = 1;
3166 hex = oid_to_hex(&opts->squash_onto);
3167 if (write_message(hex, strlen(hex),
3168 rebase_path_squash_onto(), 0))
3169 return error(_("writing squash-onto"));
3170 }
3171 oidcpy(&oid, &opts->squash_onto);
3172 } else {
71571cd7
3173 int i;
3174
ebddf393
JS
3175 /* Determine the length of the label */
3176 for (i = 0; i < len; i++)
3177 if (isspace(name[i]))
71571cd7
3178 break;
3179 len = i;
ebddf393
JS
3180
3181 strbuf_addf(&ref_name, "refs/rewritten/%.*s", len, name);
3182 if (get_oid(ref_name.buf, &oid) &&
3183 get_oid(ref_name.buf + strlen("refs/rewritten/"), &oid)) {
3184 error(_("could not read '%s'"), ref_name.buf);
3185 rollback_lock_file(&lock);
3186 strbuf_release(&ref_name);
3187 return -1;
3188 }
9055e401
JS
3189 }
3190
3191 memset(&unpack_tree_opts, 0, sizeof(unpack_tree_opts));
3192 setup_unpack_trees_porcelain(&unpack_tree_opts, "reset");
3193 unpack_tree_opts.head_idx = 1;
f11c9580
NTND
3194 unpack_tree_opts.src_index = r->index;
3195 unpack_tree_opts.dst_index = r->index;
9055e401
JS
3196 unpack_tree_opts.fn = oneway_merge;
3197 unpack_tree_opts.merge = 1;
3198 unpack_tree_opts.update = 1;
3199
e1ff0a32 3200 if (repo_read_index_unmerged(r)) {
9055e401
JS
3201 rollback_lock_file(&lock);
3202 strbuf_release(&ref_name);
3203 return error_resolve_conflict(_(action_name(opts)));
3204 }
3205
3206 if (!fill_tree_descriptor(&desc, &oid)) {
3207 error(_("failed to find tree of %s"), oid_to_hex(&oid));
3208 rollback_lock_file(&lock);
3209 free((void *)desc.buffer);
3210 strbuf_release(&ref_name);
3211 return -1;
3212 }
3213
3214 if (unpack_trees(1, &desc, &unpack_tree_opts)) {
3215 rollback_lock_file(&lock);
3216 free((void *)desc.buffer);
3217 strbuf_release(&ref_name);
3218 return -1;
3219 }
3220
3221 tree = parse_tree_indirect(&oid);
c207e9e1 3222 prime_cache_tree(r, r->index, tree);
9055e401 3223
f11c9580 3224 if (write_locked_index(r->index, &lock, COMMIT_LOCK) < 0)
9055e401
JS
3225 ret = error(_("could not write index"));
3226 free((void *)desc.buffer);
3227
3228 if (!ret)
3229 ret = update_ref(reflog_message(opts, "reset", "'%.*s'",
3230 len, name), "HEAD", &oid,
3231 NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3232
3233 strbuf_release(&ref_name);
3234 return ret;
3235}
3236
2b6ad0f4
JS
3237static struct commit *lookup_label(const char *label, int len,
3238 struct strbuf *buf)
3239{
3240 struct commit *commit;
3241
3242 strbuf_reset(buf);
3243 strbuf_addf(buf, "refs/rewritten/%.*s", len, label);
3244 commit = lookup_commit_reference_by_name(buf->buf);
3245 if (!commit) {
3246 /* fall back to non-rewritten ref or commit */
3247 strbuf_splice(buf, 0, strlen("refs/rewritten/"), "", 0);
3248 commit = lookup_commit_reference_by_name(buf->buf);
3249 }
3250
3251 if (!commit)
3252 error(_("could not resolve '%s'"), buf->buf);
3253
3254 return commit;
3255}
3256
f11c9580
NTND
3257static int do_merge(struct repository *r,
3258 struct commit *commit,
3259 const char *arg, int arg_len,
4c68e7dd
JS
3260 int flags, struct replay_opts *opts)
3261{
3262 int run_commit_flags = (flags & TODO_EDIT_MERGE_MSG) ?
3263 EDIT_MSG | VERIFY_MSG : 0;
3264 struct strbuf ref_name = STRBUF_INIT;
3265 struct commit *head_commit, *merge_commit, *i;
3266 struct commit_list *bases, *j, *reversed = NULL;
2b6ad0f4 3267 struct commit_list *to_merge = NULL, **tail = &to_merge;
4c68e7dd 3268 struct merge_options o;
2b6ad0f4 3269 int merge_arg_len, oneline_offset, can_fast_forward, ret, k;
4c68e7dd
JS
3270 static struct lock_file lock;
3271 const char *p;
3272
3a95f31d 3273 if (repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) {
4c68e7dd
JS
3274 ret = -1;
3275 goto leave_merge;
3276 }
3277
3278 head_commit = lookup_commit_reference_by_name("HEAD");
3279 if (!head_commit) {
3280 ret = error(_("cannot merge without a current revision"));
3281 goto leave_merge;
3282 }
3283
2b6ad0f4
JS
3284 /*
3285 * For octopus merges, the arg starts with the list of revisions to be
3286 * merged. The list is optionally followed by '#' and the oneline.
3287 */
3288 merge_arg_len = oneline_offset = arg_len;
3289 for (p = arg; p - arg < arg_len; p += strspn(p, " \t\n")) {
3290 if (!*p)
3291 break;
3292 if (*p == '#' && (!p[1] || isspace(p[1]))) {
3293 p += 1 + strspn(p + 1, " \t\n");
3294 oneline_offset = p - arg;
3295 break;
3296 }
3297 k = strcspn(p, " \t\n");
3298 if (!k)
3299 continue;
3300 merge_commit = lookup_label(p, k, &ref_name);
3301 if (!merge_commit) {
3302 ret = error(_("unable to parse '%.*s'"), k, p);
3303 goto leave_merge;
3304 }
3305 tail = &commit_list_insert(merge_commit, tail)->next;
3306 p += k;
3307 merge_arg_len = p - arg;
4c68e7dd
JS
3308 }
3309
2b6ad0f4
JS
3310 if (!to_merge) {
3311 ret = error(_("nothing to merge: '%.*s'"), arg_len, arg);
4c68e7dd
JS
3312 goto leave_merge;
3313 }
3314
9c85a1c2 3315 if (opts->have_squash_onto &&
4a7e27e9 3316 oideq(&head_commit->object.oid, &opts->squash_onto)) {
9c85a1c2
JS
3317 /*
3318 * When the user tells us to "merge" something into a
3319 * "[new root]", let's simply fast-forward to the merge head.
3320 */
3321 rollback_lock_file(&lock);
2b6ad0f4
JS
3322 if (to_merge->next)
3323 ret = error(_("octopus merge cannot be executed on "
3324 "top of a [new root]"));
3325 else
f11c9580 3326 ret = fast_forward_to(r, &to_merge->item->object.oid,
2b6ad0f4
JS
3327 &head_commit->object.oid, 0,
3328 opts);
9c85a1c2
JS
3329 goto leave_merge;
3330 }
3331
4c68e7dd
JS
3332 if (commit) {
3333 const char *message = get_commit_buffer(commit, NULL);
3334 const char *body;
3335 int len;
3336
3337 if (!message) {
3338 ret = error(_("could not get commit message of '%s'"),
3339 oid_to_hex(&commit->object.oid));
3340 goto leave_merge;
3341 }
3342 write_author_script(message);
3343 find_commit_subject(message, &body);
3344 len = strlen(body);
f11c9580 3345 ret = write_message(body, len, git_path_merge_msg(r), 0);
4c68e7dd
JS
3346 unuse_commit_buffer(commit, message);
3347 if (ret) {
3348 error_errno(_("could not write '%s'"),
f11c9580 3349 git_path_merge_msg(r));
4c68e7dd
JS
3350 goto leave_merge;
3351 }
3352 } else {
3353 struct strbuf buf = STRBUF_INIT;
3354 int len;
3355
3356 strbuf_addf(&buf, "author %s", git_author_info(0));
3357 write_author_script(buf.buf);
3358 strbuf_reset(&buf);
3359
3360 if (oneline_offset < arg_len) {
3361 p = arg + oneline_offset;
3362 len = arg_len - oneline_offset;
3363 } else {
2b6ad0f4
JS
3364 strbuf_addf(&buf, "Merge %s '%.*s'",
3365 to_merge->next ? "branches" : "branch",
4c68e7dd
JS
3366 merge_arg_len, arg);
3367 p = buf.buf;
3368 len = buf.len;
3369 }
3370
f11c9580 3371 ret = write_message(p, len, git_path_merge_msg(r), 0);
4c68e7dd
JS
3372 strbuf_release(&buf);
3373 if (ret) {
3374 error_errno(_("could not write '%s'"),
f11c9580 3375 git_path_merge_msg(r));
4c68e7dd
JS
3376 goto leave_merge;
3377 }
3378 }
3379
d1e8b011
JS
3380 /*
3381 * If HEAD is not identical to the first parent of the original merge
3382 * commit, we cannot fast-forward.
3383 */
3384 can_fast_forward = opts->allow_ff && commit && commit->parents &&
4a7e27e9
JK
3385 oideq(&commit->parents->item->object.oid,
3386 &head_commit->object.oid);
d1e8b011
JS
3387
3388 /*
2b6ad0f4 3389 * If any merge head is different from the original one, we cannot
d1e8b011
JS
3390 * fast-forward.
3391 */
3392 if (can_fast_forward) {
2b6ad0f4 3393 struct commit_list *p = commit->parents->next;
d1e8b011 3394
2b6ad0f4 3395 for (j = to_merge; j && p; j = j->next, p = p->next)
9001dc2a 3396 if (!oideq(&j->item->object.oid,
2b6ad0f4
JS
3397 &p->item->object.oid)) {
3398 can_fast_forward = 0;
3399 break;
3400 }
3401 /*
3402 * If the number of merge heads differs from the original merge
3403 * commit, we cannot fast-forward.
3404 */
3405 if (j || p)
d1e8b011
JS
3406 can_fast_forward = 0;
3407 }
3408
2b6ad0f4 3409 if (can_fast_forward) {
d1e8b011 3410 rollback_lock_file(&lock);
f11c9580 3411 ret = fast_forward_to(r, &commit->object.oid,
d1e8b011
JS
3412 &head_commit->object.oid, 0, opts);
3413 goto leave_merge;
3414 }
3415
2b6ad0f4
JS
3416 if (to_merge->next) {
3417 /* Octopus merge */
3418 struct child_process cmd = CHILD_PROCESS_INIT;
3419
3420 if (read_env_script(&cmd.env_array)) {
3421 const char *gpg_opt = gpg_sign_opt_quoted(opts);
3422
3423 ret = error(_(staged_changes_advice), gpg_opt, gpg_opt);
3424 goto leave_merge;
3425 }
3426
3427 cmd.git_cmd = 1;
3428 argv_array_push(&cmd.args, "merge");
3429 argv_array_push(&cmd.args, "-s");
3430 argv_array_push(&cmd.args, "octopus");
3431 argv_array_push(&cmd.args, "--no-edit");
3432 argv_array_push(&cmd.args, "--no-ff");
3433 argv_array_push(&cmd.args, "--no-log");
3434 argv_array_push(&cmd.args, "--no-stat");
3435 argv_array_push(&cmd.args, "-F");
f11c9580 3436 argv_array_push(&cmd.args, git_path_merge_msg(r));
2b6ad0f4
JS
3437 if (opts->gpg_sign)
3438 argv_array_push(&cmd.args, opts->gpg_sign);
3439
3440 /* Add the tips to be merged */
3441 for (j = to_merge; j; j = j->next)
3442 argv_array_push(&cmd.args,
3443 oid_to_hex(&j->item->object.oid));
3444
3445 strbuf_release(&ref_name);
f11c9580 3446 unlink(git_path_cherry_pick_head(r));
2b6ad0f4
JS
3447 rollback_lock_file(&lock);
3448
3449 rollback_lock_file(&lock);
3450 ret = run_command(&cmd);
3451
3452 /* force re-reading of the cache */
f11c9580 3453 if (!ret && (discard_index(r->index) < 0 ||
e1ff0a32 3454 repo_read_index(r) < 0))
2b6ad0f4
JS
3455 ret = error(_("could not read index"));
3456 goto leave_merge;
3457 }
3458
3459 merge_commit = to_merge->item;
4c68e7dd 3460 bases = get_merge_bases(head_commit, merge_commit);
4a7e27e9
JK
3461 if (bases && oideq(&merge_commit->object.oid,
3462 &bases->item->object.oid)) {
7ccdf65b
JS
3463 ret = 0;
3464 /* skip merging an ancestor of HEAD */
3465 goto leave_merge;
3466 }
3467
85f8d9da 3468 write_message(oid_to_hex(&merge_commit->object.oid), GIT_SHA1_HEXSZ,
cde55548
JH
3469 git_path_merge_head(r), 0);
3470 write_message("no-ff", 5, git_path_merge_mode(r), 0);
85f8d9da 3471
4c68e7dd
JS
3472 for (j = bases; j; j = j->next)
3473 commit_list_insert(j->item, &reversed);
3474 free_commit_list(bases);
3475
e1ff0a32 3476 repo_read_index(r);
0d6caa2d 3477 init_merge_options(&o, r);
4c68e7dd
JS
3478 o.branch1 = "HEAD";
3479 o.branch2 = ref_name.buf;
3480 o.buffer_output = 2;
3481
3482 ret = merge_recursive(&o, head_commit, merge_commit, reversed, &i);
3483 if (ret <= 0)
3484 fputs(o.obuf.buf, stdout);
3485 strbuf_release(&o.obuf);
3486 if (ret < 0) {
3487 error(_("could not even attempt to merge '%.*s'"),
3488 merge_arg_len, arg);
3489 goto leave_merge;
3490 }
3491 /*
3492 * The return value of merge_recursive() is 1 on clean, and 0 on
3493 * unclean merge.
3494 *
3495 * Let's reverse that, so that do_merge() returns 0 upon success and
3496 * 1 upon failed merge (keeping the return value -1 for the cases where
3497 * we will want to reschedule the `merge` command).
3498 */
3499 ret = !ret;
3500
f11c9580
NTND
3501 if (r->index->cache_changed &&
3502 write_locked_index(r->index, &lock, COMMIT_LOCK)) {
4c68e7dd
JS
3503 ret = error(_("merge: Unable to write new index file"));
3504 goto leave_merge;
3505 }
3506
3507 rollback_lock_file(&lock);
3508 if (ret)
f11c9580 3509 repo_rerere(r, opts->allow_rerere_auto);
4c68e7dd
JS
3510 else
3511 /*
3512 * In case of problems, we now want to return a positive
3513 * value (a negative one would indicate that the `merge`
3514 * command needs to be rescheduled).
3515 */
f11c9580
NTND
3516 ret = !!run_git_commit(r, git_path_merge_msg(r), opts,
3517 run_commit_flags);
4c68e7dd
JS
3518
3519leave_merge:
3520 strbuf_release(&ref_name);
3521 rollback_lock_file(&lock);
2b6ad0f4 3522 free_commit_list(to_merge);
4c68e7dd
JS
3523 return ret;
3524}
3525
6e98de72
JS
3526static int is_final_fixup(struct todo_list *todo_list)
3527{
3528 int i = todo_list->current;
3529
3530 if (!is_fixup(todo_list->items[i].command))
3531 return 0;
3532
3533 while (++i < todo_list->nr)
3534 if (is_fixup(todo_list->items[i].command))
3535 return 0;
3536 else if (!is_noop(todo_list->items[i].command))
3537 break;
3538 return 1;
3539}
3540
25cb8df9
JS
3541static enum todo_command peek_command(struct todo_list *todo_list, int offset)
3542{
3543 int i;
3544
3545 for (i = todo_list->current + offset; i < todo_list->nr; i++)
3546 if (!is_noop(todo_list->items[i].command))
3547 return todo_list->items[i].command;
3548
3549 return -1;
3550}
3551
796c7972
JS
3552static int apply_autostash(struct replay_opts *opts)
3553{
3554 struct strbuf stash_sha1 = STRBUF_INIT;
3555 struct child_process child = CHILD_PROCESS_INIT;
3556 int ret = 0;
3557
3558 if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
3559 strbuf_release(&stash_sha1);
3560 return 0;
3561 }
3562 strbuf_trim(&stash_sha1);
3563
3564 child.git_cmd = 1;
79a62269
PW
3565 child.no_stdout = 1;
3566 child.no_stderr = 1;
796c7972
JS
3567 argv_array_push(&child.args, "stash");
3568 argv_array_push(&child.args, "apply");
3569 argv_array_push(&child.args, stash_sha1.buf);
3570 if (!run_command(&child))
cdb866b3 3571 fprintf(stderr, _("Applied autostash.\n"));
796c7972
JS
3572 else {
3573 struct child_process store = CHILD_PROCESS_INIT;
3574
3575 store.git_cmd = 1;
3576 argv_array_push(&store.args, "stash");
3577 argv_array_push(&store.args, "store");
3578 argv_array_push(&store.args, "-m");
3579 argv_array_push(&store.args, "autostash");
3580 argv_array_push(&store.args, "-q");
3581 argv_array_push(&store.args, stash_sha1.buf);
3582 if (run_command(&store))
3583 ret = error(_("cannot store %s"), stash_sha1.buf);
3584 else
cdb866b3
JS
3585 fprintf(stderr,
3586 _("Applying autostash resulted in conflicts.\n"
3587 "Your changes are safe in the stash.\n"
3588 "You can run \"git stash pop\" or"
3589 " \"git stash drop\" at any time.\n"));
796c7972
JS
3590 }
3591
3592 strbuf_release(&stash_sha1);
3593 return ret;
3594}
3595
96e832a5
JS
3596static const char *reflog_message(struct replay_opts *opts,
3597 const char *sub_action, const char *fmt, ...)
3598{
3599 va_list ap;
3600 static struct strbuf buf = STRBUF_INIT;
3601
3602 va_start(ap, fmt);
3603 strbuf_reset(&buf);
3604 strbuf_addstr(&buf, action_name(opts));
3605 if (sub_action)
3606 strbuf_addf(&buf, " (%s)", sub_action);
3607 if (fmt) {
3608 strbuf_addstr(&buf, ": ");
3609 strbuf_vaddf(&buf, fmt, ap);
3610 }
3611 va_end(ap);
3612
3613 return buf.buf;
3614}
3615
fc4a6735
PW
3616static int run_git_checkout(struct repository *r, struct replay_opts *opts,
3617 const char *commit, const char *action)
2c58483a
AG
3618{
3619 struct child_process cmd = CHILD_PROCESS_INIT;
fc4a6735 3620 int ret;
2c58483a
AG
3621
3622 cmd.git_cmd = 1;
3623
3624 argv_array_push(&cmd.args, "checkout");
3625 argv_array_push(&cmd.args, commit);
3626 argv_array_pushf(&cmd.env_array, GIT_REFLOG_ACTION "=%s", action);
3627
3628 if (opts->verbose)
fc4a6735 3629 ret = run_command(&cmd);
2c58483a 3630 else
fc4a6735
PW
3631 ret = run_command_silent_on_success(&cmd);
3632
3633 if (!ret)
3634 discard_index(r->index);
3635
3636 return ret;
2c58483a
AG
3637}
3638
fc4a6735
PW
3639int prepare_branch_to_be_rebased(struct repository *r, struct replay_opts *opts,
3640 const char *commit)
2c58483a
AG
3641{
3642 const char *action;
3643
3644 if (commit && *commit) {
3645 action = reflog_message(opts, "start", "checkout %s", commit);
fc4a6735 3646 if (run_git_checkout(r, opts, commit, action))
2c58483a
AG
3647 return error(_("could not checkout %s"), commit);
3648 }
3649
3650 return 0;
3651}
3652
fc4a6735 3653static int checkout_onto(struct repository *r, struct replay_opts *opts,
7d3488eb 3654 const char *onto_name, const struct object_id *onto,
91f0d95d 3655 const char *orig_head)
4df66c40
AG
3656{
3657 struct object_id oid;
3658 const char *action = reflog_message(opts, "start", "checkout %s", onto_name);
3659
3660 if (get_oid(orig_head, &oid))
3661 return error(_("%s: not a valid OID"), orig_head);
3662
7d3488eb 3663 if (run_git_checkout(r, opts, oid_to_hex(onto), action)) {
4df66c40
AG
3664 apply_autostash(opts);
3665 sequencer_remove_state(opts);
3666 return error(_("could not detach HEAD"));
3667 }
3668
3669 return update_ref(NULL, "ORIG_HEAD", &oid, NULL, 0, UPDATE_REFS_MSG_ON_ERR);
3670}
3671
005af339 3672static int stopped_at_head(struct repository *r)
71f82465
JS
3673{
3674 struct object_id head;
3675 struct commit *commit;
3676 struct commit_message message;
3677
789b1f70 3678 if (get_oid("HEAD", &head) ||
005af339 3679 !(commit = lookup_commit(r, &head)) ||
71f82465
JS
3680 parse_commit(commit) || get_message(commit, &message))
3681 fprintf(stderr, _("Stopped at HEAD\n"));
3682 else {
3683 fprintf(stderr, _("Stopped at %s\n"), message.label);
3684 free_message(commit, &message);
3685 }
3686 return 0;
3687
3688}
3689
cb5206ea
JS
3690static const char rescheduled_advice[] =
3691N_("Could not execute the todo command\n"
3692"\n"
3693" %.*s"
3694"\n"
3695"It has been rescheduled; To edit the command before continuing, please\n"
3696"edit the todo list first:\n"
3697"\n"
3698" git rebase --edit-todo\n"
3699" git rebase --continue\n");
3700
f11c9580
NTND
3701static int pick_commits(struct repository *r,
3702 struct todo_list *todo_list,
3703 struct replay_opts *opts)
043a4492 3704{
9055e401 3705 int res = 0, reschedule = 0;
043a4492
RR
3706
3707 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
3708 if (opts->allow_ff)
3709 assert(!(opts->signoff || opts->no_commit ||
3710 opts->record_origin || opts->edit));
f11c9580 3711 if (read_and_refresh_cache(r, opts))
0d9c6dc9 3712 return -1;
043a4492 3713
004fefa7
JS
3714 while (todo_list->current < todo_list->nr) {
3715 struct todo_item *item = todo_list->items + todo_list->current;
6ad656db 3716 const char *arg = todo_item_get_arg(todo_list, item);
a47ba3c7 3717 int check_todo = 0;
6ad656db 3718
004fefa7 3719 if (save_todo(todo_list, opts))
221675de 3720 return -1;
6e98de72 3721 if (is_rebase_i(opts)) {
ef80069a
JS
3722 if (item->command != TODO_COMMENT) {
3723 FILE *f = fopen(rebase_path_msgnum(), "w");
3724
3725 todo_list->done_nr++;
3726
3727 if (f) {
3728 fprintf(f, "%d\n", todo_list->done_nr);
3729 fclose(f);
3730 }
899b49c4
EN
3731 if (!opts->quiet)
3732 fprintf(stderr, "Rebasing (%d/%d)%s",
3733 todo_list->done_nr,
3734 todo_list->total_nr,
3735 opts->verbose ? "\n" : "\r");
ef80069a 3736 }
6e98de72
JS
3737 unlink(rebase_path_message());
3738 unlink(rebase_path_author_script());
3739 unlink(rebase_path_stopped_sha());
3740 unlink(rebase_path_amend());
69c92209 3741 unlink(git_path_merge_head(the_repository));
fbd7a232 3742 delete_ref(NULL, "REBASE_HEAD", NULL, REF_NO_DEREF);
71f82465 3743
d7d90885
SG
3744 if (item->command == TODO_BREAK) {
3745 if (!opts->verbose)
3746 term_clear_line();
005af339 3747 return stopped_at_head(r);
d7d90885 3748 }
6e98de72
JS
3749 }
3750 if (item->command <= TODO_SQUASH) {
8ab37ef2
JS
3751 if (is_rebase_i(opts))
3752 setenv("GIT_REFLOG_ACTION", reflog_message(opts,
3753 command_to_string(item->command), NULL),
3754 1);
f11c9580 3755 res = do_pick_commit(r, item->command, item->commit,
a47ba3c7
PW
3756 opts, is_final_fixup(todo_list),
3757 &check_todo);
9d7bf3cf
JS
3758 if (is_rebase_i(opts) && res < 0) {
3759 /* Reschedule */
cb5206ea
JS
3760 advise(_(rescheduled_advice),
3761 get_item_line_length(todo_list,
3762 todo_list->current),
3763 get_item_line(todo_list,
3764 todo_list->current));
9d7bf3cf
JS
3765 todo_list->current--;
3766 if (save_todo(todo_list, opts))
3767 return -1;
3768 }
56dc3ab0
JS
3769 if (item->command == TODO_EDIT) {
3770 struct commit *commit = item->commit;
d7d90885
SG
3771 if (!res) {
3772 if (!opts->verbose)
3773 term_clear_line();
99429213 3774 fprintf(stderr,
a42e1b41 3775 _("Stopped at %s... %.*s\n"),
56dc3ab0 3776 short_commit_name(commit),
6ad656db 3777 item->arg_len, arg);
d7d90885 3778 }
f11c9580 3779 return error_with_patch(r, commit,
6ad656db 3780 arg, item->arg_len, opts, res, !res);
56dc3ab0 3781 }
25cb8df9
JS
3782 if (is_rebase_i(opts) && !res)
3783 record_in_rewritten(&item->commit->object.oid,
3784 peek_command(todo_list, 1));
6e98de72
JS
3785 if (res && is_fixup(item->command)) {
3786 if (res == 1)
3787 intend_to_amend();
f11c9580 3788 return error_failed_squash(r, item->commit, opts,
6ad656db 3789 item->arg_len, arg);
a9279c67
PW
3790 } else if (res && is_rebase_i(opts) && item->commit) {
3791 int to_amend = 0;
3792 struct object_id oid;
3793
3794 /*
3795 * If we are rewording and have either
3796 * fast-forwarded already, or are about to
3797 * create a new root commit, we want to amend,
3798 * otherwise we do not.
3799 */
3800 if (item->command == TODO_REWORD &&
3801 !get_oid("HEAD", &oid) &&
4a7e27e9 3802 (oideq(&item->commit->object.oid, &oid) ||
a9279c67 3803 (opts->have_squash_onto &&
4a7e27e9 3804 oideq(&opts->squash_onto, &oid))))
a9279c67
PW
3805 to_amend = 1;
3806
f11c9580 3807 return res | error_with_patch(r, item->commit,
6ad656db 3808 arg, item->arg_len, opts,
a9279c67
PW
3809 res, to_amend);
3810 }
311af526 3811 } else if (item->command == TODO_EXEC) {
6ad656db 3812 char *end_of_arg = (char *)(arg + item->arg_len);
311af526
JS
3813 int saved = *end_of_arg;
3814
d7d90885
SG
3815 if (!opts->verbose)
3816 term_clear_line();
311af526 3817 *end_of_arg = '\0';
6ad656db 3818 res = do_exec(r, arg);
311af526 3819 *end_of_arg = saved;
54fd3243 3820
d421afa0
JS
3821 if (res) {
3822 if (opts->reschedule_failed_exec)
3823 reschedule = 1;
54fd3243 3824 }
a47ba3c7 3825 check_todo = 1;
9055e401 3826 } else if (item->command == TODO_LABEL) {
6ad656db 3827 if ((res = do_label(r, arg, item->arg_len)))
9055e401
JS
3828 reschedule = 1;
3829 } else if (item->command == TODO_RESET) {
6ad656db 3830 if ((res = do_reset(r, arg, item->arg_len, opts)))
9055e401 3831 reschedule = 1;
4c68e7dd 3832 } else if (item->command == TODO_MERGE) {
f11c9580 3833 if ((res = do_merge(r, item->commit,
6ad656db 3834 arg, item->arg_len,
4c68e7dd
JS
3835 item->flags, opts)) < 0)
3836 reschedule = 1;
537e7d61
JS
3837 else if (item->commit)
3838 record_in_rewritten(&item->commit->object.oid,
3839 peek_command(todo_list, 1));
3840 if (res > 0)
4c68e7dd 3841 /* failed with merge conflicts */
f11c9580 3842 return error_with_patch(r, item->commit,
6ad656db
AG
3843 arg, item->arg_len,
3844 opts, res, 0);
56dc3ab0 3845 } else if (!is_noop(item->command))
25c43667
JS
3846 return error(_("unknown command %d"), item->command);
3847
9055e401
JS
3848 if (reschedule) {
3849 advise(_(rescheduled_advice),
3850 get_item_line_length(todo_list,
3851 todo_list->current),
3852 get_item_line(todo_list, todo_list->current));
3853 todo_list->current--;
3854 if (save_todo(todo_list, opts))
3855 return -1;
4c68e7dd 3856 if (item->commit)
f11c9580
NTND
3857 return error_with_patch(r,
3858 item->commit,
6ad656db
AG
3859 arg, item->arg_len,
3860 opts, res, 0);
a47ba3c7
PW
3861 } else if (check_todo && !res) {
3862 struct stat st;
3863
3864 if (stat(get_todo_path(opts), &st)) {
3865 res = error_errno(_("could not stat '%s'"),
3866 get_todo_path(opts));
3867 } else if (match_stat_data(&todo_list->stat, &st)) {
3868 /* Reread the todo file if it has changed. */
3869 todo_list_release(todo_list);
3870 if (read_populate_todo(r, todo_list, opts))
3871 res = -1; /* message was printed */
3872 /* `current` will be incremented below */
3873 todo_list->current = -1;
3874 }
9055e401
JS
3875 }
3876
004fefa7 3877 todo_list->current++;
043a4492
RR
3878 if (res)
3879 return res;
3880 }
3881
56dc3ab0 3882 if (is_rebase_i(opts)) {
4b83ce9f 3883 struct strbuf head_ref = STRBUF_INIT, buf = STRBUF_INIT;
25cb8df9 3884 struct stat st;
556907f1 3885
56dc3ab0
JS
3886 /* Stopped in the middle, as planned? */
3887 if (todo_list->current < todo_list->nr)
3888 return 0;
556907f1 3889
4b83ce9f
JS
3890 if (read_oneliner(&head_ref, rebase_path_head_name(), 0) &&
3891 starts_with(head_ref.buf, "refs/")) {
96e832a5 3892 const char *msg;
092bbcdf 3893 struct object_id head, orig;
4b83ce9f
JS
3894 int res;
3895
092bbcdf 3896 if (get_oid("HEAD", &head)) {
4b83ce9f
JS
3897 res = error(_("cannot read HEAD"));
3898cleanup_head_ref:
3899 strbuf_release(&head_ref);
3900 strbuf_release(&buf);
3901 return res;
3902 }
3903 if (!read_oneliner(&buf, rebase_path_orig_head(), 0) ||
092bbcdf 3904 get_oid_hex(buf.buf, &orig)) {
4b83ce9f
JS
3905 res = error(_("could not read orig-head"));
3906 goto cleanup_head_ref;
3907 }
4ab867b8 3908 strbuf_reset(&buf);
4b83ce9f
JS
3909 if (!read_oneliner(&buf, rebase_path_onto(), 0)) {
3910 res = error(_("could not read 'onto'"));
3911 goto cleanup_head_ref;
3912 }
96e832a5
JS
3913 msg = reflog_message(opts, "finish", "%s onto %s",
3914 head_ref.buf, buf.buf);
ae077771 3915 if (update_ref(msg, head_ref.buf, &head, &orig,
91774afc 3916 REF_NO_DEREF, UPDATE_REFS_MSG_ON_ERR)) {
4b83ce9f
JS
3917 res = error(_("could not update %s"),
3918 head_ref.buf);
3919 goto cleanup_head_ref;
3920 }
96e832a5 3921 msg = reflog_message(opts, "finish", "returning to %s",
4b83ce9f 3922 head_ref.buf);
96e832a5 3923 if (create_symref("HEAD", head_ref.buf, msg)) {
4b83ce9f
JS
3924 res = error(_("could not update HEAD to %s"),
3925 head_ref.buf);
3926 goto cleanup_head_ref;
3927 }
3928 strbuf_reset(&buf);
3929 }
3930
556907f1
JS
3931 if (opts->verbose) {
3932 struct rev_info log_tree_opt;
3933 struct object_id orig, head;
3934
3935 memset(&log_tree_opt, 0, sizeof(log_tree_opt));
f11c9580 3936 repo_init_revisions(r, &log_tree_opt, NULL);
556907f1
JS
3937 log_tree_opt.diff = 1;
3938 log_tree_opt.diffopt.output_format =
3939 DIFF_FORMAT_DIFFSTAT;
3940 log_tree_opt.disable_stdin = 1;
3941
3942 if (read_oneliner(&buf, rebase_path_orig_head(), 0) &&
e82caf38 3943 !get_oid(buf.buf, &orig) &&
3944 !get_oid("HEAD", &head)) {
66f414f8
BW
3945 diff_tree_oid(&orig, &head, "",
3946 &log_tree_opt.diffopt);
556907f1
JS
3947 log_tree_diff_flush(&log_tree_opt);
3948 }
3949 }
25cb8df9
JS
3950 flush_rewritten_pending();
3951 if (!stat(rebase_path_rewritten_list(), &st) &&
3952 st.st_size > 0) {
3953 struct child_process child = CHILD_PROCESS_INIT;
79516045
JS
3954 const char *post_rewrite_hook =
3955 find_hook("post-rewrite");
25cb8df9
JS
3956
3957 child.in = open(rebase_path_rewritten_list(), O_RDONLY);
3958 child.git_cmd = 1;
3959 argv_array_push(&child.args, "notes");
3960 argv_array_push(&child.args, "copy");
3961 argv_array_push(&child.args, "--for-rewrite=rebase");
3962 /* we don't care if this copying failed */
3963 run_command(&child);
79516045
JS
3964
3965 if (post_rewrite_hook) {
3966 struct child_process hook = CHILD_PROCESS_INIT;
3967
3968 hook.in = open(rebase_path_rewritten_list(),
3969 O_RDONLY);
3970 hook.stdout_to_stderr = 1;
6206286e 3971 hook.trace2_hook_name = "post-rewrite";
79516045
JS
3972 argv_array_push(&hook.args, post_rewrite_hook);
3973 argv_array_push(&hook.args, "rebase");
3974 /* we don't care if this hook failed */
3975 run_command(&hook);
3976 }
25cb8df9 3977 }
796c7972 3978 apply_autostash(opts);
25cb8df9 3979
d7d90885
SG
3980 if (!opts->quiet) {
3981 if (!opts->verbose)
3982 term_clear_line();
899b49c4
EN
3983 fprintf(stderr,
3984 "Successfully rebased and updated %s.\n",
3985 head_ref.buf);
d7d90885 3986 }
5da4966f 3987
556907f1 3988 strbuf_release(&buf);
4b83ce9f 3989 strbuf_release(&head_ref);
56dc3ab0
JS
3990 }
3991
043a4492
RR
3992 /*
3993 * Sequence of picks finished successfully; cleanup by
3994 * removing the .git/sequencer directory
3995 */
2863584f 3996 return sequencer_remove_state(opts);
043a4492
RR
3997}
3998
005af339 3999static int continue_single_pick(struct repository *r)
043a4492
RR
4000{
4001 const char *argv[] = { "commit", NULL };
4002
005af339
NTND
4003 if (!file_exists(git_path_cherry_pick_head(r)) &&
4004 !file_exists(git_path_revert_head(r)))
043a4492
RR
4005 return error(_("no cherry-pick or revert in progress"));
4006 return run_command_v_opt(argv, RUN_GIT_CMD);
4007}
4008
f11c9580
NTND
4009static int commit_staged_changes(struct repository *r,
4010 struct replay_opts *opts,
15ef6931 4011 struct todo_list *todo_list)
9d93ccd1 4012{
789b3eff 4013 unsigned int flags = ALLOW_EMPTY | EDIT_MSG;
15ef6931 4014 unsigned int final_fixup = 0, is_clean;
9d93ccd1 4015
f11c9580 4016 if (has_unstaged_changes(r, 1))
9d93ccd1 4017 return error(_("cannot rebase: You have unstaged changes."));
52632209 4018
f11c9580 4019 is_clean = !has_uncommitted_changes(r, 0);
9d93ccd1
JS
4020
4021 if (file_exists(rebase_path_amend())) {
4022 struct strbuf rev = STRBUF_INIT;
092bbcdf 4023 struct object_id head, to_amend;
9d93ccd1 4024
092bbcdf 4025 if (get_oid("HEAD", &head))
9d93ccd1
JS
4026 return error(_("cannot amend non-existing commit"));
4027 if (!read_oneliner(&rev, rebase_path_amend(), 0))
4028 return error(_("invalid file: '%s'"), rebase_path_amend());
092bbcdf 4029 if (get_oid_hex(rev.buf, &to_amend))
9d93ccd1
JS
4030 return error(_("invalid contents: '%s'"),
4031 rebase_path_amend());
9001dc2a 4032 if (!is_clean && !oideq(&head, &to_amend))
9d93ccd1
JS
4033 return error(_("\nYou have uncommitted changes in your "
4034 "working tree. Please, commit them\n"
4035 "first and then run 'git rebase "
4036 "--continue' again."));
15ef6931
JS
4037 /*
4038 * When skipping a failed fixup/squash, we need to edit the
4039 * commit message, the current fixup list and count, and if it
4040 * was the last fixup/squash in the chain, we need to clean up
4041 * the commit message and if there was a squash, let the user
4042 * edit it.
4043 */
10d2f354
JS
4044 if (!is_clean || !opts->current_fixup_count)
4045 ; /* this is not the final fixup */
87ae8a1a 4046 else if (!oideq(&head, &to_amend) ||
10d2f354
JS
4047 !file_exists(rebase_path_stopped_sha())) {
4048 /* was a final fixup or squash done manually? */
4049 if (!is_fixup(peek_command(todo_list, 0))) {
4050 unlink(rebase_path_fixup_msg());
4051 unlink(rebase_path_squash_msg());
4052 unlink(rebase_path_current_fixups());
4053 strbuf_reset(&opts->current_fixups);
4054 opts->current_fixup_count = 0;
4055 }
4056 } else {
4057 /* we are in a fixup/squash chain */
15ef6931
JS
4058 const char *p = opts->current_fixups.buf;
4059 int len = opts->current_fixups.len;
4060
4061 opts->current_fixup_count--;
4062 if (!len)
4063 BUG("Incorrect current_fixups:\n%s", p);
4064 while (len && p[len - 1] != '\n')
4065 len--;
4066 strbuf_setlen(&opts->current_fixups, len);
4067 if (write_message(p, len, rebase_path_current_fixups(),
4068 0) < 0)
4069 return error(_("could not write file: '%s'"),
4070 rebase_path_current_fixups());
4071
4072 /*
4073 * If a fixup/squash in a fixup/squash chain failed, the
4074 * commit message is already correct, no need to commit
4075 * it again.
4076 *
4077 * Only if it is the final command in the fixup/squash
4078 * chain, and only if the chain is longer than a single
4079 * fixup/squash command (which was just skipped), do we
4080 * actually need to re-commit with a cleaned up commit
4081 * message.
4082 */
4083 if (opts->current_fixup_count > 0 &&
4084 !is_fixup(peek_command(todo_list, 0))) {
4085 final_fixup = 1;
4086 /*
4087 * If there was not a single "squash" in the
4088 * chain, we only need to clean up the commit
4089 * message, no need to bother the user with
4090 * opening the commit message in the editor.
4091 */
4092 if (!starts_with(p, "squash ") &&
4093 !strstr(p, "\nsquash "))
4094 flags = (flags & ~EDIT_MSG) | CLEANUP_MSG;
4095 } else if (is_fixup(peek_command(todo_list, 0))) {
4096 /*
4097 * We need to update the squash message to skip
4098 * the latest commit message.
4099 */
4100 struct commit *commit;
4101 const char *path = rebase_path_squash_msg();
4102
005af339 4103 if (parse_head(r, &commit) ||
15ef6931
JS
4104 !(p = get_commit_buffer(commit, NULL)) ||
4105 write_message(p, strlen(p), path, 0)) {
4106 unuse_commit_buffer(commit, p);
4107 return error(_("could not write file: "
4108 "'%s'"), path);
4109 }
4110 unuse_commit_buffer(commit, p);
4111 }
4112 }
9d93ccd1
JS
4113
4114 strbuf_release(&rev);
789b3eff 4115 flags |= AMEND_MSG;
9d93ccd1
JS
4116 }
4117
15ef6931 4118 if (is_clean) {
f11c9580 4119 const char *cherry_pick_head = git_path_cherry_pick_head(r);
15ef6931
JS
4120
4121 if (file_exists(cherry_pick_head) && unlink(cherry_pick_head))
4122 return error(_("could not remove CHERRY_PICK_HEAD"));
4123 if (!final_fixup)
4124 return 0;
4125 }
4126
f11c9580 4127 if (run_git_commit(r, final_fixup ? NULL : rebase_path_message(),
15ef6931 4128 opts, flags))
9d93ccd1
JS
4129 return error(_("could not commit staged changes."));
4130 unlink(rebase_path_amend());
69c92209 4131 unlink(git_path_merge_head(the_repository));
15ef6931
JS
4132 if (final_fixup) {
4133 unlink(rebase_path_fixup_msg());
4134 unlink(rebase_path_squash_msg());
4135 }
4136 if (opts->current_fixup_count > 0) {
4137 /*
4138 * Whether final fixup or not, we just cleaned up the commit
4139 * message...
4140 */
4141 unlink(rebase_path_current_fixups());
4142 strbuf_reset(&opts->current_fixups);
4143 opts->current_fixup_count = 0;
4144 }
9d93ccd1
JS
4145 return 0;
4146}
4147
f11c9580 4148int sequencer_continue(struct repository *r, struct replay_opts *opts)
043a4492 4149{
004fefa7
JS
4150 struct todo_list todo_list = TODO_LIST_INIT;
4151 int res;
043a4492 4152
f11c9580 4153 if (read_and_refresh_cache(r, opts))
2863584f
JS
4154 return -1;
4155
15ef6931
JS
4156 if (read_populate_opts(opts))
4157 return -1;
9d93ccd1 4158 if (is_rebase_i(opts)) {
005af339 4159 if ((res = read_populate_todo(r, &todo_list, opts)))
15ef6931 4160 goto release_todo_list;
f11c9580 4161 if (commit_staged_changes(r, opts, &todo_list))
9d93ccd1 4162 return -1;
4258a6da 4163 } else if (!file_exists(get_todo_path(opts)))
005af339
NTND
4164 return continue_single_pick(r);
4165 else if ((res = read_populate_todo(r, &todo_list, opts)))
004fefa7 4166 goto release_todo_list;
043a4492 4167
4258a6da
JS
4168 if (!is_rebase_i(opts)) {
4169 /* Verify that the conflict has been resolved */
f11c9580
NTND
4170 if (file_exists(git_path_cherry_pick_head(r)) ||
4171 file_exists(git_path_revert_head(r))) {
005af339 4172 res = continue_single_pick(r);
4258a6da
JS
4173 if (res)
4174 goto release_todo_list;
4175 }
ffc00a48 4176 if (index_differs_from(r, "HEAD", NULL, 0)) {
e1ff0a32 4177 res = error_dirty_index(r, opts);
004fefa7 4178 goto release_todo_list;
4258a6da
JS
4179 }
4180 todo_list.current++;
ca98c6d4
JS
4181 } else if (file_exists(rebase_path_stopped_sha())) {
4182 struct strbuf buf = STRBUF_INIT;
4183 struct object_id oid;
4184
4185 if (read_oneliner(&buf, rebase_path_stopped_sha(), 1) &&
e82caf38 4186 !get_oid_committish(buf.buf, &oid))
ca98c6d4
JS
4187 record_in_rewritten(&oid, peek_command(&todo_list, 0));
4188 strbuf_release(&buf);
043a4492 4189 }
4258a6da 4190
f11c9580 4191 res = pick_commits(r, &todo_list, opts);
004fefa7
JS
4192release_todo_list:
4193 todo_list_release(&todo_list);
4194 return res;
043a4492
RR
4195}
4196
f11c9580
NTND
4197static int single_pick(struct repository *r,
4198 struct commit *cmit,
4199 struct replay_opts *opts)
043a4492 4200{
a47ba3c7
PW
4201 int check_todo;
4202
043a4492 4203 setenv(GIT_REFLOG_ACTION, action_name(opts), 0);
f11c9580 4204 return do_pick_commit(r, opts->action == REPLAY_PICK ?
a47ba3c7
PW
4205 TODO_PICK : TODO_REVERT, cmit, opts, 0,
4206 &check_todo);
043a4492
RR
4207}
4208
f11c9580
NTND
4209int sequencer_pick_revisions(struct repository *r,
4210 struct replay_opts *opts)
043a4492 4211{
004fefa7 4212 struct todo_list todo_list = TODO_LIST_INIT;
1e43ed98 4213 struct object_id oid;
004fefa7 4214 int i, res;
043a4492 4215
2863584f 4216 assert(opts->revs);
f11c9580 4217 if (read_and_refresh_cache(r, opts))
0d9c6dc9 4218 return -1;
043a4492 4219
21246dbb 4220 for (i = 0; i < opts->revs->pending.nr; i++) {
1e43ed98 4221 struct object_id oid;
21246dbb
MV
4222 const char *name = opts->revs->pending.objects[i].name;
4223
4224 /* This happens when using --stdin. */
4225 if (!strlen(name))
4226 continue;
4227
1e43ed98 4228 if (!get_oid(name, &oid)) {
f11c9580
NTND
4229 if (!lookup_commit_reference_gently(r, &oid, 1)) {
4230 enum object_type type = oid_object_info(r,
0df8e965 4231 &oid,
abef9020 4232 NULL);
b9b946d4 4233 return error(_("%s: can't cherry-pick a %s"),
debca9d2 4234 name, type_name(type));
7c0b0d8d 4235 }
21246dbb 4236 } else
b9b946d4 4237 return error(_("%s: bad revision"), name);
21246dbb
MV
4238 }
4239
043a4492
RR
4240 /*
4241 * If we were called as "git cherry-pick <commit>", just
4242 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4243 * REVERT_HEAD, and don't touch the sequencer state.
4244 * This means it is possible to cherry-pick in the middle
4245 * of a cherry-pick sequence.
4246 */
4247 if (opts->revs->cmdline.nr == 1 &&
4248 opts->revs->cmdline.rev->whence == REV_CMD_REV &&
4249 opts->revs->no_walk &&
4250 !opts->revs->cmdline.rev->flags) {
4251 struct commit *cmit;
4252 if (prepare_revision_walk(opts->revs))
b9b946d4 4253 return error(_("revision walk setup failed"));
043a4492 4254 cmit = get_revision(opts->revs);
c5e358d0
JK
4255 if (!cmit)
4256 return error(_("empty commit set passed"));
4257 if (get_revision(opts->revs))
4258 BUG("unexpected extra commit from walk");
f11c9580 4259 return single_pick(r, cmit, opts);
043a4492
RR
4260 }
4261
4262 /*
4263 * Start a new cherry-pick/ revert sequence; but
4264 * first, make sure that an existing one isn't in
4265 * progress
4266 */
4267
34b0528b
JS
4268 if (walk_revs_populate_todo(&todo_list, opts) ||
4269 create_seq_dir() < 0)
043a4492 4270 return -1;
1e43ed98 4271 if (get_oid("HEAD", &oid) && (opts->action == REPLAY_REVERT))
93b3df6f 4272 return error(_("can't revert as initial commit"));
1e43ed98 4273 if (save_head(oid_to_hex(&oid)))
311fd397 4274 return -1;
88d5a271
JS
4275 if (save_opts(opts))
4276 return -1;
1e41229d 4277 update_abort_safety_file();
f11c9580 4278 res = pick_commits(r, &todo_list, opts);
004fefa7
JS
4279 todo_list_release(&todo_list);
4280 return res;
043a4492 4281}
5ed75e2a 4282
66e83d9b 4283void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag)
5ed75e2a 4284{
bab4d109 4285 unsigned no_dup_sob = flag & APPEND_SIGNOFF_DEDUP;
5ed75e2a 4286 struct strbuf sob = STRBUF_INIT;
bab4d109 4287 int has_footer;
5ed75e2a
MV
4288
4289 strbuf_addstr(&sob, sign_off_header);
39ab4d09 4290 strbuf_addstr(&sob, fmt_name(WANT_COMMITTER_IDENT));
5ed75e2a 4291 strbuf_addch(&sob, '\n');
bab4d109 4292
44dc738a
JT
4293 if (!ignore_footer)
4294 strbuf_complete_line(msgbuf);
4295
bab4d109
BC
4296 /*
4297 * If the whole message buffer is equal to the sob, pretend that we
4298 * found a conforming footer with a matching sob
4299 */
4300 if (msgbuf->len - ignore_footer == sob.len &&
4301 !strncmp(msgbuf->buf, sob.buf, sob.len))
4302 has_footer = 3;
4303 else
4304 has_footer = has_conforming_footer(msgbuf, &sob, ignore_footer);
4305
33f2f9ab
BC
4306 if (!has_footer) {
4307 const char *append_newlines = NULL;
4308 size_t len = msgbuf->len - ignore_footer;
4309
8c613fd5
BC
4310 if (!len) {
4311 /*
4312 * The buffer is completely empty. Leave foom for
4313 * the title and body to be filled in by the user.
4314 */
33f2f9ab 4315 append_newlines = "\n\n";
8c613fd5
BC
4316 } else if (len == 1) {
4317 /*
4318 * Buffer contains a single newline. Add another
4319 * so that we leave room for the title and body.
4320 */
4321 append_newlines = "\n";
4322 } else if (msgbuf->buf[len - 2] != '\n') {
4323 /*
4324 * Buffer ends with a single newline. Add another
4325 * so that there is an empty line between the message
4326 * body and the sob.
4327 */
33f2f9ab 4328 append_newlines = "\n";
8c613fd5 4329 } /* else, the buffer already ends with two newlines. */
33f2f9ab
BC
4330
4331 if (append_newlines)
4332 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4333 append_newlines, strlen(append_newlines));
5ed75e2a 4334 }
bab4d109
BC
4335
4336 if (has_footer != 3 && (!no_dup_sob || has_footer != 2))
4337 strbuf_splice(msgbuf, msgbuf->len - ignore_footer, 0,
4338 sob.buf, sob.len);
4339
5ed75e2a
MV
4340 strbuf_release(&sob);
4341}
62db5247 4342
1644c73c
JS
4343struct labels_entry {
4344 struct hashmap_entry entry;
4345 char label[FLEX_ARRAY];
4346};
4347
4348static int labels_cmp(const void *fndata, const struct labels_entry *a,
4349 const struct labels_entry *b, const void *key)
4350{
4351 return key ? strcmp(a->label, key) : strcmp(a->label, b->label);
4352}
4353
4354struct string_entry {
4355 struct oidmap_entry entry;
4356 char string[FLEX_ARRAY];
4357};
4358
4359struct label_state {
4360 struct oidmap commit2label;
4361 struct hashmap labels;
4362 struct strbuf buf;
4363};
4364
4365static const char *label_oid(struct object_id *oid, const char *label,
4366 struct label_state *state)
4367{
4368 struct labels_entry *labels_entry;
4369 struct string_entry *string_entry;
4370 struct object_id dummy;
4371 size_t len;
4372 int i;
4373
4374 string_entry = oidmap_get(&state->commit2label, oid);
4375 if (string_entry)
4376 return string_entry->string;
4377
4378 /*
4379 * For "uninteresting" commits, i.e. commits that are not to be
4380 * rebased, and which can therefore not be labeled, we use a unique
4381 * abbreviation of the commit name. This is slightly more complicated
4382 * than calling find_unique_abbrev() because we also need to make
4383 * sure that the abbreviation does not conflict with any other
4384 * label.
4385 *
4386 * We disallow "interesting" commits to be labeled by a string that
4387 * is a valid full-length hash, to ensure that we always can find an
4388 * abbreviation for any uninteresting commit's names that does not
4389 * clash with any other label.
4390 */
4391 if (!label) {
4392 char *p;
4393
4394 strbuf_reset(&state->buf);
4395 strbuf_grow(&state->buf, GIT_SHA1_HEXSZ);
4396 label = p = state->buf.buf;
4397
4398 find_unique_abbrev_r(p, oid, default_abbrev);
4399
4400 /*
4401 * We may need to extend the abbreviated hash so that there is
4402 * no conflicting label.
4403 */
4404 if (hashmap_get_from_hash(&state->labels, strihash(p), p)) {
4405 size_t i = strlen(p) + 1;
4406
4407 oid_to_hex_r(p, oid);
4408 for (; i < GIT_SHA1_HEXSZ; i++) {
4409 char save = p[i];
4410 p[i] = '\0';
4411 if (!hashmap_get_from_hash(&state->labels,
4412 strihash(p), p))
4413 break;
4414 p[i] = save;
4415 }
4416 }
5971b083 4417 } else if (((len = strlen(label)) == the_hash_algo->hexsz &&
1644c73c
JS
4418 !get_oid_hex(label, &dummy)) ||
4419 (len == 1 && *label == '#') ||
4420 hashmap_get_from_hash(&state->labels,
4421 strihash(label), label)) {
4422 /*
4423 * If the label already exists, or if the label is a valid full
4424 * OID, or the label is a '#' (which we use as a separator
4425 * between merge heads and oneline), we append a dash and a
4426 * number to make it unique.
4427 */
4428 struct strbuf *buf = &state->buf;
4429
4430 strbuf_reset(buf);
4431 strbuf_add(buf, label, len);
4432
4433 for (i = 2; ; i++) {
4434 strbuf_setlen(buf, len);
4435 strbuf_addf(buf, "-%d", i);
4436 if (!hashmap_get_from_hash(&state->labels,
4437 strihash(buf->buf),
4438 buf->buf))
4439 break;
4440 }
4441
4442 label = buf->buf;
4443 }
4444
4445 FLEX_ALLOC_STR(labels_entry, label, label);
4446 hashmap_entry_init(labels_entry, strihash(label));
4447 hashmap_add(&state->labels, labels_entry);
4448
4449 FLEX_ALLOC_STR(string_entry, string, label);
4450 oidcpy(&string_entry->entry.oid, oid);
4451 oidmap_put(&state->commit2label, string_entry);
4452
4453 return string_entry->string;
4454}
4455
4456static int make_script_with_merges(struct pretty_print_context *pp,
d358fc28 4457 struct rev_info *revs, struct strbuf *out,
1644c73c
JS
4458 unsigned flags)
4459{
4460 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
7543f6f4 4461 int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
1644c73c
JS
4462 struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
4463 struct strbuf label = STRBUF_INIT;
4464 struct commit_list *commits = NULL, **tail = &commits, *iter;
4465 struct commit_list *tips = NULL, **tips_tail = &tips;
4466 struct commit *commit;
4467 struct oidmap commit2todo = OIDMAP_INIT;
4468 struct string_entry *entry;
4469 struct oidset interesting = OIDSET_INIT, child_seen = OIDSET_INIT,
4470 shown = OIDSET_INIT;
4471 struct label_state state = { OIDMAP_INIT, { NULL }, STRBUF_INIT };
4472
4473 int abbr = flags & TODO_LIST_ABBREVIATE_CMDS;
4474 const char *cmd_pick = abbr ? "p" : "pick",
4475 *cmd_label = abbr ? "l" : "label",
4476 *cmd_reset = abbr ? "t" : "reset",
4477 *cmd_merge = abbr ? "m" : "merge";
4478
4479 oidmap_init(&commit2todo, 0);
4480 oidmap_init(&state.commit2label, 0);
4481 hashmap_init(&state.labels, (hashmap_cmp_fn) labels_cmp, NULL, 0);
4482 strbuf_init(&state.buf, 32);
4483
4484 if (revs->cmdline.nr && (revs->cmdline.rev[0].flags & BOTTOM)) {
4485 struct object_id *oid = &revs->cmdline.rev[0].item->oid;
4486 FLEX_ALLOC_STR(entry, string, "onto");
4487 oidcpy(&entry->entry.oid, oid);
4488 oidmap_put(&state.commit2label, entry);
4489 }
4490
4491 /*
4492 * First phase:
4493 * - get onelines for all commits
4494 * - gather all branch tips (i.e. 2nd or later parents of merges)
4495 * - label all branch tips
4496 */
4497 while ((commit = get_revision(revs))) {
4498 struct commit_list *to_merge;
1644c73c
JS
4499 const char *p1, *p2;
4500 struct object_id *oid;
4501 int is_empty;
4502
4503 tail = &commit_list_insert(commit, tail)->next;
4504 oidset_insert(&interesting, &commit->object.oid);
4505
4506 is_empty = is_original_commit_empty(commit);
4507 if (!is_empty && (commit->object.flags & PATCHSAME))
4508 continue;
4509
4510 strbuf_reset(&oneline);
4511 pretty_print_commit(pp, commit, &oneline);
4512
4513 to_merge = commit->parents ? commit->parents->next : NULL;
4514 if (!to_merge) {
4515 /* non-merge commit: easy case */
4516 strbuf_reset(&buf);
4517 if (!keep_empty && is_empty)
4518 strbuf_addf(&buf, "%c ", comment_line_char);
4519 strbuf_addf(&buf, "%s %s %s", cmd_pick,
4520 oid_to_hex(&commit->object.oid),
4521 oneline.buf);
4522
4523 FLEX_ALLOC_STR(entry, string, buf.buf);
4524 oidcpy(&entry->entry.oid, &commit->object.oid);
4525 oidmap_put(&commit2todo, entry);
4526
4527 continue;
4528 }
4529
1644c73c
JS
4530 /* Create a label */
4531 strbuf_reset(&label);
4532 if (skip_prefix(oneline.buf, "Merge ", &p1) &&
4533 (p1 = strchr(p1, '\'')) &&
4534 (p2 = strchr(++p1, '\'')))
4535 strbuf_add(&label, p1, p2 - p1);
4536 else if (skip_prefix(oneline.buf, "Merge pull request ",
4537 &p1) &&
4538 (p1 = strstr(p1, " from ")))
4539 strbuf_addstr(&label, p1 + strlen(" from "));
4540 else
4541 strbuf_addbuf(&label, &oneline);
4542
4543 for (p1 = label.buf; *p1; p1++)
4544 if (isspace(*p1))
4545 *(char *)p1 = '-';
4546
4547 strbuf_reset(&buf);
4548 strbuf_addf(&buf, "%s -C %s",
4549 cmd_merge, oid_to_hex(&commit->object.oid));
4550
2b6ad0f4
JS
4551 /* label the tips of merged branches */
4552 for (; to_merge; to_merge = to_merge->next) {
4553 oid = &to_merge->item->object.oid;
4554 strbuf_addch(&buf, ' ');
4555
4556 if (!oidset_contains(&interesting, oid)) {
4557 strbuf_addstr(&buf, label_oid(oid, NULL,
4558 &state));
4559 continue;
4560 }
1644c73c 4561
1644c73c
JS
4562 tips_tail = &commit_list_insert(to_merge->item,
4563 tips_tail)->next;
4564
4565 strbuf_addstr(&buf, label_oid(oid, label.buf, &state));
4566 }
4567 strbuf_addf(&buf, " # %s", oneline.buf);
4568
4569 FLEX_ALLOC_STR(entry, string, buf.buf);
4570 oidcpy(&entry->entry.oid, &commit->object.oid);
4571 oidmap_put(&commit2todo, entry);
4572 }
4573
4574 /*
4575 * Second phase:
4576 * - label branch points
4577 * - add HEAD to the branch tips
4578 */
4579 for (iter = commits; iter; iter = iter->next) {
4580 struct commit_list *parent = iter->item->parents;
4581 for (; parent; parent = parent->next) {
4582 struct object_id *oid = &parent->item->object.oid;
4583 if (!oidset_contains(&interesting, oid))
4584 continue;
6e8fc70f 4585 if (oidset_insert(&child_seen, oid))
1644c73c
JS
4586 label_oid(oid, "branch-point", &state);
4587 }
4588
4589 /* Add HEAD as implict "tip of branch" */
4590 if (!iter->next)
4591 tips_tail = &commit_list_insert(iter->item,
4592 tips_tail)->next;
4593 }
4594
4595 /*
4596 * Third phase: output the todo list. This is a bit tricky, as we
4597 * want to avoid jumping back and forth between revisions. To
4598 * accomplish that goal, we walk backwards from the branch tips,
4599 * gathering commits not yet shown, reversing the list on the fly,
4600 * then outputting that list (labeling revisions as needed).
4601 */
d358fc28 4602 strbuf_addf(out, "%s onto\n", cmd_label);
1644c73c
JS
4603 for (iter = tips; iter; iter = iter->next) {
4604 struct commit_list *list = NULL, *iter2;
4605
4606 commit = iter->item;
4607 if (oidset_contains(&shown, &commit->object.oid))
4608 continue;
4609 entry = oidmap_get(&state.commit2label, &commit->object.oid);
4610
4611 if (entry)
d358fc28 4612 strbuf_addf(out, "\n%c Branch %s\n", comment_line_char, entry->string);
1644c73c 4613 else
d358fc28 4614 strbuf_addch(out, '\n');
1644c73c
JS
4615
4616 while (oidset_contains(&interesting, &commit->object.oid) &&
4617 !oidset_contains(&shown, &commit->object.oid)) {
4618 commit_list_insert(commit, &list);
4619 if (!commit->parents) {
4620 commit = NULL;
4621 break;
4622 }
4623 commit = commit->parents->item;
4624 }
4625
4626 if (!commit)
d358fc28
AG
4627 strbuf_addf(out, "%s %s\n", cmd_reset,
4628 rebase_cousins ? "onto" : "[new root]");
1644c73c
JS
4629 else {
4630 const char *to = NULL;
4631
4632 entry = oidmap_get(&state.commit2label,
4633 &commit->object.oid);
4634 if (entry)
4635 to = entry->string;
7543f6f4
JS
4636 else if (!rebase_cousins)
4637 to = label_oid(&commit->object.oid, NULL,
4638 &state);
1644c73c
JS
4639
4640 if (!to || !strcmp(to, "onto"))
d358fc28 4641 strbuf_addf(out, "%s onto\n", cmd_reset);
1644c73c
JS
4642 else {
4643 strbuf_reset(&oneline);
4644 pretty_print_commit(pp, commit, &oneline);
d358fc28
AG
4645 strbuf_addf(out, "%s %s # %s\n",
4646 cmd_reset, to, oneline.buf);
1644c73c
JS
4647 }
4648 }
4649
4650 for (iter2 = list; iter2; iter2 = iter2->next) {
4651 struct object_id *oid = &iter2->item->object.oid;
4652 entry = oidmap_get(&commit2todo, oid);
4653 /* only show if not already upstream */
4654 if (entry)
d358fc28 4655 strbuf_addf(out, "%s\n", entry->string);
1644c73c
JS
4656 entry = oidmap_get(&state.commit2label, oid);
4657 if (entry)
d358fc28
AG
4658 strbuf_addf(out, "%s %s\n",
4659 cmd_label, entry->string);
1644c73c
JS
4660 oidset_insert(&shown, oid);
4661 }
4662
4663 free_commit_list(list);
4664 }
4665
4666 free_commit_list(commits);
4667 free_commit_list(tips);
4668
4669 strbuf_release(&label);
4670 strbuf_release(&oneline);
4671 strbuf_release(&buf);
4672
4673 oidmap_free(&commit2todo, 1);
4674 oidmap_free(&state.commit2label, 1);
4675 hashmap_free(&state.labels, 1);
4676 strbuf_release(&state.buf);
4677
4678 return 0;
4679}
4680
d358fc28
AG
4681int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
4682 const char **argv, unsigned flags)
62db5247
JS
4683{
4684 char *format = NULL;
4685 struct pretty_print_context pp = {0};
62db5247
JS
4686 struct rev_info revs;
4687 struct commit *commit;
313a48ea 4688 int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
d8ae6c84 4689 const char *insn = flags & TODO_LIST_ABBREVIATE_CMDS ? "p" : "pick";
1644c73c 4690 int rebase_merges = flags & TODO_LIST_REBASE_MERGES;
62db5247 4691
f11c9580 4692 repo_init_revisions(r, &revs, NULL);
62db5247 4693 revs.verbose_header = 1;
1644c73c
JS
4694 if (!rebase_merges)
4695 revs.max_parents = 1;
76ea2358 4696 revs.cherry_mark = 1;
62db5247
JS
4697 revs.limited = 1;
4698 revs.reverse = 1;
4699 revs.right_only = 1;
4700 revs.sort_order = REV_SORT_IN_GRAPH_ORDER;
4701 revs.topo_order = 1;
4702
4703 revs.pretty_given = 1;
4704 git_config_get_string("rebase.instructionFormat", &format);
4705 if (!format || !*format) {
4706 free(format);
4707 format = xstrdup("%s");
4708 }
4709 get_commit_format(format, &revs);
4710 free(format);
4711 pp.fmt = revs.commit_format;
4712 pp.output_encoding = get_log_output_encoding();
4713
4714 if (setup_revisions(argc, argv, &revs, NULL) > 1)
4715 return error(_("make_script: unhandled options"));
4716
4717 if (prepare_revision_walk(&revs) < 0)
4718 return error(_("make_script: error preparing revisions"));
4719
1644c73c
JS
4720 if (rebase_merges)
4721 return make_script_with_merges(&pp, &revs, out, flags);
4722
62db5247 4723 while ((commit = get_revision(&revs))) {
76ea2358
PW
4724 int is_empty = is_original_commit_empty(commit);
4725
4726 if (!is_empty && (commit->object.flags & PATCHSAME))
4727 continue;
76ea2358 4728 if (!keep_empty && is_empty)
d358fc28
AG
4729 strbuf_addf(out, "%c ", comment_line_char);
4730 strbuf_addf(out, "%s %s ", insn,
d8ae6c84 4731 oid_to_hex(&commit->object.oid));
d358fc28
AG
4732 pretty_print_commit(&pp, commit, out);
4733 strbuf_addch(out, '\n');
62db5247 4734 }
62db5247
JS
4735 return 0;
4736}
3546c8d9 4737
0cce4a27
LB
4738/*
4739 * Add commands after pick and (series of) squash/fixup commands
4740 * in the todo list.
4741 */
1ba204de
AG
4742void todo_list_add_exec_commands(struct todo_list *todo_list,
4743 struct string_list *commands)
3546c8d9 4744{
683153a4
AG
4745 struct strbuf *buf = &todo_list->buf;
4746 size_t base_offset = buf->len;
4747 int i, insert, nr = 0, alloc = 0;
4748 struct todo_item *items = NULL, *base_items = NULL;
3546c8d9 4749
683153a4
AG
4750 base_items = xcalloc(commands->nr, sizeof(struct todo_item));
4751 for (i = 0; i < commands->nr; i++) {
4752 size_t command_len = strlen(commands->items[i].string);
3546c8d9 4753
683153a4
AG
4754 strbuf_addstr(buf, commands->items[i].string);
4755 strbuf_addch(buf, '\n');
3546c8d9 4756
683153a4
AG
4757 base_items[i].command = TODO_EXEC;
4758 base_items[i].offset_in_buf = base_offset;
4759 base_items[i].arg_offset = base_offset + strlen("exec ");
4760 base_items[i].arg_len = command_len - strlen("exec ");
3546c8d9 4761
683153a4 4762 base_offset += command_len + 1;
3546c8d9
JS
4763 }
4764
1ace63bc
JS
4765 /*
4766 * Insert <commands> after every pick. Here, fixup/squash chains
4767 * are considered part of the pick, so we insert the commands *after*
4768 * those chains if there are any.
683153a4
AG
4769 *
4770 * As we insert the exec commands immediatly after rearranging
4771 * any fixups and before the user edits the list, a fixup chain
4772 * can never contain comments (any comments are empty picks that
4773 * have been commented out because the user did not specify
4774 * --keep-empty). So, it is safe to insert an exec command
4775 * without looking at the command following a comment.
1ace63bc 4776 */
683153a4
AG
4777 insert = 0;
4778 for (i = 0; i < todo_list->nr; i++) {
4779 enum todo_command command = todo_list->items[i].command;
4780 if (insert && !is_fixup(command)) {
4781 ALLOC_GROW(items, nr + commands->nr, alloc);
4782 COPY_ARRAY(items + nr, base_items, commands->nr);
4783 nr += commands->nr;
4784
4785 insert = 0;
0cce4a27 4786 }
1ace63bc 4787
683153a4
AG
4788 ALLOC_GROW(items, nr + 1, alloc);
4789 items[nr++] = todo_list->items[i];
4790
1ace63bc 4791 if (command == TODO_PICK || command == TODO_MERGE)
683153a4 4792 insert = 1;
0cce4a27
LB
4793 }
4794
1ace63bc 4795 /* insert or append final <commands> */
683153a4
AG
4796 if (insert || nr == todo_list->nr) {
4797 ALLOC_GROW(items, nr + commands->nr, alloc);
4798 COPY_ARRAY(items + nr, base_items, commands->nr);
4799 nr += commands->nr;
4800 }
0cce4a27 4801
683153a4
AG
4802 free(base_items);
4803 FREE_AND_NULL(todo_list->items);
4804 todo_list->items = items;
4805 todo_list->nr = nr;
4806 todo_list->alloc = alloc;
0cce4a27 4807}
3546c8d9 4808
616d7740
AG
4809static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_list,
4810 struct strbuf *buf, int num, unsigned flags)
3546c8d9 4811{
8dccc7a6 4812 struct todo_item *item;
616d7740 4813 int i, max = todo_list->nr;
3546c8d9 4814
616d7740
AG
4815 if (num > 0 && num < max)
4816 max = num;
3546c8d9 4817
616d7740 4818 for (item = todo_list->items, i = 0; i < max; i++, item++) {
8dccc7a6
LB
4819 /* if the item is not a command write it and continue */
4820 if (item->command >= TODO_COMMENT) {
616d7740 4821 strbuf_addf(buf, "%.*s\n", item->arg_len,
cbef27d6 4822 todo_item_get_arg(todo_list, item));
8dccc7a6 4823 continue;
3546c8d9 4824 }
8dccc7a6
LB
4825
4826 /* add command to the buffer */
d8ae6c84 4827 if (flags & TODO_LIST_ABBREVIATE_CMDS)
616d7740 4828 strbuf_addch(buf, command_to_char(item->command));
d8ae6c84 4829 else
616d7740 4830 strbuf_addstr(buf, command_to_string(item->command));
8dccc7a6
LB
4831
4832 /* add commit id */
4833 if (item->commit) {
313a48ea 4834 const char *oid = flags & TODO_LIST_SHORTEN_IDS ?
8dccc7a6
LB
4835 short_commit_name(item->commit) :
4836 oid_to_hex(&item->commit->object.oid);
4837
4c68e7dd
JS
4838 if (item->command == TODO_MERGE) {
4839 if (item->flags & TODO_EDIT_MERGE_MSG)
616d7740 4840 strbuf_addstr(buf, " -c");
4c68e7dd 4841 else
616d7740 4842 strbuf_addstr(buf, " -C");
4c68e7dd
JS
4843 }
4844
616d7740 4845 strbuf_addf(buf, " %s", oid);
3546c8d9 4846 }
4c68e7dd 4847
8dccc7a6 4848 /* add all the rest */
c7b4d79c 4849 if (!item->arg_len)
616d7740 4850 strbuf_addch(buf, '\n');
c7b4d79c 4851 else
616d7740 4852 strbuf_addf(buf, " %.*s\n", item->arg_len,
cbef27d6 4853 todo_item_get_arg(todo_list, item));
3546c8d9 4854 }
3546c8d9 4855}
94399949 4856
616d7740
AG
4857int todo_list_write_to_file(struct repository *r, struct todo_list *todo_list,
4858 const char *file, const char *shortrevisions,
4859 const char *shortonto, int num, unsigned flags)
94399949 4860{
af1fc3ad 4861 int res;
616d7740 4862 struct strbuf buf = STRBUF_INIT;
94399949 4863
616d7740 4864 todo_list_to_strbuf(r, todo_list, &buf, num, flags);
af1fc3ad
AG
4865 if (flags & TODO_LIST_APPEND_TODO_HELP)
4866 append_todo_help(flags & TODO_LIST_KEEP_EMPTY, count_commands(todo_list),
4867 shortrevisions, shortonto, &buf);
94399949 4868
616d7740 4869 res = write_message(buf.buf, buf.len, file, 0);
cbef27d6 4870 strbuf_release(&buf);
8315bd20 4871
616d7740 4872 return res;
cbef27d6 4873}
94399949 4874
6ca89c6f
AG
4875static const char edit_todo_list_advice[] =
4876N_("You can fix this with 'git rebase --edit-todo' "
4877"and then run 'git rebase --continue'.\n"
4878"Or you can abort the rebase with 'git rebase"
4879" --abort'.\n");
94399949 4880
6ca89c6f 4881int check_todo_list_from_file(struct repository *r)
94399949 4882{
6ca89c6f
AG
4883 struct todo_list old_todo = TODO_LIST_INIT, new_todo = TODO_LIST_INIT;
4884 int res = 0;
94399949 4885
6ca89c6f 4886 if (strbuf_read_file_or_whine(&new_todo.buf, rebase_path_todo()) < 0) {
87805600 4887 res = -1;
6ca89c6f 4888 goto out;
94399949
JS
4889 }
4890
6ca89c6f 4891 if (strbuf_read_file_or_whine(&old_todo.buf, rebase_path_todo_backup()) < 0) {
87805600 4892 res = -1;
6ca89c6f 4893 goto out;
94399949
JS
4894 }
4895
6ca89c6f
AG
4896 res = todo_list_parse_insn_buffer(r, old_todo.buf.buf, &old_todo);
4897 if (!res)
4898 res = todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo);
4899 if (!res)
4900 res = todo_list_check(&old_todo, &new_todo);
4901 if (res)
4902 fprintf(stderr, _(edit_todo_list_advice));
4903out:
4904 todo_list_release(&old_todo);
4905 todo_list_release(&new_todo);
94399949
JS
4906
4907 return res;
4908}
cdac2b01
JS
4909
4910/* skip picking commits whose parents are unchanged */
6bfeb7f1
AG
4911static int skip_unnecessary_picks(struct repository *r,
4912 struct todo_list *todo_list,
4913 struct object_id *base_oid)
cdac2b01 4914{
d4ed5d77 4915 struct object_id *parent_oid;
6bfeb7f1 4916 int i;
cdac2b01 4917
6bfeb7f1
AG
4918 for (i = 0; i < todo_list->nr; i++) {
4919 struct todo_item *item = todo_list->items + i;
cdac2b01
JS
4920
4921 if (item->command >= TODO_NOOP)
4922 continue;
4923 if (item->command != TODO_PICK)
4924 break;
4925 if (parse_commit(item->commit)) {
cdac2b01
JS
4926 return error(_("could not parse commit '%s'"),
4927 oid_to_hex(&item->commit->object.oid));
4928 }
4929 if (!item->commit->parents)
4930 break; /* root commit */
4931 if (item->commit->parents->next)
4932 break; /* merge commit */
4933 parent_oid = &item->commit->parents->item->object.oid;
6bfeb7f1 4934 if (!oideq(parent_oid, base_oid))
cdac2b01 4935 break;
6bfeb7f1 4936 oidcpy(base_oid, &item->commit->object.oid);
cdac2b01
JS
4937 }
4938 if (i > 0) {
cdac2b01
JS
4939 const char *done_path = rebase_path_done();
4940
6bfeb7f1 4941 if (todo_list_write_to_file(r, todo_list, done_path, NULL, NULL, i, 0)) {
cdac2b01 4942 error_errno(_("could not write to '%s'"), done_path);
cdac2b01
JS
4943 return -1;
4944 }
cdac2b01 4945
6bfeb7f1
AG
4946 MOVE_ARRAY(todo_list->items, todo_list->items + i, todo_list->nr - i);
4947 todo_list->nr -= i;
4948 todo_list->current = 0;
cdac2b01 4949
6bfeb7f1
AG
4950 if (is_fixup(peek_command(todo_list, 0)))
4951 record_in_rewritten(base_oid, peek_command(todo_list, 0));
cdac2b01
JS
4952 }
4953
cdac2b01
JS
4954 return 0;
4955}
c44a4c65 4956
005af339 4957int complete_action(struct repository *r, struct replay_opts *opts, unsigned flags,
b97e1873 4958 const char *shortrevisions, const char *onto_name,
7d3488eb
PW
4959 struct commit *onto, const char *orig_head,
4960 struct string_list *commands, unsigned autosquash,
4961 struct todo_list *todo_list)
b97e1873
AG
4962{
4963 const char *shortonto, *todo_file = rebase_path_todo();
94bcad79
AG
4964 struct todo_list new_todo = TODO_LIST_INIT;
4965 struct strbuf *buf = &todo_list->buf;
7d3488eb 4966 struct object_id oid = onto->object.oid;
1451d0f6 4967 int res;
b97e1873 4968
b97e1873
AG
4969 shortonto = find_unique_abbrev(&oid, DEFAULT_ABBREV);
4970
94bcad79
AG
4971 if (buf->len == 0) {
4972 struct todo_item *item = append_new_todo(todo_list);
4973 item->command = TODO_NOOP;
4974 item->commit = NULL;
4975 item->arg_len = item->arg_offset = item->flags = item->offset_in_buf = 0;
4976 }
b97e1873 4977
94bcad79 4978 if (autosquash && todo_list_rearrange_squash(todo_list))
b97e1873
AG
4979 return -1;
4980
683153a4 4981 if (commands->nr)
94bcad79 4982 todo_list_add_exec_commands(todo_list, commands);
b97e1873 4983
94bcad79 4984 if (count_commands(todo_list) == 0) {
b97e1873
AG
4985 apply_autostash(opts);
4986 sequencer_remove_state(opts);
b97e1873
AG
4987
4988 return error(_("nothing to do"));
4989 }
4990
1451d0f6
AG
4991 res = edit_todo_list(r, todo_list, &new_todo, shortrevisions,
4992 shortonto, flags);
4993 if (res == -1)
b97e1873 4994 return -1;
1451d0f6 4995 else if (res == -2) {
b97e1873
AG
4996 apply_autostash(opts);
4997 sequencer_remove_state(opts);
b97e1873
AG
4998
4999 return -1;
1451d0f6 5000 } else if (res == -3) {
b97e1873
AG
5001 apply_autostash(opts);
5002 sequencer_remove_state(opts);
94bcad79 5003 todo_list_release(&new_todo);
b97e1873
AG
5004
5005 return error(_("nothing to do"));
5006 }
5007
94bcad79
AG
5008 if (todo_list_parse_insn_buffer(r, new_todo.buf.buf, &new_todo) ||
5009 todo_list_check(todo_list, &new_todo)) {
5010 fprintf(stderr, _(edit_todo_list_advice));
7d3488eb 5011 checkout_onto(r, opts, onto_name, &onto->object.oid, orig_head);
94bcad79
AG
5012 todo_list_release(&new_todo);
5013
b97e1873
AG
5014 return -1;
5015 }
5016
6bfeb7f1
AG
5017 if (opts->allow_ff && skip_unnecessary_picks(r, &new_todo, &oid)) {
5018 todo_list_release(&new_todo);
b97e1873 5019 return error(_("could not skip unnecessary pick commands"));
6bfeb7f1
AG
5020 }
5021
94bcad79
AG
5022 if (todo_list_write_to_file(r, &new_todo, todo_file, NULL, NULL, -1,
5023 flags & ~(TODO_LIST_SHORTEN_IDS))) {
5024 todo_list_release(&new_todo);
5025 return error_errno(_("could not write '%s'"), todo_file);
5026 }
5027
5028 todo_list_release(&new_todo);
b97e1873 5029
7d3488eb 5030 if (checkout_onto(r, opts, onto_name, &oid, orig_head))
b97e1873 5031 return -1;
29d51e21 5032
005af339 5033 if (require_clean_work_tree(r, "rebase", "", 1, 1))
b97e1873
AG
5034 return -1;
5035
005af339 5036 return sequencer_continue(r, opts);
b97e1873
AG
5037}
5038
c44a4c65
JS
5039struct subject2item_entry {
5040 struct hashmap_entry entry;
5041 int i;
5042 char subject[FLEX_ARRAY];
5043};
5044
5045static int subject2item_cmp(const void *fndata,
5046 const struct subject2item_entry *a,
5047 const struct subject2item_entry *b, const void *key)
5048{
5049 return key ? strcmp(a->subject, key) : strcmp(a->subject, b->subject);
5050}
5051
3cc0287b
NTND
5052define_commit_slab(commit_todo_item, struct todo_item *);
5053
c44a4c65
JS
5054/*
5055 * Rearrange the todo list that has both "pick commit-id msg" and "pick
5056 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
5057 * after the former, and change "pick" to "fixup"/"squash".
5058 *
5059 * Note that if the config has specified a custom instruction format, each log
5060 * message will have to be retrieved from the commit (as the oneline in the
5061 * script cannot be trusted) in order to normalize the autosquash arrangement.
5062 */
79d7e883 5063int todo_list_rearrange_squash(struct todo_list *todo_list)
c44a4c65 5064{
c44a4c65 5065 struct hashmap subject2item;
f2a04904 5066 int rearranged = 0, *next, *tail, i, nr = 0, alloc = 0;
c44a4c65 5067 char **subjects;
3cc0287b 5068 struct commit_todo_item commit_todo;
f2a04904 5069 struct todo_item *items = NULL;
c44a4c65 5070
3cc0287b 5071 init_commit_todo_item(&commit_todo);
c44a4c65
JS
5072 /*
5073 * The hashmap maps onelines to the respective todo list index.
5074 *
5075 * If any items need to be rearranged, the next[i] value will indicate
5076 * which item was moved directly after the i'th.
5077 *
5078 * In that case, last[i] will indicate the index of the latest item to
5079 * be moved to appear after the i'th.
5080 */
5081 hashmap_init(&subject2item, (hashmap_cmp_fn) subject2item_cmp,
f2a04904
AG
5082 NULL, todo_list->nr);
5083 ALLOC_ARRAY(next, todo_list->nr);
5084 ALLOC_ARRAY(tail, todo_list->nr);
5085 ALLOC_ARRAY(subjects, todo_list->nr);
5086 for (i = 0; i < todo_list->nr; i++) {
c44a4c65 5087 struct strbuf buf = STRBUF_INIT;
f2a04904 5088 struct todo_item *item = todo_list->items + i;
c44a4c65
JS
5089 const char *commit_buffer, *subject, *p;
5090 size_t subject_len;
5091 int i2 = -1;
5092 struct subject2item_entry *entry;
5093
5094 next[i] = tail[i] = -1;
2f6b1d13 5095 if (!item->commit || item->command == TODO_DROP) {
c44a4c65
JS
5096 subjects[i] = NULL;
5097 continue;
5098 }
5099
5100 if (is_fixup(item->command)) {
3cc0287b 5101 clear_commit_todo_item(&commit_todo);
c44a4c65
JS
5102 return error(_("the script was already rearranged."));
5103 }
5104
3cc0287b 5105 *commit_todo_item_at(&commit_todo, item->commit) = item;
c44a4c65
JS
5106
5107 parse_commit(item->commit);
5108 commit_buffer = get_commit_buffer(item->commit, NULL);
5109 find_commit_subject(commit_buffer, &subject);
5110 format_subject(&buf, subject, " ");
5111 subject = subjects[i] = strbuf_detach(&buf, &subject_len);
5112 unuse_commit_buffer(item->commit, commit_buffer);
5113 if ((skip_prefix(subject, "fixup! ", &p) ||
5114 skip_prefix(subject, "squash! ", &p))) {
5115 struct commit *commit2;
5116
5117 for (;;) {
5118 while (isspace(*p))
5119 p++;
5120 if (!skip_prefix(p, "fixup! ", &p) &&
5121 !skip_prefix(p, "squash! ", &p))
5122 break;
5123 }
5124
5125 if ((entry = hashmap_get_from_hash(&subject2item,
5126 strhash(p), p)))
5127 /* found by title */
5128 i2 = entry->i;
5129 else if (!strchr(p, ' ') &&
5130 (commit2 =
5131 lookup_commit_reference_by_name(p)) &&
3cc0287b 5132 *commit_todo_item_at(&commit_todo, commit2))
c44a4c65 5133 /* found by commit name */
3cc0287b 5134 i2 = *commit_todo_item_at(&commit_todo, commit2)
f2a04904 5135 - todo_list->items;
c44a4c65
JS
5136 else {
5137 /* copy can be a prefix of the commit subject */
5138 for (i2 = 0; i2 < i; i2++)
5139 if (subjects[i2] &&
5140 starts_with(subjects[i2], p))
5141 break;
5142 if (i2 == i)
5143 i2 = -1;
5144 }
5145 }
5146 if (i2 >= 0) {
5147 rearranged = 1;
f2a04904 5148 todo_list->items[i].command =
c44a4c65
JS
5149 starts_with(subject, "fixup!") ?
5150 TODO_FIXUP : TODO_SQUASH;
5151 if (next[i2] < 0)
5152 next[i2] = i;
5153 else
5154 next[tail[i2]] = i;
5155 tail[i2] = i;
5156 } else if (!hashmap_get_from_hash(&subject2item,
5157 strhash(subject), subject)) {
5158 FLEX_ALLOC_MEM(entry, subject, subject, subject_len);
5159 entry->i = i;
5160 hashmap_entry_init(entry, strhash(entry->subject));
5161 hashmap_put(&subject2item, entry);
5162 }
5163 }
5164
5165 if (rearranged) {
f2a04904
AG
5166 for (i = 0; i < todo_list->nr; i++) {
5167 enum todo_command command = todo_list->items[i].command;
c44a4c65
JS
5168 int cur = i;
5169
5170 /*
5171 * Initially, all commands are 'pick's. If it is a
5172 * fixup or a squash now, we have rearranged it.
5173 */
5174 if (is_fixup(command))
5175 continue;
5176
5177 while (cur >= 0) {
f2a04904
AG
5178 ALLOC_GROW(items, nr + 1, alloc);
5179 items[nr++] = todo_list->items[cur];
c44a4c65
JS
5180 cur = next[cur];
5181 }
5182 }
5183
f2a04904
AG
5184 FREE_AND_NULL(todo_list->items);
5185 todo_list->items = items;
5186 todo_list->nr = nr;
5187 todo_list->alloc = alloc;
c44a4c65
JS
5188 }
5189
5190 free(next);
5191 free(tail);
f2a04904 5192 for (i = 0; i < todo_list->nr; i++)
c44a4c65
JS
5193 free(subjects[i]);
5194 free(subjects);
5195 hashmap_free(&subject2item, 1);
c44a4c65 5196
3cc0287b 5197 clear_commit_todo_item(&commit_todo);
f2a04904
AG
5198
5199 return 0;
c44a4c65 5200}