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