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