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