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