5 #include "object-store.h"
10 #include "run-command.h"
14 #include "cache-tree.h"
18 #include "merge-ort.h"
19 #include "merge-ort-wrappers.h"
25 #include "wt-status.h"
27 #include "notes-utils.h"
29 #include "unpack-trees.h"
33 #include "commit-slab.h"
35 #include "commit-reach.h"
36 #include "rebase-interactive.h"
40 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
42 static const char sign_off_header
[] = "Signed-off-by: ";
43 static const char cherry_picked_prefix
[] = "(cherry picked from commit ";
45 GIT_PATH_FUNC(git_path_commit_editmsg
, "COMMIT_EDITMSG")
47 static GIT_PATH_FUNC(git_path_seq_dir
, "sequencer")
49 static GIT_PATH_FUNC(git_path_todo_file
, "sequencer/todo")
50 static GIT_PATH_FUNC(git_path_opts_file
, "sequencer/opts")
51 static GIT_PATH_FUNC(git_path_head_file
, "sequencer/head")
52 static GIT_PATH_FUNC(git_path_abort_safety_file
, "sequencer/abort-safety")
54 static GIT_PATH_FUNC(rebase_path
, "rebase-merge")
56 * The file containing rebase commands, comments, and empty lines.
57 * This file is created by "git rebase -i" then edited by the user. As
58 * the lines are processed, they are removed from the front of this
59 * file and written to the tail of 'done'.
61 GIT_PATH_FUNC(rebase_path_todo
, "rebase-merge/git-rebase-todo")
62 GIT_PATH_FUNC(rebase_path_todo_backup
, "rebase-merge/git-rebase-todo.backup")
64 GIT_PATH_FUNC(rebase_path_dropped
, "rebase-merge/dropped")
67 * The rebase command lines that have already been processed. A line
68 * is moved here when it is first handled, before any associated user
71 static GIT_PATH_FUNC(rebase_path_done
, "rebase-merge/done")
73 * The file to keep track of how many commands were already processed (e.g.
76 static GIT_PATH_FUNC(rebase_path_msgnum
, "rebase-merge/msgnum")
78 * The file to keep track of how many commands are to be processed in total
79 * (e.g. for the prompt).
81 static GIT_PATH_FUNC(rebase_path_msgtotal
, "rebase-merge/end")
83 * The commit message that is planned to be used for any changes that
84 * need to be committed following a user interaction.
86 static GIT_PATH_FUNC(rebase_path_message
, "rebase-merge/message")
88 * The file into which is accumulated the suggested commit message for
89 * squash/fixup commands. When the first of a series of squash/fixups
90 * is seen, the file is created and the commit message from the
91 * previous commit and from the first squash/fixup commit are written
92 * to it. The commit message for each subsequent squash/fixup commit
93 * is appended to the file as it is processed.
95 static GIT_PATH_FUNC(rebase_path_squash_msg
, "rebase-merge/message-squash")
97 * If the current series of squash/fixups has not yet included a squash
98 * command, then this file exists and holds the commit message of the
99 * original "pick" commit. (If the series ends without a "squash"
100 * command, then this can be used as the commit message of the combined
101 * commit without opening the editor.)
103 static GIT_PATH_FUNC(rebase_path_fixup_msg
, "rebase-merge/message-fixup")
105 * This file contains the list fixup/squash commands that have been
106 * accumulated into message-fixup or message-squash so far.
108 static GIT_PATH_FUNC(rebase_path_current_fixups
, "rebase-merge/current-fixups")
110 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
111 * GIT_AUTHOR_DATE that will be used for the commit that is currently
114 static GIT_PATH_FUNC(rebase_path_author_script
, "rebase-merge/author-script")
116 * When an "edit" rebase command is being processed, the SHA1 of the
117 * commit to be edited is recorded in this file. When "git rebase
118 * --continue" is executed, if there are any staged changes then they
119 * will be amended to the HEAD commit, but only provided the HEAD
120 * commit is still the commit to be edited. When any other rebase
121 * command is processed, this file is deleted.
123 static GIT_PATH_FUNC(rebase_path_amend
, "rebase-merge/amend")
125 * When we stop at a given patch via the "edit" command, this file contains
126 * the commit object name of the corresponding patch.
128 static GIT_PATH_FUNC(rebase_path_stopped_sha
, "rebase-merge/stopped-sha")
130 * For the post-rewrite hook, we make a list of rewritten commits and
131 * their new sha1s. The rewritten-pending list keeps the sha1s of
132 * commits that have been processed, but not committed yet,
133 * e.g. because they are waiting for a 'squash' command.
135 static GIT_PATH_FUNC(rebase_path_rewritten_list
, "rebase-merge/rewritten-list")
136 static GIT_PATH_FUNC(rebase_path_rewritten_pending
,
137 "rebase-merge/rewritten-pending")
140 * The path of the file containing the OID of the "squash onto" commit, i.e.
141 * the dummy commit used for `reset [new root]`.
143 static GIT_PATH_FUNC(rebase_path_squash_onto
, "rebase-merge/squash-onto")
146 * The path of the file listing refs that need to be deleted after the rebase
147 * finishes. This is used by the `label` command to record the need for cleanup.
149 static GIT_PATH_FUNC(rebase_path_refs_to_delete
, "rebase-merge/refs-to-delete")
152 * The update-refs file stores a list of refs that will be updated at the end
153 * of the rebase sequence. The 'update-ref <ref>' commands in the todo file
154 * update the OIDs for the refs in this file, but the refs are not updated
155 * until the end of the rebase sequence.
157 * rebase_path_update_refs() returns the path to this file for a given
158 * worktree directory. For the current worktree, pass the_repository->gitdir.
160 static char *rebase_path_update_refs(const char *wt_git_dir
)
162 return xstrfmt("%s/rebase-merge/update-refs", wt_git_dir
);
166 * The following files are written by git-rebase just after parsing the
169 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt
, "rebase-merge/gpg_sign_opt")
170 static GIT_PATH_FUNC(rebase_path_cdate_is_adate
, "rebase-merge/cdate_is_adate")
171 static GIT_PATH_FUNC(rebase_path_ignore_date
, "rebase-merge/ignore_date")
172 static GIT_PATH_FUNC(rebase_path_orig_head
, "rebase-merge/orig-head")
173 static GIT_PATH_FUNC(rebase_path_verbose
, "rebase-merge/verbose")
174 static GIT_PATH_FUNC(rebase_path_quiet
, "rebase-merge/quiet")
175 static GIT_PATH_FUNC(rebase_path_signoff
, "rebase-merge/signoff")
176 static GIT_PATH_FUNC(rebase_path_head_name
, "rebase-merge/head-name")
177 static GIT_PATH_FUNC(rebase_path_onto
, "rebase-merge/onto")
178 static GIT_PATH_FUNC(rebase_path_autostash
, "rebase-merge/autostash")
179 static GIT_PATH_FUNC(rebase_path_strategy
, "rebase-merge/strategy")
180 static GIT_PATH_FUNC(rebase_path_strategy_opts
, "rebase-merge/strategy_opts")
181 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate
, "rebase-merge/allow_rerere_autoupdate")
182 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec
, "rebase-merge/reschedule-failed-exec")
183 static GIT_PATH_FUNC(rebase_path_no_reschedule_failed_exec
, "rebase-merge/no-reschedule-failed-exec")
184 static GIT_PATH_FUNC(rebase_path_drop_redundant_commits
, "rebase-merge/drop_redundant_commits")
185 static GIT_PATH_FUNC(rebase_path_keep_redundant_commits
, "rebase-merge/keep_redundant_commits")
188 * A 'struct update_refs_record' represents a value in the update-refs
189 * list. We use a string_list to map refs to these (before, after) pairs.
191 struct update_ref_record
{
192 struct object_id before
;
193 struct object_id after
;
196 static struct update_ref_record
*init_update_ref_record(const char *ref
)
198 struct update_ref_record
*rec
;
200 CALLOC_ARRAY(rec
, 1);
202 oidcpy(&rec
->before
, null_oid());
203 oidcpy(&rec
->after
, null_oid());
205 /* This may fail, but that's fine, we will keep the null OID. */
206 read_ref(ref
, &rec
->before
);
211 static int git_sequencer_config(const char *k
, const char *v
, void *cb
)
213 struct replay_opts
*opts
= cb
;
216 if (!strcmp(k
, "commit.cleanup")) {
219 status
= git_config_string(&s
, k
, v
);
223 if (!strcmp(s
, "verbatim")) {
224 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
225 opts
->explicit_cleanup
= 1;
226 } else if (!strcmp(s
, "whitespace")) {
227 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
228 opts
->explicit_cleanup
= 1;
229 } else if (!strcmp(s
, "strip")) {
230 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_ALL
;
231 opts
->explicit_cleanup
= 1;
232 } else if (!strcmp(s
, "scissors")) {
233 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SCISSORS
;
234 opts
->explicit_cleanup
= 1;
236 warning(_("invalid commit message cleanup mode '%s'"),
244 if (!strcmp(k
, "commit.gpgsign")) {
245 opts
->gpg_sign
= git_config_bool(k
, v
) ? xstrdup("") : NULL
;
249 if (!opts
->default_strategy
&& !strcmp(k
, "pull.twohead")) {
250 int ret
= git_config_string((const char**)&opts
->default_strategy
, k
, v
);
253 * pull.twohead is allowed to be multi-valued; we only
254 * care about the first value.
256 char *tmp
= strchr(opts
->default_strategy
, ' ');
263 if (opts
->action
== REPLAY_REVERT
&& !strcmp(k
, "revert.reference"))
264 opts
->commit_use_reference
= git_config_bool(k
, v
);
266 status
= git_gpg_config(k
, v
, NULL
);
270 return git_diff_basic_config(k
, v
, NULL
);
273 void sequencer_init_config(struct replay_opts
*opts
)
275 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
276 git_config(git_sequencer_config
, opts
);
279 static inline int is_rebase_i(const struct replay_opts
*opts
)
281 return opts
->action
== REPLAY_INTERACTIVE_REBASE
;
284 static const char *get_dir(const struct replay_opts
*opts
)
286 if (is_rebase_i(opts
))
287 return rebase_path();
288 return git_path_seq_dir();
291 static const char *get_todo_path(const struct replay_opts
*opts
)
293 if (is_rebase_i(opts
))
294 return rebase_path_todo();
295 return git_path_todo_file();
299 * Returns 0 for non-conforming footer
300 * Returns 1 for conforming footer
301 * Returns 2 when sob exists within conforming footer
302 * Returns 3 when sob exists within conforming footer as last entry
304 static int has_conforming_footer(struct strbuf
*sb
, struct strbuf
*sob
,
305 size_t ignore_footer
)
307 struct process_trailer_options opts
= PROCESS_TRAILER_OPTIONS_INIT
;
308 struct trailer_info info
;
310 int found_sob
= 0, found_sob_last
= 0;
316 saved_char
= sb
->buf
[sb
->len
- ignore_footer
];
317 sb
->buf
[sb
->len
- ignore_footer
] = '\0';
320 trailer_info_get(&info
, sb
->buf
, &opts
);
323 sb
->buf
[sb
->len
- ignore_footer
] = saved_char
;
325 if (info
.trailer_start
== info
.trailer_end
)
328 for (i
= 0; i
< info
.trailer_nr
; i
++)
329 if (sob
&& !strncmp(info
.trailers
[i
], sob
->buf
, sob
->len
)) {
331 if (i
== info
.trailer_nr
- 1)
335 trailer_info_release(&info
);
344 static const char *gpg_sign_opt_quoted(struct replay_opts
*opts
)
346 static struct strbuf buf
= STRBUF_INIT
;
350 sq_quotef(&buf
, "-S%s", opts
->gpg_sign
);
354 void replay_opts_release(struct replay_opts
*opts
)
356 free(opts
->gpg_sign
);
357 free(opts
->reflog_action
);
358 free(opts
->default_strategy
);
359 free(opts
->strategy
);
360 for (size_t i
= 0; i
< opts
->xopts_nr
; i
++)
361 free(opts
->xopts
[i
]);
363 strbuf_release(&opts
->current_fixups
);
365 release_revisions(opts
->revs
);
369 int sequencer_remove_state(struct replay_opts
*opts
)
371 struct strbuf buf
= STRBUF_INIT
;
374 if (is_rebase_i(opts
) &&
375 strbuf_read_file(&buf
, rebase_path_refs_to_delete(), 0) > 0) {
378 char *eol
= strchr(p
, '\n');
381 if (delete_ref("(rebase) cleanup", p
, NULL
, 0) < 0) {
382 warning(_("could not delete '%s'"), p
);
392 strbuf_addstr(&buf
, get_dir(opts
));
393 if (remove_dir_recursively(&buf
, 0))
394 ret
= error(_("could not remove '%s'"), buf
.buf
);
395 strbuf_release(&buf
);
400 static const char *action_name(const struct replay_opts
*opts
)
402 switch (opts
->action
) {
406 return N_("cherry-pick");
407 case REPLAY_INTERACTIVE_REBASE
:
410 die(_("unknown action: %d"), opts
->action
);
413 struct commit_message
{
420 static const char *short_commit_name(struct commit
*commit
)
422 return find_unique_abbrev(&commit
->object
.oid
, DEFAULT_ABBREV
);
425 static int get_message(struct commit
*commit
, struct commit_message
*out
)
427 const char *abbrev
, *subject
;
430 out
->message
= logmsg_reencode(commit
, NULL
, get_commit_output_encoding());
431 abbrev
= short_commit_name(commit
);
433 subject_len
= find_commit_subject(out
->message
, &subject
);
435 out
->subject
= xmemdupz(subject
, subject_len
);
436 out
->label
= xstrfmt("%s (%s)", abbrev
, out
->subject
);
437 out
->parent_label
= xstrfmt("parent of %s", out
->label
);
442 static void free_message(struct commit
*commit
, struct commit_message
*msg
)
444 free(msg
->parent_label
);
447 unuse_commit_buffer(commit
, msg
->message
);
450 static void print_advice(struct repository
*r
, int show_hint
,
451 struct replay_opts
*opts
)
453 char *msg
= getenv("GIT_CHERRY_PICK_HELP");
458 * A conflict has occurred but the porcelain
459 * (typically rebase --interactive) wants to take care
460 * of the commit itself so remove CHERRY_PICK_HEAD
462 refs_delete_ref(get_main_ref_store(r
), "", "CHERRY_PICK_HEAD",
469 advise(_("after resolving the conflicts, mark the corrected paths\n"
470 "with 'git add <paths>' or 'git rm <paths>'"));
471 else if (opts
->action
== REPLAY_PICK
)
472 advise(_("After resolving the conflicts, mark them with\n"
473 "\"git add/rm <pathspec>\", then run\n"
474 "\"git cherry-pick --continue\".\n"
475 "You can instead skip this commit with \"git cherry-pick --skip\".\n"
476 "To abort and get back to the state before \"git cherry-pick\",\n"
477 "run \"git cherry-pick --abort\"."));
478 else if (opts
->action
== REPLAY_REVERT
)
479 advise(_("After resolving the conflicts, mark them with\n"
480 "\"git add/rm <pathspec>\", then run\n"
481 "\"git revert --continue\".\n"
482 "You can instead skip this commit with \"git revert --skip\".\n"
483 "To abort and get back to the state before \"git revert\",\n"
484 "run \"git revert --abort\"."));
486 BUG("unexpected pick action in print_advice()");
490 static int write_message(const void *buf
, size_t len
, const char *filename
,
493 struct lock_file msg_file
= LOCK_INIT
;
495 int msg_fd
= hold_lock_file_for_update(&msg_file
, filename
, 0);
497 return error_errno(_("could not lock '%s'"), filename
);
498 if (write_in_full(msg_fd
, buf
, len
) < 0) {
499 error_errno(_("could not write to '%s'"), filename
);
500 rollback_lock_file(&msg_file
);
503 if (append_eol
&& write(msg_fd
, "\n", 1) < 0) {
504 error_errno(_("could not write eol to '%s'"), filename
);
505 rollback_lock_file(&msg_file
);
508 if (commit_lock_file(&msg_file
) < 0)
509 return error(_("failed to finalize '%s'"), filename
);
514 int read_oneliner(struct strbuf
*buf
,
515 const char *path
, unsigned flags
)
517 int orig_len
= buf
->len
;
519 if (strbuf_read_file(buf
, path
, 0) < 0) {
520 if ((flags
& READ_ONELINER_WARN_MISSING
) ||
521 (errno
!= ENOENT
&& errno
!= ENOTDIR
))
522 warning_errno(_("could not read '%s'"), path
);
526 if (buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\n') {
527 if (--buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\r')
529 buf
->buf
[buf
->len
] = '\0';
532 if ((flags
& READ_ONELINER_SKIP_IF_EMPTY
) && buf
->len
== orig_len
)
538 static struct tree
*empty_tree(struct repository
*r
)
540 return lookup_tree(r
, the_hash_algo
->empty_tree
);
543 static int error_dirty_index(struct repository
*repo
, struct replay_opts
*opts
)
545 if (repo_read_index_unmerged(repo
))
546 return error_resolve_conflict(action_name(opts
));
548 error(_("your local changes would be overwritten by %s."),
549 _(action_name(opts
)));
551 if (advice_enabled(ADVICE_COMMIT_BEFORE_MERGE
))
552 advise(_("commit your changes or stash them to proceed."));
556 static void update_abort_safety_file(void)
558 struct object_id head
;
560 /* Do nothing on a single-pick */
561 if (!file_exists(git_path_seq_dir()))
564 if (!get_oid("HEAD", &head
))
565 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head
));
567 write_file(git_path_abort_safety_file(), "%s", "");
570 static int fast_forward_to(struct repository
*r
,
571 const struct object_id
*to
,
572 const struct object_id
*from
,
574 struct replay_opts
*opts
)
576 struct ref_transaction
*transaction
;
577 struct strbuf sb
= STRBUF_INIT
;
578 struct strbuf err
= STRBUF_INIT
;
581 if (checkout_fast_forward(r
, from
, to
, 1))
582 return -1; /* the callee should have complained already */
584 strbuf_addf(&sb
, "%s: fast-forward", action_name(opts
));
586 transaction
= ref_transaction_begin(&err
);
588 ref_transaction_update(transaction
, "HEAD",
589 to
, unborn
&& !is_rebase_i(opts
) ?
592 ref_transaction_commit(transaction
, &err
)) {
593 ref_transaction_free(transaction
);
594 error("%s", err
.buf
);
596 strbuf_release(&err
);
601 strbuf_release(&err
);
602 ref_transaction_free(transaction
);
603 update_abort_safety_file();
607 enum commit_msg_cleanup_mode
get_cleanup_mode(const char *cleanup_arg
,
610 if (!cleanup_arg
|| !strcmp(cleanup_arg
, "default"))
611 return use_editor
? COMMIT_MSG_CLEANUP_ALL
:
612 COMMIT_MSG_CLEANUP_SPACE
;
613 else if (!strcmp(cleanup_arg
, "verbatim"))
614 return COMMIT_MSG_CLEANUP_NONE
;
615 else if (!strcmp(cleanup_arg
, "whitespace"))
616 return COMMIT_MSG_CLEANUP_SPACE
;
617 else if (!strcmp(cleanup_arg
, "strip"))
618 return COMMIT_MSG_CLEANUP_ALL
;
619 else if (!strcmp(cleanup_arg
, "scissors"))
620 return use_editor
? COMMIT_MSG_CLEANUP_SCISSORS
:
621 COMMIT_MSG_CLEANUP_SPACE
;
623 die(_("Invalid cleanup mode %s"), cleanup_arg
);
627 * NB using int rather than enum cleanup_mode to stop clang's
628 * -Wtautological-constant-out-of-range-compare complaining that the comparison
631 static const char *describe_cleanup_mode(int cleanup_mode
)
633 static const char *modes
[] = { "whitespace",
638 if (cleanup_mode
< ARRAY_SIZE(modes
))
639 return modes
[cleanup_mode
];
641 BUG("invalid cleanup_mode provided (%d)", cleanup_mode
);
644 void append_conflicts_hint(struct index_state
*istate
,
645 struct strbuf
*msgbuf
, enum commit_msg_cleanup_mode cleanup_mode
)
649 if (cleanup_mode
== COMMIT_MSG_CLEANUP_SCISSORS
) {
650 strbuf_addch(msgbuf
, '\n');
651 wt_status_append_cut_line(msgbuf
);
652 strbuf_addch(msgbuf
, comment_line_char
);
655 strbuf_addch(msgbuf
, '\n');
656 strbuf_commented_addf(msgbuf
, "Conflicts:\n");
657 for (i
= 0; i
< istate
->cache_nr
;) {
658 const struct cache_entry
*ce
= istate
->cache
[i
++];
660 strbuf_commented_addf(msgbuf
, "\t%s\n", ce
->name
);
661 while (i
< istate
->cache_nr
&&
662 !strcmp(ce
->name
, istate
->cache
[i
]->name
))
668 static int do_recursive_merge(struct repository
*r
,
669 struct commit
*base
, struct commit
*next
,
670 const char *base_label
, const char *next_label
,
671 struct object_id
*head
, struct strbuf
*msgbuf
,
672 struct replay_opts
*opts
)
674 struct merge_options o
;
675 struct merge_result result
;
676 struct tree
*next_tree
, *base_tree
, *head_tree
;
677 int clean
, show_output
;
679 struct lock_file index_lock
= LOCK_INIT
;
681 if (repo_hold_locked_index(r
, &index_lock
, LOCK_REPORT_ON_ERROR
) < 0)
686 init_merge_options(&o
, r
);
687 o
.ancestor
= base
? base_label
: "(empty tree)";
689 o
.branch2
= next
? next_label
: "(empty tree)";
690 if (is_rebase_i(opts
))
692 o
.show_rename_progress
= 1;
694 head_tree
= parse_tree_indirect(head
);
695 next_tree
= next
? get_commit_tree(next
) : empty_tree(r
);
696 base_tree
= base
? get_commit_tree(base
) : empty_tree(r
);
698 for (i
= 0; i
< opts
->xopts_nr
; i
++)
699 parse_merge_opt(&o
, opts
->xopts
[i
]);
701 if (!opts
->strategy
|| !strcmp(opts
->strategy
, "ort")) {
702 memset(&result
, 0, sizeof(result
));
703 merge_incore_nonrecursive(&o
, base_tree
, head_tree
, next_tree
,
705 show_output
= !is_rebase_i(opts
) || !result
.clean
;
707 * TODO: merge_switch_to_result will update index/working tree;
708 * we only really want to do that if !result.clean || this is
709 * the final patch to be picked. But determining this is the
710 * final patch would take some work, and "head_tree" would need
711 * to be replace with the tree the index matched before we
712 * started doing any picks.
714 merge_switch_to_result(&o
, head_tree
, &result
, 1, show_output
);
715 clean
= result
.clean
;
717 ensure_full_index(r
->index
);
718 clean
= merge_trees(&o
, head_tree
, next_tree
, base_tree
);
719 if (is_rebase_i(opts
) && clean
<= 0)
720 fputs(o
.obuf
.buf
, stdout
);
721 strbuf_release(&o
.obuf
);
724 rollback_lock_file(&index_lock
);
728 if (write_locked_index(r
->index
, &index_lock
,
729 COMMIT_LOCK
| SKIP_IF_UNCHANGED
))
731 * TRANSLATORS: %s will be "revert", "cherry-pick" or
734 return error(_("%s: Unable to write new index file"),
735 _(action_name(opts
)));
738 append_conflicts_hint(r
->index
, msgbuf
,
739 opts
->default_msg_cleanup
);
744 static struct object_id
*get_cache_tree_oid(struct index_state
*istate
)
746 if (!cache_tree_fully_valid(istate
->cache_tree
))
747 if (cache_tree_update(istate
, 0)) {
748 error(_("unable to update cache tree"));
752 return &istate
->cache_tree
->oid
;
755 static int is_index_unchanged(struct repository
*r
)
757 struct object_id head_oid
, *cache_tree_oid
;
758 struct commit
*head_commit
;
759 struct index_state
*istate
= r
->index
;
761 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING
, &head_oid
, NULL
))
762 return error(_("could not resolve HEAD commit"));
764 head_commit
= lookup_commit(r
, &head_oid
);
767 * If head_commit is NULL, check_commit, called from
768 * lookup_commit, would have indicated that head_commit is not
769 * a commit object already. parse_commit() will return failure
770 * without further complaints in such a case. Otherwise, if
771 * the commit is invalid, parse_commit() will complain. So
772 * there is nothing for us to say here. Just return failure.
774 if (parse_commit(head_commit
))
777 if (!(cache_tree_oid
= get_cache_tree_oid(istate
)))
780 return oideq(cache_tree_oid
, get_commit_tree_oid(head_commit
));
783 static int write_author_script(const char *message
)
785 struct strbuf buf
= STRBUF_INIT
;
790 if (!*message
|| starts_with(message
, "\n")) {
792 /* Missing 'author' line? */
793 unlink(rebase_path_author_script());
795 } else if (skip_prefix(message
, "author ", &message
))
797 else if ((eol
= strchr(message
, '\n')))
802 strbuf_addstr(&buf
, "GIT_AUTHOR_NAME='");
803 while (*message
&& *message
!= '\n' && *message
!= '\r')
804 if (skip_prefix(message
, " <", &message
))
806 else if (*message
!= '\'')
807 strbuf_addch(&buf
, *(message
++));
809 strbuf_addf(&buf
, "'\\%c'", *(message
++));
810 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_EMAIL='");
811 while (*message
&& *message
!= '\n' && *message
!= '\r')
812 if (skip_prefix(message
, "> ", &message
))
814 else if (*message
!= '\'')
815 strbuf_addch(&buf
, *(message
++));
817 strbuf_addf(&buf
, "'\\%c'", *(message
++));
818 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_DATE='@");
819 while (*message
&& *message
!= '\n' && *message
!= '\r')
820 if (*message
!= '\'')
821 strbuf_addch(&buf
, *(message
++));
823 strbuf_addf(&buf
, "'\\%c'", *(message
++));
824 strbuf_addch(&buf
, '\'');
825 res
= write_message(buf
.buf
, buf
.len
, rebase_path_author_script(), 1);
826 strbuf_release(&buf
);
831 * Take a series of KEY='VALUE' lines where VALUE part is
832 * sq-quoted, and append <KEY, VALUE> at the end of the string list
834 static int parse_key_value_squoted(char *buf
, struct string_list
*list
)
837 struct string_list_item
*item
;
839 char *cp
= strchr(buf
, '=');
841 np
= strchrnul(buf
, '\n');
842 return error(_("no key present in '%.*s'"),
843 (int) (np
- buf
), buf
);
845 np
= strchrnul(cp
, '\n');
847 item
= string_list_append(list
, buf
);
849 buf
= np
+ (*np
== '\n');
853 return error(_("unable to dequote value of '%s'"),
855 item
->util
= xstrdup(cp
);
861 * Reads and parses the state directory's "author-script" file, and sets name,
862 * email and date accordingly.
863 * Returns 0 on success, -1 if the file could not be parsed.
865 * The author script is of the format:
867 * GIT_AUTHOR_NAME='$author_name'
868 * GIT_AUTHOR_EMAIL='$author_email'
869 * GIT_AUTHOR_DATE='$author_date'
871 * where $author_name, $author_email and $author_date are quoted. We are strict
872 * with our parsing, as the file was meant to be eval'd in the now-removed
873 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
874 * from what this function expects, it is better to bail out than to do
875 * something that the user does not expect.
877 int read_author_script(const char *path
, char **name
, char **email
, char **date
,
880 struct strbuf buf
= STRBUF_INIT
;
881 struct string_list kv
= STRING_LIST_INIT_DUP
;
882 int retval
= -1; /* assume failure */
883 int i
, name_i
= -2, email_i
= -2, date_i
= -2, err
= 0;
885 if (strbuf_read_file(&buf
, path
, 256) <= 0) {
886 strbuf_release(&buf
);
887 if (errno
== ENOENT
&& allow_missing
)
890 return error_errno(_("could not open '%s' for reading"),
894 if (parse_key_value_squoted(buf
.buf
, &kv
))
897 for (i
= 0; i
< kv
.nr
; i
++) {
898 if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_NAME")) {
900 name_i
= error(_("'GIT_AUTHOR_NAME' already given"));
903 } else if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_EMAIL")) {
905 email_i
= error(_("'GIT_AUTHOR_EMAIL' already given"));
908 } else if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_DATE")) {
910 date_i
= error(_("'GIT_AUTHOR_DATE' already given"));
914 err
= error(_("unknown variable '%s'"),
919 error(_("missing 'GIT_AUTHOR_NAME'"));
921 error(_("missing 'GIT_AUTHOR_EMAIL'"));
923 error(_("missing 'GIT_AUTHOR_DATE'"));
924 if (name_i
< 0 || email_i
< 0 || date_i
< 0 || err
)
926 *name
= kv
.items
[name_i
].util
;
927 *email
= kv
.items
[email_i
].util
;
928 *date
= kv
.items
[date_i
].util
;
931 string_list_clear(&kv
, !!retval
);
932 strbuf_release(&buf
);
937 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
938 * file with shell quoting into struct strvec. Returns -1 on
939 * error, 0 otherwise.
941 static int read_env_script(struct strvec
*env
)
943 char *name
, *email
, *date
;
945 if (read_author_script(rebase_path_author_script(),
946 &name
, &email
, &date
, 0))
949 strvec_pushf(env
, "GIT_AUTHOR_NAME=%s", name
);
950 strvec_pushf(env
, "GIT_AUTHOR_EMAIL=%s", email
);
951 strvec_pushf(env
, "GIT_AUTHOR_DATE=%s", date
);
959 static char *get_author(const char *message
)
964 a
= find_commit_header(message
, "author", &len
);
966 return xmemdupz(a
, len
);
971 static const char *author_date_from_env(const struct strvec
*env
)
976 for (i
= 0; i
< env
->nr
; i
++)
977 if (skip_prefix(env
->v
[i
],
978 "GIT_AUTHOR_DATE=", &date
))
981 * If GIT_AUTHOR_DATE is missing we should have already errored out when
984 BUG("GIT_AUTHOR_DATE missing from author script");
987 static const char staged_changes_advice
[] =
988 N_("you have staged changes in your working tree\n"
989 "If these changes are meant to be squashed into the previous commit, run:\n"
991 " git commit --amend %s\n"
993 "If they are meant to go into a new commit, run:\n"
997 "In both cases, once you're done, continue with:\n"
999 " git rebase --continue\n");
1001 #define ALLOW_EMPTY (1<<0)
1002 #define EDIT_MSG (1<<1)
1003 #define AMEND_MSG (1<<2)
1004 #define CLEANUP_MSG (1<<3)
1005 #define VERIFY_MSG (1<<4)
1006 #define CREATE_ROOT_COMMIT (1<<5)
1007 #define VERBATIM_MSG (1<<6)
1009 static int run_command_silent_on_success(struct child_process
*cmd
)
1011 struct strbuf buf
= STRBUF_INIT
;
1014 cmd
->stdout_to_stderr
= 1;
1015 rc
= pipe_command(cmd
,
1021 fputs(buf
.buf
, stderr
);
1022 strbuf_release(&buf
);
1027 * If we are cherry-pick, and if the merge did not result in
1028 * hand-editing, we will hit this commit and inherit the original
1029 * author date and name.
1031 * If we are revert, or if our cherry-pick results in a hand merge,
1032 * we had better say that the current user is responsible for that.
1034 * An exception is when run_git_commit() is called during an
1035 * interactive rebase: in that case, we will want to retain the
1038 static int run_git_commit(const char *defmsg
,
1039 struct replay_opts
*opts
,
1042 struct child_process cmd
= CHILD_PROCESS_INIT
;
1044 if ((flags
& CLEANUP_MSG
) && (flags
& VERBATIM_MSG
))
1045 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1049 if (is_rebase_i(opts
) &&
1050 ((opts
->committer_date_is_author_date
&& !opts
->ignore_date
) ||
1051 !(!defmsg
&& (flags
& AMEND_MSG
))) &&
1052 read_env_script(&cmd
.env
)) {
1053 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
1055 return error(_(staged_changes_advice
),
1059 strvec_pushf(&cmd
.env
, GIT_REFLOG_ACTION
"=%s", opts
->reflog_message
);
1061 if (opts
->committer_date_is_author_date
)
1062 strvec_pushf(&cmd
.env
, "GIT_COMMITTER_DATE=%s",
1065 author_date_from_env(&cmd
.env
));
1066 if (opts
->ignore_date
)
1067 strvec_push(&cmd
.env
, "GIT_AUTHOR_DATE=");
1069 strvec_push(&cmd
.args
, "commit");
1071 if (!(flags
& VERIFY_MSG
))
1072 strvec_push(&cmd
.args
, "-n");
1073 if ((flags
& AMEND_MSG
))
1074 strvec_push(&cmd
.args
, "--amend");
1076 strvec_pushf(&cmd
.args
, "-S%s", opts
->gpg_sign
);
1078 strvec_push(&cmd
.args
, "--no-gpg-sign");
1080 strvec_pushl(&cmd
.args
, "-F", defmsg
, NULL
);
1081 else if (!(flags
& EDIT_MSG
))
1082 strvec_pushl(&cmd
.args
, "-C", "HEAD", NULL
);
1083 if ((flags
& CLEANUP_MSG
))
1084 strvec_push(&cmd
.args
, "--cleanup=strip");
1085 if ((flags
& VERBATIM_MSG
))
1086 strvec_push(&cmd
.args
, "--cleanup=verbatim");
1087 if ((flags
& EDIT_MSG
))
1088 strvec_push(&cmd
.args
, "-e");
1089 else if (!(flags
& CLEANUP_MSG
) &&
1090 !opts
->signoff
&& !opts
->record_origin
&&
1091 !opts
->explicit_cleanup
)
1092 strvec_push(&cmd
.args
, "--cleanup=verbatim");
1094 if ((flags
& ALLOW_EMPTY
))
1095 strvec_push(&cmd
.args
, "--allow-empty");
1097 if (!(flags
& EDIT_MSG
))
1098 strvec_push(&cmd
.args
, "--allow-empty-message");
1100 if (is_rebase_i(opts
) && !(flags
& EDIT_MSG
))
1101 return run_command_silent_on_success(&cmd
);
1103 return run_command(&cmd
);
1106 static int rest_is_empty(const struct strbuf
*sb
, int start
)
1111 /* Check if the rest is just whitespace and Signed-off-by's. */
1112 for (i
= start
; i
< sb
->len
; i
++) {
1113 nl
= memchr(sb
->buf
+ i
, '\n', sb
->len
- i
);
1119 if (strlen(sign_off_header
) <= eol
- i
&&
1120 starts_with(sb
->buf
+ i
, sign_off_header
)) {
1125 if (!isspace(sb
->buf
[i
++]))
1132 void cleanup_message(struct strbuf
*msgbuf
,
1133 enum commit_msg_cleanup_mode cleanup_mode
, int verbose
)
1135 if (verbose
|| /* Truncate the message just before the diff, if any. */
1136 cleanup_mode
== COMMIT_MSG_CLEANUP_SCISSORS
)
1137 strbuf_setlen(msgbuf
, wt_status_locate_end(msgbuf
->buf
, msgbuf
->len
));
1138 if (cleanup_mode
!= COMMIT_MSG_CLEANUP_NONE
)
1139 strbuf_stripspace(msgbuf
, cleanup_mode
== COMMIT_MSG_CLEANUP_ALL
);
1143 * Find out if the message in the strbuf contains only whitespace and
1144 * Signed-off-by lines.
1146 int message_is_empty(const struct strbuf
*sb
,
1147 enum commit_msg_cleanup_mode cleanup_mode
)
1149 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
1151 return rest_is_empty(sb
, 0);
1155 * See if the user edited the message in the editor or left what
1156 * was in the template intact
1158 int template_untouched(const struct strbuf
*sb
, const char *template_file
,
1159 enum commit_msg_cleanup_mode cleanup_mode
)
1161 struct strbuf tmpl
= STRBUF_INIT
;
1164 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
1167 if (!template_file
|| strbuf_read_file(&tmpl
, template_file
, 0) <= 0)
1170 strbuf_stripspace(&tmpl
, cleanup_mode
== COMMIT_MSG_CLEANUP_ALL
);
1171 if (!skip_prefix(sb
->buf
, tmpl
.buf
, &start
))
1173 strbuf_release(&tmpl
);
1174 return rest_is_empty(sb
, start
- sb
->buf
);
1177 int update_head_with_reflog(const struct commit
*old_head
,
1178 const struct object_id
*new_head
,
1179 const char *action
, const struct strbuf
*msg
,
1182 struct ref_transaction
*transaction
;
1183 struct strbuf sb
= STRBUF_INIT
;
1188 strbuf_addstr(&sb
, action
);
1189 strbuf_addstr(&sb
, ": ");
1192 nl
= strchr(msg
->buf
, '\n');
1194 strbuf_add(&sb
, msg
->buf
, nl
+ 1 - msg
->buf
);
1196 strbuf_addbuf(&sb
, msg
);
1197 strbuf_addch(&sb
, '\n');
1200 transaction
= ref_transaction_begin(err
);
1202 ref_transaction_update(transaction
, "HEAD", new_head
,
1203 old_head
? &old_head
->object
.oid
: null_oid(),
1205 ref_transaction_commit(transaction
, err
)) {
1208 ref_transaction_free(transaction
);
1209 strbuf_release(&sb
);
1214 static int run_rewrite_hook(const struct object_id
*oldoid
,
1215 const struct object_id
*newoid
)
1217 struct child_process proc
= CHILD_PROCESS_INIT
;
1219 struct strbuf sb
= STRBUF_INIT
;
1220 const char *hook_path
= find_hook("post-rewrite");
1225 strvec_pushl(&proc
.args
, hook_path
, "amend", NULL
);
1227 proc
.stdout_to_stderr
= 1;
1228 proc
.trace2_hook_name
= "post-rewrite";
1230 code
= start_command(&proc
);
1233 strbuf_addf(&sb
, "%s %s\n", oid_to_hex(oldoid
), oid_to_hex(newoid
));
1234 sigchain_push(SIGPIPE
, SIG_IGN
);
1235 write_in_full(proc
.in
, sb
.buf
, sb
.len
);
1237 strbuf_release(&sb
);
1238 sigchain_pop(SIGPIPE
);
1239 return finish_command(&proc
);
1242 void commit_post_rewrite(struct repository
*r
,
1243 const struct commit
*old_head
,
1244 const struct object_id
*new_head
)
1246 struct notes_rewrite_cfg
*cfg
;
1248 cfg
= init_copy_notes_for_rewrite("amend");
1250 /* we are amending, so old_head is not NULL */
1251 copy_note_for_rewrite(cfg
, &old_head
->object
.oid
, new_head
);
1252 finish_copy_notes_for_rewrite(r
, cfg
, "Notes added by 'git commit --amend'");
1254 run_rewrite_hook(&old_head
->object
.oid
, new_head
);
1257 static int run_prepare_commit_msg_hook(struct repository
*r
,
1262 const char *name
, *arg1
= NULL
, *arg2
= NULL
;
1264 name
= git_path_commit_editmsg();
1265 if (write_message(msg
->buf
, msg
->len
, name
, 0))
1274 if (run_commit_hook(0, r
->index_file
, NULL
, "prepare-commit-msg", name
,
1276 ret
= error(_("'prepare-commit-msg' hook failed"));
1281 static const char implicit_ident_advice_noconfig
[] =
1282 N_("Your name and email address were configured automatically based\n"
1283 "on your username and hostname. Please check that they are accurate.\n"
1284 "You can suppress this message by setting them explicitly. Run the\n"
1285 "following command and follow the instructions in your editor to edit\n"
1286 "your configuration file:\n"
1288 " git config --global --edit\n"
1290 "After doing this, you may fix the identity used for this commit with:\n"
1292 " git commit --amend --reset-author\n");
1294 static const char implicit_ident_advice_config
[] =
1295 N_("Your name and email address were configured automatically based\n"
1296 "on your username and hostname. Please check that they are accurate.\n"
1297 "You can suppress this message by setting them explicitly:\n"
1299 " git config --global user.name \"Your Name\"\n"
1300 " git config --global user.email you@example.com\n"
1302 "After doing this, you may fix the identity used for this commit with:\n"
1304 " git commit --amend --reset-author\n");
1306 static const char *implicit_ident_advice(void)
1308 char *user_config
= interpolate_path("~/.gitconfig", 0);
1309 char *xdg_config
= xdg_config_home("config");
1310 int config_exists
= file_exists(user_config
) || file_exists(xdg_config
);
1316 return _(implicit_ident_advice_config
);
1318 return _(implicit_ident_advice_noconfig
);
1322 void print_commit_summary(struct repository
*r
,
1324 const struct object_id
*oid
,
1327 struct rev_info rev
;
1328 struct commit
*commit
;
1329 struct strbuf format
= STRBUF_INIT
;
1331 struct pretty_print_context pctx
= {0};
1332 struct strbuf author_ident
= STRBUF_INIT
;
1333 struct strbuf committer_ident
= STRBUF_INIT
;
1334 struct ref_store
*refs
;
1336 commit
= lookup_commit(r
, oid
);
1338 die(_("couldn't look up newly created commit"));
1339 if (parse_commit(commit
))
1340 die(_("could not parse newly created commit"));
1342 strbuf_addstr(&format
, "format:%h] %s");
1344 format_commit_message(commit
, "%an <%ae>", &author_ident
, &pctx
);
1345 format_commit_message(commit
, "%cn <%ce>", &committer_ident
, &pctx
);
1346 if (strbuf_cmp(&author_ident
, &committer_ident
)) {
1347 strbuf_addstr(&format
, "\n Author: ");
1348 strbuf_addbuf_percentquote(&format
, &author_ident
);
1350 if (flags
& SUMMARY_SHOW_AUTHOR_DATE
) {
1351 struct strbuf date
= STRBUF_INIT
;
1353 format_commit_message(commit
, "%ad", &date
, &pctx
);
1354 strbuf_addstr(&format
, "\n Date: ");
1355 strbuf_addbuf_percentquote(&format
, &date
);
1356 strbuf_release(&date
);
1358 if (!committer_ident_sufficiently_given()) {
1359 strbuf_addstr(&format
, "\n Committer: ");
1360 strbuf_addbuf_percentquote(&format
, &committer_ident
);
1361 if (advice_enabled(ADVICE_IMPLICIT_IDENTITY
)) {
1362 strbuf_addch(&format
, '\n');
1363 strbuf_addstr(&format
, implicit_ident_advice());
1366 strbuf_release(&author_ident
);
1367 strbuf_release(&committer_ident
);
1369 repo_init_revisions(r
, &rev
, prefix
);
1370 setup_revisions(0, NULL
, &rev
, NULL
);
1373 rev
.diffopt
.output_format
=
1374 DIFF_FORMAT_SHORTSTAT
| DIFF_FORMAT_SUMMARY
;
1376 rev
.verbose_header
= 1;
1377 rev
.show_root_diff
= 1;
1378 get_commit_format(format
.buf
, &rev
);
1379 rev
.always_show_header
= 0;
1380 rev
.diffopt
.detect_rename
= DIFF_DETECT_RENAME
;
1381 diff_setup_done(&rev
.diffopt
);
1383 refs
= get_main_ref_store(the_repository
);
1384 head
= refs_resolve_ref_unsafe(refs
, "HEAD", 0, NULL
, NULL
);
1386 die(_("unable to resolve HEAD after creating commit"));
1387 if (!strcmp(head
, "HEAD"))
1388 head
= _("detached HEAD");
1390 skip_prefix(head
, "refs/heads/", &head
);
1391 printf("[%s%s ", head
, (flags
& SUMMARY_INITIAL_COMMIT
) ?
1392 _(" (root-commit)") : "");
1394 if (!log_tree_commit(&rev
, commit
)) {
1395 rev
.always_show_header
= 1;
1396 rev
.use_terminator
= 1;
1397 log_tree_commit(&rev
, commit
);
1400 release_revisions(&rev
);
1401 strbuf_release(&format
);
1404 static int parse_head(struct repository
*r
, struct commit
**head
)
1406 struct commit
*current_head
;
1407 struct object_id oid
;
1409 if (get_oid("HEAD", &oid
)) {
1410 current_head
= NULL
;
1412 current_head
= lookup_commit_reference(r
, &oid
);
1414 return error(_("could not parse HEAD"));
1415 if (!oideq(&oid
, ¤t_head
->object
.oid
)) {
1416 warning(_("HEAD %s is not a commit!"),
1419 if (parse_commit(current_head
))
1420 return error(_("could not parse HEAD commit"));
1422 *head
= current_head
;
1428 * Try to commit without forking 'git commit'. In some cases we need
1429 * to run 'git commit' to display an error message
1432 * -1 - error unable to commit
1434 * 1 - run 'git commit'
1436 static int try_to_commit(struct repository
*r
,
1437 struct strbuf
*msg
, const char *author
,
1438 struct replay_opts
*opts
, unsigned int flags
,
1439 struct object_id
*oid
)
1441 struct object_id tree
;
1442 struct commit
*current_head
= NULL
;
1443 struct commit_list
*parents
= NULL
;
1444 struct commit_extra_header
*extra
= NULL
;
1445 struct strbuf err
= STRBUF_INIT
;
1446 struct strbuf commit_msg
= STRBUF_INIT
;
1447 char *amend_author
= NULL
;
1448 const char *committer
= NULL
;
1449 const char *hook_commit
= NULL
;
1450 enum commit_msg_cleanup_mode cleanup
;
1453 if ((flags
& CLEANUP_MSG
) && (flags
& VERBATIM_MSG
))
1454 BUG("CLEANUP_MSG and VERBATIM_MSG are mutually exclusive");
1456 if (parse_head(r
, ¤t_head
))
1459 if (flags
& AMEND_MSG
) {
1460 const char *exclude_gpgsig
[] = { "gpgsig", "gpgsig-sha256", NULL
};
1461 const char *out_enc
= get_commit_output_encoding();
1462 const char *message
= logmsg_reencode(current_head
, NULL
,
1466 const char *orig_message
= NULL
;
1468 find_commit_subject(message
, &orig_message
);
1470 strbuf_addstr(msg
, orig_message
);
1471 hook_commit
= "HEAD";
1473 author
= amend_author
= get_author(message
);
1474 unuse_commit_buffer(current_head
, message
);
1476 res
= error(_("unable to parse commit author"));
1479 parents
= copy_commit_list(current_head
->parents
);
1480 extra
= read_commit_extra_headers(current_head
, exclude_gpgsig
);
1481 } else if (current_head
&&
1482 (!(flags
& CREATE_ROOT_COMMIT
) || (flags
& AMEND_MSG
))) {
1483 commit_list_insert(current_head
, &parents
);
1486 if (write_index_as_tree(&tree
, r
->index
, r
->index_file
, 0, NULL
)) {
1487 res
= error(_("git write-tree failed to write a tree"));
1491 if (!(flags
& ALLOW_EMPTY
)) {
1492 struct commit
*first_parent
= current_head
;
1494 if (flags
& AMEND_MSG
) {
1495 if (current_head
->parents
) {
1496 first_parent
= current_head
->parents
->item
;
1497 if (repo_parse_commit(r
, first_parent
)) {
1498 res
= error(_("could not parse HEAD commit"));
1502 first_parent
= NULL
;
1505 if (oideq(first_parent
1506 ? get_commit_tree_oid(first_parent
)
1507 : the_hash_algo
->empty_tree
,
1509 res
= 1; /* run 'git commit' to display error message */
1514 if (hook_exists("prepare-commit-msg")) {
1515 res
= run_prepare_commit_msg_hook(r
, msg
, hook_commit
);
1518 if (strbuf_read_file(&commit_msg
, git_path_commit_editmsg(),
1520 res
= error_errno(_("unable to read commit message "
1522 git_path_commit_editmsg());
1528 if (flags
& CLEANUP_MSG
)
1529 cleanup
= COMMIT_MSG_CLEANUP_ALL
;
1530 else if (flags
& VERBATIM_MSG
)
1531 cleanup
= COMMIT_MSG_CLEANUP_NONE
;
1532 else if ((opts
->signoff
|| opts
->record_origin
) &&
1533 !opts
->explicit_cleanup
)
1534 cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
1536 cleanup
= opts
->default_msg_cleanup
;
1538 if (cleanup
!= COMMIT_MSG_CLEANUP_NONE
)
1539 strbuf_stripspace(msg
, cleanup
== COMMIT_MSG_CLEANUP_ALL
);
1540 if ((flags
& EDIT_MSG
) && message_is_empty(msg
, cleanup
)) {
1541 res
= 1; /* run 'git commit' to display error message */
1545 if (opts
->committer_date_is_author_date
) {
1546 struct ident_split id
;
1547 struct strbuf date
= STRBUF_INIT
;
1549 if (!opts
->ignore_date
) {
1550 if (split_ident_line(&id
, author
, (int)strlen(author
)) < 0) {
1551 res
= error(_("invalid author identity '%s'"),
1555 if (!id
.date_begin
) {
1557 "corrupt author: missing date information"));
1560 strbuf_addf(&date
, "@%.*s %.*s",
1561 (int)(id
.date_end
- id
.date_begin
),
1563 (int)(id
.tz_end
- id
.tz_begin
),
1568 committer
= fmt_ident(getenv("GIT_COMMITTER_NAME"),
1569 getenv("GIT_COMMITTER_EMAIL"),
1570 WANT_COMMITTER_IDENT
,
1571 opts
->ignore_date
? NULL
: date
.buf
,
1573 strbuf_release(&date
);
1578 if (opts
->ignore_date
) {
1579 struct ident_split id
;
1582 if (split_ident_line(&id
, author
, strlen(author
)) < 0) {
1583 error(_("invalid author identity '%s'"), author
);
1586 name
= xmemdupz(id
.name_begin
, id
.name_end
- id
.name_begin
);
1587 email
= xmemdupz(id
.mail_begin
, id
.mail_end
- id
.mail_begin
);
1588 author
= fmt_ident(name
, email
, WANT_AUTHOR_IDENT
, NULL
,
1594 if (commit_tree_extended(msg
->buf
, msg
->len
, &tree
, parents
, oid
,
1595 author
, committer
, opts
->gpg_sign
, extra
)) {
1596 res
= error(_("failed to write commit object"));
1600 if (update_head_with_reflog(current_head
, oid
, opts
->reflog_message
,
1602 res
= error("%s", err
.buf
);
1606 run_commit_hook(0, r
->index_file
, NULL
, "post-commit", NULL
);
1607 if (flags
& AMEND_MSG
)
1608 commit_post_rewrite(r
, current_head
, oid
);
1611 free_commit_extra_headers(extra
);
1612 strbuf_release(&err
);
1613 strbuf_release(&commit_msg
);
1619 static int write_rebase_head(struct object_id
*oid
)
1621 if (update_ref("rebase", "REBASE_HEAD", oid
,
1622 NULL
, REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
1623 return error(_("could not update %s"), "REBASE_HEAD");
1628 static int do_commit(struct repository
*r
,
1629 const char *msg_file
, const char *author
,
1630 struct replay_opts
*opts
, unsigned int flags
,
1631 struct object_id
*oid
)
1635 if (!(flags
& EDIT_MSG
) && !(flags
& VERIFY_MSG
)) {
1636 struct object_id oid
;
1637 struct strbuf sb
= STRBUF_INIT
;
1639 if (msg_file
&& strbuf_read_file(&sb
, msg_file
, 2048) < 0)
1640 return error_errno(_("unable to read commit message "
1644 res
= try_to_commit(r
, msg_file
? &sb
: NULL
,
1645 author
, opts
, flags
, &oid
);
1646 strbuf_release(&sb
);
1648 refs_delete_ref(get_main_ref_store(r
), "",
1649 "CHERRY_PICK_HEAD", NULL
, 0);
1650 unlink(git_path_merge_msg(r
));
1651 if (!is_rebase_i(opts
))
1652 print_commit_summary(r
, NULL
, &oid
,
1653 SUMMARY_SHOW_AUTHOR_DATE
);
1658 if (is_rebase_i(opts
) && oid
)
1659 if (write_rebase_head(oid
))
1661 return run_git_commit(msg_file
, opts
, flags
);
1667 static int is_original_commit_empty(struct commit
*commit
)
1669 const struct object_id
*ptree_oid
;
1671 if (parse_commit(commit
))
1672 return error(_("could not parse commit %s"),
1673 oid_to_hex(&commit
->object
.oid
));
1674 if (commit
->parents
) {
1675 struct commit
*parent
= commit
->parents
->item
;
1676 if (parse_commit(parent
))
1677 return error(_("could not parse parent commit %s"),
1678 oid_to_hex(&parent
->object
.oid
));
1679 ptree_oid
= get_commit_tree_oid(parent
);
1681 ptree_oid
= the_hash_algo
->empty_tree
; /* commit is root */
1684 return oideq(ptree_oid
, get_commit_tree_oid(commit
));
1688 * Should empty commits be allowed? Return status:
1689 * <0: Error in is_index_unchanged(r) or is_original_commit_empty(commit)
1690 * 0: Halt on empty commit
1691 * 1: Allow empty commit
1692 * 2: Drop empty commit
1694 static int allow_empty(struct repository
*r
,
1695 struct replay_opts
*opts
,
1696 struct commit
*commit
)
1698 int index_unchanged
, originally_empty
;
1703 * (1) we do not allow empty at all and error out.
1705 * (2) we allow ones that were initially empty, and
1706 * just drop the ones that become empty
1708 * (3) we allow ones that were initially empty, but
1709 * halt for the ones that become empty;
1711 * (4) we allow both.
1713 if (!opts
->allow_empty
)
1714 return 0; /* let "git commit" barf as necessary */
1716 index_unchanged
= is_index_unchanged(r
);
1717 if (index_unchanged
< 0)
1718 return index_unchanged
;
1719 if (!index_unchanged
)
1720 return 0; /* we do not have to say --allow-empty */
1722 if (opts
->keep_redundant_commits
)
1725 originally_empty
= is_original_commit_empty(commit
);
1726 if (originally_empty
< 0)
1727 return originally_empty
;
1728 if (originally_empty
)
1730 else if (opts
->drop_redundant_commits
)
1739 } todo_command_info
[] = {
1740 [TODO_PICK
] = { 'p', "pick" },
1741 [TODO_REVERT
] = { 0, "revert" },
1742 [TODO_EDIT
] = { 'e', "edit" },
1743 [TODO_REWORD
] = { 'r', "reword" },
1744 [TODO_FIXUP
] = { 'f', "fixup" },
1745 [TODO_SQUASH
] = { 's', "squash" },
1746 [TODO_EXEC
] = { 'x', "exec" },
1747 [TODO_BREAK
] = { 'b', "break" },
1748 [TODO_LABEL
] = { 'l', "label" },
1749 [TODO_RESET
] = { 't', "reset" },
1750 [TODO_MERGE
] = { 'm', "merge" },
1751 [TODO_UPDATE_REF
] = { 'u', "update-ref" },
1752 [TODO_NOOP
] = { 0, "noop" },
1753 [TODO_DROP
] = { 'd', "drop" },
1754 [TODO_COMMENT
] = { 0, NULL
},
1757 static const char *command_to_string(const enum todo_command command
)
1759 if (command
< TODO_COMMENT
)
1760 return todo_command_info
[command
].str
;
1761 die(_("unknown command: %d"), command
);
1764 static char command_to_char(const enum todo_command command
)
1766 if (command
< TODO_COMMENT
)
1767 return todo_command_info
[command
].c
;
1768 return comment_line_char
;
1771 static int is_noop(const enum todo_command command
)
1773 return TODO_NOOP
<= command
;
1776 static int is_fixup(enum todo_command command
)
1778 return command
== TODO_FIXUP
|| command
== TODO_SQUASH
;
1781 /* Does this command create a (non-merge) commit? */
1782 static int is_pick_or_similar(enum todo_command command
)
1797 enum todo_item_flags
{
1798 TODO_EDIT_MERGE_MSG
= (1 << 0),
1799 TODO_REPLACE_FIXUP_MSG
= (1 << 1),
1800 TODO_EDIT_FIXUP_MSG
= (1 << 2),
1803 static const char first_commit_msg_str
[] = N_("This is the 1st commit message:");
1804 static const char nth_commit_msg_fmt
[] = N_("This is the commit message #%d:");
1805 static const char skip_first_commit_msg_str
[] = N_("The 1st commit message will be skipped:");
1806 static const char skip_nth_commit_msg_fmt
[] = N_("The commit message #%d will be skipped:");
1807 static const char combined_commit_msg_fmt
[] = N_("This is a combination of %d commits.");
1809 static int is_fixup_flag(enum todo_command command
, unsigned flag
)
1811 return command
== TODO_FIXUP
&& ((flag
& TODO_REPLACE_FIXUP_MSG
) ||
1812 (flag
& TODO_EDIT_FIXUP_MSG
));
1816 * Wrapper around strbuf_add_commented_lines() which avoids double
1817 * commenting commit subjects.
1819 static void add_commented_lines(struct strbuf
*buf
, const void *str
, size_t len
)
1821 const char *s
= str
;
1822 while (len
> 0 && s
[0] == comment_line_char
) {
1824 const char *n
= memchr(s
, '\n', len
);
1829 strbuf_add(buf
, s
, count
);
1833 strbuf_add_commented_lines(buf
, s
, len
);
1836 /* Does the current fixup chain contain a squash command? */
1837 static int seen_squash(struct replay_opts
*opts
)
1839 return starts_with(opts
->current_fixups
.buf
, "squash") ||
1840 strstr(opts
->current_fixups
.buf
, "\nsquash");
1843 static void update_comment_bufs(struct strbuf
*buf1
, struct strbuf
*buf2
, int n
)
1845 strbuf_setlen(buf1
, 2);
1846 strbuf_addf(buf1
, _(nth_commit_msg_fmt
), n
);
1847 strbuf_addch(buf1
, '\n');
1848 strbuf_setlen(buf2
, 2);
1849 strbuf_addf(buf2
, _(skip_nth_commit_msg_fmt
), n
);
1850 strbuf_addch(buf2
, '\n');
1854 * Comment out any un-commented commit messages, updating the message comments
1855 * to say they will be skipped but do not comment out the empty lines that
1856 * surround commit messages and their comments.
1858 static void update_squash_message_for_fixup(struct strbuf
*msg
)
1860 void (*copy_lines
)(struct strbuf
*, const void *, size_t) = strbuf_add
;
1861 struct strbuf buf1
= STRBUF_INIT
, buf2
= STRBUF_INIT
;
1862 const char *s
, *start
;
1864 size_t orig_msg_len
;
1867 strbuf_addf(&buf1
, "# %s\n", _(first_commit_msg_str
));
1868 strbuf_addf(&buf2
, "# %s\n", _(skip_first_commit_msg_str
));
1869 s
= start
= orig_msg
= strbuf_detach(msg
, &orig_msg_len
);
1873 if (skip_prefix(s
, buf1
.buf
, &next
)) {
1875 * Copy the last message, preserving the blank line
1876 * preceding the current line
1878 off
= (s
> start
+ 1 && s
[-2] == '\n') ? 1 : 0;
1879 copy_lines(msg
, start
, s
- start
- off
);
1881 strbuf_addch(msg
, '\n');
1883 * The next message needs to be commented out but the
1884 * message header is already commented out so just copy
1885 * it and the blank line that follows it.
1887 strbuf_addbuf(msg
, &buf2
);
1889 strbuf_addch(msg
, *next
++);
1891 copy_lines
= add_commented_lines
;
1892 update_comment_bufs(&buf1
, &buf2
, ++i
);
1893 } else if (skip_prefix(s
, buf2
.buf
, &next
)) {
1894 off
= (s
> start
+ 1 && s
[-2] == '\n') ? 1 : 0;
1895 copy_lines(msg
, start
, s
- start
- off
);
1898 copy_lines
= strbuf_add
;
1899 update_comment_bufs(&buf1
, &buf2
, ++i
);
1901 s
= strchr(s
, '\n');
1906 copy_lines(msg
, start
, orig_msg_len
- (start
- orig_msg
));
1908 strbuf_release(&buf1
);
1909 strbuf_release(&buf2
);
1912 static int append_squash_message(struct strbuf
*buf
, const char *body
,
1913 enum todo_command command
, struct replay_opts
*opts
,
1916 const char *fixup_msg
;
1917 size_t commented_len
= 0, fixup_off
;
1919 * amend is non-interactive and not normally used with fixup!
1920 * or squash! commits, so only comment out those subjects when
1921 * squashing commit messages.
1923 if (starts_with(body
, "amend!") ||
1924 ((command
== TODO_SQUASH
|| seen_squash(opts
)) &&
1925 (starts_with(body
, "squash!") || starts_with(body
, "fixup!"))))
1926 commented_len
= commit_subject_length(body
);
1928 strbuf_addf(buf
, "\n%c ", comment_line_char
);
1929 strbuf_addf(buf
, _(nth_commit_msg_fmt
),
1930 ++opts
->current_fixup_count
+ 1);
1931 strbuf_addstr(buf
, "\n\n");
1932 strbuf_add_commented_lines(buf
, body
, commented_len
);
1933 /* buf->buf may be reallocated so store an offset into the buffer */
1934 fixup_off
= buf
->len
;
1935 strbuf_addstr(buf
, body
+ commented_len
);
1937 /* fixup -C after squash behaves like squash */
1938 if (is_fixup_flag(command
, flag
) && !seen_squash(opts
)) {
1940 * We're replacing the commit message so we need to
1941 * append the Signed-off-by: trailer if the user
1942 * requested '--signoff'.
1945 append_signoff(buf
, 0, 0);
1947 if ((command
== TODO_FIXUP
) &&
1948 (flag
& TODO_REPLACE_FIXUP_MSG
) &&
1949 (file_exists(rebase_path_fixup_msg()) ||
1950 !file_exists(rebase_path_squash_msg()))) {
1951 fixup_msg
= skip_blank_lines(buf
->buf
+ fixup_off
);
1952 if (write_message(fixup_msg
, strlen(fixup_msg
),
1953 rebase_path_fixup_msg(), 0) < 0)
1954 return error(_("cannot write '%s'"),
1955 rebase_path_fixup_msg());
1957 unlink(rebase_path_fixup_msg());
1960 unlink(rebase_path_fixup_msg());
1966 static int update_squash_messages(struct repository
*r
,
1967 enum todo_command command
,
1968 struct commit
*commit
,
1969 struct replay_opts
*opts
,
1972 struct strbuf buf
= STRBUF_INIT
;
1974 const char *message
, *body
;
1975 const char *encoding
= get_commit_output_encoding();
1977 if (opts
->current_fixup_count
> 0) {
1978 struct strbuf header
= STRBUF_INIT
;
1981 if (strbuf_read_file(&buf
, rebase_path_squash_msg(), 9) <= 0)
1982 return error(_("could not read '%s'"),
1983 rebase_path_squash_msg());
1985 eol
= buf
.buf
[0] != comment_line_char
?
1986 buf
.buf
: strchrnul(buf
.buf
, '\n');
1988 strbuf_addf(&header
, "%c ", comment_line_char
);
1989 strbuf_addf(&header
, _(combined_commit_msg_fmt
),
1990 opts
->current_fixup_count
+ 2);
1991 strbuf_splice(&buf
, 0, eol
- buf
.buf
, header
.buf
, header
.len
);
1992 strbuf_release(&header
);
1993 if (is_fixup_flag(command
, flag
) && !seen_squash(opts
))
1994 update_squash_message_for_fixup(&buf
);
1996 struct object_id head
;
1997 struct commit
*head_commit
;
1998 const char *head_message
, *body
;
2000 if (get_oid("HEAD", &head
))
2001 return error(_("need a HEAD to fixup"));
2002 if (!(head_commit
= lookup_commit_reference(r
, &head
)))
2003 return error(_("could not read HEAD"));
2004 if (!(head_message
= logmsg_reencode(head_commit
, NULL
, encoding
)))
2005 return error(_("could not read HEAD's commit message"));
2007 find_commit_subject(head_message
, &body
);
2008 if (command
== TODO_FIXUP
&& !flag
&& write_message(body
, strlen(body
),
2009 rebase_path_fixup_msg(), 0) < 0) {
2010 unuse_commit_buffer(head_commit
, head_message
);
2011 return error(_("cannot write '%s'"), rebase_path_fixup_msg());
2013 strbuf_addf(&buf
, "%c ", comment_line_char
);
2014 strbuf_addf(&buf
, _(combined_commit_msg_fmt
), 2);
2015 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
2016 strbuf_addstr(&buf
, is_fixup_flag(command
, flag
) ?
2017 _(skip_first_commit_msg_str
) :
2018 _(first_commit_msg_str
));
2019 strbuf_addstr(&buf
, "\n\n");
2020 if (is_fixup_flag(command
, flag
))
2021 strbuf_add_commented_lines(&buf
, body
, strlen(body
));
2023 strbuf_addstr(&buf
, body
);
2025 unuse_commit_buffer(head_commit
, head_message
);
2028 if (!(message
= logmsg_reencode(commit
, NULL
, encoding
)))
2029 return error(_("could not read commit message of %s"),
2030 oid_to_hex(&commit
->object
.oid
));
2031 find_commit_subject(message
, &body
);
2033 if (command
== TODO_SQUASH
|| is_fixup_flag(command
, flag
)) {
2034 res
= append_squash_message(&buf
, body
, command
, opts
, flag
);
2035 } else if (command
== TODO_FIXUP
) {
2036 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
2037 strbuf_addf(&buf
, _(skip_nth_commit_msg_fmt
),
2038 ++opts
->current_fixup_count
+ 1);
2039 strbuf_addstr(&buf
, "\n\n");
2040 strbuf_add_commented_lines(&buf
, body
, strlen(body
));
2042 return error(_("unknown command: %d"), command
);
2043 unuse_commit_buffer(commit
, message
);
2046 res
= write_message(buf
.buf
, buf
.len
, rebase_path_squash_msg(),
2048 strbuf_release(&buf
);
2051 strbuf_addf(&opts
->current_fixups
, "%s%s %s",
2052 opts
->current_fixups
.len
? "\n" : "",
2053 command_to_string(command
),
2054 oid_to_hex(&commit
->object
.oid
));
2055 res
= write_message(opts
->current_fixups
.buf
,
2056 opts
->current_fixups
.len
,
2057 rebase_path_current_fixups(), 0);
2063 static void flush_rewritten_pending(void)
2065 struct strbuf buf
= STRBUF_INIT
;
2066 struct object_id newoid
;
2069 if (strbuf_read_file(&buf
, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ
+ 1) * 2) > 0 &&
2070 !get_oid("HEAD", &newoid
) &&
2071 (out
= fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
2072 char *bol
= buf
.buf
, *eol
;
2075 eol
= strchrnul(bol
, '\n');
2076 fprintf(out
, "%.*s %s\n", (int)(eol
- bol
),
2077 bol
, oid_to_hex(&newoid
));
2083 unlink(rebase_path_rewritten_pending());
2085 strbuf_release(&buf
);
2088 static void record_in_rewritten(struct object_id
*oid
,
2089 enum todo_command next_command
)
2091 FILE *out
= fopen_or_warn(rebase_path_rewritten_pending(), "a");
2096 fprintf(out
, "%s\n", oid_to_hex(oid
));
2099 if (!is_fixup(next_command
))
2100 flush_rewritten_pending();
2103 static int should_edit(struct replay_opts
*opts
) {
2106 * Note that we only handle the case of non-conflicted
2107 * commits; continue_single_pick() handles the conflicted
2108 * commits itself instead of calling this function.
2110 return (opts
->action
== REPLAY_REVERT
&& isatty(0)) ? 1 : 0;
2114 static void refer_to_commit(struct replay_opts
*opts
,
2115 struct strbuf
*msgbuf
, struct commit
*commit
)
2117 if (opts
->commit_use_reference
) {
2118 struct pretty_print_context ctx
= {
2119 .abbrev
= DEFAULT_ABBREV
,
2120 .date_mode
.type
= DATE_SHORT
,
2122 format_commit_message(commit
, "%h (%s, %ad)", msgbuf
, &ctx
);
2124 strbuf_addstr(msgbuf
, oid_to_hex(&commit
->object
.oid
));
2128 static int do_pick_commit(struct repository
*r
,
2129 struct todo_item
*item
,
2130 struct replay_opts
*opts
,
2131 int final_fixup
, int *check_todo
)
2133 unsigned int flags
= should_edit(opts
) ? EDIT_MSG
: 0;
2134 const char *msg_file
= should_edit(opts
) ? NULL
: git_path_merge_msg(r
);
2135 struct object_id head
;
2136 struct commit
*base
, *next
, *parent
;
2137 const char *base_label
, *next_label
;
2138 char *author
= NULL
;
2139 struct commit_message msg
= { NULL
, NULL
, NULL
, NULL
};
2140 struct strbuf msgbuf
= STRBUF_INIT
;
2141 int res
, unborn
= 0, reword
= 0, allow
, drop_commit
;
2142 enum todo_command command
= item
->command
;
2143 struct commit
*commit
= item
->commit
;
2145 if (opts
->no_commit
) {
2147 * We do not intend to commit immediately. We just want to
2148 * merge the differences in, so let's compute the tree
2149 * that represents the "current" state for the merge machinery
2152 if (write_index_as_tree(&head
, r
->index
, r
->index_file
, 0, NULL
))
2153 return error(_("your index file is unmerged."));
2155 unborn
= get_oid("HEAD", &head
);
2156 /* Do we want to generate a root commit? */
2157 if (is_pick_or_similar(command
) && opts
->have_squash_onto
&&
2158 oideq(&head
, &opts
->squash_onto
)) {
2159 if (is_fixup(command
))
2160 return error(_("cannot fixup root commit"));
2161 flags
|= CREATE_ROOT_COMMIT
;
2164 oidcpy(&head
, the_hash_algo
->empty_tree
);
2165 if (index_differs_from(r
, unborn
? empty_tree_oid_hex() : "HEAD",
2167 return error_dirty_index(r
, opts
);
2169 discard_index(r
->index
);
2171 if (!commit
->parents
)
2173 else if (commit
->parents
->next
) {
2174 /* Reverting or cherry-picking a merge commit */
2176 struct commit_list
*p
;
2178 if (!opts
->mainline
)
2179 return error(_("commit %s is a merge but no -m option was given."),
2180 oid_to_hex(&commit
->object
.oid
));
2182 for (cnt
= 1, p
= commit
->parents
;
2183 cnt
!= opts
->mainline
&& p
;
2186 if (cnt
!= opts
->mainline
|| !p
)
2187 return error(_("commit %s does not have parent %d"),
2188 oid_to_hex(&commit
->object
.oid
), opts
->mainline
);
2190 } else if (1 < opts
->mainline
)
2192 * Non-first parent explicitly specified as mainline for
2195 return error(_("commit %s does not have parent %d"),
2196 oid_to_hex(&commit
->object
.oid
), opts
->mainline
);
2198 parent
= commit
->parents
->item
;
2200 if (get_message(commit
, &msg
) != 0)
2201 return error(_("cannot get commit message for %s"),
2202 oid_to_hex(&commit
->object
.oid
));
2204 if (opts
->allow_ff
&& !is_fixup(command
) &&
2205 ((parent
&& oideq(&parent
->object
.oid
, &head
)) ||
2206 (!parent
&& unborn
))) {
2207 if (is_rebase_i(opts
))
2208 write_author_script(msg
.message
);
2209 res
= fast_forward_to(r
, &commit
->object
.oid
, &head
, unborn
,
2211 if (res
|| command
!= TODO_REWORD
)
2215 goto fast_forward_edit
;
2217 if (parent
&& parse_commit(parent
) < 0)
2218 /* TRANSLATORS: The first %s will be a "todo" command like
2219 "revert" or "pick", the second %s a SHA1. */
2220 return error(_("%s: cannot parse parent commit %s"),
2221 command_to_string(command
),
2222 oid_to_hex(&parent
->object
.oid
));
2225 * "commit" is an existing commit. We would want to apply
2226 * the difference it introduces since its first parent "prev"
2227 * on top of the current HEAD if we are cherry-pick. Or the
2228 * reverse of it if we are revert.
2231 if (command
== TODO_REVERT
) {
2233 base_label
= msg
.label
;
2235 next_label
= msg
.parent_label
;
2236 if (opts
->commit_use_reference
) {
2237 strbuf_addstr(&msgbuf
,
2238 "# *** SAY WHY WE ARE REVERTING ON THE TITLE LINE ***");
2240 strbuf_addstr(&msgbuf
, "Revert \"");
2241 strbuf_addstr(&msgbuf
, msg
.subject
);
2242 strbuf_addstr(&msgbuf
, "\"");
2244 strbuf_addstr(&msgbuf
, "\n\nThis reverts commit ");
2245 refer_to_commit(opts
, &msgbuf
, commit
);
2247 if (commit
->parents
&& commit
->parents
->next
) {
2248 strbuf_addstr(&msgbuf
, ", reversing\nchanges made to ");
2249 refer_to_commit(opts
, &msgbuf
, parent
);
2251 strbuf_addstr(&msgbuf
, ".\n");
2256 base_label
= msg
.parent_label
;
2258 next_label
= msg
.label
;
2260 /* Append the commit log message to msgbuf. */
2261 if (find_commit_subject(msg
.message
, &p
))
2262 strbuf_addstr(&msgbuf
, p
);
2264 if (opts
->record_origin
) {
2265 strbuf_complete_line(&msgbuf
);
2266 if (!has_conforming_footer(&msgbuf
, NULL
, 0))
2267 strbuf_addch(&msgbuf
, '\n');
2268 strbuf_addstr(&msgbuf
, cherry_picked_prefix
);
2269 strbuf_addstr(&msgbuf
, oid_to_hex(&commit
->object
.oid
));
2270 strbuf_addstr(&msgbuf
, ")\n");
2272 if (!is_fixup(command
))
2273 author
= get_author(msg
.message
);
2276 if (command
== TODO_REWORD
)
2278 else if (is_fixup(command
)) {
2279 if (update_squash_messages(r
, command
, commit
,
2280 opts
, item
->flags
)) {
2286 msg_file
= rebase_path_squash_msg();
2287 else if (file_exists(rebase_path_fixup_msg())) {
2288 flags
|= VERBATIM_MSG
;
2289 msg_file
= rebase_path_fixup_msg();
2291 const char *dest
= git_path_squash_msg(r
);
2293 if (copy_file(dest
, rebase_path_squash_msg(), 0666)) {
2294 res
= error(_("could not rename '%s' to '%s'"),
2295 rebase_path_squash_msg(), dest
);
2298 unlink(git_path_merge_msg(r
));
2304 if (opts
->signoff
&& !is_fixup(command
))
2305 append_signoff(&msgbuf
, 0, 0);
2307 if (is_rebase_i(opts
) && write_author_script(msg
.message
) < 0)
2309 else if (!opts
->strategy
||
2310 !strcmp(opts
->strategy
, "recursive") ||
2311 !strcmp(opts
->strategy
, "ort") ||
2312 command
== TODO_REVERT
) {
2313 res
= do_recursive_merge(r
, base
, next
, base_label
, next_label
,
2314 &head
, &msgbuf
, opts
);
2318 res
|= write_message(msgbuf
.buf
, msgbuf
.len
,
2319 git_path_merge_msg(r
), 0);
2321 struct commit_list
*common
= NULL
;
2322 struct commit_list
*remotes
= NULL
;
2324 res
= write_message(msgbuf
.buf
, msgbuf
.len
,
2325 git_path_merge_msg(r
), 0);
2327 commit_list_insert(base
, &common
);
2328 commit_list_insert(next
, &remotes
);
2329 res
|= try_merge_command(r
, opts
->strategy
,
2330 opts
->xopts_nr
, (const char **)opts
->xopts
,
2331 common
, oid_to_hex(&head
), remotes
);
2332 free_commit_list(common
);
2333 free_commit_list(remotes
);
2337 * If the merge was clean or if it failed due to conflict, we write
2338 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2339 * However, if the merge did not even start, then we don't want to
2342 if ((command
== TODO_PICK
|| command
== TODO_REWORD
||
2343 command
== TODO_EDIT
) && !opts
->no_commit
&&
2344 (res
== 0 || res
== 1) &&
2345 update_ref(NULL
, "CHERRY_PICK_HEAD", &commit
->object
.oid
, NULL
,
2346 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
2348 if (command
== TODO_REVERT
&& ((opts
->no_commit
&& res
== 0) || res
== 1) &&
2349 update_ref(NULL
, "REVERT_HEAD", &commit
->object
.oid
, NULL
,
2350 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
2354 error(command
== TODO_REVERT
2355 ? _("could not revert %s... %s")
2356 : _("could not apply %s... %s"),
2357 short_commit_name(commit
), msg
.subject
);
2358 print_advice(r
, res
== 1, opts
);
2359 repo_rerere(r
, opts
->allow_rerere_auto
);
2364 allow
= allow_empty(r
, opts
, commit
);
2368 } else if (allow
== 1) {
2369 flags
|= ALLOW_EMPTY
;
2370 } else if (allow
== 2) {
2372 refs_delete_ref(get_main_ref_store(r
), "", "CHERRY_PICK_HEAD",
2374 unlink(git_path_merge_msg(r
));
2375 unlink(git_path_auto_merge(r
));
2377 _("dropping %s %s -- patch contents already upstream\n"),
2378 oid_to_hex(&commit
->object
.oid
), msg
.subject
);
2379 } /* else allow == 0 and there's nothing special to do */
2380 if (!opts
->no_commit
&& !drop_commit
) {
2381 if (author
|| command
== TODO_REVERT
|| (flags
& AMEND_MSG
))
2382 res
= do_commit(r
, msg_file
, author
, opts
, flags
,
2383 commit
? &commit
->object
.oid
: NULL
);
2385 res
= error(_("unable to parse commit author"));
2386 *check_todo
= !!(flags
& EDIT_MSG
);
2387 if (!res
&& reword
) {
2389 res
= run_git_commit(NULL
, opts
, EDIT_MSG
|
2390 VERIFY_MSG
| AMEND_MSG
|
2391 (flags
& ALLOW_EMPTY
));
2397 if (!res
&& final_fixup
) {
2398 unlink(rebase_path_fixup_msg());
2399 unlink(rebase_path_squash_msg());
2400 unlink(rebase_path_current_fixups());
2401 strbuf_reset(&opts
->current_fixups
);
2402 opts
->current_fixup_count
= 0;
2406 free_message(commit
, &msg
);
2408 strbuf_release(&msgbuf
);
2409 update_abort_safety_file();
2414 static int prepare_revs(struct replay_opts
*opts
)
2417 * picking (but not reverting) ranges (but not individual revisions)
2418 * should be done in reverse
2420 if (opts
->action
== REPLAY_PICK
&& !opts
->revs
->no_walk
)
2421 opts
->revs
->reverse
^= 1;
2423 if (prepare_revision_walk(opts
->revs
))
2424 return error(_("revision walk setup failed"));
2429 static int read_and_refresh_cache(struct repository
*r
,
2430 struct replay_opts
*opts
)
2432 struct lock_file index_lock
= LOCK_INIT
;
2433 int index_fd
= repo_hold_locked_index(r
, &index_lock
, 0);
2434 if (repo_read_index(r
) < 0) {
2435 rollback_lock_file(&index_lock
);
2436 return error(_("git %s: failed to read the index"),
2439 refresh_index(r
->index
, REFRESH_QUIET
|REFRESH_UNMERGED
, NULL
, NULL
, NULL
);
2441 if (index_fd
>= 0) {
2442 if (write_locked_index(r
->index
, &index_lock
,
2443 COMMIT_LOCK
| SKIP_IF_UNCHANGED
)) {
2444 return error(_("git %s: failed to refresh the index"),
2450 * If we are resolving merges in any way other than "ort", then
2451 * expand the sparse index.
2453 if (opts
->strategy
&& strcmp(opts
->strategy
, "ort"))
2454 ensure_full_index(r
->index
);
2458 void todo_list_release(struct todo_list
*todo_list
)
2460 strbuf_release(&todo_list
->buf
);
2461 FREE_AND_NULL(todo_list
->items
);
2462 todo_list
->nr
= todo_list
->alloc
= 0;
2465 static struct todo_item
*append_new_todo(struct todo_list
*todo_list
)
2467 ALLOC_GROW(todo_list
->items
, todo_list
->nr
+ 1, todo_list
->alloc
);
2468 todo_list
->total_nr
++;
2469 return todo_list
->items
+ todo_list
->nr
++;
2472 const char *todo_item_get_arg(struct todo_list
*todo_list
,
2473 struct todo_item
*item
)
2475 return todo_list
->buf
.buf
+ item
->arg_offset
;
2478 static int is_command(enum todo_command command
, const char **bol
)
2480 const char *str
= todo_command_info
[command
].str
;
2481 const char nick
= todo_command_info
[command
].c
;
2482 const char *p
= *bol
;
2484 return (skip_prefix(p
, str
, &p
) || (nick
&& *p
++ == nick
)) &&
2485 (*p
== ' ' || *p
== '\t' || *p
== '\n' || *p
== '\r' || !*p
) &&
2489 static int check_label_or_ref_arg(enum todo_command command
, const char *arg
)
2494 * '#' is not a valid label as the merge command uses it to
2495 * separate merge parents from the commit subject.
2497 if (!strcmp(arg
, "#") ||
2498 check_refname_format(arg
, REFNAME_ALLOW_ONELEVEL
))
2499 return error(_("'%s' is not a valid label"), arg
);
2502 case TODO_UPDATE_REF
:
2503 if (check_refname_format(arg
, REFNAME_ALLOW_ONELEVEL
))
2504 return error(_("'%s' is not a valid refname"), arg
);
2505 if (check_refname_format(arg
, 0))
2506 return error(_("update-ref requires a fully qualified "
2507 "refname e.g. refs/heads/%s"), arg
);
2511 BUG("unexpected todo_command");
2517 static int parse_insn_line(struct repository
*r
, struct todo_item
*item
,
2518 const char *buf
, const char *bol
, char *eol
)
2520 struct object_id commit_oid
;
2521 char *end_of_object_name
;
2522 int i
, saved
, status
, padding
;
2527 bol
+= strspn(bol
, " \t");
2529 if (bol
== eol
|| *bol
== '\r' || *bol
== comment_line_char
) {
2530 item
->command
= TODO_COMMENT
;
2531 item
->commit
= NULL
;
2532 item
->arg_offset
= bol
- buf
;
2533 item
->arg_len
= eol
- bol
;
2537 for (i
= 0; i
< TODO_COMMENT
; i
++)
2538 if (is_command(i
, &bol
)) {
2542 if (i
>= TODO_COMMENT
)
2543 return error(_("invalid command '%.*s'"),
2544 (int)strcspn(bol
, " \t\r\n"), bol
);
2546 /* Eat up extra spaces/ tabs before object name */
2547 padding
= strspn(bol
, " \t");
2550 if (item
->command
== TODO_NOOP
|| item
->command
== TODO_BREAK
) {
2552 return error(_("%s does not accept arguments: '%s'"),
2553 command_to_string(item
->command
), bol
);
2554 item
->commit
= NULL
;
2555 item
->arg_offset
= bol
- buf
;
2556 item
->arg_len
= eol
- bol
;
2561 return error(_("missing arguments for %s"),
2562 command_to_string(item
->command
));
2564 if (item
->command
== TODO_EXEC
|| item
->command
== TODO_LABEL
||
2565 item
->command
== TODO_RESET
|| item
->command
== TODO_UPDATE_REF
) {
2568 item
->commit
= NULL
;
2569 item
->arg_offset
= bol
- buf
;
2570 item
->arg_len
= (int)(eol
- bol
);
2571 if (item
->command
== TODO_LABEL
||
2572 item
->command
== TODO_UPDATE_REF
) {
2575 ret
= check_label_or_ref_arg(item
->command
, bol
);
2581 if (item
->command
== TODO_FIXUP
) {
2582 if (skip_prefix(bol
, "-C", &bol
)) {
2583 bol
+= strspn(bol
, " \t");
2584 item
->flags
|= TODO_REPLACE_FIXUP_MSG
;
2585 } else if (skip_prefix(bol
, "-c", &bol
)) {
2586 bol
+= strspn(bol
, " \t");
2587 item
->flags
|= TODO_EDIT_FIXUP_MSG
;
2591 if (item
->command
== TODO_MERGE
) {
2592 if (skip_prefix(bol
, "-C", &bol
))
2593 bol
+= strspn(bol
, " \t");
2594 else if (skip_prefix(bol
, "-c", &bol
)) {
2595 bol
+= strspn(bol
, " \t");
2596 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2598 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2599 item
->commit
= NULL
;
2600 item
->arg_offset
= bol
- buf
;
2601 item
->arg_len
= (int)(eol
- bol
);
2606 end_of_object_name
= (char *) bol
+ strcspn(bol
, " \t\n");
2607 saved
= *end_of_object_name
;
2608 *end_of_object_name
= '\0';
2609 status
= get_oid(bol
, &commit_oid
);
2611 error(_("could not parse '%s'"), bol
); /* return later */
2612 *end_of_object_name
= saved
;
2614 bol
= end_of_object_name
+ strspn(end_of_object_name
, " \t");
2615 item
->arg_offset
= bol
- buf
;
2616 item
->arg_len
= (int)(eol
- bol
);
2621 item
->commit
= lookup_commit_reference(r
, &commit_oid
);
2622 return item
->commit
? 0 : -1;
2625 int sequencer_get_last_command(struct repository
*r
, enum replay_action
*action
)
2627 const char *todo_file
, *bol
;
2628 struct strbuf buf
= STRBUF_INIT
;
2631 todo_file
= git_path_todo_file();
2632 if (strbuf_read_file(&buf
, todo_file
, 0) < 0) {
2633 if (errno
== ENOENT
|| errno
== ENOTDIR
)
2636 return error_errno("unable to open '%s'", todo_file
);
2638 bol
= buf
.buf
+ strspn(buf
.buf
, " \t\r\n");
2639 if (is_command(TODO_PICK
, &bol
) && (*bol
== ' ' || *bol
== '\t'))
2640 *action
= REPLAY_PICK
;
2641 else if (is_command(TODO_REVERT
, &bol
) &&
2642 (*bol
== ' ' || *bol
== '\t'))
2643 *action
= REPLAY_REVERT
;
2647 strbuf_release(&buf
);
2652 int todo_list_parse_insn_buffer(struct repository
*r
, char *buf
,
2653 struct todo_list
*todo_list
)
2655 struct todo_item
*item
;
2656 char *p
= buf
, *next_p
;
2657 int i
, res
= 0, fixup_okay
= file_exists(rebase_path_done());
2659 todo_list
->current
= todo_list
->nr
= 0;
2661 for (i
= 1; *p
; i
++, p
= next_p
) {
2662 char *eol
= strchrnul(p
, '\n');
2664 next_p
= *eol
? eol
+ 1 /* skip LF */ : eol
;
2666 if (p
!= eol
&& eol
[-1] == '\r')
2667 eol
--; /* strip Carriage Return */
2669 item
= append_new_todo(todo_list
);
2670 item
->offset_in_buf
= p
- todo_list
->buf
.buf
;
2671 if (parse_insn_line(r
, item
, buf
, p
, eol
)) {
2672 res
= error(_("invalid line %d: %.*s"),
2673 i
, (int)(eol
- p
), p
);
2674 item
->command
= TODO_COMMENT
+ 1;
2675 item
->arg_offset
= p
- buf
;
2676 item
->arg_len
= (int)(eol
- p
);
2677 item
->commit
= NULL
;
2682 else if (is_fixup(item
->command
))
2683 return error(_("cannot '%s' without a previous commit"),
2684 command_to_string(item
->command
));
2685 else if (!is_noop(item
->command
))
2692 static int count_commands(struct todo_list
*todo_list
)
2696 for (i
= 0; i
< todo_list
->nr
; i
++)
2697 if (todo_list
->items
[i
].command
!= TODO_COMMENT
)
2703 static int get_item_line_offset(struct todo_list
*todo_list
, int index
)
2705 return index
< todo_list
->nr
?
2706 todo_list
->items
[index
].offset_in_buf
: todo_list
->buf
.len
;
2709 static const char *get_item_line(struct todo_list
*todo_list
, int index
)
2711 return todo_list
->buf
.buf
+ get_item_line_offset(todo_list
, index
);
2714 static int get_item_line_length(struct todo_list
*todo_list
, int index
)
2716 return get_item_line_offset(todo_list
, index
+ 1)
2717 - get_item_line_offset(todo_list
, index
);
2720 static ssize_t
strbuf_read_file_or_whine(struct strbuf
*sb
, const char *path
)
2725 fd
= open(path
, O_RDONLY
);
2727 return error_errno(_("could not open '%s'"), path
);
2728 len
= strbuf_read(sb
, fd
, 0);
2731 return error(_("could not read '%s'."), path
);
2735 static int have_finished_the_last_pick(void)
2737 struct strbuf buf
= STRBUF_INIT
;
2739 const char *todo_path
= git_path_todo_file();
2742 if (strbuf_read_file(&buf
, todo_path
, 0) < 0) {
2743 if (errno
== ENOENT
) {
2746 error_errno("unable to open '%s'", todo_path
);
2750 /* If there is only one line then we are done */
2751 eol
= strchr(buf
.buf
, '\n');
2752 if (!eol
|| !eol
[1])
2755 strbuf_release(&buf
);
2760 void sequencer_post_commit_cleanup(struct repository
*r
, int verbose
)
2762 struct replay_opts opts
= REPLAY_OPTS_INIT
;
2763 int need_cleanup
= 0;
2765 if (refs_ref_exists(get_main_ref_store(r
), "CHERRY_PICK_HEAD")) {
2766 if (!refs_delete_ref(get_main_ref_store(r
), "",
2767 "CHERRY_PICK_HEAD", NULL
, 0) &&
2769 warning(_("cancelling a cherry picking in progress"));
2770 opts
.action
= REPLAY_PICK
;
2774 if (refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD")) {
2775 if (!refs_delete_ref(get_main_ref_store(r
), "", "REVERT_HEAD",
2778 warning(_("cancelling a revert in progress"));
2779 opts
.action
= REPLAY_REVERT
;
2783 unlink(git_path_auto_merge(r
));
2788 if (!have_finished_the_last_pick())
2791 sequencer_remove_state(&opts
);
2794 static void todo_list_write_total_nr(struct todo_list
*todo_list
)
2796 FILE *f
= fopen_or_warn(rebase_path_msgtotal(), "w");
2799 fprintf(f
, "%d\n", todo_list
->total_nr
);
2804 static int read_populate_todo(struct repository
*r
,
2805 struct todo_list
*todo_list
,
2806 struct replay_opts
*opts
)
2808 const char *todo_file
= get_todo_path(opts
);
2811 strbuf_reset(&todo_list
->buf
);
2812 if (strbuf_read_file_or_whine(&todo_list
->buf
, todo_file
) < 0)
2815 res
= todo_list_parse_insn_buffer(r
, todo_list
->buf
.buf
, todo_list
);
2817 if (is_rebase_i(opts
))
2818 return error(_("please fix this using "
2819 "'git rebase --edit-todo'."));
2820 return error(_("unusable instruction sheet: '%s'"), todo_file
);
2823 if (!todo_list
->nr
&&
2824 (!is_rebase_i(opts
) || !file_exists(rebase_path_done())))
2825 return error(_("no commits parsed."));
2827 if (!is_rebase_i(opts
)) {
2828 enum todo_command valid
=
2829 opts
->action
== REPLAY_PICK
? TODO_PICK
: TODO_REVERT
;
2832 for (i
= 0; i
< todo_list
->nr
; i
++)
2833 if (valid
== todo_list
->items
[i
].command
)
2835 else if (valid
== TODO_PICK
)
2836 return error(_("cannot cherry-pick during a revert."));
2838 return error(_("cannot revert during a cherry-pick."));
2841 if (is_rebase_i(opts
)) {
2842 struct todo_list done
= TODO_LIST_INIT
;
2844 if (strbuf_read_file(&done
.buf
, rebase_path_done(), 0) > 0 &&
2845 !todo_list_parse_insn_buffer(r
, done
.buf
.buf
, &done
))
2846 todo_list
->done_nr
= count_commands(&done
);
2848 todo_list
->done_nr
= 0;
2850 todo_list
->total_nr
= todo_list
->done_nr
2851 + count_commands(todo_list
);
2852 todo_list_release(&done
);
2854 todo_list_write_total_nr(todo_list
);
2860 static int git_config_string_dup(char **dest
,
2861 const char *var
, const char *value
)
2864 return config_error_nonbool(var
);
2866 *dest
= xstrdup(value
);
2870 static int populate_opts_cb(const char *key
, const char *value
, void *data
)
2872 struct replay_opts
*opts
= data
;
2877 else if (!strcmp(key
, "options.no-commit"))
2878 opts
->no_commit
= git_config_bool_or_int(key
, value
, &error_flag
);
2879 else if (!strcmp(key
, "options.edit"))
2880 opts
->edit
= git_config_bool_or_int(key
, value
, &error_flag
);
2881 else if (!strcmp(key
, "options.allow-empty"))
2883 git_config_bool_or_int(key
, value
, &error_flag
);
2884 else if (!strcmp(key
, "options.allow-empty-message"))
2885 opts
->allow_empty_message
=
2886 git_config_bool_or_int(key
, value
, &error_flag
);
2887 else if (!strcmp(key
, "options.keep-redundant-commits"))
2888 opts
->keep_redundant_commits
=
2889 git_config_bool_or_int(key
, value
, &error_flag
);
2890 else if (!strcmp(key
, "options.signoff"))
2891 opts
->signoff
= git_config_bool_or_int(key
, value
, &error_flag
);
2892 else if (!strcmp(key
, "options.record-origin"))
2893 opts
->record_origin
= git_config_bool_or_int(key
, value
, &error_flag
);
2894 else if (!strcmp(key
, "options.allow-ff"))
2895 opts
->allow_ff
= git_config_bool_or_int(key
, value
, &error_flag
);
2896 else if (!strcmp(key
, "options.mainline"))
2897 opts
->mainline
= git_config_int(key
, value
);
2898 else if (!strcmp(key
, "options.strategy"))
2899 git_config_string_dup(&opts
->strategy
, key
, value
);
2900 else if (!strcmp(key
, "options.gpg-sign"))
2901 git_config_string_dup(&opts
->gpg_sign
, key
, value
);
2902 else if (!strcmp(key
, "options.strategy-option")) {
2903 ALLOC_GROW(opts
->xopts
, opts
->xopts_nr
+ 1, opts
->xopts_alloc
);
2904 opts
->xopts
[opts
->xopts_nr
++] = xstrdup(value
);
2905 } else if (!strcmp(key
, "options.allow-rerere-auto"))
2906 opts
->allow_rerere_auto
=
2907 git_config_bool_or_int(key
, value
, &error_flag
) ?
2908 RERERE_AUTOUPDATE
: RERERE_NOAUTOUPDATE
;
2909 else if (!strcmp(key
, "options.default-msg-cleanup")) {
2910 opts
->explicit_cleanup
= 1;
2911 opts
->default_msg_cleanup
= get_cleanup_mode(value
, 1);
2913 return error(_("invalid key: %s"), key
);
2916 return error(_("invalid value for '%s': '%s'"), key
, value
);
2921 void parse_strategy_opts(struct replay_opts
*opts
, char *raw_opts
)
2924 char *strategy_opts_string
= raw_opts
;
2926 if (*strategy_opts_string
== ' ')
2927 strategy_opts_string
++;
2929 opts
->xopts_nr
= split_cmdline(strategy_opts_string
,
2930 (const char ***)&opts
->xopts
);
2931 for (i
= 0; i
< opts
->xopts_nr
; i
++) {
2932 const char *arg
= opts
->xopts
[i
];
2934 skip_prefix(arg
, "--", &arg
);
2935 opts
->xopts
[i
] = xstrdup(arg
);
2939 static void read_strategy_opts(struct replay_opts
*opts
, struct strbuf
*buf
)
2942 if (!read_oneliner(buf
, rebase_path_strategy(), 0))
2944 free(opts
->strategy
);
2945 opts
->strategy
= strbuf_detach(buf
, NULL
);
2946 if (!read_oneliner(buf
, rebase_path_strategy_opts(), 0))
2949 parse_strategy_opts(opts
, buf
->buf
);
2952 static int read_populate_opts(struct replay_opts
*opts
)
2954 if (is_rebase_i(opts
)) {
2955 struct strbuf buf
= STRBUF_INIT
;
2958 if (read_oneliner(&buf
, rebase_path_gpg_sign_opt(),
2959 READ_ONELINER_SKIP_IF_EMPTY
)) {
2960 if (!starts_with(buf
.buf
, "-S"))
2963 free(opts
->gpg_sign
);
2964 opts
->gpg_sign
= xstrdup(buf
.buf
+ 2);
2969 if (read_oneliner(&buf
, rebase_path_allow_rerere_autoupdate(),
2970 READ_ONELINER_SKIP_IF_EMPTY
)) {
2971 if (!strcmp(buf
.buf
, "--rerere-autoupdate"))
2972 opts
->allow_rerere_auto
= RERERE_AUTOUPDATE
;
2973 else if (!strcmp(buf
.buf
, "--no-rerere-autoupdate"))
2974 opts
->allow_rerere_auto
= RERERE_NOAUTOUPDATE
;
2978 if (file_exists(rebase_path_verbose()))
2981 if (file_exists(rebase_path_quiet()))
2984 if (file_exists(rebase_path_signoff())) {
2989 if (file_exists(rebase_path_cdate_is_adate())) {
2991 opts
->committer_date_is_author_date
= 1;
2994 if (file_exists(rebase_path_ignore_date())) {
2996 opts
->ignore_date
= 1;
2999 if (file_exists(rebase_path_reschedule_failed_exec()))
3000 opts
->reschedule_failed_exec
= 1;
3001 else if (file_exists(rebase_path_no_reschedule_failed_exec()))
3002 opts
->reschedule_failed_exec
= 0;
3004 if (file_exists(rebase_path_drop_redundant_commits()))
3005 opts
->drop_redundant_commits
= 1;
3007 if (file_exists(rebase_path_keep_redundant_commits()))
3008 opts
->keep_redundant_commits
= 1;
3010 read_strategy_opts(opts
, &buf
);
3013 if (read_oneliner(&opts
->current_fixups
,
3014 rebase_path_current_fixups(),
3015 READ_ONELINER_SKIP_IF_EMPTY
)) {
3016 const char *p
= opts
->current_fixups
.buf
;
3017 opts
->current_fixup_count
= 1;
3018 while ((p
= strchr(p
, '\n'))) {
3019 opts
->current_fixup_count
++;
3024 if (read_oneliner(&buf
, rebase_path_squash_onto(), 0)) {
3025 if (get_oid_committish(buf
.buf
, &opts
->squash_onto
) < 0) {
3026 ret
= error(_("unusable squash-onto"));
3029 opts
->have_squash_onto
= 1;
3033 strbuf_release(&buf
);
3037 if (!file_exists(git_path_opts_file()))
3040 * The function git_parse_source(), called from git_config_from_file(),
3041 * may die() in case of a syntactically incorrect file. We do not care
3042 * about this case, though, because we wrote that file ourselves, so we
3043 * are pretty certain that it is syntactically correct.
3045 if (git_config_from_file(populate_opts_cb
, git_path_opts_file(), opts
) < 0)
3046 return error(_("malformed options sheet: '%s'"),
3047 git_path_opts_file());
3051 static void write_strategy_opts(struct replay_opts
*opts
)
3054 struct strbuf buf
= STRBUF_INIT
;
3056 for (i
= 0; i
< opts
->xopts_nr
; ++i
)
3057 strbuf_addf(&buf
, " --%s", opts
->xopts
[i
]);
3059 write_file(rebase_path_strategy_opts(), "%s\n", buf
.buf
);
3060 strbuf_release(&buf
);
3063 int write_basic_state(struct replay_opts
*opts
, const char *head_name
,
3064 struct commit
*onto
, const struct object_id
*orig_head
)
3067 write_file(rebase_path_head_name(), "%s\n", head_name
);
3069 write_file(rebase_path_onto(), "%s\n",
3070 oid_to_hex(&onto
->object
.oid
));
3072 write_file(rebase_path_orig_head(), "%s\n",
3073 oid_to_hex(orig_head
));
3076 write_file(rebase_path_quiet(), "%s", "");
3078 write_file(rebase_path_verbose(), "%s", "");
3080 write_file(rebase_path_strategy(), "%s\n", opts
->strategy
);
3081 if (opts
->xopts_nr
> 0)
3082 write_strategy_opts(opts
);
3084 if (opts
->allow_rerere_auto
== RERERE_AUTOUPDATE
)
3085 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
3086 else if (opts
->allow_rerere_auto
== RERERE_NOAUTOUPDATE
)
3087 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
3090 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts
->gpg_sign
);
3092 write_file(rebase_path_signoff(), "--signoff\n");
3093 if (opts
->drop_redundant_commits
)
3094 write_file(rebase_path_drop_redundant_commits(), "%s", "");
3095 if (opts
->keep_redundant_commits
)
3096 write_file(rebase_path_keep_redundant_commits(), "%s", "");
3097 if (opts
->committer_date_is_author_date
)
3098 write_file(rebase_path_cdate_is_adate(), "%s", "");
3099 if (opts
->ignore_date
)
3100 write_file(rebase_path_ignore_date(), "%s", "");
3101 if (opts
->reschedule_failed_exec
)
3102 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
3104 write_file(rebase_path_no_reschedule_failed_exec(), "%s", "");
3109 static int walk_revs_populate_todo(struct todo_list
*todo_list
,
3110 struct replay_opts
*opts
)
3112 enum todo_command command
= opts
->action
== REPLAY_PICK
?
3113 TODO_PICK
: TODO_REVERT
;
3114 const char *command_string
= todo_command_info
[command
].str
;
3115 const char *encoding
;
3116 struct commit
*commit
;
3118 if (prepare_revs(opts
))
3121 encoding
= get_log_output_encoding();
3123 while ((commit
= get_revision(opts
->revs
))) {
3124 struct todo_item
*item
= append_new_todo(todo_list
);
3125 const char *commit_buffer
= logmsg_reencode(commit
, NULL
, encoding
);
3126 const char *subject
;
3129 item
->command
= command
;
3130 item
->commit
= commit
;
3131 item
->arg_offset
= 0;
3133 item
->offset_in_buf
= todo_list
->buf
.len
;
3134 subject_len
= find_commit_subject(commit_buffer
, &subject
);
3135 strbuf_addf(&todo_list
->buf
, "%s %s %.*s\n", command_string
,
3136 short_commit_name(commit
), subject_len
, subject
);
3137 unuse_commit_buffer(commit
, commit_buffer
);
3141 return error(_("empty commit set passed"));
3146 static int create_seq_dir(struct repository
*r
)
3148 enum replay_action action
;
3149 const char *in_progress_error
= NULL
;
3150 const char *in_progress_advice
= NULL
;
3151 unsigned int advise_skip
=
3152 refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD") ||
3153 refs_ref_exists(get_main_ref_store(r
), "CHERRY_PICK_HEAD");
3155 if (!sequencer_get_last_command(r
, &action
)) {
3158 in_progress_error
= _("revert is already in progress");
3159 in_progress_advice
=
3160 _("try \"git revert (--continue | %s--abort | --quit)\"");
3163 in_progress_error
= _("cherry-pick is already in progress");
3164 in_progress_advice
=
3165 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
3168 BUG("unexpected action in create_seq_dir");
3171 if (in_progress_error
) {
3172 error("%s", in_progress_error
);
3173 if (advice_enabled(ADVICE_SEQUENCER_IN_USE
))
3174 advise(in_progress_advice
,
3175 advise_skip
? "--skip | " : "");
3178 if (mkdir(git_path_seq_dir(), 0777) < 0)
3179 return error_errno(_("could not create sequencer directory '%s'"),
3180 git_path_seq_dir());
3185 static int save_head(const char *head
)
3187 struct lock_file head_lock
= LOCK_INIT
;
3188 struct strbuf buf
= STRBUF_INIT
;
3192 fd
= hold_lock_file_for_update(&head_lock
, git_path_head_file(), 0);
3194 return error_errno(_("could not lock HEAD"));
3195 strbuf_addf(&buf
, "%s\n", head
);
3196 written
= write_in_full(fd
, buf
.buf
, buf
.len
);
3197 strbuf_release(&buf
);
3199 error_errno(_("could not write to '%s'"), git_path_head_file());
3200 rollback_lock_file(&head_lock
);
3203 if (commit_lock_file(&head_lock
) < 0)
3204 return error(_("failed to finalize '%s'"), git_path_head_file());
3208 static int rollback_is_safe(void)
3210 struct strbuf sb
= STRBUF_INIT
;
3211 struct object_id expected_head
, actual_head
;
3213 if (strbuf_read_file(&sb
, git_path_abort_safety_file(), 0) >= 0) {
3215 if (get_oid_hex(sb
.buf
, &expected_head
)) {
3216 strbuf_release(&sb
);
3217 die(_("could not parse %s"), git_path_abort_safety_file());
3219 strbuf_release(&sb
);
3221 else if (errno
== ENOENT
)
3222 oidclr(&expected_head
);
3224 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
3226 if (get_oid("HEAD", &actual_head
))
3227 oidclr(&actual_head
);
3229 return oideq(&actual_head
, &expected_head
);
3232 static int reset_merge(const struct object_id
*oid
)
3234 struct child_process cmd
= CHILD_PROCESS_INIT
;
3237 strvec_pushl(&cmd
.args
, "reset", "--merge", NULL
);
3239 if (!is_null_oid(oid
))
3240 strvec_push(&cmd
.args
, oid_to_hex(oid
));
3242 return run_command(&cmd
);
3245 static int rollback_single_pick(struct repository
*r
)
3247 struct object_id head_oid
;
3249 if (!refs_ref_exists(get_main_ref_store(r
), "CHERRY_PICK_HEAD") &&
3250 !refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD"))
3251 return error(_("no cherry-pick or revert in progress"));
3252 if (read_ref_full("HEAD", 0, &head_oid
, NULL
))
3253 return error(_("cannot resolve HEAD"));
3254 if (is_null_oid(&head_oid
))
3255 return error(_("cannot abort from a branch yet to be born"));
3256 return reset_merge(&head_oid
);
3259 static int skip_single_pick(void)
3261 struct object_id head
;
3263 if (read_ref_full("HEAD", 0, &head
, NULL
))
3264 return error(_("cannot resolve HEAD"));
3265 return reset_merge(&head
);
3268 int sequencer_rollback(struct repository
*r
, struct replay_opts
*opts
)
3271 struct object_id oid
;
3272 struct strbuf buf
= STRBUF_INIT
;
3275 f
= fopen(git_path_head_file(), "r");
3276 if (!f
&& errno
== ENOENT
) {
3278 * There is no multiple-cherry-pick in progress.
3279 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
3280 * a single-cherry-pick in progress, abort that.
3282 return rollback_single_pick(r
);
3285 return error_errno(_("cannot open '%s'"), git_path_head_file());
3286 if (strbuf_getline_lf(&buf
, f
)) {
3287 error(_("cannot read '%s': %s"), git_path_head_file(),
3288 ferror(f
) ? strerror(errno
) : _("unexpected end of file"));
3293 if (parse_oid_hex(buf
.buf
, &oid
, &p
) || *p
!= '\0') {
3294 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
3295 git_path_head_file());
3298 if (is_null_oid(&oid
)) {
3299 error(_("cannot abort from a branch yet to be born"));
3303 if (!rollback_is_safe()) {
3304 /* Do not error, just do not rollback */
3305 warning(_("You seem to have moved HEAD. "
3306 "Not rewinding, check your HEAD!"));
3308 if (reset_merge(&oid
))
3310 strbuf_release(&buf
);
3311 return sequencer_remove_state(opts
);
3313 strbuf_release(&buf
);
3317 int sequencer_skip(struct repository
*r
, struct replay_opts
*opts
)
3319 enum replay_action action
= -1;
3320 sequencer_get_last_command(r
, &action
);
3323 * Check whether the subcommand requested to skip the commit is actually
3324 * in progress and that it's safe to skip the commit.
3326 * opts->action tells us which subcommand requested to skip the commit.
3327 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
3328 * action is in progress and we can skip the commit.
3330 * Otherwise we check that the last instruction was related to the
3331 * particular subcommand we're trying to execute and barf if that's not
3334 * Finally we check that the rollback is "safe", i.e., has the HEAD
3335 * moved? In this case, it doesn't make sense to "reset the merge" and
3336 * "skip the commit" as the user already handled this by committing. But
3337 * we'd not want to barf here, instead give advice on how to proceed. We
3338 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
3339 * it gets removed when the user commits, so if it still exists we're
3340 * sure the user can't have committed before.
3342 switch (opts
->action
) {
3344 if (!refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD")) {
3345 if (action
!= REPLAY_REVERT
)
3346 return error(_("no revert in progress"));
3347 if (!rollback_is_safe())
3352 if (!refs_ref_exists(get_main_ref_store(r
),
3353 "CHERRY_PICK_HEAD")) {
3354 if (action
!= REPLAY_PICK
)
3355 return error(_("no cherry-pick in progress"));
3356 if (!rollback_is_safe())
3361 BUG("unexpected action in sequencer_skip");
3364 if (skip_single_pick())
3365 return error(_("failed to skip the commit"));
3366 if (!is_directory(git_path_seq_dir()))
3369 return sequencer_continue(r
, opts
);
3372 error(_("there is nothing to skip"));
3374 if (advice_enabled(ADVICE_RESOLVE_CONFLICT
)) {
3375 advise(_("have you committed already?\n"
3376 "try \"git %s --continue\""),
3377 action
== REPLAY_REVERT
? "revert" : "cherry-pick");
3382 static int save_todo(struct todo_list
*todo_list
, struct replay_opts
*opts
)
3384 struct lock_file todo_lock
= LOCK_INIT
;
3385 const char *todo_path
= get_todo_path(opts
);
3386 int next
= todo_list
->current
, offset
, fd
;
3389 * rebase -i writes "git-rebase-todo" without the currently executing
3390 * command, appending it to "done" instead.
3392 if (is_rebase_i(opts
))
3395 fd
= hold_lock_file_for_update(&todo_lock
, todo_path
, 0);
3397 return error_errno(_("could not lock '%s'"), todo_path
);
3398 offset
= get_item_line_offset(todo_list
, next
);
3399 if (write_in_full(fd
, todo_list
->buf
.buf
+ offset
,
3400 todo_list
->buf
.len
- offset
) < 0)
3401 return error_errno(_("could not write to '%s'"), todo_path
);
3402 if (commit_lock_file(&todo_lock
) < 0)
3403 return error(_("failed to finalize '%s'"), todo_path
);
3405 if (is_rebase_i(opts
) && next
> 0) {
3406 const char *done
= rebase_path_done();
3407 int fd
= open(done
, O_CREAT
| O_WRONLY
| O_APPEND
, 0666);
3412 if (write_in_full(fd
, get_item_line(todo_list
, next
- 1),
3413 get_item_line_length(todo_list
, next
- 1))
3415 ret
= error_errno(_("could not write to '%s'"), done
);
3417 ret
= error_errno(_("failed to finalize '%s'"), done
);
3423 static int save_opts(struct replay_opts
*opts
)
3425 const char *opts_file
= git_path_opts_file();
3428 if (opts
->no_commit
)
3429 res
|= git_config_set_in_file_gently(opts_file
,
3430 "options.no-commit", "true");
3431 if (opts
->edit
>= 0)
3432 res
|= git_config_set_in_file_gently(opts_file
, "options.edit",
3433 opts
->edit
? "true" : "false");
3434 if (opts
->allow_empty
)
3435 res
|= git_config_set_in_file_gently(opts_file
,
3436 "options.allow-empty", "true");
3437 if (opts
->allow_empty_message
)
3438 res
|= git_config_set_in_file_gently(opts_file
,
3439 "options.allow-empty-message", "true");
3440 if (opts
->keep_redundant_commits
)
3441 res
|= git_config_set_in_file_gently(opts_file
,
3442 "options.keep-redundant-commits", "true");
3444 res
|= git_config_set_in_file_gently(opts_file
,
3445 "options.signoff", "true");
3446 if (opts
->record_origin
)
3447 res
|= git_config_set_in_file_gently(opts_file
,
3448 "options.record-origin", "true");
3450 res
|= git_config_set_in_file_gently(opts_file
,
3451 "options.allow-ff", "true");
3452 if (opts
->mainline
) {
3453 struct strbuf buf
= STRBUF_INIT
;
3454 strbuf_addf(&buf
, "%d", opts
->mainline
);
3455 res
|= git_config_set_in_file_gently(opts_file
,
3456 "options.mainline", buf
.buf
);
3457 strbuf_release(&buf
);
3460 res
|= git_config_set_in_file_gently(opts_file
,
3461 "options.strategy", opts
->strategy
);
3463 res
|= git_config_set_in_file_gently(opts_file
,
3464 "options.gpg-sign", opts
->gpg_sign
);
3467 for (i
= 0; i
< opts
->xopts_nr
; i
++)
3468 res
|= git_config_set_multivar_in_file_gently(opts_file
,
3469 "options.strategy-option",
3470 opts
->xopts
[i
], "^$", 0);
3472 if (opts
->allow_rerere_auto
)
3473 res
|= git_config_set_in_file_gently(opts_file
,
3474 "options.allow-rerere-auto",
3475 opts
->allow_rerere_auto
== RERERE_AUTOUPDATE
?
3478 if (opts
->explicit_cleanup
)
3479 res
|= git_config_set_in_file_gently(opts_file
,
3480 "options.default-msg-cleanup",
3481 describe_cleanup_mode(opts
->default_msg_cleanup
));
3485 static int make_patch(struct repository
*r
,
3486 struct commit
*commit
,
3487 struct replay_opts
*opts
)
3489 struct strbuf buf
= STRBUF_INIT
;
3490 struct rev_info log_tree_opt
;
3491 const char *subject
;
3492 char hex
[GIT_MAX_HEXSZ
+ 1];
3495 oid_to_hex_r(hex
, &commit
->object
.oid
);
3496 if (write_message(hex
, strlen(hex
), rebase_path_stopped_sha(), 1) < 0)
3498 res
|= write_rebase_head(&commit
->object
.oid
);
3500 strbuf_addf(&buf
, "%s/patch", get_dir(opts
));
3501 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
3502 repo_init_revisions(r
, &log_tree_opt
, NULL
);
3503 log_tree_opt
.abbrev
= 0;
3504 log_tree_opt
.diff
= 1;
3505 log_tree_opt
.diffopt
.output_format
= DIFF_FORMAT_PATCH
;
3506 log_tree_opt
.disable_stdin
= 1;
3507 log_tree_opt
.no_commit_id
= 1;
3508 log_tree_opt
.diffopt
.file
= fopen(buf
.buf
, "w");
3509 log_tree_opt
.diffopt
.use_color
= GIT_COLOR_NEVER
;
3510 if (!log_tree_opt
.diffopt
.file
)
3511 res
|= error_errno(_("could not open '%s'"), buf
.buf
);
3513 res
|= log_tree_commit(&log_tree_opt
, commit
);
3514 fclose(log_tree_opt
.diffopt
.file
);
3518 strbuf_addf(&buf
, "%s/message", get_dir(opts
));
3519 if (!file_exists(buf
.buf
)) {
3520 const char *encoding
= get_commit_output_encoding();
3521 const char *commit_buffer
= logmsg_reencode(commit
, NULL
, encoding
);
3522 find_commit_subject(commit_buffer
, &subject
);
3523 res
|= write_message(subject
, strlen(subject
), buf
.buf
, 1);
3524 unuse_commit_buffer(commit
, commit_buffer
);
3526 strbuf_release(&buf
);
3527 release_revisions(&log_tree_opt
);
3532 static int intend_to_amend(void)
3534 struct object_id head
;
3537 if (get_oid("HEAD", &head
))
3538 return error(_("cannot read HEAD"));
3540 p
= oid_to_hex(&head
);
3541 return write_message(p
, strlen(p
), rebase_path_amend(), 1);
3544 static int error_with_patch(struct repository
*r
,
3545 struct commit
*commit
,
3546 const char *subject
, int subject_len
,
3547 struct replay_opts
*opts
,
3548 int exit_code
, int to_amend
)
3551 if (make_patch(r
, commit
, opts
))
3553 } else if (copy_file(rebase_path_message(),
3554 git_path_merge_msg(r
), 0666))
3555 return error(_("unable to copy '%s' to '%s'"),
3556 git_path_merge_msg(r
), rebase_path_message());
3559 if (intend_to_amend())
3563 _("You can amend the commit now, with\n"
3565 " git commit --amend %s\n"
3567 "Once you are satisfied with your changes, run\n"
3569 " git rebase --continue\n"),
3570 gpg_sign_opt_quoted(opts
));
3571 } else if (exit_code
) {
3573 fprintf_ln(stderr
, _("Could not apply %s... %.*s"),
3574 short_commit_name(commit
), subject_len
, subject
);
3577 * We don't have the hash of the parent so
3578 * just print the line from the todo file.
3580 fprintf_ln(stderr
, _("Could not merge %.*s"),
3581 subject_len
, subject
);
3587 static int error_failed_squash(struct repository
*r
,
3588 struct commit
*commit
,
3589 struct replay_opts
*opts
,
3591 const char *subject
)
3593 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3594 return error(_("could not copy '%s' to '%s'"),
3595 rebase_path_squash_msg(), rebase_path_message());
3596 unlink(git_path_merge_msg(r
));
3597 if (copy_file(git_path_merge_msg(r
), rebase_path_message(), 0666))
3598 return error(_("could not copy '%s' to '%s'"),
3599 rebase_path_message(),
3600 git_path_merge_msg(r
));
3601 return error_with_patch(r
, commit
, subject
, subject_len
, opts
, 1, 0);
3604 static int do_exec(struct repository
*r
, const char *command_line
)
3606 struct child_process cmd
= CHILD_PROCESS_INIT
;
3609 fprintf(stderr
, _("Executing: %s\n"), command_line
);
3611 strvec_push(&cmd
.args
, command_line
);
3612 status
= run_command(&cmd
);
3614 /* force re-reading of the cache */
3615 discard_index(r
->index
);
3616 if (repo_read_index(r
) < 0)
3617 return error(_("could not read index"));
3619 dirty
= require_clean_work_tree(r
, "rebase", NULL
, 1, 1);
3622 warning(_("execution failed: %s\n%s"
3623 "You can fix the problem, and then run\n"
3625 " git rebase --continue\n"
3628 dirty
? N_("and made changes to the index and/or the "
3629 "working tree\n") : "");
3631 /* command not found */
3634 warning(_("execution succeeded: %s\nbut "
3635 "left changes to the index and/or the working tree\n"
3636 "Commit or stash your changes, and then run\n"
3638 " git rebase --continue\n"
3639 "\n"), command_line
);
3646 __attribute__((format (printf
, 2, 3)))
3647 static int safe_append(const char *filename
, const char *fmt
, ...)
3650 struct lock_file lock
= LOCK_INIT
;
3651 int fd
= hold_lock_file_for_update(&lock
, filename
,
3652 LOCK_REPORT_ON_ERROR
);
3653 struct strbuf buf
= STRBUF_INIT
;
3658 if (strbuf_read_file(&buf
, filename
, 0) < 0 && errno
!= ENOENT
) {
3659 error_errno(_("could not read '%s'"), filename
);
3660 rollback_lock_file(&lock
);
3663 strbuf_complete(&buf
, '\n');
3665 strbuf_vaddf(&buf
, fmt
, ap
);
3668 if (write_in_full(fd
, buf
.buf
, buf
.len
) < 0) {
3669 error_errno(_("could not write to '%s'"), filename
);
3670 strbuf_release(&buf
);
3671 rollback_lock_file(&lock
);
3674 if (commit_lock_file(&lock
) < 0) {
3675 strbuf_release(&buf
);
3676 rollback_lock_file(&lock
);
3677 return error(_("failed to finalize '%s'"), filename
);
3680 strbuf_release(&buf
);
3684 static int do_label(struct repository
*r
, const char *name
, int len
)
3686 struct ref_store
*refs
= get_main_ref_store(r
);
3687 struct ref_transaction
*transaction
;
3688 struct strbuf ref_name
= STRBUF_INIT
, err
= STRBUF_INIT
;
3689 struct strbuf msg
= STRBUF_INIT
;
3691 struct object_id head_oid
;
3693 if (len
== 1 && *name
== '#')
3694 return error(_("illegal label name: '%.*s'"), len
, name
);
3696 strbuf_addf(&ref_name
, "refs/rewritten/%.*s", len
, name
);
3697 strbuf_addf(&msg
, "rebase (label) '%.*s'", len
, name
);
3699 transaction
= ref_store_transaction_begin(refs
, &err
);
3701 error("%s", err
.buf
);
3703 } else if (get_oid("HEAD", &head_oid
)) {
3704 error(_("could not read HEAD"));
3706 } else if (ref_transaction_update(transaction
, ref_name
.buf
, &head_oid
,
3707 NULL
, 0, msg
.buf
, &err
) < 0 ||
3708 ref_transaction_commit(transaction
, &err
)) {
3709 error("%s", err
.buf
);
3712 ref_transaction_free(transaction
);
3713 strbuf_release(&err
);
3714 strbuf_release(&msg
);
3717 ret
= safe_append(rebase_path_refs_to_delete(),
3718 "%s\n", ref_name
.buf
);
3719 strbuf_release(&ref_name
);
3724 static const char *sequencer_reflog_action(struct replay_opts
*opts
)
3726 if (!opts
->reflog_action
) {
3727 opts
->reflog_action
= getenv(GIT_REFLOG_ACTION
);
3728 opts
->reflog_action
=
3729 xstrdup(opts
->reflog_action
? opts
->reflog_action
3730 : action_name(opts
));
3733 return opts
->reflog_action
;
3736 __attribute__((format (printf
, 3, 4)))
3737 static const char *reflog_message(struct replay_opts
*opts
,
3738 const char *sub_action
, const char *fmt
, ...)
3741 static struct strbuf buf
= STRBUF_INIT
;
3745 strbuf_addstr(&buf
, sequencer_reflog_action(opts
));
3747 strbuf_addf(&buf
, " (%s)", sub_action
);
3749 strbuf_addstr(&buf
, ": ");
3750 strbuf_vaddf(&buf
, fmt
, ap
);
3757 static struct commit
*lookup_label(struct repository
*r
, const char *label
,
3758 int len
, struct strbuf
*buf
)
3760 struct commit
*commit
;
3761 struct object_id oid
;
3764 strbuf_addf(buf
, "refs/rewritten/%.*s", len
, label
);
3765 if (!read_ref(buf
->buf
, &oid
)) {
3766 commit
= lookup_commit_object(r
, &oid
);
3768 /* fall back to non-rewritten ref or commit */
3769 strbuf_splice(buf
, 0, strlen("refs/rewritten/"), "", 0);
3770 commit
= lookup_commit_reference_by_name(buf
->buf
);
3774 error(_("could not resolve '%s'"), buf
->buf
);
3779 static int do_reset(struct repository
*r
,
3780 const char *name
, int len
,
3781 struct replay_opts
*opts
)
3783 struct strbuf ref_name
= STRBUF_INIT
;
3784 struct object_id oid
;
3785 struct lock_file lock
= LOCK_INIT
;
3786 struct tree_desc desc
= { 0 };
3788 struct unpack_trees_options unpack_tree_opts
= { 0 };
3791 if (repo_hold_locked_index(r
, &lock
, LOCK_REPORT_ON_ERROR
) < 0)
3794 if (len
== 10 && !strncmp("[new root]", name
, len
)) {
3795 if (!opts
->have_squash_onto
) {
3797 if (commit_tree("", 0, the_hash_algo
->empty_tree
,
3798 NULL
, &opts
->squash_onto
,
3800 return error(_("writing fake root commit"));
3801 opts
->have_squash_onto
= 1;
3802 hex
= oid_to_hex(&opts
->squash_onto
);
3803 if (write_message(hex
, strlen(hex
),
3804 rebase_path_squash_onto(), 0))
3805 return error(_("writing squash-onto"));
3807 oidcpy(&oid
, &opts
->squash_onto
);
3810 struct commit
*commit
;
3812 /* Determine the length of the label */
3813 for (i
= 0; i
< len
; i
++)
3814 if (isspace(name
[i
]))
3818 commit
= lookup_label(r
, name
, len
, &ref_name
);
3823 oid
= commit
->object
.oid
;
3826 setup_unpack_trees_porcelain(&unpack_tree_opts
, "reset");
3827 unpack_tree_opts
.head_idx
= 1;
3828 unpack_tree_opts
.src_index
= r
->index
;
3829 unpack_tree_opts
.dst_index
= r
->index
;
3830 unpack_tree_opts
.fn
= oneway_merge
;
3831 unpack_tree_opts
.merge
= 1;
3832 unpack_tree_opts
.update
= 1;
3833 unpack_tree_opts
.preserve_ignored
= 0; /* FIXME: !overwrite_ignore */
3834 unpack_tree_opts
.skip_cache_tree_update
= 1;
3835 init_checkout_metadata(&unpack_tree_opts
.meta
, name
, &oid
, NULL
);
3837 if (repo_read_index_unmerged(r
)) {
3838 ret
= error_resolve_conflict(action_name(opts
));
3842 if (!fill_tree_descriptor(r
, &desc
, &oid
)) {
3843 ret
= error(_("failed to find tree of %s"), oid_to_hex(&oid
));
3847 if (unpack_trees(1, &desc
, &unpack_tree_opts
)) {
3852 tree
= parse_tree_indirect(&oid
);
3853 prime_cache_tree(r
, r
->index
, tree
);
3855 if (write_locked_index(r
->index
, &lock
, COMMIT_LOCK
) < 0)
3856 ret
= error(_("could not write index"));
3859 ret
= update_ref(reflog_message(opts
, "reset", "'%.*s'",
3860 len
, name
), "HEAD", &oid
,
3861 NULL
, 0, UPDATE_REFS_MSG_ON_ERR
);
3863 free((void *)desc
.buffer
);
3865 rollback_lock_file(&lock
);
3866 strbuf_release(&ref_name
);
3867 clear_unpack_trees_porcelain(&unpack_tree_opts
);
3871 static int do_merge(struct repository
*r
,
3872 struct commit
*commit
,
3873 const char *arg
, int arg_len
,
3874 int flags
, int *check_todo
, struct replay_opts
*opts
)
3876 int run_commit_flags
= 0;
3877 struct strbuf ref_name
= STRBUF_INIT
;
3878 struct commit
*head_commit
, *merge_commit
, *i
;
3879 struct commit_list
*bases
, *j
;
3880 struct commit_list
*to_merge
= NULL
, **tail
= &to_merge
;
3881 const char *strategy
= !opts
->xopts_nr
&&
3883 !strcmp(opts
->strategy
, "recursive") ||
3884 !strcmp(opts
->strategy
, "ort")) ?
3885 NULL
: opts
->strategy
;
3886 struct merge_options o
;
3887 int merge_arg_len
, oneline_offset
, can_fast_forward
, ret
, k
;
3888 static struct lock_file lock
;
3891 if (repo_hold_locked_index(r
, &lock
, LOCK_REPORT_ON_ERROR
) < 0) {
3896 head_commit
= lookup_commit_reference_by_name("HEAD");
3898 ret
= error(_("cannot merge without a current revision"));
3903 * For octopus merges, the arg starts with the list of revisions to be
3904 * merged. The list is optionally followed by '#' and the oneline.
3906 merge_arg_len
= oneline_offset
= arg_len
;
3907 for (p
= arg
; p
- arg
< arg_len
; p
+= strspn(p
, " \t\n")) {
3910 if (*p
== '#' && (!p
[1] || isspace(p
[1]))) {
3911 p
+= 1 + strspn(p
+ 1, " \t\n");
3912 oneline_offset
= p
- arg
;
3915 k
= strcspn(p
, " \t\n");
3918 merge_commit
= lookup_label(r
, p
, k
, &ref_name
);
3919 if (!merge_commit
) {
3920 ret
= error(_("unable to parse '%.*s'"), k
, p
);
3923 tail
= &commit_list_insert(merge_commit
, tail
)->next
;
3925 merge_arg_len
= p
- arg
;
3929 ret
= error(_("nothing to merge: '%.*s'"), arg_len
, arg
);
3933 if (opts
->have_squash_onto
&&
3934 oideq(&head_commit
->object
.oid
, &opts
->squash_onto
)) {
3936 * When the user tells us to "merge" something into a
3937 * "[new root]", let's simply fast-forward to the merge head.
3939 rollback_lock_file(&lock
);
3941 ret
= error(_("octopus merge cannot be executed on "
3942 "top of a [new root]"));
3944 ret
= fast_forward_to(r
, &to_merge
->item
->object
.oid
,
3945 &head_commit
->object
.oid
, 0,
3951 * If HEAD is not identical to the first parent of the original merge
3952 * commit, we cannot fast-forward.
3954 can_fast_forward
= opts
->allow_ff
&& commit
&& commit
->parents
&&
3955 oideq(&commit
->parents
->item
->object
.oid
,
3956 &head_commit
->object
.oid
);
3959 * If any merge head is different from the original one, we cannot
3962 if (can_fast_forward
) {
3963 struct commit_list
*p
= commit
->parents
->next
;
3965 for (j
= to_merge
; j
&& p
; j
= j
->next
, p
= p
->next
)
3966 if (!oideq(&j
->item
->object
.oid
,
3967 &p
->item
->object
.oid
)) {
3968 can_fast_forward
= 0;
3972 * If the number of merge heads differs from the original merge
3973 * commit, we cannot fast-forward.
3976 can_fast_forward
= 0;
3979 if (can_fast_forward
) {
3980 rollback_lock_file(&lock
);
3981 ret
= fast_forward_to(r
, &commit
->object
.oid
,
3982 &head_commit
->object
.oid
, 0, opts
);
3983 if (flags
& TODO_EDIT_MERGE_MSG
)
3984 goto fast_forward_edit
;
3990 const char *encoding
= get_commit_output_encoding();
3991 const char *message
= logmsg_reencode(commit
, NULL
, encoding
);
3996 ret
= error(_("could not get commit message of '%s'"),
3997 oid_to_hex(&commit
->object
.oid
));
4000 write_author_script(message
);
4001 find_commit_subject(message
, &body
);
4003 ret
= write_message(body
, len
, git_path_merge_msg(r
), 0);
4004 unuse_commit_buffer(commit
, message
);
4006 error_errno(_("could not write '%s'"),
4007 git_path_merge_msg(r
));
4011 struct strbuf buf
= STRBUF_INIT
;
4014 strbuf_addf(&buf
, "author %s", git_author_info(0));
4015 write_author_script(buf
.buf
);
4018 if (oneline_offset
< arg_len
) {
4019 p
= arg
+ oneline_offset
;
4020 len
= arg_len
- oneline_offset
;
4022 strbuf_addf(&buf
, "Merge %s '%.*s'",
4023 to_merge
->next
? "branches" : "branch",
4024 merge_arg_len
, arg
);
4029 ret
= write_message(p
, len
, git_path_merge_msg(r
), 0);
4030 strbuf_release(&buf
);
4032 error_errno(_("could not write '%s'"),
4033 git_path_merge_msg(r
));
4038 if (strategy
|| to_merge
->next
) {
4040 struct child_process cmd
= CHILD_PROCESS_INIT
;
4042 if (read_env_script(&cmd
.env
)) {
4043 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
4045 ret
= error(_(staged_changes_advice
), gpg_opt
, gpg_opt
);
4049 if (opts
->committer_date_is_author_date
)
4050 strvec_pushf(&cmd
.env
, "GIT_COMMITTER_DATE=%s",
4053 author_date_from_env(&cmd
.env
));
4054 if (opts
->ignore_date
)
4055 strvec_push(&cmd
.env
, "GIT_AUTHOR_DATE=");
4058 strvec_push(&cmd
.args
, "merge");
4059 strvec_push(&cmd
.args
, "-s");
4061 strvec_push(&cmd
.args
, "octopus");
4063 strvec_push(&cmd
.args
, strategy
);
4064 for (k
= 0; k
< opts
->xopts_nr
; k
++)
4065 strvec_pushf(&cmd
.args
,
4066 "-X%s", opts
->xopts
[k
]);
4068 if (!(flags
& TODO_EDIT_MERGE_MSG
))
4069 strvec_push(&cmd
.args
, "--no-edit");
4071 strvec_push(&cmd
.args
, "--edit");
4072 strvec_push(&cmd
.args
, "--no-ff");
4073 strvec_push(&cmd
.args
, "--no-log");
4074 strvec_push(&cmd
.args
, "--no-stat");
4075 strvec_push(&cmd
.args
, "-F");
4076 strvec_push(&cmd
.args
, git_path_merge_msg(r
));
4078 strvec_pushf(&cmd
.args
, "-S%s", opts
->gpg_sign
);
4080 strvec_push(&cmd
.args
, "--no-gpg-sign");
4082 /* Add the tips to be merged */
4083 for (j
= to_merge
; j
; j
= j
->next
)
4084 strvec_push(&cmd
.args
,
4085 oid_to_hex(&j
->item
->object
.oid
));
4087 strbuf_release(&ref_name
);
4088 refs_delete_ref(get_main_ref_store(r
), "", "CHERRY_PICK_HEAD",
4090 rollback_lock_file(&lock
);
4092 ret
= run_command(&cmd
);
4094 /* force re-reading of the cache */
4096 discard_index(r
->index
);
4097 if (repo_read_index(r
) < 0)
4098 ret
= error(_("could not read index"));
4103 merge_commit
= to_merge
->item
;
4104 bases
= get_merge_bases(head_commit
, merge_commit
);
4105 if (bases
&& oideq(&merge_commit
->object
.oid
,
4106 &bases
->item
->object
.oid
)) {
4108 /* skip merging an ancestor of HEAD */
4112 write_message(oid_to_hex(&merge_commit
->object
.oid
), the_hash_algo
->hexsz
,
4113 git_path_merge_head(r
), 0);
4114 write_message("no-ff", 5, git_path_merge_mode(r
), 0);
4116 bases
= reverse_commit_list(bases
);
4119 init_merge_options(&o
, r
);
4121 o
.branch2
= ref_name
.buf
;
4122 o
.buffer_output
= 2;
4124 if (!opts
->strategy
|| !strcmp(opts
->strategy
, "ort")) {
4126 * TODO: Should use merge_incore_recursive() and
4127 * merge_switch_to_result(), skipping the call to
4128 * merge_switch_to_result() when we don't actually need to
4129 * update the index and working copy immediately.
4131 ret
= merge_ort_recursive(&o
,
4132 head_commit
, merge_commit
, bases
,
4135 ret
= merge_recursive(&o
, head_commit
, merge_commit
, bases
,
4139 fputs(o
.obuf
.buf
, stdout
);
4140 strbuf_release(&o
.obuf
);
4142 error(_("could not even attempt to merge '%.*s'"),
4143 merge_arg_len
, arg
);
4147 * The return value of merge_recursive() is 1 on clean, and 0 on
4150 * Let's reverse that, so that do_merge() returns 0 upon success and
4151 * 1 upon failed merge (keeping the return value -1 for the cases where
4152 * we will want to reschedule the `merge` command).
4156 if (r
->index
->cache_changed
&&
4157 write_locked_index(r
->index
, &lock
, COMMIT_LOCK
)) {
4158 ret
= error(_("merge: Unable to write new index file"));
4162 rollback_lock_file(&lock
);
4164 repo_rerere(r
, opts
->allow_rerere_auto
);
4167 * In case of problems, we now want to return a positive
4168 * value (a negative one would indicate that the `merge`
4169 * command needs to be rescheduled).
4171 ret
= !!run_git_commit(git_path_merge_msg(r
), opts
,
4174 if (!ret
&& flags
& TODO_EDIT_MERGE_MSG
) {
4177 run_commit_flags
|= AMEND_MSG
| EDIT_MSG
| VERIFY_MSG
;
4178 ret
= !!run_git_commit(NULL
, opts
, run_commit_flags
);
4183 strbuf_release(&ref_name
);
4184 rollback_lock_file(&lock
);
4185 free_commit_list(to_merge
);
4189 static int write_update_refs_state(struct string_list
*refs_to_oids
)
4192 struct lock_file lock
= LOCK_INIT
;
4194 struct string_list_item
*item
;
4197 path
= rebase_path_update_refs(the_repository
->gitdir
);
4199 if (!refs_to_oids
->nr
) {
4200 if (unlink(path
) && errno
!= ENOENT
)
4201 result
= error_errno(_("could not unlink: %s"), path
);
4205 if (safe_create_leading_directories(path
)) {
4206 result
= error(_("unable to create leading directories of %s"),
4211 if (hold_lock_file_for_update(&lock
, path
, 0) < 0) {
4212 result
= error(_("another 'rebase' process appears to be running; "
4213 "'%s.lock' already exists"),
4218 fp
= fdopen_lock_file(&lock
, "w");
4220 result
= error_errno(_("could not open '%s' for writing"), path
);
4221 rollback_lock_file(&lock
);
4225 for_each_string_list_item(item
, refs_to_oids
) {
4226 struct update_ref_record
*rec
= item
->util
;
4227 fprintf(fp
, "%s\n%s\n%s\n", item
->string
,
4228 oid_to_hex(&rec
->before
), oid_to_hex(&rec
->after
));
4231 result
= commit_lock_file(&lock
);
4239 * Parse the update-refs file for the current rebase, then remove the
4240 * refs that do not appear in the todo_list (and have not had updated
4241 * values stored) and add refs that are in the todo_list but not
4242 * represented in the update-refs file.
4244 * If there are changes to the update-refs list, then write the new state
4247 void todo_list_filter_update_refs(struct repository
*r
,
4248 struct todo_list
*todo_list
)
4252 struct string_list update_refs
= STRING_LIST_INIT_DUP
;
4254 sequencer_get_update_refs_state(r
->gitdir
, &update_refs
);
4257 * For each item in the update_refs list, if it has no updated
4258 * value and does not appear in the todo_list, then remove it
4259 * from the update_refs list.
4261 for (i
= 0; i
< update_refs
.nr
; i
++) {
4264 const char *ref
= update_refs
.items
[i
].string
;
4265 size_t reflen
= strlen(ref
);
4266 struct update_ref_record
*rec
= update_refs
.items
[i
].util
;
4268 /* OID already stored as updated. */
4269 if (!is_null_oid(&rec
->after
))
4272 for (j
= 0; !found
&& j
< todo_list
->total_nr
; j
++) {
4273 struct todo_item
*item
= &todo_list
->items
[j
];
4274 const char *arg
= todo_list
->buf
.buf
+ item
->arg_offset
;
4276 if (item
->command
!= TODO_UPDATE_REF
)
4279 if (item
->arg_len
!= reflen
||
4280 strncmp(arg
, ref
, reflen
))
4287 free(update_refs
.items
[i
].string
);
4288 free(update_refs
.items
[i
].util
);
4291 MOVE_ARRAY(update_refs
.items
+ i
, update_refs
.items
+ i
+ 1, update_refs
.nr
- i
);
4299 * For each todo_item, check if its ref is in the update_refs list.
4300 * If not, then add it as an un-updated ref.
4302 for (i
= 0; i
< todo_list
->total_nr
; i
++) {
4303 struct todo_item
*item
= &todo_list
->items
[i
];
4304 const char *arg
= todo_list
->buf
.buf
+ item
->arg_offset
;
4307 if (item
->command
!= TODO_UPDATE_REF
)
4310 for (j
= 0; !found
&& j
< update_refs
.nr
; j
++) {
4311 const char *ref
= update_refs
.items
[j
].string
;
4313 found
= strlen(ref
) == item
->arg_len
&&
4314 !strncmp(ref
, arg
, item
->arg_len
);
4318 struct string_list_item
*inserted
;
4319 struct strbuf argref
= STRBUF_INIT
;
4321 strbuf_add(&argref
, arg
, item
->arg_len
);
4322 inserted
= string_list_insert(&update_refs
, argref
.buf
);
4323 inserted
->util
= init_update_ref_record(argref
.buf
);
4324 strbuf_release(&argref
);
4330 write_update_refs_state(&update_refs
);
4331 string_list_clear(&update_refs
, 1);
4334 static int do_update_ref(struct repository
*r
, const char *refname
)
4336 struct string_list_item
*item
;
4337 struct string_list list
= STRING_LIST_INIT_DUP
;
4339 if (sequencer_get_update_refs_state(r
->gitdir
, &list
))
4342 for_each_string_list_item(item
, &list
) {
4343 if (!strcmp(item
->string
, refname
)) {
4344 struct update_ref_record
*rec
= item
->util
;
4345 if (read_ref("HEAD", &rec
->after
))
4351 write_update_refs_state(&list
);
4352 string_list_clear(&list
, 1);
4356 static int do_update_refs(struct repository
*r
, int quiet
)
4359 struct string_list_item
*item
;
4360 struct string_list refs_to_oids
= STRING_LIST_INIT_DUP
;
4361 struct ref_store
*refs
= get_main_ref_store(r
);
4362 struct strbuf update_msg
= STRBUF_INIT
;
4363 struct strbuf error_msg
= STRBUF_INIT
;
4365 if ((res
= sequencer_get_update_refs_state(r
->gitdir
, &refs_to_oids
)))
4368 for_each_string_list_item(item
, &refs_to_oids
) {
4369 struct update_ref_record
*rec
= item
->util
;
4372 loop_res
= refs_update_ref(refs
, "rewritten during rebase",
4374 &rec
->after
, &rec
->before
,
4375 0, UPDATE_REFS_MSG_ON_ERR
);
4382 strbuf_addf(&error_msg
, "\t%s\n", item
->string
);
4384 strbuf_addf(&update_msg
, "\t%s\n", item
->string
);
4388 (update_msg
.len
|| error_msg
.len
)) {
4390 _("Updated the following refs with %s:\n%s"),
4396 _("Failed to update the following refs with %s:\n%s"),
4401 string_list_clear(&refs_to_oids
, 1);
4402 strbuf_release(&update_msg
);
4403 strbuf_release(&error_msg
);
4407 static int is_final_fixup(struct todo_list
*todo_list
)
4409 int i
= todo_list
->current
;
4411 if (!is_fixup(todo_list
->items
[i
].command
))
4414 while (++i
< todo_list
->nr
)
4415 if (is_fixup(todo_list
->items
[i
].command
))
4417 else if (!is_noop(todo_list
->items
[i
].command
))
4422 static enum todo_command
peek_command(struct todo_list
*todo_list
, int offset
)
4426 for (i
= todo_list
->current
+ offset
; i
< todo_list
->nr
; i
++)
4427 if (!is_noop(todo_list
->items
[i
].command
))
4428 return todo_list
->items
[i
].command
;
4433 void create_autostash(struct repository
*r
, const char *path
)
4435 struct strbuf buf
= STRBUF_INIT
;
4436 struct lock_file lock_file
= LOCK_INIT
;
4439 fd
= repo_hold_locked_index(r
, &lock_file
, 0);
4440 refresh_index(r
->index
, REFRESH_QUIET
, NULL
, NULL
, NULL
);
4442 repo_update_index_if_able(r
, &lock_file
);
4443 rollback_lock_file(&lock_file
);
4445 if (has_unstaged_changes(r
, 1) ||
4446 has_uncommitted_changes(r
, 1)) {
4447 struct child_process stash
= CHILD_PROCESS_INIT
;
4448 struct reset_head_opts ropts
= { .flags
= RESET_HEAD_HARD
};
4449 struct object_id oid
;
4451 strvec_pushl(&stash
.args
,
4452 "stash", "create", "autostash", NULL
);
4456 if (capture_command(&stash
, &buf
, GIT_MAX_HEXSZ
))
4457 die(_("Cannot autostash"));
4458 strbuf_trim_trailing_newline(&buf
);
4459 if (get_oid(buf
.buf
, &oid
))
4460 die(_("Unexpected stash response: '%s'"),
4463 strbuf_add_unique_abbrev(&buf
, &oid
, DEFAULT_ABBREV
);
4465 if (safe_create_leading_directories_const(path
))
4466 die(_("Could not create directory for '%s'"),
4468 write_file(path
, "%s", oid_to_hex(&oid
));
4469 printf(_("Created autostash: %s\n"), buf
.buf
);
4470 if (reset_head(r
, &ropts
) < 0)
4471 die(_("could not reset --hard"));
4472 discard_index(r
->index
);
4473 if (repo_read_index(r
) < 0)
4474 die(_("could not read index"));
4476 strbuf_release(&buf
);
4479 static int apply_save_autostash_oid(const char *stash_oid
, int attempt_apply
)
4481 struct child_process child
= CHILD_PROCESS_INIT
;
4484 if (attempt_apply
) {
4486 child
.no_stdout
= 1;
4487 child
.no_stderr
= 1;
4488 strvec_push(&child
.args
, "stash");
4489 strvec_push(&child
.args
, "apply");
4490 strvec_push(&child
.args
, stash_oid
);
4491 ret
= run_command(&child
);
4494 if (attempt_apply
&& !ret
)
4495 fprintf(stderr
, _("Applied autostash.\n"));
4497 struct child_process store
= CHILD_PROCESS_INIT
;
4500 strvec_push(&store
.args
, "stash");
4501 strvec_push(&store
.args
, "store");
4502 strvec_push(&store
.args
, "-m");
4503 strvec_push(&store
.args
, "autostash");
4504 strvec_push(&store
.args
, "-q");
4505 strvec_push(&store
.args
, stash_oid
);
4506 if (run_command(&store
))
4507 ret
= error(_("cannot store %s"), stash_oid
);
4511 "Your changes are safe in the stash.\n"
4512 "You can run \"git stash pop\" or"
4513 " \"git stash drop\" at any time.\n"),
4515 _("Applying autostash resulted in conflicts.") :
4516 _("Autostash exists; creating a new stash entry."));
4522 static int apply_save_autostash(const char *path
, int attempt_apply
)
4524 struct strbuf stash_oid
= STRBUF_INIT
;
4527 if (!read_oneliner(&stash_oid
, path
,
4528 READ_ONELINER_SKIP_IF_EMPTY
)) {
4529 strbuf_release(&stash_oid
);
4532 strbuf_trim(&stash_oid
);
4534 ret
= apply_save_autostash_oid(stash_oid
.buf
, attempt_apply
);
4537 strbuf_release(&stash_oid
);
4541 int save_autostash(const char *path
)
4543 return apply_save_autostash(path
, 0);
4546 int apply_autostash(const char *path
)
4548 return apply_save_autostash(path
, 1);
4551 int apply_autostash_oid(const char *stash_oid
)
4553 return apply_save_autostash_oid(stash_oid
, 1);
4556 static int checkout_onto(struct repository
*r
, struct replay_opts
*opts
,
4557 const char *onto_name
, const struct object_id
*onto
,
4558 const struct object_id
*orig_head
)
4560 struct reset_head_opts ropts
= {
4562 .orig_head
= orig_head
,
4563 .flags
= RESET_HEAD_DETACH
| RESET_ORIG_HEAD
|
4564 RESET_HEAD_RUN_POST_CHECKOUT_HOOK
,
4565 .head_msg
= reflog_message(opts
, "start", "checkout %s",
4567 .default_reflog_action
= sequencer_reflog_action(opts
)
4569 if (reset_head(r
, &ropts
)) {
4570 apply_autostash(rebase_path_autostash());
4571 sequencer_remove_state(opts
);
4572 return error(_("could not detach HEAD"));
4578 static int stopped_at_head(struct repository
*r
)
4580 struct object_id head
;
4581 struct commit
*commit
;
4582 struct commit_message message
;
4584 if (get_oid("HEAD", &head
) ||
4585 !(commit
= lookup_commit(r
, &head
)) ||
4586 parse_commit(commit
) || get_message(commit
, &message
))
4587 fprintf(stderr
, _("Stopped at HEAD\n"));
4589 fprintf(stderr
, _("Stopped at %s\n"), message
.label
);
4590 free_message(commit
, &message
);
4596 static int reread_todo_if_changed(struct repository
*r
,
4597 struct todo_list
*todo_list
,
4598 struct replay_opts
*opts
)
4601 struct strbuf buf
= STRBUF_INIT
;
4603 if (strbuf_read_file_or_whine(&buf
, get_todo_path(opts
)) < 0)
4605 offset
= get_item_line_offset(todo_list
, todo_list
->current
+ 1);
4606 if (buf
.len
!= todo_list
->buf
.len
- offset
||
4607 memcmp(buf
.buf
, todo_list
->buf
.buf
+ offset
, buf
.len
)) {
4608 /* Reread the todo file if it has changed. */
4609 todo_list_release(todo_list
);
4610 if (read_populate_todo(r
, todo_list
, opts
))
4611 return -1; /* message was printed */
4612 /* `current` will be incremented on return */
4613 todo_list
->current
= -1;
4615 strbuf_release(&buf
);
4620 static const char rescheduled_advice
[] =
4621 N_("Could not execute the todo command\n"
4625 "It has been rescheduled; To edit the command before continuing, please\n"
4626 "edit the todo list first:\n"
4628 " git rebase --edit-todo\n"
4629 " git rebase --continue\n");
4631 static int pick_commits(struct repository
*r
,
4632 struct todo_list
*todo_list
,
4633 struct replay_opts
*opts
)
4635 int res
= 0, reschedule
= 0;
4637 opts
->reflog_message
= sequencer_reflog_action(opts
);
4639 assert(!(opts
->signoff
|| opts
->no_commit
||
4640 opts
->record_origin
|| should_edit(opts
) ||
4641 opts
->committer_date_is_author_date
||
4642 opts
->ignore_date
));
4643 if (read_and_refresh_cache(r
, opts
))
4646 while (todo_list
->current
< todo_list
->nr
) {
4647 struct todo_item
*item
= todo_list
->items
+ todo_list
->current
;
4648 const char *arg
= todo_item_get_arg(todo_list
, item
);
4651 if (save_todo(todo_list
, opts
))
4653 if (is_rebase_i(opts
)) {
4654 if (item
->command
!= TODO_COMMENT
) {
4655 FILE *f
= fopen(rebase_path_msgnum(), "w");
4657 todo_list
->done_nr
++;
4660 fprintf(f
, "%d\n", todo_list
->done_nr
);
4664 fprintf(stderr
, _("Rebasing (%d/%d)%s"),
4666 todo_list
->total_nr
,
4667 opts
->verbose
? "\n" : "\r");
4669 unlink(rebase_path_message());
4670 unlink(rebase_path_author_script());
4671 unlink(rebase_path_stopped_sha());
4672 unlink(rebase_path_amend());
4673 unlink(git_path_merge_head(r
));
4674 unlink(git_path_auto_merge(r
));
4675 delete_ref(NULL
, "REBASE_HEAD", NULL
, REF_NO_DEREF
);
4677 if (item
->command
== TODO_BREAK
) {
4680 return stopped_at_head(r
);
4683 if (item
->command
<= TODO_SQUASH
) {
4684 if (is_rebase_i(opts
))
4685 opts
->reflog_message
= reflog_message(opts
,
4686 command_to_string(item
->command
), NULL
);
4688 res
= do_pick_commit(r
, item
, opts
,
4689 is_final_fixup(todo_list
),
4691 if (is_rebase_i(opts
) && res
< 0) {
4693 advise(_(rescheduled_advice
),
4694 get_item_line_length(todo_list
,
4695 todo_list
->current
),
4696 get_item_line(todo_list
,
4697 todo_list
->current
));
4698 todo_list
->current
--;
4699 if (save_todo(todo_list
, opts
))
4702 if (item
->command
== TODO_EDIT
) {
4703 struct commit
*commit
= item
->commit
;
4708 _("Stopped at %s... %.*s\n"),
4709 short_commit_name(commit
),
4710 item
->arg_len
, arg
);
4712 return error_with_patch(r
, commit
,
4713 arg
, item
->arg_len
, opts
, res
, !res
);
4715 if (is_rebase_i(opts
) && !res
)
4716 record_in_rewritten(&item
->commit
->object
.oid
,
4717 peek_command(todo_list
, 1));
4718 if (res
&& is_fixup(item
->command
)) {
4721 return error_failed_squash(r
, item
->commit
, opts
,
4722 item
->arg_len
, arg
);
4723 } else if (res
&& is_rebase_i(opts
) && item
->commit
) {
4725 struct object_id oid
;
4728 * If we are rewording and have either
4729 * fast-forwarded already, or are about to
4730 * create a new root commit, we want to amend,
4731 * otherwise we do not.
4733 if (item
->command
== TODO_REWORD
&&
4734 !get_oid("HEAD", &oid
) &&
4735 (oideq(&item
->commit
->object
.oid
, &oid
) ||
4736 (opts
->have_squash_onto
&&
4737 oideq(&opts
->squash_onto
, &oid
))))
4740 return res
| error_with_patch(r
, item
->commit
,
4741 arg
, item
->arg_len
, opts
,
4744 } else if (item
->command
== TODO_EXEC
) {
4745 char *end_of_arg
= (char *)(arg
+ item
->arg_len
);
4746 int saved
= *end_of_arg
;
4751 res
= do_exec(r
, arg
);
4752 *end_of_arg
= saved
;
4755 if (opts
->reschedule_failed_exec
)
4759 } else if (item
->command
== TODO_LABEL
) {
4760 if ((res
= do_label(r
, arg
, item
->arg_len
)))
4762 } else if (item
->command
== TODO_RESET
) {
4763 if ((res
= do_reset(r
, arg
, item
->arg_len
, opts
)))
4765 } else if (item
->command
== TODO_MERGE
) {
4766 if ((res
= do_merge(r
, item
->commit
, arg
, item
->arg_len
,
4767 item
->flags
, &check_todo
, opts
)) < 0)
4769 else if (item
->commit
)
4770 record_in_rewritten(&item
->commit
->object
.oid
,
4771 peek_command(todo_list
, 1));
4773 /* failed with merge conflicts */
4774 return error_with_patch(r
, item
->commit
,
4777 } else if (item
->command
== TODO_UPDATE_REF
) {
4778 struct strbuf ref
= STRBUF_INIT
;
4779 strbuf_add(&ref
, arg
, item
->arg_len
);
4780 if ((res
= do_update_ref(r
, ref
.buf
)))
4782 strbuf_release(&ref
);
4783 } else if (!is_noop(item
->command
))
4784 return error(_("unknown command %d"), item
->command
);
4787 advise(_(rescheduled_advice
),
4788 get_item_line_length(todo_list
,
4789 todo_list
->current
),
4790 get_item_line(todo_list
, todo_list
->current
));
4791 todo_list
->current
--;
4792 if (save_todo(todo_list
, opts
))
4795 return error_with_patch(r
,
4799 } else if (is_rebase_i(opts
) && check_todo
&& !res
&&
4800 reread_todo_if_changed(r
, todo_list
, opts
)) {
4804 todo_list
->current
++;
4809 if (is_rebase_i(opts
)) {
4810 struct strbuf head_ref
= STRBUF_INIT
, buf
= STRBUF_INIT
;
4813 /* Stopped in the middle, as planned? */
4814 if (todo_list
->current
< todo_list
->nr
)
4817 if (read_oneliner(&head_ref
, rebase_path_head_name(), 0) &&
4818 starts_with(head_ref
.buf
, "refs/")) {
4820 struct object_id head
, orig
;
4823 if (get_oid("HEAD", &head
)) {
4824 res
= error(_("cannot read HEAD"));
4826 strbuf_release(&head_ref
);
4827 strbuf_release(&buf
);
4830 if (!read_oneliner(&buf
, rebase_path_orig_head(), 0) ||
4831 get_oid_hex(buf
.buf
, &orig
)) {
4832 res
= error(_("could not read orig-head"));
4833 goto cleanup_head_ref
;
4836 if (!read_oneliner(&buf
, rebase_path_onto(), 0)) {
4837 res
= error(_("could not read 'onto'"));
4838 goto cleanup_head_ref
;
4840 msg
= reflog_message(opts
, "finish", "%s onto %s",
4841 head_ref
.buf
, buf
.buf
);
4842 if (update_ref(msg
, head_ref
.buf
, &head
, &orig
,
4843 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
)) {
4844 res
= error(_("could not update %s"),
4846 goto cleanup_head_ref
;
4848 msg
= reflog_message(opts
, "finish", "returning to %s",
4850 if (create_symref("HEAD", head_ref
.buf
, msg
)) {
4851 res
= error(_("could not update HEAD to %s"),
4853 goto cleanup_head_ref
;
4858 if (opts
->verbose
) {
4859 struct rev_info log_tree_opt
;
4860 struct object_id orig
, head
;
4862 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
4863 repo_init_revisions(r
, &log_tree_opt
, NULL
);
4864 log_tree_opt
.diff
= 1;
4865 log_tree_opt
.diffopt
.output_format
=
4866 DIFF_FORMAT_DIFFSTAT
;
4867 log_tree_opt
.disable_stdin
= 1;
4869 if (read_oneliner(&buf
, rebase_path_orig_head(), 0) &&
4870 !get_oid(buf
.buf
, &orig
) &&
4871 !get_oid("HEAD", &head
)) {
4872 diff_tree_oid(&orig
, &head
, "",
4873 &log_tree_opt
.diffopt
);
4874 log_tree_diff_flush(&log_tree_opt
);
4876 release_revisions(&log_tree_opt
);
4878 flush_rewritten_pending();
4879 if (!stat(rebase_path_rewritten_list(), &st
) &&
4881 struct child_process child
= CHILD_PROCESS_INIT
;
4882 struct run_hooks_opt hook_opt
= RUN_HOOKS_OPT_INIT
;
4884 child
.in
= open(rebase_path_rewritten_list(), O_RDONLY
);
4886 strvec_push(&child
.args
, "notes");
4887 strvec_push(&child
.args
, "copy");
4888 strvec_push(&child
.args
, "--for-rewrite=rebase");
4889 /* we don't care if this copying failed */
4890 run_command(&child
);
4892 hook_opt
.path_to_stdin
= rebase_path_rewritten_list();
4893 strvec_push(&hook_opt
.args
, "rebase");
4894 run_hooks_opt("post-rewrite", &hook_opt
);
4896 apply_autostash(rebase_path_autostash());
4902 _("Successfully rebased and updated %s.\n"),
4906 strbuf_release(&buf
);
4907 strbuf_release(&head_ref
);
4909 if (do_update_refs(r
, opts
->quiet
))
4914 * Sequence of picks finished successfully; cleanup by
4915 * removing the .git/sequencer directory
4917 return sequencer_remove_state(opts
);
4920 static int continue_single_pick(struct repository
*r
, struct replay_opts
*opts
)
4922 struct child_process cmd
= CHILD_PROCESS_INIT
;
4924 if (!refs_ref_exists(get_main_ref_store(r
), "CHERRY_PICK_HEAD") &&
4925 !refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD"))
4926 return error(_("no cherry-pick or revert in progress"));
4929 strvec_push(&cmd
.args
, "commit");
4932 * continue_single_pick() handles the case of recovering from a
4933 * conflict. should_edit() doesn't handle that case; for a conflict,
4934 * we want to edit if the user asked for it, or if they didn't specify
4935 * and stdin is a tty.
4937 if (!opts
->edit
|| (opts
->edit
< 0 && !isatty(0)))
4939 * Include --cleanup=strip as well because we don't want the
4940 * "# Conflicts:" messages.
4942 strvec_pushl(&cmd
.args
, "--no-edit", "--cleanup=strip", NULL
);
4944 return run_command(&cmd
);
4947 static int commit_staged_changes(struct repository
*r
,
4948 struct replay_opts
*opts
,
4949 struct todo_list
*todo_list
)
4951 unsigned int flags
= ALLOW_EMPTY
| EDIT_MSG
;
4952 unsigned int final_fixup
= 0, is_clean
;
4954 if (has_unstaged_changes(r
, 1))
4955 return error(_("cannot rebase: You have unstaged changes."));
4957 is_clean
= !has_uncommitted_changes(r
, 0);
4959 if (file_exists(rebase_path_amend())) {
4960 struct strbuf rev
= STRBUF_INIT
;
4961 struct object_id head
, to_amend
;
4963 if (get_oid("HEAD", &head
))
4964 return error(_("cannot amend non-existing commit"));
4965 if (!read_oneliner(&rev
, rebase_path_amend(), 0))
4966 return error(_("invalid file: '%s'"), rebase_path_amend());
4967 if (get_oid_hex(rev
.buf
, &to_amend
))
4968 return error(_("invalid contents: '%s'"),
4969 rebase_path_amend());
4970 if (!is_clean
&& !oideq(&head
, &to_amend
))
4971 return error(_("\nYou have uncommitted changes in your "
4972 "working tree. Please, commit them\n"
4973 "first and then run 'git rebase "
4974 "--continue' again."));
4976 * When skipping a failed fixup/squash, we need to edit the
4977 * commit message, the current fixup list and count, and if it
4978 * was the last fixup/squash in the chain, we need to clean up
4979 * the commit message and if there was a squash, let the user
4982 if (!is_clean
|| !opts
->current_fixup_count
)
4983 ; /* this is not the final fixup */
4984 else if (!oideq(&head
, &to_amend
) ||
4985 !file_exists(rebase_path_stopped_sha())) {
4986 /* was a final fixup or squash done manually? */
4987 if (!is_fixup(peek_command(todo_list
, 0))) {
4988 unlink(rebase_path_fixup_msg());
4989 unlink(rebase_path_squash_msg());
4990 unlink(rebase_path_current_fixups());
4991 strbuf_reset(&opts
->current_fixups
);
4992 opts
->current_fixup_count
= 0;
4995 /* we are in a fixup/squash chain */
4996 const char *p
= opts
->current_fixups
.buf
;
4997 int len
= opts
->current_fixups
.len
;
4999 opts
->current_fixup_count
--;
5001 BUG("Incorrect current_fixups:\n%s", p
);
5002 while (len
&& p
[len
- 1] != '\n')
5004 strbuf_setlen(&opts
->current_fixups
, len
);
5005 if (write_message(p
, len
, rebase_path_current_fixups(),
5007 return error(_("could not write file: '%s'"),
5008 rebase_path_current_fixups());
5011 * If a fixup/squash in a fixup/squash chain failed, the
5012 * commit message is already correct, no need to commit
5015 * Only if it is the final command in the fixup/squash
5016 * chain, and only if the chain is longer than a single
5017 * fixup/squash command (which was just skipped), do we
5018 * actually need to re-commit with a cleaned up commit
5021 if (opts
->current_fixup_count
> 0 &&
5022 !is_fixup(peek_command(todo_list
, 0))) {
5025 * If there was not a single "squash" in the
5026 * chain, we only need to clean up the commit
5027 * message, no need to bother the user with
5028 * opening the commit message in the editor.
5030 if (!starts_with(p
, "squash ") &&
5031 !strstr(p
, "\nsquash "))
5032 flags
= (flags
& ~EDIT_MSG
) | CLEANUP_MSG
;
5033 } else if (is_fixup(peek_command(todo_list
, 0))) {
5035 * We need to update the squash message to skip
5036 * the latest commit message.
5038 struct commit
*commit
;
5039 const char *path
= rebase_path_squash_msg();
5040 const char *encoding
= get_commit_output_encoding();
5042 if (parse_head(r
, &commit
) ||
5043 !(p
= logmsg_reencode(commit
, NULL
, encoding
)) ||
5044 write_message(p
, strlen(p
), path
, 0)) {
5045 unuse_commit_buffer(commit
, p
);
5046 return error(_("could not write file: "
5049 unuse_commit_buffer(commit
, p
);
5053 strbuf_release(&rev
);
5058 if (refs_ref_exists(get_main_ref_store(r
),
5059 "CHERRY_PICK_HEAD") &&
5060 refs_delete_ref(get_main_ref_store(r
), "",
5061 "CHERRY_PICK_HEAD", NULL
, 0))
5062 return error(_("could not remove CHERRY_PICK_HEAD"));
5063 if (unlink(git_path_merge_msg(r
)) && errno
!= ENOENT
)
5064 return error_errno(_("could not remove '%s'"),
5065 git_path_merge_msg(r
));
5070 if (run_git_commit(final_fixup
? NULL
: rebase_path_message(),
5072 return error(_("could not commit staged changes."));
5073 unlink(rebase_path_amend());
5074 unlink(git_path_merge_head(r
));
5075 unlink(git_path_auto_merge(r
));
5077 unlink(rebase_path_fixup_msg());
5078 unlink(rebase_path_squash_msg());
5080 if (opts
->current_fixup_count
> 0) {
5082 * Whether final fixup or not, we just cleaned up the commit
5085 unlink(rebase_path_current_fixups());
5086 strbuf_reset(&opts
->current_fixups
);
5087 opts
->current_fixup_count
= 0;
5092 int sequencer_continue(struct repository
*r
, struct replay_opts
*opts
)
5094 struct todo_list todo_list
= TODO_LIST_INIT
;
5097 if (read_and_refresh_cache(r
, opts
))
5100 if (read_populate_opts(opts
))
5102 if (is_rebase_i(opts
)) {
5103 if ((res
= read_populate_todo(r
, &todo_list
, opts
)))
5104 goto release_todo_list
;
5106 if (file_exists(rebase_path_dropped())) {
5107 if ((res
= todo_list_check_against_backup(r
, &todo_list
)))
5108 goto release_todo_list
;
5110 unlink(rebase_path_dropped());
5113 opts
->reflog_message
= reflog_message(opts
, "continue", NULL
);
5114 if (commit_staged_changes(r
, opts
, &todo_list
)) {
5116 goto release_todo_list
;
5118 } else if (!file_exists(get_todo_path(opts
)))
5119 return continue_single_pick(r
, opts
);
5120 else if ((res
= read_populate_todo(r
, &todo_list
, opts
)))
5121 goto release_todo_list
;
5123 if (!is_rebase_i(opts
)) {
5124 /* Verify that the conflict has been resolved */
5125 if (refs_ref_exists(get_main_ref_store(r
),
5126 "CHERRY_PICK_HEAD") ||
5127 refs_ref_exists(get_main_ref_store(r
), "REVERT_HEAD")) {
5128 res
= continue_single_pick(r
, opts
);
5130 goto release_todo_list
;
5132 if (index_differs_from(r
, "HEAD", NULL
, 0)) {
5133 res
= error_dirty_index(r
, opts
);
5134 goto release_todo_list
;
5136 todo_list
.current
++;
5137 } else if (file_exists(rebase_path_stopped_sha())) {
5138 struct strbuf buf
= STRBUF_INIT
;
5139 struct object_id oid
;
5141 if (read_oneliner(&buf
, rebase_path_stopped_sha(),
5142 READ_ONELINER_SKIP_IF_EMPTY
) &&
5143 !get_oid_hex(buf
.buf
, &oid
))
5144 record_in_rewritten(&oid
, peek_command(&todo_list
, 0));
5145 strbuf_release(&buf
);
5148 res
= pick_commits(r
, &todo_list
, opts
);
5150 todo_list_release(&todo_list
);
5154 static int single_pick(struct repository
*r
,
5155 struct commit
*cmit
,
5156 struct replay_opts
*opts
)
5159 struct todo_item item
;
5161 item
.command
= opts
->action
== REPLAY_PICK
?
5162 TODO_PICK
: TODO_REVERT
;
5165 opts
->reflog_message
= sequencer_reflog_action(opts
);
5166 return do_pick_commit(r
, &item
, opts
, 0, &check_todo
);
5169 int sequencer_pick_revisions(struct repository
*r
,
5170 struct replay_opts
*opts
)
5172 struct todo_list todo_list
= TODO_LIST_INIT
;
5173 struct object_id oid
;
5177 if (read_and_refresh_cache(r
, opts
))
5180 for (i
= 0; i
< opts
->revs
->pending
.nr
; i
++) {
5181 struct object_id oid
;
5182 const char *name
= opts
->revs
->pending
.objects
[i
].name
;
5184 /* This happens when using --stdin. */
5188 if (!get_oid(name
, &oid
)) {
5189 if (!lookup_commit_reference_gently(r
, &oid
, 1)) {
5190 enum object_type type
= oid_object_info(r
,
5193 return error(_("%s: can't cherry-pick a %s"),
5194 name
, type_name(type
));
5197 return error(_("%s: bad revision"), name
);
5201 * If we were called as "git cherry-pick <commit>", just
5202 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
5203 * REVERT_HEAD, and don't touch the sequencer state.
5204 * This means it is possible to cherry-pick in the middle
5205 * of a cherry-pick sequence.
5207 if (opts
->revs
->cmdline
.nr
== 1 &&
5208 opts
->revs
->cmdline
.rev
->whence
== REV_CMD_REV
&&
5209 opts
->revs
->no_walk
&&
5210 !opts
->revs
->cmdline
.rev
->flags
) {
5211 struct commit
*cmit
;
5212 if (prepare_revision_walk(opts
->revs
))
5213 return error(_("revision walk setup failed"));
5214 cmit
= get_revision(opts
->revs
);
5216 return error(_("empty commit set passed"));
5217 if (get_revision(opts
->revs
))
5218 BUG("unexpected extra commit from walk");
5219 return single_pick(r
, cmit
, opts
);
5223 * Start a new cherry-pick/ revert sequence; but
5224 * first, make sure that an existing one isn't in
5228 if (walk_revs_populate_todo(&todo_list
, opts
) ||
5229 create_seq_dir(r
) < 0)
5231 if (get_oid("HEAD", &oid
) && (opts
->action
== REPLAY_REVERT
))
5232 return error(_("can't revert as initial commit"));
5233 if (save_head(oid_to_hex(&oid
)))
5235 if (save_opts(opts
))
5237 update_abort_safety_file();
5238 res
= pick_commits(r
, &todo_list
, opts
);
5239 todo_list_release(&todo_list
);
5243 void append_signoff(struct strbuf
*msgbuf
, size_t ignore_footer
, unsigned flag
)
5245 unsigned no_dup_sob
= flag
& APPEND_SIGNOFF_DEDUP
;
5246 struct strbuf sob
= STRBUF_INIT
;
5249 strbuf_addstr(&sob
, sign_off_header
);
5250 strbuf_addstr(&sob
, fmt_name(WANT_COMMITTER_IDENT
));
5251 strbuf_addch(&sob
, '\n');
5254 strbuf_complete_line(msgbuf
);
5257 * If the whole message buffer is equal to the sob, pretend that we
5258 * found a conforming footer with a matching sob
5260 if (msgbuf
->len
- ignore_footer
== sob
.len
&&
5261 !strncmp(msgbuf
->buf
, sob
.buf
, sob
.len
))
5264 has_footer
= has_conforming_footer(msgbuf
, &sob
, ignore_footer
);
5267 const char *append_newlines
= NULL
;
5268 size_t len
= msgbuf
->len
- ignore_footer
;
5272 * The buffer is completely empty. Leave foom for
5273 * the title and body to be filled in by the user.
5275 append_newlines
= "\n\n";
5276 } else if (len
== 1) {
5278 * Buffer contains a single newline. Add another
5279 * so that we leave room for the title and body.
5281 append_newlines
= "\n";
5282 } else if (msgbuf
->buf
[len
- 2] != '\n') {
5284 * Buffer ends with a single newline. Add another
5285 * so that there is an empty line between the message
5288 append_newlines
= "\n";
5289 } /* else, the buffer already ends with two newlines. */
5291 if (append_newlines
)
5292 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
5293 append_newlines
, strlen(append_newlines
));
5296 if (has_footer
!= 3 && (!no_dup_sob
|| has_footer
!= 2))
5297 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
5300 strbuf_release(&sob
);
5303 struct labels_entry
{
5304 struct hashmap_entry entry
;
5305 char label
[FLEX_ARRAY
];
5308 static int labels_cmp(const void *fndata UNUSED
,
5309 const struct hashmap_entry
*eptr
,
5310 const struct hashmap_entry
*entry_or_key
, const void *key
)
5312 const struct labels_entry
*a
, *b
;
5314 a
= container_of(eptr
, const struct labels_entry
, entry
);
5315 b
= container_of(entry_or_key
, const struct labels_entry
, entry
);
5317 return key
? strcmp(a
->label
, key
) : strcmp(a
->label
, b
->label
);
5320 struct string_entry
{
5321 struct oidmap_entry entry
;
5322 char string
[FLEX_ARRAY
];
5325 struct label_state
{
5326 struct oidmap commit2label
;
5327 struct hashmap labels
;
5331 static const char *label_oid(struct object_id
*oid
, const char *label
,
5332 struct label_state
*state
)
5334 struct labels_entry
*labels_entry
;
5335 struct string_entry
*string_entry
;
5336 struct object_id dummy
;
5339 string_entry
= oidmap_get(&state
->commit2label
, oid
);
5341 return string_entry
->string
;
5344 * For "uninteresting" commits, i.e. commits that are not to be
5345 * rebased, and which can therefore not be labeled, we use a unique
5346 * abbreviation of the commit name. This is slightly more complicated
5347 * than calling find_unique_abbrev() because we also need to make
5348 * sure that the abbreviation does not conflict with any other
5351 * We disallow "interesting" commits to be labeled by a string that
5352 * is a valid full-length hash, to ensure that we always can find an
5353 * abbreviation for any uninteresting commit's names that does not
5354 * clash with any other label.
5356 strbuf_reset(&state
->buf
);
5360 strbuf_grow(&state
->buf
, GIT_MAX_HEXSZ
);
5361 label
= p
= state
->buf
.buf
;
5363 find_unique_abbrev_r(p
, oid
, default_abbrev
);
5366 * We may need to extend the abbreviated hash so that there is
5367 * no conflicting label.
5369 if (hashmap_get_from_hash(&state
->labels
, strihash(p
), p
)) {
5370 size_t i
= strlen(p
) + 1;
5372 oid_to_hex_r(p
, oid
);
5373 for (; i
< the_hash_algo
->hexsz
; i
++) {
5376 if (!hashmap_get_from_hash(&state
->labels
,
5383 struct strbuf
*buf
= &state
->buf
;
5386 * Sanitize labels by replacing non-alpha-numeric characters
5387 * (including white-space ones) by dashes, as they might be
5388 * illegal in file names (and hence in ref names).
5390 * Note that we retain non-ASCII UTF-8 characters (identified
5391 * via the most significant bit). They should be all acceptable
5392 * in file names. We do not validate the UTF-8 here, that's not
5393 * the job of this function.
5395 for (; *label
; label
++)
5396 if ((*label
& 0x80) || isalnum(*label
))
5397 strbuf_addch(buf
, *label
);
5398 /* avoid leading dash and double-dashes */
5399 else if (buf
->len
&& buf
->buf
[buf
->len
- 1] != '-')
5400 strbuf_addch(buf
, '-');
5402 strbuf_addstr(buf
, "rev-");
5403 strbuf_add_unique_abbrev(buf
, oid
, default_abbrev
);
5407 if ((buf
->len
== the_hash_algo
->hexsz
&&
5408 !get_oid_hex(label
, &dummy
)) ||
5409 (buf
->len
== 1 && *label
== '#') ||
5410 hashmap_get_from_hash(&state
->labels
,
5411 strihash(label
), label
)) {
5413 * If the label already exists, or if the label is a
5414 * valid full OID, or the label is a '#' (which we use
5415 * as a separator between merge heads and oneline), we
5416 * append a dash and a number to make it unique.
5418 size_t len
= buf
->len
;
5420 for (i
= 2; ; i
++) {
5421 strbuf_setlen(buf
, len
);
5422 strbuf_addf(buf
, "-%d", i
);
5423 if (!hashmap_get_from_hash(&state
->labels
,
5433 FLEX_ALLOC_STR(labels_entry
, label
, label
);
5434 hashmap_entry_init(&labels_entry
->entry
, strihash(label
));
5435 hashmap_add(&state
->labels
, &labels_entry
->entry
);
5437 FLEX_ALLOC_STR(string_entry
, string
, label
);
5438 oidcpy(&string_entry
->entry
.oid
, oid
);
5439 oidmap_put(&state
->commit2label
, string_entry
);
5441 return string_entry
->string
;
5444 static int make_script_with_merges(struct pretty_print_context
*pp
,
5445 struct rev_info
*revs
, struct strbuf
*out
,
5448 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
5449 int rebase_cousins
= flags
& TODO_LIST_REBASE_COUSINS
;
5450 int root_with_onto
= flags
& TODO_LIST_ROOT_WITH_ONTO
;
5451 int skipped_commit
= 0;
5452 struct strbuf buf
= STRBUF_INIT
, oneline
= STRBUF_INIT
;
5453 struct strbuf label
= STRBUF_INIT
;
5454 struct commit_list
*commits
= NULL
, **tail
= &commits
, *iter
;
5455 struct commit_list
*tips
= NULL
, **tips_tail
= &tips
;
5456 struct commit
*commit
;
5457 struct oidmap commit2todo
= OIDMAP_INIT
;
5458 struct string_entry
*entry
;
5459 struct oidset interesting
= OIDSET_INIT
, child_seen
= OIDSET_INIT
,
5460 shown
= OIDSET_INIT
;
5461 struct label_state state
= { OIDMAP_INIT
, { NULL
}, STRBUF_INIT
};
5463 int abbr
= flags
& TODO_LIST_ABBREVIATE_CMDS
;
5464 const char *cmd_pick
= abbr
? "p" : "pick",
5465 *cmd_label
= abbr
? "l" : "label",
5466 *cmd_reset
= abbr
? "t" : "reset",
5467 *cmd_merge
= abbr
? "m" : "merge";
5469 oidmap_init(&commit2todo
, 0);
5470 oidmap_init(&state
.commit2label
, 0);
5471 hashmap_init(&state
.labels
, labels_cmp
, NULL
, 0);
5472 strbuf_init(&state
.buf
, 32);
5474 if (revs
->cmdline
.nr
&& (revs
->cmdline
.rev
[0].flags
& BOTTOM
)) {
5475 struct labels_entry
*onto_label_entry
;
5476 struct object_id
*oid
= &revs
->cmdline
.rev
[0].item
->oid
;
5477 FLEX_ALLOC_STR(entry
, string
, "onto");
5478 oidcpy(&entry
->entry
.oid
, oid
);
5479 oidmap_put(&state
.commit2label
, entry
);
5481 FLEX_ALLOC_STR(onto_label_entry
, label
, "onto");
5482 hashmap_entry_init(&onto_label_entry
->entry
, strihash("onto"));
5483 hashmap_add(&state
.labels
, &onto_label_entry
->entry
);
5488 * - get onelines for all commits
5489 * - gather all branch tips (i.e. 2nd or later parents of merges)
5490 * - label all branch tips
5492 while ((commit
= get_revision(revs
))) {
5493 struct commit_list
*to_merge
;
5494 const char *p1
, *p2
;
5495 struct object_id
*oid
;
5498 tail
= &commit_list_insert(commit
, tail
)->next
;
5499 oidset_insert(&interesting
, &commit
->object
.oid
);
5501 is_empty
= is_original_commit_empty(commit
);
5502 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
)) {
5503 if (flags
& TODO_LIST_WARN_SKIPPED_CHERRY_PICKS
)
5504 warning(_("skipped previously applied commit %s"),
5505 short_commit_name(commit
));
5509 if (is_empty
&& !keep_empty
)
5512 strbuf_reset(&oneline
);
5513 pretty_print_commit(pp
, commit
, &oneline
);
5515 to_merge
= commit
->parents
? commit
->parents
->next
: NULL
;
5517 /* non-merge commit: easy case */
5519 strbuf_addf(&buf
, "%s %s %s", cmd_pick
,
5520 oid_to_hex(&commit
->object
.oid
),
5523 strbuf_addf(&buf
, " %c empty",
5526 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
5527 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
5528 oidmap_put(&commit2todo
, entry
);
5533 /* Create a label */
5534 strbuf_reset(&label
);
5535 if (skip_prefix(oneline
.buf
, "Merge ", &p1
) &&
5536 (p1
= strchr(p1
, '\'')) &&
5537 (p2
= strchr(++p1
, '\'')))
5538 strbuf_add(&label
, p1
, p2
- p1
);
5539 else if (skip_prefix(oneline
.buf
, "Merge pull request ",
5541 (p1
= strstr(p1
, " from ")))
5542 strbuf_addstr(&label
, p1
+ strlen(" from "));
5544 strbuf_addbuf(&label
, &oneline
);
5547 strbuf_addf(&buf
, "%s -C %s",
5548 cmd_merge
, oid_to_hex(&commit
->object
.oid
));
5550 /* label the tips of merged branches */
5551 for (; to_merge
; to_merge
= to_merge
->next
) {
5552 oid
= &to_merge
->item
->object
.oid
;
5553 strbuf_addch(&buf
, ' ');
5555 if (!oidset_contains(&interesting
, oid
)) {
5556 strbuf_addstr(&buf
, label_oid(oid
, NULL
,
5561 tips_tail
= &commit_list_insert(to_merge
->item
,
5564 strbuf_addstr(&buf
, label_oid(oid
, label
.buf
, &state
));
5566 strbuf_addf(&buf
, " # %s", oneline
.buf
);
5568 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
5569 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
5570 oidmap_put(&commit2todo
, entry
);
5573 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS
,
5574 _("use --reapply-cherry-picks to include skipped commits"));
5578 * - label branch points
5579 * - add HEAD to the branch tips
5581 for (iter
= commits
; iter
; iter
= iter
->next
) {
5582 struct commit_list
*parent
= iter
->item
->parents
;
5583 for (; parent
; parent
= parent
->next
) {
5584 struct object_id
*oid
= &parent
->item
->object
.oid
;
5585 if (!oidset_contains(&interesting
, oid
))
5587 if (oidset_insert(&child_seen
, oid
))
5588 label_oid(oid
, "branch-point", &state
);
5591 /* Add HEAD as implicit "tip of branch" */
5593 tips_tail
= &commit_list_insert(iter
->item
,
5598 * Third phase: output the todo list. This is a bit tricky, as we
5599 * want to avoid jumping back and forth between revisions. To
5600 * accomplish that goal, we walk backwards from the branch tips,
5601 * gathering commits not yet shown, reversing the list on the fly,
5602 * then outputting that list (labeling revisions as needed).
5604 strbuf_addf(out
, "%s onto\n", cmd_label
);
5605 for (iter
= tips
; iter
; iter
= iter
->next
) {
5606 struct commit_list
*list
= NULL
, *iter2
;
5608 commit
= iter
->item
;
5609 if (oidset_contains(&shown
, &commit
->object
.oid
))
5611 entry
= oidmap_get(&state
.commit2label
, &commit
->object
.oid
);
5614 strbuf_addf(out
, "\n%c Branch %s\n", comment_line_char
, entry
->string
);
5616 strbuf_addch(out
, '\n');
5618 while (oidset_contains(&interesting
, &commit
->object
.oid
) &&
5619 !oidset_contains(&shown
, &commit
->object
.oid
)) {
5620 commit_list_insert(commit
, &list
);
5621 if (!commit
->parents
) {
5625 commit
= commit
->parents
->item
;
5629 strbuf_addf(out
, "%s %s\n", cmd_reset
,
5630 rebase_cousins
|| root_with_onto
?
5631 "onto" : "[new root]");
5633 const char *to
= NULL
;
5635 entry
= oidmap_get(&state
.commit2label
,
5636 &commit
->object
.oid
);
5639 else if (!rebase_cousins
)
5640 to
= label_oid(&commit
->object
.oid
, NULL
,
5643 if (!to
|| !strcmp(to
, "onto"))
5644 strbuf_addf(out
, "%s onto\n", cmd_reset
);
5646 strbuf_reset(&oneline
);
5647 pretty_print_commit(pp
, commit
, &oneline
);
5648 strbuf_addf(out
, "%s %s # %s\n",
5649 cmd_reset
, to
, oneline
.buf
);
5653 for (iter2
= list
; iter2
; iter2
= iter2
->next
) {
5654 struct object_id
*oid
= &iter2
->item
->object
.oid
;
5655 entry
= oidmap_get(&commit2todo
, oid
);
5656 /* only show if not already upstream */
5658 strbuf_addf(out
, "%s\n", entry
->string
);
5659 entry
= oidmap_get(&state
.commit2label
, oid
);
5661 strbuf_addf(out
, "%s %s\n",
5662 cmd_label
, entry
->string
);
5663 oidset_insert(&shown
, oid
);
5666 free_commit_list(list
);
5669 free_commit_list(commits
);
5670 free_commit_list(tips
);
5672 strbuf_release(&label
);
5673 strbuf_release(&oneline
);
5674 strbuf_release(&buf
);
5676 oidmap_free(&commit2todo
, 1);
5677 oidmap_free(&state
.commit2label
, 1);
5678 hashmap_clear_and_free(&state
.labels
, struct labels_entry
, entry
);
5679 strbuf_release(&state
.buf
);
5684 int sequencer_make_script(struct repository
*r
, struct strbuf
*out
, int argc
,
5685 const char **argv
, unsigned flags
)
5687 char *format
= NULL
;
5688 struct pretty_print_context pp
= {0};
5689 struct rev_info revs
;
5690 struct commit
*commit
;
5691 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
5692 const char *insn
= flags
& TODO_LIST_ABBREVIATE_CMDS
? "p" : "pick";
5693 int rebase_merges
= flags
& TODO_LIST_REBASE_MERGES
;
5694 int reapply_cherry_picks
= flags
& TODO_LIST_REAPPLY_CHERRY_PICKS
;
5695 int skipped_commit
= 0;
5698 repo_init_revisions(r
, &revs
, NULL
);
5699 revs
.verbose_header
= 1;
5701 revs
.max_parents
= 1;
5702 revs
.cherry_mark
= !reapply_cherry_picks
;
5705 revs
.right_only
= 1;
5706 revs
.sort_order
= REV_SORT_IN_GRAPH_ORDER
;
5707 revs
.topo_order
= 1;
5709 revs
.pretty_given
= 1;
5710 git_config_get_string("rebase.instructionFormat", &format
);
5711 if (!format
|| !*format
) {
5713 format
= xstrdup("%s");
5715 get_commit_format(format
, &revs
);
5717 pp
.fmt
= revs
.commit_format
;
5718 pp
.output_encoding
= get_log_output_encoding();
5720 if (setup_revisions(argc
, argv
, &revs
, NULL
) > 1) {
5721 ret
= error(_("make_script: unhandled options"));
5725 if (prepare_revision_walk(&revs
) < 0) {
5726 ret
= error(_("make_script: error preparing revisions"));
5730 if (rebase_merges
) {
5731 ret
= make_script_with_merges(&pp
, &revs
, out
, flags
);
5735 while ((commit
= get_revision(&revs
))) {
5736 int is_empty
= is_original_commit_empty(commit
);
5738 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
)) {
5739 if (flags
& TODO_LIST_WARN_SKIPPED_CHERRY_PICKS
)
5740 warning(_("skipped previously applied commit %s"),
5741 short_commit_name(commit
));
5745 if (is_empty
&& !keep_empty
)
5747 strbuf_addf(out
, "%s %s ", insn
,
5748 oid_to_hex(&commit
->object
.oid
));
5749 pretty_print_commit(&pp
, commit
, out
);
5751 strbuf_addf(out
, " %c empty", comment_line_char
);
5752 strbuf_addch(out
, '\n');
5755 advise_if_enabled(ADVICE_SKIPPED_CHERRY_PICKS
,
5756 _("use --reapply-cherry-picks to include skipped commits"));
5758 release_revisions(&revs
);
5763 * Add commands after pick and (series of) squash/fixup commands
5766 static void todo_list_add_exec_commands(struct todo_list
*todo_list
,
5767 struct string_list
*commands
)
5769 struct strbuf
*buf
= &todo_list
->buf
;
5770 size_t base_offset
= buf
->len
;
5771 int i
, insert
, nr
= 0, alloc
= 0;
5772 struct todo_item
*items
= NULL
, *base_items
= NULL
;
5774 CALLOC_ARRAY(base_items
, commands
->nr
);
5775 for (i
= 0; i
< commands
->nr
; i
++) {
5776 size_t command_len
= strlen(commands
->items
[i
].string
);
5778 strbuf_addstr(buf
, commands
->items
[i
].string
);
5779 strbuf_addch(buf
, '\n');
5781 base_items
[i
].command
= TODO_EXEC
;
5782 base_items
[i
].offset_in_buf
= base_offset
;
5783 base_items
[i
].arg_offset
= base_offset
;
5784 base_items
[i
].arg_len
= command_len
;
5786 base_offset
+= command_len
+ 1;
5790 * Insert <commands> after every pick. Here, fixup/squash chains
5791 * are considered part of the pick, so we insert the commands *after*
5792 * those chains if there are any.
5794 * As we insert the exec commands immediately after rearranging
5795 * any fixups and before the user edits the list, a fixup chain
5796 * can never contain comments (any comments are empty picks that
5797 * have been commented out because the user did not specify
5798 * --keep-empty). So, it is safe to insert an exec command
5799 * without looking at the command following a comment.
5802 for (i
= 0; i
< todo_list
->nr
; i
++) {
5803 enum todo_command command
= todo_list
->items
[i
].command
;
5804 if (insert
&& !is_fixup(command
)) {
5805 ALLOC_GROW(items
, nr
+ commands
->nr
, alloc
);
5806 COPY_ARRAY(items
+ nr
, base_items
, commands
->nr
);
5812 ALLOC_GROW(items
, nr
+ 1, alloc
);
5813 items
[nr
++] = todo_list
->items
[i
];
5815 if (command
== TODO_PICK
|| command
== TODO_MERGE
)
5819 /* insert or append final <commands> */
5821 ALLOC_GROW(items
, nr
+ commands
->nr
, alloc
);
5822 COPY_ARRAY(items
+ nr
, base_items
, commands
->nr
);
5827 FREE_AND_NULL(todo_list
->items
);
5828 todo_list
->items
= items
;
5830 todo_list
->alloc
= alloc
;
5833 static void todo_list_to_strbuf(struct repository
*r
, struct todo_list
*todo_list
,
5834 struct strbuf
*buf
, int num
, unsigned flags
)
5836 struct todo_item
*item
;
5837 int i
, max
= todo_list
->nr
;
5839 if (num
> 0 && num
< max
)
5842 for (item
= todo_list
->items
, i
= 0; i
< max
; i
++, item
++) {
5845 /* if the item is not a command write it and continue */
5846 if (item
->command
>= TODO_COMMENT
) {
5847 strbuf_addf(buf
, "%.*s\n", item
->arg_len
,
5848 todo_item_get_arg(todo_list
, item
));
5852 /* add command to the buffer */
5853 cmd
= command_to_char(item
->command
);
5854 if ((flags
& TODO_LIST_ABBREVIATE_CMDS
) && cmd
)
5855 strbuf_addch(buf
, cmd
);
5857 strbuf_addstr(buf
, command_to_string(item
->command
));
5861 const char *oid
= flags
& TODO_LIST_SHORTEN_IDS
?
5862 short_commit_name(item
->commit
) :
5863 oid_to_hex(&item
->commit
->object
.oid
);
5865 if (item
->command
== TODO_FIXUP
) {
5866 if (item
->flags
& TODO_EDIT_FIXUP_MSG
)
5867 strbuf_addstr(buf
, " -c");
5868 else if (item
->flags
& TODO_REPLACE_FIXUP_MSG
) {
5869 strbuf_addstr(buf
, " -C");
5873 if (item
->command
== TODO_MERGE
) {
5874 if (item
->flags
& TODO_EDIT_MERGE_MSG
)
5875 strbuf_addstr(buf
, " -c");
5877 strbuf_addstr(buf
, " -C");
5880 strbuf_addf(buf
, " %s", oid
);
5883 /* add all the rest */
5885 strbuf_addch(buf
, '\n');
5887 strbuf_addf(buf
, " %.*s\n", item
->arg_len
,
5888 todo_item_get_arg(todo_list
, item
));
5892 int todo_list_write_to_file(struct repository
*r
, struct todo_list
*todo_list
,
5893 const char *file
, const char *shortrevisions
,
5894 const char *shortonto
, int num
, unsigned flags
)
5897 struct strbuf buf
= STRBUF_INIT
;
5899 todo_list_to_strbuf(r
, todo_list
, &buf
, num
, flags
);
5900 if (flags
& TODO_LIST_APPEND_TODO_HELP
)
5901 append_todo_help(count_commands(todo_list
),
5902 shortrevisions
, shortonto
, &buf
);
5904 res
= write_message(buf
.buf
, buf
.len
, file
, 0);
5905 strbuf_release(&buf
);
5910 /* skip picking commits whose parents are unchanged */
5911 static int skip_unnecessary_picks(struct repository
*r
,
5912 struct todo_list
*todo_list
,
5913 struct object_id
*base_oid
)
5915 struct object_id
*parent_oid
;
5918 for (i
= 0; i
< todo_list
->nr
; i
++) {
5919 struct todo_item
*item
= todo_list
->items
+ i
;
5921 if (item
->command
>= TODO_NOOP
)
5923 if (item
->command
!= TODO_PICK
)
5925 if (parse_commit(item
->commit
)) {
5926 return error(_("could not parse commit '%s'"),
5927 oid_to_hex(&item
->commit
->object
.oid
));
5929 if (!item
->commit
->parents
)
5930 break; /* root commit */
5931 if (item
->commit
->parents
->next
)
5932 break; /* merge commit */
5933 parent_oid
= &item
->commit
->parents
->item
->object
.oid
;
5934 if (!oideq(parent_oid
, base_oid
))
5936 oidcpy(base_oid
, &item
->commit
->object
.oid
);
5939 const char *done_path
= rebase_path_done();
5941 if (todo_list_write_to_file(r
, todo_list
, done_path
, NULL
, NULL
, i
, 0)) {
5942 error_errno(_("could not write to '%s'"), done_path
);
5946 MOVE_ARRAY(todo_list
->items
, todo_list
->items
+ i
, todo_list
->nr
- i
);
5948 todo_list
->current
= 0;
5949 todo_list
->done_nr
+= i
;
5951 if (is_fixup(peek_command(todo_list
, 0)))
5952 record_in_rewritten(base_oid
, peek_command(todo_list
, 0));
5958 struct todo_add_branch_context
{
5959 struct todo_item
*items
;
5963 struct commit
*commit
;
5964 struct string_list refs_to_oids
;
5967 static int add_decorations_to_list(const struct commit
*commit
,
5968 struct todo_add_branch_context
*ctx
)
5970 const struct name_decoration
*decoration
= get_name_decoration(&commit
->object
);
5971 const char *head_ref
= resolve_ref_unsafe("HEAD",
5972 RESOLVE_REF_READING
,
5976 while (decoration
) {
5977 struct todo_item
*item
;
5979 size_t base_offset
= ctx
->buf
->len
;
5982 * If the branch is the current HEAD, then it will be
5983 * updated by the default rebase behavior.
5985 if (head_ref
&& !strcmp(head_ref
, decoration
->name
)) {
5986 decoration
= decoration
->next
;
5990 ALLOC_GROW(ctx
->items
,
5993 item
= &ctx
->items
[ctx
->items_nr
];
5994 memset(item
, 0, sizeof(*item
));
5996 /* If the branch is checked out, then leave a comment instead. */
5997 if ((path
= branch_checked_out(decoration
->name
))) {
5998 item
->command
= TODO_COMMENT
;
5999 strbuf_addf(ctx
->buf
, "# Ref %s checked out at '%s'\n",
6000 decoration
->name
, path
);
6002 struct string_list_item
*sti
;
6003 item
->command
= TODO_UPDATE_REF
;
6004 strbuf_addf(ctx
->buf
, "%s\n", decoration
->name
);
6006 sti
= string_list_insert(&ctx
->refs_to_oids
,
6008 sti
->util
= init_update_ref_record(decoration
->name
);
6011 item
->offset_in_buf
= base_offset
;
6012 item
->arg_offset
= base_offset
;
6013 item
->arg_len
= ctx
->buf
->len
- base_offset
;
6016 decoration
= decoration
->next
;
6023 * For each 'pick' command, find out if the commit has a decoration in
6024 * refs/heads/. If so, then add a 'label for-update-refs/' command.
6026 static int todo_list_add_update_ref_commands(struct todo_list
*todo_list
)
6029 static struct string_list decorate_refs_exclude
= STRING_LIST_INIT_NODUP
;
6030 static struct string_list decorate_refs_exclude_config
= STRING_LIST_INIT_NODUP
;
6031 static struct string_list decorate_refs_include
= STRING_LIST_INIT_NODUP
;
6032 struct decoration_filter decoration_filter
= {
6033 .include_ref_pattern
= &decorate_refs_include
,
6034 .exclude_ref_pattern
= &decorate_refs_exclude
,
6035 .exclude_ref_config_pattern
= &decorate_refs_exclude_config
,
6037 struct todo_add_branch_context ctx
= {
6038 .buf
= &todo_list
->buf
,
6039 .refs_to_oids
= STRING_LIST_INIT_DUP
,
6042 ctx
.items_alloc
= 2 * todo_list
->nr
+ 1;
6043 ALLOC_ARRAY(ctx
.items
, ctx
.items_alloc
);
6045 string_list_append(&decorate_refs_include
, "refs/heads/");
6046 load_ref_decorations(&decoration_filter
, 0);
6048 for (i
= 0; i
< todo_list
->nr
; ) {
6049 struct todo_item
*item
= &todo_list
->items
[i
];
6051 /* insert ith item into new list */
6052 ALLOC_GROW(ctx
.items
,
6056 ctx
.items
[ctx
.items_nr
++] = todo_list
->items
[i
++];
6059 ctx
.commit
= item
->commit
;
6060 add_decorations_to_list(item
->commit
, &ctx
);
6064 res
= write_update_refs_state(&ctx
.refs_to_oids
);
6066 string_list_clear(&ctx
.refs_to_oids
, 1);
6069 /* we failed, so clean up the new list. */
6074 free(todo_list
->items
);
6075 todo_list
->items
= ctx
.items
;
6076 todo_list
->nr
= ctx
.items_nr
;
6077 todo_list
->alloc
= ctx
.items_alloc
;
6082 int complete_action(struct repository
*r
, struct replay_opts
*opts
, unsigned flags
,
6083 const char *shortrevisions
, const char *onto_name
,
6084 struct commit
*onto
, const struct object_id
*orig_head
,
6085 struct string_list
*commands
, unsigned autosquash
,
6086 unsigned update_refs
,
6087 struct todo_list
*todo_list
)
6089 char shortonto
[GIT_MAX_HEXSZ
+ 1];
6090 const char *todo_file
= rebase_path_todo();
6091 struct todo_list new_todo
= TODO_LIST_INIT
;
6092 struct strbuf
*buf
= &todo_list
->buf
, buf2
= STRBUF_INIT
;
6093 struct object_id oid
= onto
->object
.oid
;
6096 find_unique_abbrev_r(shortonto
, &oid
, DEFAULT_ABBREV
);
6098 if (buf
->len
== 0) {
6099 struct todo_item
*item
= append_new_todo(todo_list
);
6100 item
->command
= TODO_NOOP
;
6101 item
->commit
= NULL
;
6102 item
->arg_len
= item
->arg_offset
= item
->flags
= item
->offset_in_buf
= 0;
6105 if (update_refs
&& todo_list_add_update_ref_commands(todo_list
))
6108 if (autosquash
&& todo_list_rearrange_squash(todo_list
))
6112 todo_list_add_exec_commands(todo_list
, commands
);
6114 if (count_commands(todo_list
) == 0) {
6115 apply_autostash(rebase_path_autostash());
6116 sequencer_remove_state(opts
);
6118 return error(_("nothing to do"));
6121 res
= edit_todo_list(r
, todo_list
, &new_todo
, shortrevisions
,
6125 else if (res
== -2) {
6126 apply_autostash(rebase_path_autostash());
6127 sequencer_remove_state(opts
);
6130 } else if (res
== -3) {
6131 apply_autostash(rebase_path_autostash());
6132 sequencer_remove_state(opts
);
6133 todo_list_release(&new_todo
);
6135 return error(_("nothing to do"));
6136 } else if (res
== -4) {
6137 checkout_onto(r
, opts
, onto_name
, &onto
->object
.oid
, orig_head
);
6138 todo_list_release(&new_todo
);
6143 /* Expand the commit IDs */
6144 todo_list_to_strbuf(r
, &new_todo
, &buf2
, -1, 0);
6145 strbuf_swap(&new_todo
.buf
, &buf2
);
6146 strbuf_release(&buf2
);
6147 new_todo
.total_nr
-= new_todo
.nr
;
6148 if (todo_list_parse_insn_buffer(r
, new_todo
.buf
.buf
, &new_todo
) < 0)
6149 BUG("invalid todo list after expanding IDs:\n%s",
6152 if (opts
->allow_ff
&& skip_unnecessary_picks(r
, &new_todo
, &oid
)) {
6153 todo_list_release(&new_todo
);
6154 return error(_("could not skip unnecessary pick commands"));
6157 if (todo_list_write_to_file(r
, &new_todo
, todo_file
, NULL
, NULL
, -1,
6158 flags
& ~(TODO_LIST_SHORTEN_IDS
))) {
6159 todo_list_release(&new_todo
);
6160 return error_errno(_("could not write '%s'"), todo_file
);
6165 if (checkout_onto(r
, opts
, onto_name
, &oid
, orig_head
))
6168 if (require_clean_work_tree(r
, "rebase", "", 1, 1))
6171 todo_list_write_total_nr(&new_todo
);
6172 res
= pick_commits(r
, &new_todo
, opts
);
6175 todo_list_release(&new_todo
);
6180 struct subject2item_entry
{
6181 struct hashmap_entry entry
;
6183 char subject
[FLEX_ARRAY
];
6186 static int subject2item_cmp(const void *fndata UNUSED
,
6187 const struct hashmap_entry
*eptr
,
6188 const struct hashmap_entry
*entry_or_key
,
6191 const struct subject2item_entry
*a
, *b
;
6193 a
= container_of(eptr
, const struct subject2item_entry
, entry
);
6194 b
= container_of(entry_or_key
, const struct subject2item_entry
, entry
);
6196 return key
? strcmp(a
->subject
, key
) : strcmp(a
->subject
, b
->subject
);
6199 define_commit_slab(commit_todo_item
, struct todo_item
*);
6201 static int skip_fixupish(const char *subject
, const char **p
) {
6202 return skip_prefix(subject
, "fixup! ", p
) ||
6203 skip_prefix(subject
, "amend! ", p
) ||
6204 skip_prefix(subject
, "squash! ", p
);
6208 * Rearrange the todo list that has both "pick commit-id msg" and "pick
6209 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
6210 * after the former, and change "pick" to "fixup"/"squash".
6212 * Note that if the config has specified a custom instruction format, each log
6213 * message will have to be retrieved from the commit (as the oneline in the
6214 * script cannot be trusted) in order to normalize the autosquash arrangement.
6216 int todo_list_rearrange_squash(struct todo_list
*todo_list
)
6218 struct hashmap subject2item
;
6219 int rearranged
= 0, *next
, *tail
, i
, nr
= 0, alloc
= 0;
6221 struct commit_todo_item commit_todo
;
6222 struct todo_item
*items
= NULL
;
6224 init_commit_todo_item(&commit_todo
);
6226 * The hashmap maps onelines to the respective todo list index.
6228 * If any items need to be rearranged, the next[i] value will indicate
6229 * which item was moved directly after the i'th.
6231 * In that case, last[i] will indicate the index of the latest item to
6232 * be moved to appear after the i'th.
6234 hashmap_init(&subject2item
, subject2item_cmp
, NULL
, todo_list
->nr
);
6235 ALLOC_ARRAY(next
, todo_list
->nr
);
6236 ALLOC_ARRAY(tail
, todo_list
->nr
);
6237 ALLOC_ARRAY(subjects
, todo_list
->nr
);
6238 for (i
= 0; i
< todo_list
->nr
; i
++) {
6239 struct strbuf buf
= STRBUF_INIT
;
6240 struct todo_item
*item
= todo_list
->items
+ i
;
6241 const char *commit_buffer
, *subject
, *p
;
6244 struct subject2item_entry
*entry
;
6246 next
[i
] = tail
[i
] = -1;
6247 if (!item
->commit
|| item
->command
== TODO_DROP
) {
6252 if (is_fixup(item
->command
)) {
6253 clear_commit_todo_item(&commit_todo
);
6254 return error(_("the script was already rearranged."));
6257 parse_commit(item
->commit
);
6258 commit_buffer
= logmsg_reencode(item
->commit
, NULL
, "UTF-8");
6259 find_commit_subject(commit_buffer
, &subject
);
6260 format_subject(&buf
, subject
, " ");
6261 subject
= subjects
[i
] = strbuf_detach(&buf
, &subject_len
);
6262 unuse_commit_buffer(item
->commit
, commit_buffer
);
6263 if (skip_fixupish(subject
, &p
)) {
6264 struct commit
*commit2
;
6269 if (!skip_fixupish(p
, &p
))
6273 entry
= hashmap_get_entry_from_hash(&subject2item
,
6275 struct subject2item_entry
,
6278 /* found by title */
6280 else if (!strchr(p
, ' ') &&
6282 lookup_commit_reference_by_name(p
)) &&
6283 *commit_todo_item_at(&commit_todo
, commit2
))
6284 /* found by commit name */
6285 i2
= *commit_todo_item_at(&commit_todo
, commit2
)
6288 /* copy can be a prefix of the commit subject */
6289 for (i2
= 0; i2
< i
; i2
++)
6291 starts_with(subjects
[i2
], p
))
6299 if (starts_with(subject
, "fixup!")) {
6300 todo_list
->items
[i
].command
= TODO_FIXUP
;
6301 } else if (starts_with(subject
, "amend!")) {
6302 todo_list
->items
[i
].command
= TODO_FIXUP
;
6303 todo_list
->items
[i
].flags
= TODO_REPLACE_FIXUP_MSG
;
6305 todo_list
->items
[i
].command
= TODO_SQUASH
;
6311 next
[i
] = next
[tail
[i2
]];
6315 } else if (!hashmap_get_from_hash(&subject2item
,
6316 strhash(subject
), subject
)) {
6317 FLEX_ALLOC_MEM(entry
, subject
, subject
, subject_len
);
6319 hashmap_entry_init(&entry
->entry
,
6320 strhash(entry
->subject
));
6321 hashmap_put(&subject2item
, &entry
->entry
);
6324 *commit_todo_item_at(&commit_todo
, item
->commit
) = item
;
6328 for (i
= 0; i
< todo_list
->nr
; i
++) {
6329 enum todo_command command
= todo_list
->items
[i
].command
;
6333 * Initially, all commands are 'pick's. If it is a
6334 * fixup or a squash now, we have rearranged it.
6336 if (is_fixup(command
))
6340 ALLOC_GROW(items
, nr
+ 1, alloc
);
6341 items
[nr
++] = todo_list
->items
[cur
];
6346 FREE_AND_NULL(todo_list
->items
);
6347 todo_list
->items
= items
;
6349 todo_list
->alloc
= alloc
;
6354 for (i
= 0; i
< todo_list
->nr
; i
++)
6357 hashmap_clear_and_free(&subject2item
, struct subject2item_entry
, entry
);
6359 clear_commit_todo_item(&commit_todo
);
6364 int sequencer_determine_whence(struct repository
*r
, enum commit_whence
*whence
)
6366 if (refs_ref_exists(get_main_ref_store(r
), "CHERRY_PICK_HEAD")) {
6367 struct object_id cherry_pick_head
, rebase_head
;
6369 if (file_exists(git_path_seq_dir()))
6370 *whence
= FROM_CHERRY_PICK_MULTI
;
6371 if (file_exists(rebase_path()) &&
6372 !get_oid("REBASE_HEAD", &rebase_head
) &&
6373 !get_oid("CHERRY_PICK_HEAD", &cherry_pick_head
) &&
6374 oideq(&rebase_head
, &cherry_pick_head
))
6375 *whence
= FROM_REBASE_PICK
;
6377 *whence
= FROM_CHERRY_PICK_SINGLE
;
6385 int sequencer_get_update_refs_state(const char *wt_dir
,
6386 struct string_list
*refs
)
6390 struct strbuf ref
= STRBUF_INIT
;
6391 struct strbuf hash
= STRBUF_INIT
;
6392 struct update_ref_record
*rec
= NULL
;
6394 char *path
= rebase_path_update_refs(wt_dir
);
6396 fp
= fopen(path
, "r");
6400 while (strbuf_getline(&ref
, fp
) != EOF
) {
6401 struct string_list_item
*item
;
6403 CALLOC_ARRAY(rec
, 1);
6405 if (strbuf_getline(&hash
, fp
) == EOF
||
6406 get_oid_hex(hash
.buf
, &rec
->before
)) {
6407 warning(_("update-refs file at '%s' is invalid"),
6413 if (strbuf_getline(&hash
, fp
) == EOF
||
6414 get_oid_hex(hash
.buf
, &rec
->after
)) {
6415 warning(_("update-refs file at '%s' is invalid"),
6421 item
= string_list_insert(refs
, ref
.buf
);
6431 strbuf_release(&ref
);
6432 strbuf_release(&hash
);