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