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