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