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