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