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