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