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