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