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