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