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