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