5 #include "object-store.h"
10 #include "run-command.h"
13 #include "cache-tree.h"
17 #include "merge-recursive.h"
19 #include "argv-array.h"
23 #include "wt-status.h"
25 #include "notes-utils.h"
27 #include "unpack-trees.h"
31 #include "commit-slab.h"
34 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
36 const char sign_off_header
[] = "Signed-off-by: ";
37 static const char cherry_picked_prefix
[] = "(cherry picked from commit ";
39 GIT_PATH_FUNC(git_path_commit_editmsg
, "COMMIT_EDITMSG")
41 GIT_PATH_FUNC(git_path_seq_dir
, "sequencer")
43 static GIT_PATH_FUNC(git_path_todo_file
, "sequencer/todo")
44 static GIT_PATH_FUNC(git_path_opts_file
, "sequencer/opts")
45 static GIT_PATH_FUNC(git_path_head_file
, "sequencer/head")
46 static GIT_PATH_FUNC(git_path_abort_safety_file
, "sequencer/abort-safety")
48 static GIT_PATH_FUNC(rebase_path
, "rebase-merge")
50 * The file containing rebase commands, comments, and empty lines.
51 * This file is created by "git rebase -i" then edited by the user. As
52 * the lines are processed, they are removed from the front of this
53 * file and written to the tail of 'done'.
55 static GIT_PATH_FUNC(rebase_path_todo
, "rebase-merge/git-rebase-todo")
57 * The rebase command lines that have already been processed. A line
58 * is moved here when it is first handled, before any associated user
61 static GIT_PATH_FUNC(rebase_path_done
, "rebase-merge/done")
63 * The file to keep track of how many commands were already processed (e.g.
66 static GIT_PATH_FUNC(rebase_path_msgnum
, "rebase-merge/msgnum")
68 * The file to keep track of how many commands are to be processed in total
69 * (e.g. for the prompt).
71 static GIT_PATH_FUNC(rebase_path_msgtotal
, "rebase-merge/end")
73 * The commit message that is planned to be used for any changes that
74 * need to be committed following a user interaction.
76 static GIT_PATH_FUNC(rebase_path_message
, "rebase-merge/message")
78 * The file into which is accumulated the suggested commit message for
79 * squash/fixup commands. When the first of a series of squash/fixups
80 * is seen, the file is created and the commit message from the
81 * previous commit and from the first squash/fixup commit are written
82 * to it. The commit message for each subsequent squash/fixup commit
83 * is appended to the file as it is processed.
85 static GIT_PATH_FUNC(rebase_path_squash_msg
, "rebase-merge/message-squash")
87 * If the current series of squash/fixups has not yet included a squash
88 * command, then this file exists and holds the commit message of the
89 * original "pick" commit. (If the series ends without a "squash"
90 * command, then this can be used as the commit message of the combined
91 * commit without opening the editor.)
93 static GIT_PATH_FUNC(rebase_path_fixup_msg
, "rebase-merge/message-fixup")
95 * This file contains the list fixup/squash commands that have been
96 * accumulated into message-fixup or message-squash so far.
98 static GIT_PATH_FUNC(rebase_path_current_fixups
, "rebase-merge/current-fixups")
100 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
101 * GIT_AUTHOR_DATE that will be used for the commit that is currently
104 static GIT_PATH_FUNC(rebase_path_author_script
, "rebase-merge/author-script")
106 * When an "edit" rebase command is being processed, the SHA1 of the
107 * commit to be edited is recorded in this file. When "git rebase
108 * --continue" is executed, if there are any staged changes then they
109 * will be amended to the HEAD commit, but only provided the HEAD
110 * commit is still the commit to be edited. When any other rebase
111 * command is processed, this file is deleted.
113 static GIT_PATH_FUNC(rebase_path_amend
, "rebase-merge/amend")
115 * When we stop at a given patch via the "edit" command, this file contains
116 * the abbreviated commit name of the corresponding patch.
118 static GIT_PATH_FUNC(rebase_path_stopped_sha
, "rebase-merge/stopped-sha")
120 * For the post-rewrite hook, we make a list of rewritten commits and
121 * their new sha1s. The rewritten-pending list keeps the sha1s of
122 * commits that have been processed, but not committed yet,
123 * e.g. because they are waiting for a 'squash' command.
125 static GIT_PATH_FUNC(rebase_path_rewritten_list
, "rebase-merge/rewritten-list")
126 static GIT_PATH_FUNC(rebase_path_rewritten_pending
,
127 "rebase-merge/rewritten-pending")
130 * The path of the file containig the OID of the "squash onto" commit, i.e.
131 * the dummy commit used for `reset [new root]`.
133 static GIT_PATH_FUNC(rebase_path_squash_onto
, "rebase-merge/squash-onto")
136 * The path of the file listing refs that need to be deleted after the rebase
137 * finishes. This is used by the `label` command to record the need for cleanup.
139 static GIT_PATH_FUNC(rebase_path_refs_to_delete
, "rebase-merge/refs-to-delete")
142 * The following files are written by git-rebase just after parsing the
143 * command-line (and are only consumed, not modified, by the sequencer).
145 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt
, "rebase-merge/gpg_sign_opt")
146 static GIT_PATH_FUNC(rebase_path_orig_head
, "rebase-merge/orig-head")
147 static GIT_PATH_FUNC(rebase_path_verbose
, "rebase-merge/verbose")
148 static GIT_PATH_FUNC(rebase_path_signoff
, "rebase-merge/signoff")
149 static GIT_PATH_FUNC(rebase_path_head_name
, "rebase-merge/head-name")
150 static GIT_PATH_FUNC(rebase_path_onto
, "rebase-merge/onto")
151 static GIT_PATH_FUNC(rebase_path_autostash
, "rebase-merge/autostash")
152 static GIT_PATH_FUNC(rebase_path_strategy
, "rebase-merge/strategy")
153 static GIT_PATH_FUNC(rebase_path_strategy_opts
, "rebase-merge/strategy_opts")
154 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate
, "rebase-merge/allow_rerere_autoupdate")
156 static int git_sequencer_config(const char *k
, const char *v
, void *cb
)
158 struct replay_opts
*opts
= cb
;
161 if (!strcmp(k
, "commit.cleanup")) {
164 status
= git_config_string(&s
, k
, v
);
168 if (!strcmp(s
, "verbatim"))
169 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
170 else if (!strcmp(s
, "whitespace"))
171 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
172 else if (!strcmp(s
, "strip"))
173 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_ALL
;
174 else if (!strcmp(s
, "scissors"))
175 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
177 warning(_("invalid commit message cleanup mode '%s'"),
184 if (!strcmp(k
, "commit.gpgsign")) {
185 opts
->gpg_sign
= git_config_bool(k
, v
) ? xstrdup("") : NULL
;
189 status
= git_gpg_config(k
, v
, NULL
);
193 return git_diff_basic_config(k
, v
, NULL
);
196 void sequencer_init_config(struct replay_opts
*opts
)
198 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
199 git_config(git_sequencer_config
, opts
);
202 static inline int is_rebase_i(const struct replay_opts
*opts
)
204 return opts
->action
== REPLAY_INTERACTIVE_REBASE
;
207 static const char *get_dir(const struct replay_opts
*opts
)
209 if (is_rebase_i(opts
))
210 return rebase_path();
211 return git_path_seq_dir();
214 static const char *get_todo_path(const struct replay_opts
*opts
)
216 if (is_rebase_i(opts
))
217 return rebase_path_todo();
218 return git_path_todo_file();
222 * Returns 0 for non-conforming footer
223 * Returns 1 for conforming footer
224 * Returns 2 when sob exists within conforming footer
225 * Returns 3 when sob exists within conforming footer as last entry
227 static int has_conforming_footer(struct strbuf
*sb
, struct strbuf
*sob
,
228 size_t ignore_footer
)
230 struct process_trailer_options opts
= PROCESS_TRAILER_OPTIONS_INIT
;
231 struct trailer_info info
;
233 int found_sob
= 0, found_sob_last
= 0;
237 trailer_info_get(&info
, sb
->buf
, &opts
);
239 if (info
.trailer_start
== info
.trailer_end
)
242 for (i
= 0; i
< info
.trailer_nr
; i
++)
243 if (sob
&& !strncmp(info
.trailers
[i
], sob
->buf
, sob
->len
)) {
245 if (i
== info
.trailer_nr
- 1)
249 trailer_info_release(&info
);
258 static const char *gpg_sign_opt_quoted(struct replay_opts
*opts
)
260 static struct strbuf buf
= STRBUF_INIT
;
264 sq_quotef(&buf
, "-S%s", opts
->gpg_sign
);
268 int sequencer_remove_state(struct replay_opts
*opts
)
270 struct strbuf buf
= STRBUF_INIT
;
273 if (is_rebase_i(opts
) &&
274 strbuf_read_file(&buf
, rebase_path_refs_to_delete(), 0) > 0) {
277 char *eol
= strchr(p
, '\n');
280 if (delete_ref("(rebase -i) cleanup", p
, NULL
, 0) < 0)
281 warning(_("could not delete '%s'"), p
);
288 free(opts
->gpg_sign
);
289 free(opts
->strategy
);
290 for (i
= 0; i
< opts
->xopts_nr
; i
++)
291 free(opts
->xopts
[i
]);
293 strbuf_release(&opts
->current_fixups
);
296 strbuf_addstr(&buf
, get_dir(opts
));
297 remove_dir_recursively(&buf
, 0);
298 strbuf_release(&buf
);
303 static const char *action_name(const struct replay_opts
*opts
)
305 switch (opts
->action
) {
309 return N_("cherry-pick");
310 case REPLAY_INTERACTIVE_REBASE
:
311 return N_("rebase -i");
313 die(_("unknown action: %d"), opts
->action
);
316 struct commit_message
{
323 static const char *short_commit_name(struct commit
*commit
)
325 return find_unique_abbrev(&commit
->object
.oid
, DEFAULT_ABBREV
);
328 static int get_message(struct commit
*commit
, struct commit_message
*out
)
330 const char *abbrev
, *subject
;
333 out
->message
= logmsg_reencode(commit
, NULL
, get_commit_output_encoding());
334 abbrev
= short_commit_name(commit
);
336 subject_len
= find_commit_subject(out
->message
, &subject
);
338 out
->subject
= xmemdupz(subject
, subject_len
);
339 out
->label
= xstrfmt("%s... %s", abbrev
, out
->subject
);
340 out
->parent_label
= xstrfmt("parent of %s", out
->label
);
345 static void free_message(struct commit
*commit
, struct commit_message
*msg
)
347 free(msg
->parent_label
);
350 unuse_commit_buffer(commit
, msg
->message
);
353 static void print_advice(int show_hint
, struct replay_opts
*opts
)
355 char *msg
= getenv("GIT_CHERRY_PICK_HELP");
358 fprintf(stderr
, "%s\n", msg
);
360 * A conflict has occurred but the porcelain
361 * (typically rebase --interactive) wants to take care
362 * of the commit itself so remove CHERRY_PICK_HEAD
364 unlink(git_path_cherry_pick_head(the_repository
));
370 advise(_("after resolving the conflicts, mark the corrected paths\n"
371 "with 'git add <paths>' or 'git rm <paths>'"));
373 advise(_("after resolving the conflicts, mark the corrected paths\n"
374 "with 'git add <paths>' or 'git rm <paths>'\n"
375 "and commit the result with 'git commit'"));
379 static int write_message(const void *buf
, size_t len
, const char *filename
,
382 struct lock_file msg_file
= LOCK_INIT
;
384 int msg_fd
= hold_lock_file_for_update(&msg_file
, filename
, 0);
386 return error_errno(_("could not lock '%s'"), filename
);
387 if (write_in_full(msg_fd
, buf
, len
) < 0) {
388 error_errno(_("could not write to '%s'"), filename
);
389 rollback_lock_file(&msg_file
);
392 if (append_eol
&& write(msg_fd
, "\n", 1) < 0) {
393 error_errno(_("could not write eol to '%s'"), filename
);
394 rollback_lock_file(&msg_file
);
397 if (commit_lock_file(&msg_file
) < 0)
398 return error(_("failed to finalize '%s'"), filename
);
404 * Reads a file that was presumably written by a shell script, i.e. with an
405 * end-of-line marker that needs to be stripped.
407 * Note that only the last end-of-line marker is stripped, consistent with the
408 * behavior of "$(cat path)" in a shell script.
410 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
412 static int read_oneliner(struct strbuf
*buf
,
413 const char *path
, int skip_if_empty
)
415 int orig_len
= buf
->len
;
417 if (!file_exists(path
))
420 if (strbuf_read_file(buf
, path
, 0) < 0) {
421 warning_errno(_("could not read '%s'"), path
);
425 if (buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\n') {
426 if (--buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\r')
428 buf
->buf
[buf
->len
] = '\0';
431 if (skip_if_empty
&& buf
->len
== orig_len
)
437 static struct tree
*empty_tree(void)
439 return lookup_tree(the_repository
, the_repository
->hash_algo
->empty_tree
);
442 static int error_dirty_index(struct replay_opts
*opts
)
444 if (read_cache_unmerged())
445 return error_resolve_conflict(_(action_name(opts
)));
447 error(_("your local changes would be overwritten by %s."),
448 _(action_name(opts
)));
450 if (advice_commit_before_merge
)
451 advise(_("commit your changes or stash them to proceed."));
455 static void update_abort_safety_file(void)
457 struct object_id head
;
459 /* Do nothing on a single-pick */
460 if (!file_exists(git_path_seq_dir()))
463 if (!get_oid("HEAD", &head
))
464 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head
));
466 write_file(git_path_abort_safety_file(), "%s", "");
469 static int fast_forward_to(const struct object_id
*to
, const struct object_id
*from
,
470 int unborn
, struct replay_opts
*opts
)
472 struct ref_transaction
*transaction
;
473 struct strbuf sb
= STRBUF_INIT
;
474 struct strbuf err
= STRBUF_INIT
;
477 if (checkout_fast_forward(from
, to
, 1))
478 return -1; /* the callee should have complained already */
480 strbuf_addf(&sb
, _("%s: fast-forward"), _(action_name(opts
)));
482 transaction
= ref_transaction_begin(&err
);
484 ref_transaction_update(transaction
, "HEAD",
485 to
, unborn
&& !is_rebase_i(opts
) ?
488 ref_transaction_commit(transaction
, &err
)) {
489 ref_transaction_free(transaction
);
490 error("%s", err
.buf
);
492 strbuf_release(&err
);
497 strbuf_release(&err
);
498 ref_transaction_free(transaction
);
499 update_abort_safety_file();
503 void append_conflicts_hint(struct strbuf
*msgbuf
)
507 strbuf_addch(msgbuf
, '\n');
508 strbuf_commented_addf(msgbuf
, "Conflicts:\n");
509 for (i
= 0; i
< active_nr
;) {
510 const struct cache_entry
*ce
= active_cache
[i
++];
512 strbuf_commented_addf(msgbuf
, "\t%s\n", ce
->name
);
513 while (i
< active_nr
&& !strcmp(ce
->name
,
514 active_cache
[i
]->name
))
520 static int do_recursive_merge(struct commit
*base
, struct commit
*next
,
521 const char *base_label
, const char *next_label
,
522 struct object_id
*head
, struct strbuf
*msgbuf
,
523 struct replay_opts
*opts
)
525 struct merge_options o
;
526 struct tree
*result
, *next_tree
, *base_tree
, *head_tree
;
529 struct lock_file index_lock
= LOCK_INIT
;
531 if (hold_locked_index(&index_lock
, LOCK_REPORT_ON_ERROR
) < 0)
536 init_merge_options(&o
);
537 o
.ancestor
= base
? base_label
: "(empty tree)";
539 o
.branch2
= next
? next_label
: "(empty tree)";
540 if (is_rebase_i(opts
))
542 o
.show_rename_progress
= 1;
544 head_tree
= parse_tree_indirect(head
);
545 next_tree
= next
? get_commit_tree(next
) : empty_tree();
546 base_tree
= base
? get_commit_tree(base
) : empty_tree();
548 for (xopt
= opts
->xopts
; xopt
!= opts
->xopts
+ opts
->xopts_nr
; xopt
++)
549 parse_merge_opt(&o
, *xopt
);
551 clean
= merge_trees(&o
,
553 next_tree
, base_tree
, &result
);
554 if (is_rebase_i(opts
) && clean
<= 0)
555 fputs(o
.obuf
.buf
, stdout
);
556 strbuf_release(&o
.obuf
);
557 diff_warn_rename_limit("merge.renamelimit", o
.needed_rename_limit
, 0);
559 rollback_lock_file(&index_lock
);
563 if (write_locked_index(&the_index
, &index_lock
,
564 COMMIT_LOCK
| SKIP_IF_UNCHANGED
))
566 * TRANSLATORS: %s will be "revert", "cherry-pick" or
569 return error(_("%s: Unable to write new index file"),
570 _(action_name(opts
)));
573 append_conflicts_hint(msgbuf
);
578 static struct object_id
*get_cache_tree_oid(void)
580 if (!active_cache_tree
)
581 active_cache_tree
= cache_tree();
583 if (!cache_tree_fully_valid(active_cache_tree
))
584 if (cache_tree_update(&the_index
, 0)) {
585 error(_("unable to update cache tree"));
589 return &active_cache_tree
->oid
;
592 static int is_index_unchanged(void)
594 struct object_id head_oid
, *cache_tree_oid
;
595 struct commit
*head_commit
;
597 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING
, &head_oid
, NULL
))
598 return error(_("could not resolve HEAD commit"));
600 head_commit
= lookup_commit(the_repository
, &head_oid
);
603 * If head_commit is NULL, check_commit, called from
604 * lookup_commit, would have indicated that head_commit is not
605 * a commit object already. parse_commit() will return failure
606 * without further complaints in such a case. Otherwise, if
607 * the commit is invalid, parse_commit() will complain. So
608 * there is nothing for us to say here. Just return failure.
610 if (parse_commit(head_commit
))
613 if (!(cache_tree_oid
= get_cache_tree_oid()))
616 return !oidcmp(cache_tree_oid
, get_commit_tree_oid(head_commit
));
619 static int write_author_script(const char *message
)
621 struct strbuf buf
= STRBUF_INIT
;
626 if (!*message
|| starts_with(message
, "\n")) {
628 /* Missing 'author' line? */
629 unlink(rebase_path_author_script());
631 } else if (skip_prefix(message
, "author ", &message
))
633 else if ((eol
= strchr(message
, '\n')))
638 strbuf_addstr(&buf
, "GIT_AUTHOR_NAME='");
639 while (*message
&& *message
!= '\n' && *message
!= '\r')
640 if (skip_prefix(message
, " <", &message
))
642 else if (*message
!= '\'')
643 strbuf_addch(&buf
, *(message
++));
645 strbuf_addf(&buf
, "'\\%c'", *(message
++));
646 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_EMAIL='");
647 while (*message
&& *message
!= '\n' && *message
!= '\r')
648 if (skip_prefix(message
, "> ", &message
))
650 else if (*message
!= '\'')
651 strbuf_addch(&buf
, *(message
++));
653 strbuf_addf(&buf
, "'\\%c'", *(message
++));
654 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_DATE='@");
655 while (*message
&& *message
!= '\n' && *message
!= '\r')
656 if (*message
!= '\'')
657 strbuf_addch(&buf
, *(message
++));
659 strbuf_addf(&buf
, "'\\%c'", *(message
++));
660 strbuf_addch(&buf
, '\'');
661 res
= write_message(buf
.buf
, buf
.len
, rebase_path_author_script(), 1);
662 strbuf_release(&buf
);
668 * write_author_script() used to fail to terminate the last line with a "'" and
669 * also escaped "'" incorrectly as "'\\\\''" rather than "'\\''". We check for
670 * the terminating "'" on the last line to see how "'" has been escaped in case
671 * git was upgraded while rebase was stopped.
673 static int quoting_is_broken(const char *s
, size_t n
)
675 /* Skip any empty lines in case the file was hand edited */
676 while (n
> 0 && s
[--n
] == '\n')
678 if (n
> 0 && s
[n
] != '\'')
685 * Read a list of environment variable assignments (such as the author-script
686 * file) into an environment block. Returns -1 on error, 0 otherwise.
688 static int read_env_script(struct argv_array
*env
)
690 struct strbuf script
= STRBUF_INIT
;
691 int i
, count
= 0, sq_bug
;
695 if (strbuf_read_file(&script
, rebase_path_author_script(), 256) <= 0)
697 /* write_author_script() used to quote incorrectly */
698 sq_bug
= quoting_is_broken(script
.buf
, script
.len
);
699 for (p
= script
.buf
; *p
; p
++)
700 if (sq_bug
&& skip_prefix(p
, "'\\\\''", &p2
))
701 strbuf_splice(&script
, p
- script
.buf
, p2
- p
, "'", 1);
702 else if (skip_prefix(p
, "'\\''", &p2
))
703 strbuf_splice(&script
, p
- script
.buf
, p2
- p
, "'", 1);
705 strbuf_splice(&script
, p
-- - script
.buf
, 1, "", 0);
706 else if (*p
== '\n') {
711 for (i
= 0, p
= script
.buf
; i
< count
; i
++) {
712 argv_array_push(env
, p
);
719 static char *get_author(const char *message
)
724 a
= find_commit_header(message
, "author", &len
);
726 return xmemdupz(a
, len
);
731 /* Read author-script and return an ident line (author <email> timestamp) */
732 static const char *read_author_ident(struct strbuf
*buf
)
734 const char *keys
[] = {
735 "GIT_AUTHOR_NAME=", "GIT_AUTHOR_EMAIL=", "GIT_AUTHOR_DATE="
737 struct strbuf out
= STRBUF_INIT
;
742 if (strbuf_read_file(buf
, rebase_path_author_script(), 256) <= 0)
745 /* dequote values and construct ident line in-place */
746 for (in
= buf
->buf
; i
< 3 && in
- buf
->buf
< buf
->len
; i
++) {
747 if (!skip_prefix(in
, keys
[i
], (const char **)&in
)) {
748 warning(_("could not parse '%s' (looking for '%s')"),
749 rebase_path_author_script(), keys
[i
]);
753 eol
= strchrnul(in
, '\n');
755 if (!sq_dequote(in
)) {
756 warning(_("bad quoting on %s value in '%s'"),
757 keys
[i
], rebase_path_author_script());
765 warning(_("could not parse '%s' (looking for '%s')"),
766 rebase_path_author_script(), keys
[i
]);
770 /* validate date since fmt_ident() will die() on bad value */
771 if (parse_date(val
[2], &out
)){
772 warning(_("invalid date format '%s' in '%s'"),
773 val
[2], rebase_path_author_script());
774 strbuf_release(&out
);
779 strbuf_addstr(&out
, fmt_ident(val
[0], val
[1], val
[2], 0));
780 strbuf_swap(buf
, &out
);
781 strbuf_release(&out
);
785 static const char staged_changes_advice
[] =
786 N_("you have staged changes in your working tree\n"
787 "If these changes are meant to be squashed into the previous commit, run:\n"
789 " git commit --amend %s\n"
791 "If they are meant to go into a new commit, run:\n"
795 "In both cases, once you're done, continue with:\n"
797 " git rebase --continue\n");
799 #define ALLOW_EMPTY (1<<0)
800 #define EDIT_MSG (1<<1)
801 #define AMEND_MSG (1<<2)
802 #define CLEANUP_MSG (1<<3)
803 #define VERIFY_MSG (1<<4)
804 #define CREATE_ROOT_COMMIT (1<<5)
807 * If we are cherry-pick, and if the merge did not result in
808 * hand-editing, we will hit this commit and inherit the original
809 * author date and name.
811 * If we are revert, or if our cherry-pick results in a hand merge,
812 * we had better say that the current user is responsible for that.
814 * An exception is when run_git_commit() is called during an
815 * interactive rebase: in that case, we will want to retain the
818 static int run_git_commit(const char *defmsg
, struct replay_opts
*opts
,
821 struct child_process cmd
= CHILD_PROCESS_INIT
;
824 if ((flags
& CREATE_ROOT_COMMIT
) && !(flags
& AMEND_MSG
)) {
825 struct strbuf msg
= STRBUF_INIT
, script
= STRBUF_INIT
;
826 const char *author
= NULL
;
827 struct object_id root_commit
, *cache_tree_oid
;
830 if (is_rebase_i(opts
)) {
831 author
= read_author_ident(&script
);
833 strbuf_release(&script
);
839 BUG("root commit without message");
841 if (!(cache_tree_oid
= get_cache_tree_oid()))
845 res
= strbuf_read_file(&msg
, defmsg
, 0);
848 res
= error_errno(_("could not read '%s'"), defmsg
);
850 res
= commit_tree(msg
.buf
, msg
.len
, cache_tree_oid
,
851 NULL
, &root_commit
, author
,
854 strbuf_release(&msg
);
855 strbuf_release(&script
);
857 update_ref(NULL
, "CHERRY_PICK_HEAD", &root_commit
, NULL
,
858 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
);
859 res
= update_ref(NULL
, "HEAD", &root_commit
, NULL
, 0,
860 UPDATE_REFS_MSG_ON_ERR
);
862 return res
< 0 ? error(_("writing root commit")) : 0;
867 if (is_rebase_i(opts
)) {
868 if (!(flags
& EDIT_MSG
)) {
869 cmd
.stdout_to_stderr
= 1;
873 if (read_env_script(&cmd
.env_array
)) {
874 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
876 return error(_(staged_changes_advice
),
881 argv_array_push(&cmd
.args
, "commit");
883 if (!(flags
& VERIFY_MSG
))
884 argv_array_push(&cmd
.args
, "-n");
885 if ((flags
& AMEND_MSG
))
886 argv_array_push(&cmd
.args
, "--amend");
888 argv_array_pushf(&cmd
.args
, "-S%s", opts
->gpg_sign
);
890 argv_array_pushl(&cmd
.args
, "-F", defmsg
, NULL
);
891 else if (!(flags
& EDIT_MSG
))
892 argv_array_pushl(&cmd
.args
, "-C", "HEAD", NULL
);
893 if ((flags
& CLEANUP_MSG
))
894 argv_array_push(&cmd
.args
, "--cleanup=strip");
895 if ((flags
& EDIT_MSG
))
896 argv_array_push(&cmd
.args
, "-e");
897 else if (!(flags
& CLEANUP_MSG
) &&
898 !opts
->signoff
&& !opts
->record_origin
&&
899 git_config_get_value("commit.cleanup", &value
))
900 argv_array_push(&cmd
.args
, "--cleanup=verbatim");
902 if ((flags
& ALLOW_EMPTY
))
903 argv_array_push(&cmd
.args
, "--allow-empty");
905 if (!(flags
& EDIT_MSG
))
906 argv_array_push(&cmd
.args
, "--allow-empty-message");
909 /* hide stderr on success */
910 struct strbuf buf
= STRBUF_INIT
;
911 int rc
= pipe_command(&cmd
,
913 /* stdout is already redirected */
917 fputs(buf
.buf
, stderr
);
918 strbuf_release(&buf
);
922 return run_command(&cmd
);
925 static int rest_is_empty(const struct strbuf
*sb
, int start
)
930 /* Check if the rest is just whitespace and Signed-off-by's. */
931 for (i
= start
; i
< sb
->len
; i
++) {
932 nl
= memchr(sb
->buf
+ i
, '\n', sb
->len
- i
);
938 if (strlen(sign_off_header
) <= eol
- i
&&
939 starts_with(sb
->buf
+ i
, sign_off_header
)) {
944 if (!isspace(sb
->buf
[i
++]))
952 * Find out if the message in the strbuf contains only whitespace and
953 * Signed-off-by lines.
955 int message_is_empty(const struct strbuf
*sb
,
956 enum commit_msg_cleanup_mode cleanup_mode
)
958 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
960 return rest_is_empty(sb
, 0);
964 * See if the user edited the message in the editor or left what
965 * was in the template intact
967 int template_untouched(const struct strbuf
*sb
, const char *template_file
,
968 enum commit_msg_cleanup_mode cleanup_mode
)
970 struct strbuf tmpl
= STRBUF_INIT
;
973 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
976 if (!template_file
|| strbuf_read_file(&tmpl
, template_file
, 0) <= 0)
979 strbuf_stripspace(&tmpl
, cleanup_mode
== COMMIT_MSG_CLEANUP_ALL
);
980 if (!skip_prefix(sb
->buf
, tmpl
.buf
, &start
))
982 strbuf_release(&tmpl
);
983 return rest_is_empty(sb
, start
- sb
->buf
);
986 int update_head_with_reflog(const struct commit
*old_head
,
987 const struct object_id
*new_head
,
988 const char *action
, const struct strbuf
*msg
,
991 struct ref_transaction
*transaction
;
992 struct strbuf sb
= STRBUF_INIT
;
997 strbuf_addstr(&sb
, action
);
998 strbuf_addstr(&sb
, ": ");
1001 nl
= strchr(msg
->buf
, '\n');
1003 strbuf_add(&sb
, msg
->buf
, nl
+ 1 - msg
->buf
);
1005 strbuf_addbuf(&sb
, msg
);
1006 strbuf_addch(&sb
, '\n');
1009 transaction
= ref_transaction_begin(err
);
1011 ref_transaction_update(transaction
, "HEAD", new_head
,
1012 old_head
? &old_head
->object
.oid
: &null_oid
,
1014 ref_transaction_commit(transaction
, err
)) {
1017 ref_transaction_free(transaction
);
1018 strbuf_release(&sb
);
1023 static int run_rewrite_hook(const struct object_id
*oldoid
,
1024 const struct object_id
*newoid
)
1026 struct child_process proc
= CHILD_PROCESS_INIT
;
1027 const char *argv
[3];
1029 struct strbuf sb
= STRBUF_INIT
;
1031 argv
[0] = find_hook("post-rewrite");
1040 proc
.stdout_to_stderr
= 1;
1042 code
= start_command(&proc
);
1045 strbuf_addf(&sb
, "%s %s\n", oid_to_hex(oldoid
), oid_to_hex(newoid
));
1046 sigchain_push(SIGPIPE
, SIG_IGN
);
1047 write_in_full(proc
.in
, sb
.buf
, sb
.len
);
1049 strbuf_release(&sb
);
1050 sigchain_pop(SIGPIPE
);
1051 return finish_command(&proc
);
1054 void commit_post_rewrite(const struct commit
*old_head
,
1055 const struct object_id
*new_head
)
1057 struct notes_rewrite_cfg
*cfg
;
1059 cfg
= init_copy_notes_for_rewrite("amend");
1061 /* we are amending, so old_head is not NULL */
1062 copy_note_for_rewrite(cfg
, &old_head
->object
.oid
, new_head
);
1063 finish_copy_notes_for_rewrite(cfg
, "Notes added by 'git commit --amend'");
1065 run_rewrite_hook(&old_head
->object
.oid
, new_head
);
1068 static int run_prepare_commit_msg_hook(struct strbuf
*msg
, const char *commit
)
1070 struct argv_array hook_env
= ARGV_ARRAY_INIT
;
1074 name
= git_path_commit_editmsg();
1075 if (write_message(msg
->buf
, msg
->len
, name
, 0))
1078 argv_array_pushf(&hook_env
, "GIT_INDEX_FILE=%s", get_index_file());
1079 argv_array_push(&hook_env
, "GIT_EDITOR=:");
1081 ret
= run_hook_le(hook_env
.argv
, "prepare-commit-msg", name
,
1082 "commit", commit
, NULL
);
1084 ret
= run_hook_le(hook_env
.argv
, "prepare-commit-msg", name
,
1087 ret
= error(_("'prepare-commit-msg' hook failed"));
1088 argv_array_clear(&hook_env
);
1093 static const char implicit_ident_advice_noconfig
[] =
1094 N_("Your name and email address were configured automatically based\n"
1095 "on your username and hostname. Please check that they are accurate.\n"
1096 "You can suppress this message by setting them explicitly. Run the\n"
1097 "following command and follow the instructions in your editor to edit\n"
1098 "your configuration file:\n"
1100 " git config --global --edit\n"
1102 "After doing this, you may fix the identity used for this commit with:\n"
1104 " git commit --amend --reset-author\n");
1106 static const char implicit_ident_advice_config
[] =
1107 N_("Your name and email address were configured automatically based\n"
1108 "on your username and hostname. Please check that they are accurate.\n"
1109 "You can suppress this message by setting them explicitly:\n"
1111 " git config --global user.name \"Your Name\"\n"
1112 " git config --global user.email you@example.com\n"
1114 "After doing this, you may fix the identity used for this commit with:\n"
1116 " git commit --amend --reset-author\n");
1118 static const char *implicit_ident_advice(void)
1120 char *user_config
= expand_user_path("~/.gitconfig", 0);
1121 char *xdg_config
= xdg_config_home("config");
1122 int config_exists
= file_exists(user_config
) || file_exists(xdg_config
);
1128 return _(implicit_ident_advice_config
);
1130 return _(implicit_ident_advice_noconfig
);
1134 void print_commit_summary(const char *prefix
, const struct object_id
*oid
,
1137 struct rev_info rev
;
1138 struct commit
*commit
;
1139 struct strbuf format
= STRBUF_INIT
;
1141 struct pretty_print_context pctx
= {0};
1142 struct strbuf author_ident
= STRBUF_INIT
;
1143 struct strbuf committer_ident
= STRBUF_INIT
;
1145 commit
= lookup_commit(the_repository
, oid
);
1147 die(_("couldn't look up newly created commit"));
1148 if (parse_commit(commit
))
1149 die(_("could not parse newly created commit"));
1151 strbuf_addstr(&format
, "format:%h] %s");
1153 format_commit_message(commit
, "%an <%ae>", &author_ident
, &pctx
);
1154 format_commit_message(commit
, "%cn <%ce>", &committer_ident
, &pctx
);
1155 if (strbuf_cmp(&author_ident
, &committer_ident
)) {
1156 strbuf_addstr(&format
, "\n Author: ");
1157 strbuf_addbuf_percentquote(&format
, &author_ident
);
1159 if (flags
& SUMMARY_SHOW_AUTHOR_DATE
) {
1160 struct strbuf date
= STRBUF_INIT
;
1162 format_commit_message(commit
, "%ad", &date
, &pctx
);
1163 strbuf_addstr(&format
, "\n Date: ");
1164 strbuf_addbuf_percentquote(&format
, &date
);
1165 strbuf_release(&date
);
1167 if (!committer_ident_sufficiently_given()) {
1168 strbuf_addstr(&format
, "\n Committer: ");
1169 strbuf_addbuf_percentquote(&format
, &committer_ident
);
1170 if (advice_implicit_identity
) {
1171 strbuf_addch(&format
, '\n');
1172 strbuf_addstr(&format
, implicit_ident_advice());
1175 strbuf_release(&author_ident
);
1176 strbuf_release(&committer_ident
);
1178 init_revisions(&rev
, prefix
);
1179 setup_revisions(0, NULL
, &rev
, NULL
);
1182 rev
.diffopt
.output_format
=
1183 DIFF_FORMAT_SHORTSTAT
| DIFF_FORMAT_SUMMARY
;
1185 rev
.verbose_header
= 1;
1186 rev
.show_root_diff
= 1;
1187 get_commit_format(format
.buf
, &rev
);
1188 rev
.always_show_header
= 0;
1189 rev
.diffopt
.detect_rename
= DIFF_DETECT_RENAME
;
1190 rev
.diffopt
.break_opt
= 0;
1191 diff_setup_done(&rev
.diffopt
);
1193 head
= resolve_ref_unsafe("HEAD", 0, NULL
, NULL
);
1195 die_errno(_("unable to resolve HEAD after creating commit"));
1196 if (!strcmp(head
, "HEAD"))
1197 head
= _("detached HEAD");
1199 skip_prefix(head
, "refs/heads/", &head
);
1200 printf("[%s%s ", head
, (flags
& SUMMARY_INITIAL_COMMIT
) ?
1201 _(" (root-commit)") : "");
1203 if (!log_tree_commit(&rev
, commit
)) {
1204 rev
.always_show_header
= 1;
1205 rev
.use_terminator
= 1;
1206 log_tree_commit(&rev
, commit
);
1209 strbuf_release(&format
);
1212 static int parse_head(struct commit
**head
)
1214 struct commit
*current_head
;
1215 struct object_id oid
;
1217 if (get_oid("HEAD", &oid
)) {
1218 current_head
= NULL
;
1220 current_head
= lookup_commit_reference(the_repository
, &oid
);
1222 return error(_("could not parse HEAD"));
1223 if (oidcmp(&oid
, ¤t_head
->object
.oid
)) {
1224 warning(_("HEAD %s is not a commit!"),
1227 if (parse_commit(current_head
))
1228 return error(_("could not parse HEAD commit"));
1230 *head
= current_head
;
1236 * Try to commit without forking 'git commit'. In some cases we need
1237 * to run 'git commit' to display an error message
1240 * -1 - error unable to commit
1242 * 1 - run 'git commit'
1244 static int try_to_commit(struct strbuf
*msg
, const char *author
,
1245 struct replay_opts
*opts
, unsigned int flags
,
1246 struct object_id
*oid
)
1248 struct object_id tree
;
1249 struct commit
*current_head
;
1250 struct commit_list
*parents
= NULL
;
1251 struct commit_extra_header
*extra
= NULL
;
1252 struct strbuf err
= STRBUF_INIT
;
1253 struct strbuf commit_msg
= STRBUF_INIT
;
1254 char *amend_author
= NULL
;
1255 const char *hook_commit
= NULL
;
1256 enum commit_msg_cleanup_mode cleanup
;
1259 if (parse_head(¤t_head
))
1262 if (flags
& AMEND_MSG
) {
1263 const char *exclude_gpgsig
[] = { "gpgsig", NULL
};
1264 const char *out_enc
= get_commit_output_encoding();
1265 const char *message
= logmsg_reencode(current_head
, NULL
,
1269 const char *orig_message
= NULL
;
1271 find_commit_subject(message
, &orig_message
);
1273 strbuf_addstr(msg
, orig_message
);
1274 hook_commit
= "HEAD";
1276 author
= amend_author
= get_author(message
);
1277 unuse_commit_buffer(current_head
, message
);
1279 res
= error(_("unable to parse commit author"));
1282 parents
= copy_commit_list(current_head
->parents
);
1283 extra
= read_commit_extra_headers(current_head
, exclude_gpgsig
);
1284 } else if (current_head
) {
1285 commit_list_insert(current_head
, &parents
);
1288 if (write_index_as_tree(&tree
, &the_index
, get_index_file(), 0, NULL
)) {
1289 res
= error(_("git write-tree failed to write a tree"));
1293 if (!(flags
& ALLOW_EMPTY
) && !oidcmp(current_head
?
1294 get_commit_tree_oid(current_head
) :
1295 the_hash_algo
->empty_tree
, &tree
)) {
1296 res
= 1; /* run 'git commit' to display error message */
1300 if (find_hook("prepare-commit-msg")) {
1301 res
= run_prepare_commit_msg_hook(msg
, hook_commit
);
1304 if (strbuf_read_file(&commit_msg
, git_path_commit_editmsg(),
1306 res
= error_errno(_("unable to read commit message "
1308 git_path_commit_editmsg());
1314 cleanup
= (flags
& CLEANUP_MSG
) ? COMMIT_MSG_CLEANUP_ALL
:
1315 opts
->default_msg_cleanup
;
1317 if (cleanup
!= COMMIT_MSG_CLEANUP_NONE
)
1318 strbuf_stripspace(msg
, cleanup
== COMMIT_MSG_CLEANUP_ALL
);
1319 if ((flags
& EDIT_MSG
) && message_is_empty(msg
, cleanup
)) {
1320 res
= 1; /* run 'git commit' to display error message */
1326 if (commit_tree_extended(msg
->buf
, msg
->len
, &tree
, parents
,
1327 oid
, author
, opts
->gpg_sign
, extra
)) {
1328 res
= error(_("failed to write commit object"));
1332 if (update_head_with_reflog(current_head
, oid
,
1333 getenv("GIT_REFLOG_ACTION"), msg
, &err
)) {
1334 res
= error("%s", err
.buf
);
1338 if (flags
& AMEND_MSG
)
1339 commit_post_rewrite(current_head
, oid
);
1342 free_commit_extra_headers(extra
);
1343 strbuf_release(&err
);
1344 strbuf_release(&commit_msg
);
1350 static int do_commit(const char *msg_file
, const char *author
,
1351 struct replay_opts
*opts
, unsigned int flags
)
1355 if (!(flags
& EDIT_MSG
) && !(flags
& VERIFY_MSG
) &&
1356 !(flags
& CREATE_ROOT_COMMIT
)) {
1357 struct object_id oid
;
1358 struct strbuf sb
= STRBUF_INIT
;
1360 if (msg_file
&& strbuf_read_file(&sb
, msg_file
, 2048) < 0)
1361 return error_errno(_("unable to read commit message "
1365 res
= try_to_commit(msg_file
? &sb
: NULL
, author
, opts
, flags
,
1367 strbuf_release(&sb
);
1369 unlink(git_path_cherry_pick_head(the_repository
));
1370 unlink(git_path_merge_msg(the_repository
));
1371 if (!is_rebase_i(opts
))
1372 print_commit_summary(NULL
, &oid
,
1373 SUMMARY_SHOW_AUTHOR_DATE
);
1378 return run_git_commit(msg_file
, opts
, flags
);
1383 static int is_original_commit_empty(struct commit
*commit
)
1385 const struct object_id
*ptree_oid
;
1387 if (parse_commit(commit
))
1388 return error(_("could not parse commit %s"),
1389 oid_to_hex(&commit
->object
.oid
));
1390 if (commit
->parents
) {
1391 struct commit
*parent
= commit
->parents
->item
;
1392 if (parse_commit(parent
))
1393 return error(_("could not parse parent commit %s"),
1394 oid_to_hex(&parent
->object
.oid
));
1395 ptree_oid
= get_commit_tree_oid(parent
);
1397 ptree_oid
= the_hash_algo
->empty_tree
; /* commit is root */
1400 return !oidcmp(ptree_oid
, get_commit_tree_oid(commit
));
1404 * Do we run "git commit" with "--allow-empty"?
1406 static int allow_empty(struct replay_opts
*opts
, struct commit
*commit
)
1408 int index_unchanged
, empty_commit
;
1413 * (1) we do not allow empty at all and error out.
1415 * (2) we allow ones that were initially empty, but
1416 * forbid the ones that become empty;
1418 * (3) we allow both.
1420 if (!opts
->allow_empty
)
1421 return 0; /* let "git commit" barf as necessary */
1423 index_unchanged
= is_index_unchanged();
1424 if (index_unchanged
< 0)
1425 return index_unchanged
;
1426 if (!index_unchanged
)
1427 return 0; /* we do not have to say --allow-empty */
1429 if (opts
->keep_redundant_commits
)
1432 empty_commit
= is_original_commit_empty(commit
);
1433 if (empty_commit
< 0)
1434 return empty_commit
;
1442 * Note that ordering matters in this enum. Not only must it match the mapping
1443 * below, it is also divided into several sections that matter. When adding
1444 * new commands, make sure you add it in the right section.
1447 /* commands that handle commits */
1454 /* commands that do something else than handling a single commit */
1459 /* commands that do nothing but are counted for reporting progress */
1462 /* comments (not counted for reporting progress) */
1469 } todo_command_info
[] = {
1485 static const char *command_to_string(const enum todo_command command
)
1487 if (command
< TODO_COMMENT
)
1488 return todo_command_info
[command
].str
;
1489 die(_("unknown command: %d"), command
);
1492 static char command_to_char(const enum todo_command command
)
1494 if (command
< TODO_COMMENT
&& todo_command_info
[command
].c
)
1495 return todo_command_info
[command
].c
;
1496 return comment_line_char
;
1499 static int is_noop(const enum todo_command command
)
1501 return TODO_NOOP
<= command
;
1504 static int is_fixup(enum todo_command command
)
1506 return command
== TODO_FIXUP
|| command
== TODO_SQUASH
;
1509 /* Does this command create a (non-merge) commit? */
1510 static int is_pick_or_similar(enum todo_command command
)
1525 static int update_squash_messages(enum todo_command command
,
1526 struct commit
*commit
, struct replay_opts
*opts
)
1528 struct strbuf buf
= STRBUF_INIT
;
1530 const char *message
, *body
;
1532 if (opts
->current_fixup_count
> 0) {
1533 struct strbuf header
= STRBUF_INIT
;
1536 if (strbuf_read_file(&buf
, rebase_path_squash_msg(), 9) <= 0)
1537 return error(_("could not read '%s'"),
1538 rebase_path_squash_msg());
1540 eol
= buf
.buf
[0] != comment_line_char
?
1541 buf
.buf
: strchrnul(buf
.buf
, '\n');
1543 strbuf_addf(&header
, "%c ", comment_line_char
);
1544 strbuf_addf(&header
, _("This is a combination of %d commits."),
1545 opts
->current_fixup_count
+ 2);
1546 strbuf_splice(&buf
, 0, eol
- buf
.buf
, header
.buf
, header
.len
);
1547 strbuf_release(&header
);
1549 struct object_id head
;
1550 struct commit
*head_commit
;
1551 const char *head_message
, *body
;
1553 if (get_oid("HEAD", &head
))
1554 return error(_("need a HEAD to fixup"));
1555 if (!(head_commit
= lookup_commit_reference(the_repository
, &head
)))
1556 return error(_("could not read HEAD"));
1557 if (!(head_message
= get_commit_buffer(head_commit
, NULL
)))
1558 return error(_("could not read HEAD's commit message"));
1560 find_commit_subject(head_message
, &body
);
1561 if (write_message(body
, strlen(body
),
1562 rebase_path_fixup_msg(), 0)) {
1563 unuse_commit_buffer(head_commit
, head_message
);
1564 return error(_("cannot write '%s'"),
1565 rebase_path_fixup_msg());
1568 strbuf_addf(&buf
, "%c ", comment_line_char
);
1569 strbuf_addf(&buf
, _("This is a combination of %d commits."), 2);
1570 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1571 strbuf_addstr(&buf
, _("This is the 1st commit message:"));
1572 strbuf_addstr(&buf
, "\n\n");
1573 strbuf_addstr(&buf
, body
);
1575 unuse_commit_buffer(head_commit
, head_message
);
1578 if (!(message
= get_commit_buffer(commit
, NULL
)))
1579 return error(_("could not read commit message of %s"),
1580 oid_to_hex(&commit
->object
.oid
));
1581 find_commit_subject(message
, &body
);
1583 if (command
== TODO_SQUASH
) {
1584 unlink(rebase_path_fixup_msg());
1585 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1586 strbuf_addf(&buf
, _("This is the commit message #%d:"),
1587 ++opts
->current_fixup_count
+ 1);
1588 strbuf_addstr(&buf
, "\n\n");
1589 strbuf_addstr(&buf
, body
);
1590 } else if (command
== TODO_FIXUP
) {
1591 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1592 strbuf_addf(&buf
, _("The commit message #%d will be skipped:"),
1593 ++opts
->current_fixup_count
+ 1);
1594 strbuf_addstr(&buf
, "\n\n");
1595 strbuf_add_commented_lines(&buf
, body
, strlen(body
));
1597 return error(_("unknown command: %d"), command
);
1598 unuse_commit_buffer(commit
, message
);
1600 res
= write_message(buf
.buf
, buf
.len
, rebase_path_squash_msg(), 0);
1601 strbuf_release(&buf
);
1604 strbuf_addf(&opts
->current_fixups
, "%s%s %s",
1605 opts
->current_fixups
.len
? "\n" : "",
1606 command_to_string(command
),
1607 oid_to_hex(&commit
->object
.oid
));
1608 res
= write_message(opts
->current_fixups
.buf
,
1609 opts
->current_fixups
.len
,
1610 rebase_path_current_fixups(), 0);
1616 static void flush_rewritten_pending(void) {
1617 struct strbuf buf
= STRBUF_INIT
;
1618 struct object_id newoid
;
1621 if (strbuf_read_file(&buf
, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ
+ 1) * 2) > 0 &&
1622 !get_oid("HEAD", &newoid
) &&
1623 (out
= fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1624 char *bol
= buf
.buf
, *eol
;
1627 eol
= strchrnul(bol
, '\n');
1628 fprintf(out
, "%.*s %s\n", (int)(eol
- bol
),
1629 bol
, oid_to_hex(&newoid
));
1635 unlink(rebase_path_rewritten_pending());
1637 strbuf_release(&buf
);
1640 static void record_in_rewritten(struct object_id
*oid
,
1641 enum todo_command next_command
) {
1642 FILE *out
= fopen_or_warn(rebase_path_rewritten_pending(), "a");
1647 fprintf(out
, "%s\n", oid_to_hex(oid
));
1650 if (!is_fixup(next_command
))
1651 flush_rewritten_pending();
1654 static int do_pick_commit(enum todo_command command
, struct commit
*commit
,
1655 struct replay_opts
*opts
, int final_fixup
)
1657 unsigned int flags
= opts
->edit
? EDIT_MSG
: 0;
1658 const char *msg_file
= opts
->edit
? NULL
: git_path_merge_msg(the_repository
);
1659 struct object_id head
;
1660 struct commit
*base
, *next
, *parent
;
1661 const char *base_label
, *next_label
;
1662 char *author
= NULL
;
1663 struct commit_message msg
= { NULL
, NULL
, NULL
, NULL
};
1664 struct strbuf msgbuf
= STRBUF_INIT
;
1665 int res
, unborn
= 0, allow
;
1667 if (opts
->no_commit
) {
1669 * We do not intend to commit immediately. We just want to
1670 * merge the differences in, so let's compute the tree
1671 * that represents the "current" state for merge-recursive
1674 if (write_index_as_tree(&head
, &the_index
, get_index_file(), 0, NULL
))
1675 return error(_("your index file is unmerged."));
1677 unborn
= get_oid("HEAD", &head
);
1678 /* Do we want to generate a root commit? */
1679 if (is_pick_or_similar(command
) && opts
->have_squash_onto
&&
1680 !oidcmp(&head
, &opts
->squash_onto
)) {
1681 if (is_fixup(command
))
1682 return error(_("cannot fixup root commit"));
1683 flags
|= CREATE_ROOT_COMMIT
;
1686 oidcpy(&head
, the_hash_algo
->empty_tree
);
1687 if (index_differs_from(unborn
? empty_tree_oid_hex() : "HEAD",
1689 return error_dirty_index(opts
);
1693 if (!commit
->parents
)
1695 else if (commit
->parents
->next
) {
1696 /* Reverting or cherry-picking a merge commit */
1698 struct commit_list
*p
;
1700 if (!opts
->mainline
)
1701 return error(_("commit %s is a merge but no -m option was given."),
1702 oid_to_hex(&commit
->object
.oid
));
1704 for (cnt
= 1, p
= commit
->parents
;
1705 cnt
!= opts
->mainline
&& p
;
1708 if (cnt
!= opts
->mainline
|| !p
)
1709 return error(_("commit %s does not have parent %d"),
1710 oid_to_hex(&commit
->object
.oid
), opts
->mainline
);
1712 } else if (0 < opts
->mainline
)
1713 return error(_("mainline was specified but commit %s is not a merge."),
1714 oid_to_hex(&commit
->object
.oid
));
1716 parent
= commit
->parents
->item
;
1718 if (get_message(commit
, &msg
) != 0)
1719 return error(_("cannot get commit message for %s"),
1720 oid_to_hex(&commit
->object
.oid
));
1722 if (opts
->allow_ff
&& !is_fixup(command
) &&
1723 ((parent
&& !oidcmp(&parent
->object
.oid
, &head
)) ||
1724 (!parent
&& unborn
))) {
1725 if (is_rebase_i(opts
))
1726 write_author_script(msg
.message
);
1727 res
= fast_forward_to(&commit
->object
.oid
, &head
, unborn
,
1729 if (res
|| command
!= TODO_REWORD
)
1731 flags
|= EDIT_MSG
| AMEND_MSG
| VERIFY_MSG
;
1733 goto fast_forward_edit
;
1735 if (parent
&& parse_commit(parent
) < 0)
1736 /* TRANSLATORS: The first %s will be a "todo" command like
1737 "revert" or "pick", the second %s a SHA1. */
1738 return error(_("%s: cannot parse parent commit %s"),
1739 command_to_string(command
),
1740 oid_to_hex(&parent
->object
.oid
));
1743 * "commit" is an existing commit. We would want to apply
1744 * the difference it introduces since its first parent "prev"
1745 * on top of the current HEAD if we are cherry-pick. Or the
1746 * reverse of it if we are revert.
1749 if (command
== TODO_REVERT
) {
1751 base_label
= msg
.label
;
1753 next_label
= msg
.parent_label
;
1754 strbuf_addstr(&msgbuf
, "Revert \"");
1755 strbuf_addstr(&msgbuf
, msg
.subject
);
1756 strbuf_addstr(&msgbuf
, "\"\n\nThis reverts commit ");
1757 strbuf_addstr(&msgbuf
, oid_to_hex(&commit
->object
.oid
));
1759 if (commit
->parents
&& commit
->parents
->next
) {
1760 strbuf_addstr(&msgbuf
, ", reversing\nchanges made to ");
1761 strbuf_addstr(&msgbuf
, oid_to_hex(&parent
->object
.oid
));
1763 strbuf_addstr(&msgbuf
, ".\n");
1768 base_label
= msg
.parent_label
;
1770 next_label
= msg
.label
;
1772 /* Append the commit log message to msgbuf. */
1773 if (find_commit_subject(msg
.message
, &p
))
1774 strbuf_addstr(&msgbuf
, p
);
1776 if (opts
->record_origin
) {
1777 strbuf_complete_line(&msgbuf
);
1778 if (!has_conforming_footer(&msgbuf
, NULL
, 0))
1779 strbuf_addch(&msgbuf
, '\n');
1780 strbuf_addstr(&msgbuf
, cherry_picked_prefix
);
1781 strbuf_addstr(&msgbuf
, oid_to_hex(&commit
->object
.oid
));
1782 strbuf_addstr(&msgbuf
, ")\n");
1784 if (!is_fixup(command
))
1785 author
= get_author(msg
.message
);
1788 if (command
== TODO_REWORD
)
1789 flags
|= EDIT_MSG
| VERIFY_MSG
;
1790 else if (is_fixup(command
)) {
1791 if (update_squash_messages(command
, commit
, opts
))
1795 msg_file
= rebase_path_squash_msg();
1796 else if (file_exists(rebase_path_fixup_msg())) {
1797 flags
|= CLEANUP_MSG
;
1798 msg_file
= rebase_path_fixup_msg();
1800 const char *dest
= git_path_squash_msg(the_repository
);
1802 if (copy_file(dest
, rebase_path_squash_msg(), 0666))
1803 return error(_("could not rename '%s' to '%s'"),
1804 rebase_path_squash_msg(), dest
);
1805 unlink(git_path_merge_msg(the_repository
));
1811 if (opts
->signoff
&& !is_fixup(command
))
1812 append_signoff(&msgbuf
, 0, 0);
1814 if (is_rebase_i(opts
) && write_author_script(msg
.message
) < 0)
1816 else if (!opts
->strategy
|| !strcmp(opts
->strategy
, "recursive") || command
== TODO_REVERT
) {
1817 res
= do_recursive_merge(base
, next
, base_label
, next_label
,
1818 &head
, &msgbuf
, opts
);
1822 res
|= write_message(msgbuf
.buf
, msgbuf
.len
,
1823 git_path_merge_msg(the_repository
), 0);
1825 struct commit_list
*common
= NULL
;
1826 struct commit_list
*remotes
= NULL
;
1828 res
= write_message(msgbuf
.buf
, msgbuf
.len
,
1829 git_path_merge_msg(the_repository
), 0);
1831 commit_list_insert(base
, &common
);
1832 commit_list_insert(next
, &remotes
);
1833 res
|= try_merge_command(opts
->strategy
,
1834 opts
->xopts_nr
, (const char **)opts
->xopts
,
1835 common
, oid_to_hex(&head
), remotes
);
1836 free_commit_list(common
);
1837 free_commit_list(remotes
);
1839 strbuf_release(&msgbuf
);
1842 * If the merge was clean or if it failed due to conflict, we write
1843 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
1844 * However, if the merge did not even start, then we don't want to
1847 if (command
== TODO_PICK
&& !opts
->no_commit
&& (res
== 0 || res
== 1) &&
1848 update_ref(NULL
, "CHERRY_PICK_HEAD", &commit
->object
.oid
, NULL
,
1849 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
1851 if (command
== TODO_REVERT
&& ((opts
->no_commit
&& res
== 0) || res
== 1) &&
1852 update_ref(NULL
, "REVERT_HEAD", &commit
->object
.oid
, NULL
,
1853 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
1857 error(command
== TODO_REVERT
1858 ? _("could not revert %s... %s")
1859 : _("could not apply %s... %s"),
1860 short_commit_name(commit
), msg
.subject
);
1861 print_advice(res
== 1, opts
);
1862 rerere(opts
->allow_rerere_auto
);
1866 allow
= allow_empty(opts
, commit
);
1871 flags
|= ALLOW_EMPTY
;
1872 if (!opts
->no_commit
) {
1874 if (author
|| command
== TODO_REVERT
|| (flags
& AMEND_MSG
))
1875 res
= do_commit(msg_file
, author
, opts
, flags
);
1877 res
= error(_("unable to parse commit author"));
1880 if (!res
&& final_fixup
) {
1881 unlink(rebase_path_fixup_msg());
1882 unlink(rebase_path_squash_msg());
1883 unlink(rebase_path_current_fixups());
1884 strbuf_reset(&opts
->current_fixups
);
1885 opts
->current_fixup_count
= 0;
1889 free_message(commit
, &msg
);
1891 update_abort_safety_file();
1896 static int prepare_revs(struct replay_opts
*opts
)
1899 * picking (but not reverting) ranges (but not individual revisions)
1900 * should be done in reverse
1902 if (opts
->action
== REPLAY_PICK
&& !opts
->revs
->no_walk
)
1903 opts
->revs
->reverse
^= 1;
1905 if (prepare_revision_walk(opts
->revs
))
1906 return error(_("revision walk setup failed"));
1911 static int read_and_refresh_cache(struct replay_opts
*opts
)
1913 struct lock_file index_lock
= LOCK_INIT
;
1914 int index_fd
= hold_locked_index(&index_lock
, 0);
1915 if (read_index_preload(&the_index
, NULL
) < 0) {
1916 rollback_lock_file(&index_lock
);
1917 return error(_("git %s: failed to read the index"),
1918 _(action_name(opts
)));
1920 refresh_index(&the_index
, REFRESH_QUIET
|REFRESH_UNMERGED
, NULL
, NULL
, NULL
);
1921 if (index_fd
>= 0) {
1922 if (write_locked_index(&the_index
, &index_lock
,
1923 COMMIT_LOCK
| SKIP_IF_UNCHANGED
)) {
1924 return error(_("git %s: failed to refresh the index"),
1925 _(action_name(opts
)));
1931 enum todo_item_flags
{
1932 TODO_EDIT_MERGE_MSG
= 1
1936 enum todo_command command
;
1937 struct commit
*commit
;
1941 size_t offset_in_buf
;
1946 struct todo_item
*items
;
1947 int nr
, alloc
, current
;
1948 int done_nr
, total_nr
;
1949 struct stat_data stat
;
1952 #define TODO_LIST_INIT { STRBUF_INIT }
1954 static void todo_list_release(struct todo_list
*todo_list
)
1956 strbuf_release(&todo_list
->buf
);
1957 FREE_AND_NULL(todo_list
->items
);
1958 todo_list
->nr
= todo_list
->alloc
= 0;
1961 static struct todo_item
*append_new_todo(struct todo_list
*todo_list
)
1963 ALLOC_GROW(todo_list
->items
, todo_list
->nr
+ 1, todo_list
->alloc
);
1964 return todo_list
->items
+ todo_list
->nr
++;
1967 static int parse_insn_line(struct todo_item
*item
, const char *bol
, char *eol
)
1969 struct object_id commit_oid
;
1970 char *end_of_object_name
;
1971 int i
, saved
, status
, padding
;
1976 bol
+= strspn(bol
, " \t");
1978 if (bol
== eol
|| *bol
== '\r' || *bol
== comment_line_char
) {
1979 item
->command
= TODO_COMMENT
;
1980 item
->commit
= NULL
;
1982 item
->arg_len
= eol
- bol
;
1986 for (i
= 0; i
< TODO_COMMENT
; i
++)
1987 if (skip_prefix(bol
, todo_command_info
[i
].str
, &bol
)) {
1990 } else if (bol
[1] == ' ' && *bol
== todo_command_info
[i
].c
) {
1995 if (i
>= TODO_COMMENT
)
1998 /* Eat up extra spaces/ tabs before object name */
1999 padding
= strspn(bol
, " \t");
2002 if (item
->command
== TODO_NOOP
) {
2004 return error(_("%s does not accept arguments: '%s'"),
2005 command_to_string(item
->command
), bol
);
2006 item
->commit
= NULL
;
2008 item
->arg_len
= eol
- bol
;
2013 return error(_("missing arguments for %s"),
2014 command_to_string(item
->command
));
2016 if (item
->command
== TODO_EXEC
|| item
->command
== TODO_LABEL
||
2017 item
->command
== TODO_RESET
) {
2018 item
->commit
= NULL
;
2020 item
->arg_len
= (int)(eol
- bol
);
2024 if (item
->command
== TODO_MERGE
) {
2025 if (skip_prefix(bol
, "-C", &bol
))
2026 bol
+= strspn(bol
, " \t");
2027 else if (skip_prefix(bol
, "-c", &bol
)) {
2028 bol
+= strspn(bol
, " \t");
2029 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2031 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2032 item
->commit
= NULL
;
2034 item
->arg_len
= (int)(eol
- bol
);
2039 end_of_object_name
= (char *) bol
+ strcspn(bol
, " \t\n");
2040 saved
= *end_of_object_name
;
2041 *end_of_object_name
= '\0';
2042 status
= get_oid(bol
, &commit_oid
);
2043 *end_of_object_name
= saved
;
2045 item
->arg
= end_of_object_name
+ strspn(end_of_object_name
, " \t");
2046 item
->arg_len
= (int)(eol
- item
->arg
);
2051 item
->commit
= lookup_commit_reference(the_repository
, &commit_oid
);
2052 return !item
->commit
;
2055 static int parse_insn_buffer(char *buf
, struct todo_list
*todo_list
)
2057 struct todo_item
*item
;
2058 char *p
= buf
, *next_p
;
2059 int i
, res
= 0, fixup_okay
= file_exists(rebase_path_done());
2061 for (i
= 1; *p
; i
++, p
= next_p
) {
2062 char *eol
= strchrnul(p
, '\n');
2064 next_p
= *eol
? eol
+ 1 /* skip LF */ : eol
;
2066 if (p
!= eol
&& eol
[-1] == '\r')
2067 eol
--; /* strip Carriage Return */
2069 item
= append_new_todo(todo_list
);
2070 item
->offset_in_buf
= p
- todo_list
->buf
.buf
;
2071 if (parse_insn_line(item
, p
, eol
)) {
2072 res
= error(_("invalid line %d: %.*s"),
2073 i
, (int)(eol
- p
), p
);
2074 item
->command
= TODO_NOOP
;
2079 else if (is_fixup(item
->command
))
2080 return error(_("cannot '%s' without a previous commit"),
2081 command_to_string(item
->command
));
2082 else if (!is_noop(item
->command
))
2089 static int count_commands(struct todo_list
*todo_list
)
2093 for (i
= 0; i
< todo_list
->nr
; i
++)
2094 if (todo_list
->items
[i
].command
!= TODO_COMMENT
)
2100 static int get_item_line_offset(struct todo_list
*todo_list
, int index
)
2102 return index
< todo_list
->nr
?
2103 todo_list
->items
[index
].offset_in_buf
: todo_list
->buf
.len
;
2106 static const char *get_item_line(struct todo_list
*todo_list
, int index
)
2108 return todo_list
->buf
.buf
+ get_item_line_offset(todo_list
, index
);
2111 static int get_item_line_length(struct todo_list
*todo_list
, int index
)
2113 return get_item_line_offset(todo_list
, index
+ 1)
2114 - get_item_line_offset(todo_list
, index
);
2117 static ssize_t
strbuf_read_file_or_whine(struct strbuf
*sb
, const char *path
)
2122 fd
= open(path
, O_RDONLY
);
2124 return error_errno(_("could not open '%s'"), path
);
2125 len
= strbuf_read(sb
, fd
, 0);
2128 return error(_("could not read '%s'."), path
);
2132 static int read_populate_todo(struct todo_list
*todo_list
,
2133 struct replay_opts
*opts
)
2136 const char *todo_file
= get_todo_path(opts
);
2139 strbuf_reset(&todo_list
->buf
);
2140 if (strbuf_read_file_or_whine(&todo_list
->buf
, todo_file
) < 0)
2143 res
= stat(todo_file
, &st
);
2145 return error(_("could not stat '%s'"), todo_file
);
2146 fill_stat_data(&todo_list
->stat
, &st
);
2148 res
= parse_insn_buffer(todo_list
->buf
.buf
, todo_list
);
2150 if (is_rebase_i(opts
))
2151 return error(_("please fix this using "
2152 "'git rebase --edit-todo'."));
2153 return error(_("unusable instruction sheet: '%s'"), todo_file
);
2156 if (!todo_list
->nr
&&
2157 (!is_rebase_i(opts
) || !file_exists(rebase_path_done())))
2158 return error(_("no commits parsed."));
2160 if (!is_rebase_i(opts
)) {
2161 enum todo_command valid
=
2162 opts
->action
== REPLAY_PICK
? TODO_PICK
: TODO_REVERT
;
2165 for (i
= 0; i
< todo_list
->nr
; i
++)
2166 if (valid
== todo_list
->items
[i
].command
)
2168 else if (valid
== TODO_PICK
)
2169 return error(_("cannot cherry-pick during a revert."));
2171 return error(_("cannot revert during a cherry-pick."));
2174 if (is_rebase_i(opts
)) {
2175 struct todo_list done
= TODO_LIST_INIT
;
2176 FILE *f
= fopen_or_warn(rebase_path_msgtotal(), "w");
2178 if (strbuf_read_file(&done
.buf
, rebase_path_done(), 0) > 0 &&
2179 !parse_insn_buffer(done
.buf
.buf
, &done
))
2180 todo_list
->done_nr
= count_commands(&done
);
2182 todo_list
->done_nr
= 0;
2184 todo_list
->total_nr
= todo_list
->done_nr
2185 + count_commands(todo_list
);
2186 todo_list_release(&done
);
2189 fprintf(f
, "%d\n", todo_list
->total_nr
);
2197 static int git_config_string_dup(char **dest
,
2198 const char *var
, const char *value
)
2201 return config_error_nonbool(var
);
2203 *dest
= xstrdup(value
);
2207 static int populate_opts_cb(const char *key
, const char *value
, void *data
)
2209 struct replay_opts
*opts
= data
;
2214 else if (!strcmp(key
, "options.no-commit"))
2215 opts
->no_commit
= git_config_bool_or_int(key
, value
, &error_flag
);
2216 else if (!strcmp(key
, "options.edit"))
2217 opts
->edit
= git_config_bool_or_int(key
, value
, &error_flag
);
2218 else if (!strcmp(key
, "options.signoff"))
2219 opts
->signoff
= git_config_bool_or_int(key
, value
, &error_flag
);
2220 else if (!strcmp(key
, "options.record-origin"))
2221 opts
->record_origin
= git_config_bool_or_int(key
, value
, &error_flag
);
2222 else if (!strcmp(key
, "options.allow-ff"))
2223 opts
->allow_ff
= git_config_bool_or_int(key
, value
, &error_flag
);
2224 else if (!strcmp(key
, "options.mainline"))
2225 opts
->mainline
= git_config_int(key
, value
);
2226 else if (!strcmp(key
, "options.strategy"))
2227 git_config_string_dup(&opts
->strategy
, key
, value
);
2228 else if (!strcmp(key
, "options.gpg-sign"))
2229 git_config_string_dup(&opts
->gpg_sign
, key
, value
);
2230 else if (!strcmp(key
, "options.strategy-option")) {
2231 ALLOC_GROW(opts
->xopts
, opts
->xopts_nr
+ 1, opts
->xopts_alloc
);
2232 opts
->xopts
[opts
->xopts_nr
++] = xstrdup(value
);
2233 } else if (!strcmp(key
, "options.allow-rerere-auto"))
2234 opts
->allow_rerere_auto
=
2235 git_config_bool_or_int(key
, value
, &error_flag
) ?
2236 RERERE_AUTOUPDATE
: RERERE_NOAUTOUPDATE
;
2238 return error(_("invalid key: %s"), key
);
2241 return error(_("invalid value for %s: %s"), key
, value
);
2246 static void read_strategy_opts(struct replay_opts
*opts
, struct strbuf
*buf
)
2249 char *strategy_opts_string
;
2252 if (!read_oneliner(buf
, rebase_path_strategy(), 0))
2254 opts
->strategy
= strbuf_detach(buf
, NULL
);
2255 if (!read_oneliner(buf
, rebase_path_strategy_opts(), 0))
2258 strategy_opts_string
= buf
->buf
;
2259 if (*strategy_opts_string
== ' ')
2260 strategy_opts_string
++;
2261 opts
->xopts_nr
= split_cmdline(strategy_opts_string
,
2262 (const char ***)&opts
->xopts
);
2263 for (i
= 0; i
< opts
->xopts_nr
; i
++) {
2264 const char *arg
= opts
->xopts
[i
];
2266 skip_prefix(arg
, "--", &arg
);
2267 opts
->xopts
[i
] = xstrdup(arg
);
2271 static int read_populate_opts(struct replay_opts
*opts
)
2273 if (is_rebase_i(opts
)) {
2274 struct strbuf buf
= STRBUF_INIT
;
2276 if (read_oneliner(&buf
, rebase_path_gpg_sign_opt(), 1)) {
2277 if (!starts_with(buf
.buf
, "-S"))
2280 free(opts
->gpg_sign
);
2281 opts
->gpg_sign
= xstrdup(buf
.buf
+ 2);
2286 if (read_oneliner(&buf
, rebase_path_allow_rerere_autoupdate(), 1)) {
2287 if (!strcmp(buf
.buf
, "--rerere-autoupdate"))
2288 opts
->allow_rerere_auto
= RERERE_AUTOUPDATE
;
2289 else if (!strcmp(buf
.buf
, "--no-rerere-autoupdate"))
2290 opts
->allow_rerere_auto
= RERERE_NOAUTOUPDATE
;
2294 if (file_exists(rebase_path_verbose()))
2297 if (file_exists(rebase_path_signoff())) {
2302 read_strategy_opts(opts
, &buf
);
2303 strbuf_release(&buf
);
2305 if (read_oneliner(&opts
->current_fixups
,
2306 rebase_path_current_fixups(), 1)) {
2307 const char *p
= opts
->current_fixups
.buf
;
2308 opts
->current_fixup_count
= 1;
2309 while ((p
= strchr(p
, '\n'))) {
2310 opts
->current_fixup_count
++;
2315 if (read_oneliner(&buf
, rebase_path_squash_onto(), 0)) {
2316 if (get_oid_hex(buf
.buf
, &opts
->squash_onto
) < 0)
2317 return error(_("unusable squash-onto"));
2318 opts
->have_squash_onto
= 1;
2324 if (!file_exists(git_path_opts_file()))
2327 * The function git_parse_source(), called from git_config_from_file(),
2328 * may die() in case of a syntactically incorrect file. We do not care
2329 * about this case, though, because we wrote that file ourselves, so we
2330 * are pretty certain that it is syntactically correct.
2332 if (git_config_from_file(populate_opts_cb
, git_path_opts_file(), opts
) < 0)
2333 return error(_("malformed options sheet: '%s'"),
2334 git_path_opts_file());
2338 static int walk_revs_populate_todo(struct todo_list
*todo_list
,
2339 struct replay_opts
*opts
)
2341 enum todo_command command
= opts
->action
== REPLAY_PICK
?
2342 TODO_PICK
: TODO_REVERT
;
2343 const char *command_string
= todo_command_info
[command
].str
;
2344 struct commit
*commit
;
2346 if (prepare_revs(opts
))
2349 while ((commit
= get_revision(opts
->revs
))) {
2350 struct todo_item
*item
= append_new_todo(todo_list
);
2351 const char *commit_buffer
= get_commit_buffer(commit
, NULL
);
2352 const char *subject
;
2355 item
->command
= command
;
2356 item
->commit
= commit
;
2359 item
->offset_in_buf
= todo_list
->buf
.len
;
2360 subject_len
= find_commit_subject(commit_buffer
, &subject
);
2361 strbuf_addf(&todo_list
->buf
, "%s %s %.*s\n", command_string
,
2362 short_commit_name(commit
), subject_len
, subject
);
2363 unuse_commit_buffer(commit
, commit_buffer
);
2367 return error(_("empty commit set passed"));
2372 static int create_seq_dir(void)
2374 if (file_exists(git_path_seq_dir())) {
2375 error(_("a cherry-pick or revert is already in progress"));
2376 advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
2378 } else if (mkdir(git_path_seq_dir(), 0777) < 0)
2379 return error_errno(_("could not create sequencer directory '%s'"),
2380 git_path_seq_dir());
2384 static int save_head(const char *head
)
2386 struct lock_file head_lock
= LOCK_INIT
;
2387 struct strbuf buf
= STRBUF_INIT
;
2391 fd
= hold_lock_file_for_update(&head_lock
, git_path_head_file(), 0);
2393 return error_errno(_("could not lock HEAD"));
2394 strbuf_addf(&buf
, "%s\n", head
);
2395 written
= write_in_full(fd
, buf
.buf
, buf
.len
);
2396 strbuf_release(&buf
);
2398 error_errno(_("could not write to '%s'"), git_path_head_file());
2399 rollback_lock_file(&head_lock
);
2402 if (commit_lock_file(&head_lock
) < 0)
2403 return error(_("failed to finalize '%s'"), git_path_head_file());
2407 static int rollback_is_safe(void)
2409 struct strbuf sb
= STRBUF_INIT
;
2410 struct object_id expected_head
, actual_head
;
2412 if (strbuf_read_file(&sb
, git_path_abort_safety_file(), 0) >= 0) {
2414 if (get_oid_hex(sb
.buf
, &expected_head
)) {
2415 strbuf_release(&sb
);
2416 die(_("could not parse %s"), git_path_abort_safety_file());
2418 strbuf_release(&sb
);
2420 else if (errno
== ENOENT
)
2421 oidclr(&expected_head
);
2423 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2425 if (get_oid("HEAD", &actual_head
))
2426 oidclr(&actual_head
);
2428 return !oidcmp(&actual_head
, &expected_head
);
2431 static int reset_for_rollback(const struct object_id
*oid
)
2433 const char *argv
[4]; /* reset --merge <arg> + NULL */
2436 argv
[1] = "--merge";
2437 argv
[2] = oid_to_hex(oid
);
2439 return run_command_v_opt(argv
, RUN_GIT_CMD
);
2442 static int rollback_single_pick(void)
2444 struct object_id head_oid
;
2446 if (!file_exists(git_path_cherry_pick_head(the_repository
)) &&
2447 !file_exists(git_path_revert_head(the_repository
)))
2448 return error(_("no cherry-pick or revert in progress"));
2449 if (read_ref_full("HEAD", 0, &head_oid
, NULL
))
2450 return error(_("cannot resolve HEAD"));
2451 if (is_null_oid(&head_oid
))
2452 return error(_("cannot abort from a branch yet to be born"));
2453 return reset_for_rollback(&head_oid
);
2456 int sequencer_rollback(struct replay_opts
*opts
)
2459 struct object_id oid
;
2460 struct strbuf buf
= STRBUF_INIT
;
2463 f
= fopen(git_path_head_file(), "r");
2464 if (!f
&& errno
== ENOENT
) {
2466 * There is no multiple-cherry-pick in progress.
2467 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2468 * a single-cherry-pick in progress, abort that.
2470 return rollback_single_pick();
2473 return error_errno(_("cannot open '%s'"), git_path_head_file());
2474 if (strbuf_getline_lf(&buf
, f
)) {
2475 error(_("cannot read '%s': %s"), git_path_head_file(),
2476 ferror(f
) ? strerror(errno
) : _("unexpected end of file"));
2481 if (parse_oid_hex(buf
.buf
, &oid
, &p
) || *p
!= '\0') {
2482 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2483 git_path_head_file());
2486 if (is_null_oid(&oid
)) {
2487 error(_("cannot abort from a branch yet to be born"));
2491 if (!rollback_is_safe()) {
2492 /* Do not error, just do not rollback */
2493 warning(_("You seem to have moved HEAD. "
2494 "Not rewinding, check your HEAD!"));
2496 if (reset_for_rollback(&oid
))
2498 strbuf_release(&buf
);
2499 return sequencer_remove_state(opts
);
2501 strbuf_release(&buf
);
2505 static int save_todo(struct todo_list
*todo_list
, struct replay_opts
*opts
)
2507 struct lock_file todo_lock
= LOCK_INIT
;
2508 const char *todo_path
= get_todo_path(opts
);
2509 int next
= todo_list
->current
, offset
, fd
;
2512 * rebase -i writes "git-rebase-todo" without the currently executing
2513 * command, appending it to "done" instead.
2515 if (is_rebase_i(opts
))
2518 fd
= hold_lock_file_for_update(&todo_lock
, todo_path
, 0);
2520 return error_errno(_("could not lock '%s'"), todo_path
);
2521 offset
= get_item_line_offset(todo_list
, next
);
2522 if (write_in_full(fd
, todo_list
->buf
.buf
+ offset
,
2523 todo_list
->buf
.len
- offset
) < 0)
2524 return error_errno(_("could not write to '%s'"), todo_path
);
2525 if (commit_lock_file(&todo_lock
) < 0)
2526 return error(_("failed to finalize '%s'"), todo_path
);
2528 if (is_rebase_i(opts
) && next
> 0) {
2529 const char *done
= rebase_path_done();
2530 int fd
= open(done
, O_CREAT
| O_WRONLY
| O_APPEND
, 0666);
2535 if (write_in_full(fd
, get_item_line(todo_list
, next
- 1),
2536 get_item_line_length(todo_list
, next
- 1))
2538 ret
= error_errno(_("could not write to '%s'"), done
);
2540 ret
= error_errno(_("failed to finalize '%s'"), done
);
2546 static int save_opts(struct replay_opts
*opts
)
2548 const char *opts_file
= git_path_opts_file();
2551 if (opts
->no_commit
)
2552 res
|= git_config_set_in_file_gently(opts_file
, "options.no-commit", "true");
2554 res
|= git_config_set_in_file_gently(opts_file
, "options.edit", "true");
2556 res
|= git_config_set_in_file_gently(opts_file
, "options.signoff", "true");
2557 if (opts
->record_origin
)
2558 res
|= git_config_set_in_file_gently(opts_file
, "options.record-origin", "true");
2560 res
|= git_config_set_in_file_gently(opts_file
, "options.allow-ff", "true");
2561 if (opts
->mainline
) {
2562 struct strbuf buf
= STRBUF_INIT
;
2563 strbuf_addf(&buf
, "%d", opts
->mainline
);
2564 res
|= git_config_set_in_file_gently(opts_file
, "options.mainline", buf
.buf
);
2565 strbuf_release(&buf
);
2568 res
|= git_config_set_in_file_gently(opts_file
, "options.strategy", opts
->strategy
);
2570 res
|= git_config_set_in_file_gently(opts_file
, "options.gpg-sign", opts
->gpg_sign
);
2573 for (i
= 0; i
< opts
->xopts_nr
; i
++)
2574 res
|= git_config_set_multivar_in_file_gently(opts_file
,
2575 "options.strategy-option",
2576 opts
->xopts
[i
], "^$", 0);
2578 if (opts
->allow_rerere_auto
)
2579 res
|= git_config_set_in_file_gently(opts_file
, "options.allow-rerere-auto",
2580 opts
->allow_rerere_auto
== RERERE_AUTOUPDATE
?
2585 static int make_patch(struct commit
*commit
, struct replay_opts
*opts
)
2587 struct strbuf buf
= STRBUF_INIT
;
2588 struct rev_info log_tree_opt
;
2589 const char *subject
, *p
;
2592 p
= short_commit_name(commit
);
2593 if (write_message(p
, strlen(p
), rebase_path_stopped_sha(), 1) < 0)
2595 if (update_ref("rebase", "REBASE_HEAD", &commit
->object
.oid
,
2596 NULL
, REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
2597 res
|= error(_("could not update %s"), "REBASE_HEAD");
2599 strbuf_addf(&buf
, "%s/patch", get_dir(opts
));
2600 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
2601 init_revisions(&log_tree_opt
, NULL
);
2602 log_tree_opt
.abbrev
= 0;
2603 log_tree_opt
.diff
= 1;
2604 log_tree_opt
.diffopt
.output_format
= DIFF_FORMAT_PATCH
;
2605 log_tree_opt
.disable_stdin
= 1;
2606 log_tree_opt
.no_commit_id
= 1;
2607 log_tree_opt
.diffopt
.file
= fopen(buf
.buf
, "w");
2608 log_tree_opt
.diffopt
.use_color
= GIT_COLOR_NEVER
;
2609 if (!log_tree_opt
.diffopt
.file
)
2610 res
|= error_errno(_("could not open '%s'"), buf
.buf
);
2612 res
|= log_tree_commit(&log_tree_opt
, commit
);
2613 fclose(log_tree_opt
.diffopt
.file
);
2617 strbuf_addf(&buf
, "%s/message", get_dir(opts
));
2618 if (!file_exists(buf
.buf
)) {
2619 const char *commit_buffer
= get_commit_buffer(commit
, NULL
);
2620 find_commit_subject(commit_buffer
, &subject
);
2621 res
|= write_message(subject
, strlen(subject
), buf
.buf
, 1);
2622 unuse_commit_buffer(commit
, commit_buffer
);
2624 strbuf_release(&buf
);
2629 static int intend_to_amend(void)
2631 struct object_id head
;
2634 if (get_oid("HEAD", &head
))
2635 return error(_("cannot read HEAD"));
2637 p
= oid_to_hex(&head
);
2638 return write_message(p
, strlen(p
), rebase_path_amend(), 1);
2641 static int error_with_patch(struct commit
*commit
,
2642 const char *subject
, int subject_len
,
2643 struct replay_opts
*opts
, int exit_code
, int to_amend
)
2646 if (make_patch(commit
, opts
))
2648 } else if (copy_file(rebase_path_message(),
2649 git_path_merge_msg(the_repository
), 0666))
2650 return error(_("unable to copy '%s' to '%s'"),
2651 git_path_merge_msg(the_repository
), rebase_path_message());
2654 if (intend_to_amend())
2658 _("You can amend the commit now, with\n"
2660 " git commit --amend %s\n"
2662 "Once you are satisfied with your changes, run\n"
2664 " git rebase --continue\n"),
2665 gpg_sign_opt_quoted(opts
));
2666 } else if (exit_code
) {
2668 fprintf_ln(stderr
, _("Could not apply %s... %.*s"),
2669 short_commit_name(commit
), subject_len
, subject
);
2672 * We don't have the hash of the parent so
2673 * just print the line from the todo file.
2675 fprintf_ln(stderr
, _("Could not merge %.*s"),
2676 subject_len
, subject
);
2682 static int error_failed_squash(struct commit
*commit
,
2683 struct replay_opts
*opts
, int subject_len
, const char *subject
)
2685 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
2686 return error(_("could not copy '%s' to '%s'"),
2687 rebase_path_squash_msg(), rebase_path_message());
2688 unlink(git_path_merge_msg(the_repository
));
2689 if (copy_file(git_path_merge_msg(the_repository
), rebase_path_message(), 0666))
2690 return error(_("could not copy '%s' to '%s'"),
2691 rebase_path_message(),
2692 git_path_merge_msg(the_repository
));
2693 return error_with_patch(commit
, subject
, subject_len
, opts
, 1, 0);
2696 static int do_exec(const char *command_line
)
2698 struct argv_array child_env
= ARGV_ARRAY_INIT
;
2699 const char *child_argv
[] = { NULL
, NULL
};
2702 fprintf(stderr
, "Executing: %s\n", command_line
);
2703 child_argv
[0] = command_line
;
2704 argv_array_pushf(&child_env
, "GIT_DIR=%s", absolute_path(get_git_dir()));
2705 argv_array_pushf(&child_env
, "GIT_WORK_TREE=%s",
2706 absolute_path(get_git_work_tree()));
2707 status
= run_command_v_opt_cd_env(child_argv
, RUN_USING_SHELL
, NULL
,
2710 /* force re-reading of the cache */
2711 if (discard_cache() < 0 || read_cache() < 0)
2712 return error(_("could not read index"));
2714 dirty
= require_clean_work_tree("rebase", NULL
, 1, 1);
2717 warning(_("execution failed: %s\n%s"
2718 "You can fix the problem, and then run\n"
2720 " git rebase --continue\n"
2723 dirty
? N_("and made changes to the index and/or the "
2724 "working tree\n") : "");
2726 /* command not found */
2729 warning(_("execution succeeded: %s\nbut "
2730 "left changes to the index and/or the working tree\n"
2731 "Commit or stash your changes, and then run\n"
2733 " git rebase --continue\n"
2734 "\n"), command_line
);
2738 argv_array_clear(&child_env
);
2743 static int safe_append(const char *filename
, const char *fmt
, ...)
2746 struct lock_file lock
= LOCK_INIT
;
2747 int fd
= hold_lock_file_for_update(&lock
, filename
,
2748 LOCK_REPORT_ON_ERROR
);
2749 struct strbuf buf
= STRBUF_INIT
;
2754 if (strbuf_read_file(&buf
, filename
, 0) < 0 && errno
!= ENOENT
) {
2755 error_errno(_("could not read '%s'"), filename
);
2756 rollback_lock_file(&lock
);
2759 strbuf_complete(&buf
, '\n');
2761 strbuf_vaddf(&buf
, fmt
, ap
);
2764 if (write_in_full(fd
, buf
.buf
, buf
.len
) < 0) {
2765 error_errno(_("could not write to '%s'"), filename
);
2766 strbuf_release(&buf
);
2767 rollback_lock_file(&lock
);
2770 if (commit_lock_file(&lock
) < 0) {
2771 strbuf_release(&buf
);
2772 rollback_lock_file(&lock
);
2773 return error(_("failed to finalize '%s'"), filename
);
2776 strbuf_release(&buf
);
2780 static int do_label(const char *name
, int len
)
2782 struct ref_store
*refs
= get_main_ref_store(the_repository
);
2783 struct ref_transaction
*transaction
;
2784 struct strbuf ref_name
= STRBUF_INIT
, err
= STRBUF_INIT
;
2785 struct strbuf msg
= STRBUF_INIT
;
2787 struct object_id head_oid
;
2789 if (len
== 1 && *name
== '#')
2790 return error(_("illegal label name: '%.*s'"), len
, name
);
2792 strbuf_addf(&ref_name
, "refs/rewritten/%.*s", len
, name
);
2793 strbuf_addf(&msg
, "rebase -i (label) '%.*s'", len
, name
);
2795 transaction
= ref_store_transaction_begin(refs
, &err
);
2797 error("%s", err
.buf
);
2799 } else if (get_oid("HEAD", &head_oid
)) {
2800 error(_("could not read HEAD"));
2802 } else if (ref_transaction_update(transaction
, ref_name
.buf
, &head_oid
,
2803 NULL
, 0, msg
.buf
, &err
) < 0 ||
2804 ref_transaction_commit(transaction
, &err
)) {
2805 error("%s", err
.buf
);
2808 ref_transaction_free(transaction
);
2809 strbuf_release(&err
);
2810 strbuf_release(&msg
);
2813 ret
= safe_append(rebase_path_refs_to_delete(),
2814 "%s\n", ref_name
.buf
);
2815 strbuf_release(&ref_name
);
2820 static const char *reflog_message(struct replay_opts
*opts
,
2821 const char *sub_action
, const char *fmt
, ...);
2823 static int do_reset(const char *name
, int len
, struct replay_opts
*opts
)
2825 struct strbuf ref_name
= STRBUF_INIT
;
2826 struct object_id oid
;
2827 struct lock_file lock
= LOCK_INIT
;
2828 struct tree_desc desc
;
2830 struct unpack_trees_options unpack_tree_opts
;
2833 if (hold_locked_index(&lock
, LOCK_REPORT_ON_ERROR
) < 0)
2836 if (len
== 10 && !strncmp("[new root]", name
, len
)) {
2837 if (!opts
->have_squash_onto
) {
2839 if (commit_tree("", 0, the_hash_algo
->empty_tree
,
2840 NULL
, &opts
->squash_onto
,
2842 return error(_("writing fake root commit"));
2843 opts
->have_squash_onto
= 1;
2844 hex
= oid_to_hex(&opts
->squash_onto
);
2845 if (write_message(hex
, strlen(hex
),
2846 rebase_path_squash_onto(), 0))
2847 return error(_("writing squash-onto"));
2849 oidcpy(&oid
, &opts
->squash_onto
);
2851 /* Determine the length of the label */
2852 for (i
= 0; i
< len
; i
++)
2853 if (isspace(name
[i
]))
2856 strbuf_addf(&ref_name
, "refs/rewritten/%.*s", len
, name
);
2857 if (get_oid(ref_name
.buf
, &oid
) &&
2858 get_oid(ref_name
.buf
+ strlen("refs/rewritten/"), &oid
)) {
2859 error(_("could not read '%s'"), ref_name
.buf
);
2860 rollback_lock_file(&lock
);
2861 strbuf_release(&ref_name
);
2866 memset(&unpack_tree_opts
, 0, sizeof(unpack_tree_opts
));
2867 setup_unpack_trees_porcelain(&unpack_tree_opts
, "reset");
2868 unpack_tree_opts
.head_idx
= 1;
2869 unpack_tree_opts
.src_index
= &the_index
;
2870 unpack_tree_opts
.dst_index
= &the_index
;
2871 unpack_tree_opts
.fn
= oneway_merge
;
2872 unpack_tree_opts
.merge
= 1;
2873 unpack_tree_opts
.update
= 1;
2875 if (read_cache_unmerged()) {
2876 rollback_lock_file(&lock
);
2877 strbuf_release(&ref_name
);
2878 return error_resolve_conflict(_(action_name(opts
)));
2881 if (!fill_tree_descriptor(&desc
, &oid
)) {
2882 error(_("failed to find tree of %s"), oid_to_hex(&oid
));
2883 rollback_lock_file(&lock
);
2884 free((void *)desc
.buffer
);
2885 strbuf_release(&ref_name
);
2889 if (unpack_trees(1, &desc
, &unpack_tree_opts
)) {
2890 rollback_lock_file(&lock
);
2891 free((void *)desc
.buffer
);
2892 strbuf_release(&ref_name
);
2896 tree
= parse_tree_indirect(&oid
);
2897 prime_cache_tree(&the_index
, tree
);
2899 if (write_locked_index(&the_index
, &lock
, COMMIT_LOCK
) < 0)
2900 ret
= error(_("could not write index"));
2901 free((void *)desc
.buffer
);
2904 ret
= update_ref(reflog_message(opts
, "reset", "'%.*s'",
2905 len
, name
), "HEAD", &oid
,
2906 NULL
, 0, UPDATE_REFS_MSG_ON_ERR
);
2908 strbuf_release(&ref_name
);
2912 static struct commit
*lookup_label(const char *label
, int len
,
2915 struct commit
*commit
;
2918 strbuf_addf(buf
, "refs/rewritten/%.*s", len
, label
);
2919 commit
= lookup_commit_reference_by_name(buf
->buf
);
2921 /* fall back to non-rewritten ref or commit */
2922 strbuf_splice(buf
, 0, strlen("refs/rewritten/"), "", 0);
2923 commit
= lookup_commit_reference_by_name(buf
->buf
);
2927 error(_("could not resolve '%s'"), buf
->buf
);
2932 static int do_merge(struct commit
*commit
, const char *arg
, int arg_len
,
2933 int flags
, struct replay_opts
*opts
)
2935 int run_commit_flags
= (flags
& TODO_EDIT_MERGE_MSG
) ?
2936 EDIT_MSG
| VERIFY_MSG
: 0;
2937 struct strbuf ref_name
= STRBUF_INIT
;
2938 struct commit
*head_commit
, *merge_commit
, *i
;
2939 struct commit_list
*bases
, *j
, *reversed
= NULL
;
2940 struct commit_list
*to_merge
= NULL
, **tail
= &to_merge
;
2941 struct merge_options o
;
2942 int merge_arg_len
, oneline_offset
, can_fast_forward
, ret
, k
;
2943 static struct lock_file lock
;
2946 if (hold_locked_index(&lock
, LOCK_REPORT_ON_ERROR
) < 0) {
2951 head_commit
= lookup_commit_reference_by_name("HEAD");
2953 ret
= error(_("cannot merge without a current revision"));
2958 * For octopus merges, the arg starts with the list of revisions to be
2959 * merged. The list is optionally followed by '#' and the oneline.
2961 merge_arg_len
= oneline_offset
= arg_len
;
2962 for (p
= arg
; p
- arg
< arg_len
; p
+= strspn(p
, " \t\n")) {
2965 if (*p
== '#' && (!p
[1] || isspace(p
[1]))) {
2966 p
+= 1 + strspn(p
+ 1, " \t\n");
2967 oneline_offset
= p
- arg
;
2970 k
= strcspn(p
, " \t\n");
2973 merge_commit
= lookup_label(p
, k
, &ref_name
);
2974 if (!merge_commit
) {
2975 ret
= error(_("unable to parse '%.*s'"), k
, p
);
2978 tail
= &commit_list_insert(merge_commit
, tail
)->next
;
2980 merge_arg_len
= p
- arg
;
2984 ret
= error(_("nothing to merge: '%.*s'"), arg_len
, arg
);
2988 if (opts
->have_squash_onto
&&
2989 !oidcmp(&head_commit
->object
.oid
, &opts
->squash_onto
)) {
2991 * When the user tells us to "merge" something into a
2992 * "[new root]", let's simply fast-forward to the merge head.
2994 rollback_lock_file(&lock
);
2996 ret
= error(_("octopus merge cannot be executed on "
2997 "top of a [new root]"));
2999 ret
= fast_forward_to(&to_merge
->item
->object
.oid
,
3000 &head_commit
->object
.oid
, 0,
3006 const char *message
= get_commit_buffer(commit
, NULL
);
3011 ret
= error(_("could not get commit message of '%s'"),
3012 oid_to_hex(&commit
->object
.oid
));
3015 write_author_script(message
);
3016 find_commit_subject(message
, &body
);
3018 ret
= write_message(body
, len
, git_path_merge_msg(the_repository
), 0);
3019 unuse_commit_buffer(commit
, message
);
3021 error_errno(_("could not write '%s'"),
3022 git_path_merge_msg(the_repository
));
3026 struct strbuf buf
= STRBUF_INIT
;
3029 strbuf_addf(&buf
, "author %s", git_author_info(0));
3030 write_author_script(buf
.buf
);
3033 if (oneline_offset
< arg_len
) {
3034 p
= arg
+ oneline_offset
;
3035 len
= arg_len
- oneline_offset
;
3037 strbuf_addf(&buf
, "Merge %s '%.*s'",
3038 to_merge
->next
? "branches" : "branch",
3039 merge_arg_len
, arg
);
3044 ret
= write_message(p
, len
, git_path_merge_msg(the_repository
), 0);
3045 strbuf_release(&buf
);
3047 error_errno(_("could not write '%s'"),
3048 git_path_merge_msg(the_repository
));
3054 * If HEAD is not identical to the first parent of the original merge
3055 * commit, we cannot fast-forward.
3057 can_fast_forward
= opts
->allow_ff
&& commit
&& commit
->parents
&&
3058 !oidcmp(&commit
->parents
->item
->object
.oid
,
3059 &head_commit
->object
.oid
);
3062 * If any merge head is different from the original one, we cannot
3065 if (can_fast_forward
) {
3066 struct commit_list
*p
= commit
->parents
->next
;
3068 for (j
= to_merge
; j
&& p
; j
= j
->next
, p
= p
->next
)
3069 if (oidcmp(&j
->item
->object
.oid
,
3070 &p
->item
->object
.oid
)) {
3071 can_fast_forward
= 0;
3075 * If the number of merge heads differs from the original merge
3076 * commit, we cannot fast-forward.
3079 can_fast_forward
= 0;
3082 if (can_fast_forward
) {
3083 rollback_lock_file(&lock
);
3084 ret
= fast_forward_to(&commit
->object
.oid
,
3085 &head_commit
->object
.oid
, 0, opts
);
3089 if (to_merge
->next
) {
3091 struct child_process cmd
= CHILD_PROCESS_INIT
;
3093 if (read_env_script(&cmd
.env_array
)) {
3094 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
3096 ret
= error(_(staged_changes_advice
), gpg_opt
, gpg_opt
);
3101 argv_array_push(&cmd
.args
, "merge");
3102 argv_array_push(&cmd
.args
, "-s");
3103 argv_array_push(&cmd
.args
, "octopus");
3104 argv_array_push(&cmd
.args
, "--no-edit");
3105 argv_array_push(&cmd
.args
, "--no-ff");
3106 argv_array_push(&cmd
.args
, "--no-log");
3107 argv_array_push(&cmd
.args
, "--no-stat");
3108 argv_array_push(&cmd
.args
, "-F");
3109 argv_array_push(&cmd
.args
, git_path_merge_msg(the_repository
));
3111 argv_array_push(&cmd
.args
, opts
->gpg_sign
);
3113 /* Add the tips to be merged */
3114 for (j
= to_merge
; j
; j
= j
->next
)
3115 argv_array_push(&cmd
.args
,
3116 oid_to_hex(&j
->item
->object
.oid
));
3118 strbuf_release(&ref_name
);
3119 unlink(git_path_cherry_pick_head(the_repository
));
3120 rollback_lock_file(&lock
);
3122 rollback_lock_file(&lock
);
3123 ret
= run_command(&cmd
);
3125 /* force re-reading of the cache */
3126 if (!ret
&& (discard_cache() < 0 || read_cache() < 0))
3127 ret
= error(_("could not read index"));
3131 merge_commit
= to_merge
->item
;
3132 write_message(oid_to_hex(&merge_commit
->object
.oid
), GIT_SHA1_HEXSZ
,
3133 git_path_merge_head(the_repository
), 0);
3134 write_message("no-ff", 5, git_path_merge_mode(the_repository
), 0);
3136 bases
= get_merge_bases(head_commit
, merge_commit
);
3137 if (bases
&& !oidcmp(&merge_commit
->object
.oid
,
3138 &bases
->item
->object
.oid
)) {
3140 /* skip merging an ancestor of HEAD */
3144 for (j
= bases
; j
; j
= j
->next
)
3145 commit_list_insert(j
->item
, &reversed
);
3146 free_commit_list(bases
);
3149 init_merge_options(&o
);
3151 o
.branch2
= ref_name
.buf
;
3152 o
.buffer_output
= 2;
3154 ret
= merge_recursive(&o
, head_commit
, merge_commit
, reversed
, &i
);
3156 fputs(o
.obuf
.buf
, stdout
);
3157 strbuf_release(&o
.obuf
);
3159 error(_("could not even attempt to merge '%.*s'"),
3160 merge_arg_len
, arg
);
3164 * The return value of merge_recursive() is 1 on clean, and 0 on
3167 * Let's reverse that, so that do_merge() returns 0 upon success and
3168 * 1 upon failed merge (keeping the return value -1 for the cases where
3169 * we will want to reschedule the `merge` command).
3173 if (active_cache_changed
&&
3174 write_locked_index(&the_index
, &lock
, COMMIT_LOCK
)) {
3175 ret
= error(_("merge: Unable to write new index file"));
3179 rollback_lock_file(&lock
);
3181 rerere(opts
->allow_rerere_auto
);
3184 * In case of problems, we now want to return a positive
3185 * value (a negative one would indicate that the `merge`
3186 * command needs to be rescheduled).
3188 ret
= !!run_git_commit(git_path_merge_msg(the_repository
), opts
,
3192 strbuf_release(&ref_name
);
3193 rollback_lock_file(&lock
);
3194 free_commit_list(to_merge
);
3198 static int is_final_fixup(struct todo_list
*todo_list
)
3200 int i
= todo_list
->current
;
3202 if (!is_fixup(todo_list
->items
[i
].command
))
3205 while (++i
< todo_list
->nr
)
3206 if (is_fixup(todo_list
->items
[i
].command
))
3208 else if (!is_noop(todo_list
->items
[i
].command
))
3213 static enum todo_command
peek_command(struct todo_list
*todo_list
, int offset
)
3217 for (i
= todo_list
->current
+ offset
; i
< todo_list
->nr
; i
++)
3218 if (!is_noop(todo_list
->items
[i
].command
))
3219 return todo_list
->items
[i
].command
;
3224 static int apply_autostash(struct replay_opts
*opts
)
3226 struct strbuf stash_sha1
= STRBUF_INIT
;
3227 struct child_process child
= CHILD_PROCESS_INIT
;
3230 if (!read_oneliner(&stash_sha1
, rebase_path_autostash(), 1)) {
3231 strbuf_release(&stash_sha1
);
3234 strbuf_trim(&stash_sha1
);
3237 child
.no_stdout
= 1;
3238 child
.no_stderr
= 1;
3239 argv_array_push(&child
.args
, "stash");
3240 argv_array_push(&child
.args
, "apply");
3241 argv_array_push(&child
.args
, stash_sha1
.buf
);
3242 if (!run_command(&child
))
3243 fprintf(stderr
, _("Applied autostash.\n"));
3245 struct child_process store
= CHILD_PROCESS_INIT
;
3248 argv_array_push(&store
.args
, "stash");
3249 argv_array_push(&store
.args
, "store");
3250 argv_array_push(&store
.args
, "-m");
3251 argv_array_push(&store
.args
, "autostash");
3252 argv_array_push(&store
.args
, "-q");
3253 argv_array_push(&store
.args
, stash_sha1
.buf
);
3254 if (run_command(&store
))
3255 ret
= error(_("cannot store %s"), stash_sha1
.buf
);
3258 _("Applying autostash resulted in conflicts.\n"
3259 "Your changes are safe in the stash.\n"
3260 "You can run \"git stash pop\" or"
3261 " \"git stash drop\" at any time.\n"));
3264 strbuf_release(&stash_sha1
);
3268 static const char *reflog_message(struct replay_opts
*opts
,
3269 const char *sub_action
, const char *fmt
, ...)
3272 static struct strbuf buf
= STRBUF_INIT
;
3276 strbuf_addstr(&buf
, action_name(opts
));
3278 strbuf_addf(&buf
, " (%s)", sub_action
);
3280 strbuf_addstr(&buf
, ": ");
3281 strbuf_vaddf(&buf
, fmt
, ap
);
3288 static const char rescheduled_advice
[] =
3289 N_("Could not execute the todo command\n"
3293 "It has been rescheduled; To edit the command before continuing, please\n"
3294 "edit the todo list first:\n"
3296 " git rebase --edit-todo\n"
3297 " git rebase --continue\n");
3299 static int pick_commits(struct todo_list
*todo_list
, struct replay_opts
*opts
)
3301 int res
= 0, reschedule
= 0;
3303 setenv(GIT_REFLOG_ACTION
, action_name(opts
), 0);
3305 assert(!(opts
->signoff
|| opts
->no_commit
||
3306 opts
->record_origin
|| opts
->edit
));
3307 if (read_and_refresh_cache(opts
))
3310 while (todo_list
->current
< todo_list
->nr
) {
3311 struct todo_item
*item
= todo_list
->items
+ todo_list
->current
;
3312 if (save_todo(todo_list
, opts
))
3314 if (is_rebase_i(opts
)) {
3315 if (item
->command
!= TODO_COMMENT
) {
3316 FILE *f
= fopen(rebase_path_msgnum(), "w");
3318 todo_list
->done_nr
++;
3321 fprintf(f
, "%d\n", todo_list
->done_nr
);
3324 fprintf(stderr
, "Rebasing (%d/%d)%s",
3326 todo_list
->total_nr
,
3327 opts
->verbose
? "\n" : "\r");
3329 unlink(rebase_path_message());
3330 unlink(rebase_path_author_script());
3331 unlink(rebase_path_stopped_sha());
3332 unlink(rebase_path_amend());
3333 delete_ref(NULL
, "REBASE_HEAD", NULL
, REF_NO_DEREF
);
3335 if (item
->command
<= TODO_SQUASH
) {
3336 if (is_rebase_i(opts
))
3337 setenv("GIT_REFLOG_ACTION", reflog_message(opts
,
3338 command_to_string(item
->command
), NULL
),
3340 res
= do_pick_commit(item
->command
, item
->commit
,
3341 opts
, is_final_fixup(todo_list
));
3342 if (is_rebase_i(opts
) && res
< 0) {
3344 advise(_(rescheduled_advice
),
3345 get_item_line_length(todo_list
,
3346 todo_list
->current
),
3347 get_item_line(todo_list
,
3348 todo_list
->current
));
3349 todo_list
->current
--;
3350 if (save_todo(todo_list
, opts
))
3353 if (item
->command
== TODO_EDIT
) {
3354 struct commit
*commit
= item
->commit
;
3357 _("Stopped at %s... %.*s\n"),
3358 short_commit_name(commit
),
3359 item
->arg_len
, item
->arg
);
3360 return error_with_patch(commit
,
3361 item
->arg
, item
->arg_len
, opts
, res
,
3364 if (is_rebase_i(opts
) && !res
)
3365 record_in_rewritten(&item
->commit
->object
.oid
,
3366 peek_command(todo_list
, 1));
3367 if (res
&& is_fixup(item
->command
)) {
3370 return error_failed_squash(item
->commit
, opts
,
3371 item
->arg_len
, item
->arg
);
3372 } else if (res
&& is_rebase_i(opts
) && item
->commit
) {
3374 struct object_id oid
;
3377 * If we are rewording and have either
3378 * fast-forwarded already, or are about to
3379 * create a new root commit, we want to amend,
3380 * otherwise we do not.
3382 if (item
->command
== TODO_REWORD
&&
3383 !get_oid("HEAD", &oid
) &&
3384 (!oidcmp(&item
->commit
->object
.oid
, &oid
) ||
3385 (opts
->have_squash_onto
&&
3386 !oidcmp(&opts
->squash_onto
, &oid
))))
3389 return res
| error_with_patch(item
->commit
,
3390 item
->arg
, item
->arg_len
, opts
,
3393 } else if (item
->command
== TODO_EXEC
) {
3394 char *end_of_arg
= (char *)(item
->arg
+ item
->arg_len
);
3395 int saved
= *end_of_arg
;
3399 res
= do_exec(item
->arg
);
3400 *end_of_arg
= saved
;
3402 /* Reread the todo file if it has changed. */
3404 ; /* fall through */
3405 else if (stat(get_todo_path(opts
), &st
))
3406 res
= error_errno(_("could not stat '%s'"),
3407 get_todo_path(opts
));
3408 else if (match_stat_data(&todo_list
->stat
, &st
)) {
3409 todo_list_release(todo_list
);
3410 if (read_populate_todo(todo_list
, opts
))
3411 res
= -1; /* message was printed */
3412 /* `current` will be incremented below */
3413 todo_list
->current
= -1;
3415 } else if (item
->command
== TODO_LABEL
) {
3416 if ((res
= do_label(item
->arg
, item
->arg_len
)))
3418 } else if (item
->command
== TODO_RESET
) {
3419 if ((res
= do_reset(item
->arg
, item
->arg_len
, opts
)))
3421 } else if (item
->command
== TODO_MERGE
) {
3422 if ((res
= do_merge(item
->commit
,
3423 item
->arg
, item
->arg_len
,
3424 item
->flags
, opts
)) < 0)
3426 else if (item
->commit
)
3427 record_in_rewritten(&item
->commit
->object
.oid
,
3428 peek_command(todo_list
, 1));
3430 /* failed with merge conflicts */
3431 return error_with_patch(item
->commit
,
3433 item
->arg_len
, opts
,
3435 } else if (!is_noop(item
->command
))
3436 return error(_("unknown command %d"), item
->command
);
3439 advise(_(rescheduled_advice
),
3440 get_item_line_length(todo_list
,
3441 todo_list
->current
),
3442 get_item_line(todo_list
, todo_list
->current
));
3443 todo_list
->current
--;
3444 if (save_todo(todo_list
, opts
))
3447 return error_with_patch(item
->commit
,
3449 item
->arg_len
, opts
,
3453 todo_list
->current
++;
3458 if (is_rebase_i(opts
)) {
3459 struct strbuf head_ref
= STRBUF_INIT
, buf
= STRBUF_INIT
;
3462 /* Stopped in the middle, as planned? */
3463 if (todo_list
->current
< todo_list
->nr
)
3466 if (read_oneliner(&head_ref
, rebase_path_head_name(), 0) &&
3467 starts_with(head_ref
.buf
, "refs/")) {
3469 struct object_id head
, orig
;
3472 if (get_oid("HEAD", &head
)) {
3473 res
= error(_("cannot read HEAD"));
3475 strbuf_release(&head_ref
);
3476 strbuf_release(&buf
);
3479 if (!read_oneliner(&buf
, rebase_path_orig_head(), 0) ||
3480 get_oid_hex(buf
.buf
, &orig
)) {
3481 res
= error(_("could not read orig-head"));
3482 goto cleanup_head_ref
;
3485 if (!read_oneliner(&buf
, rebase_path_onto(), 0)) {
3486 res
= error(_("could not read 'onto'"));
3487 goto cleanup_head_ref
;
3489 msg
= reflog_message(opts
, "finish", "%s onto %s",
3490 head_ref
.buf
, buf
.buf
);
3491 if (update_ref(msg
, head_ref
.buf
, &head
, &orig
,
3492 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
)) {
3493 res
= error(_("could not update %s"),
3495 goto cleanup_head_ref
;
3497 msg
= reflog_message(opts
, "finish", "returning to %s",
3499 if (create_symref("HEAD", head_ref
.buf
, msg
)) {
3500 res
= error(_("could not update HEAD to %s"),
3502 goto cleanup_head_ref
;
3507 if (opts
->verbose
) {
3508 struct rev_info log_tree_opt
;
3509 struct object_id orig
, head
;
3511 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
3512 init_revisions(&log_tree_opt
, NULL
);
3513 log_tree_opt
.diff
= 1;
3514 log_tree_opt
.diffopt
.output_format
=
3515 DIFF_FORMAT_DIFFSTAT
;
3516 log_tree_opt
.disable_stdin
= 1;
3518 if (read_oneliner(&buf
, rebase_path_orig_head(), 0) &&
3519 !get_oid(buf
.buf
, &orig
) &&
3520 !get_oid("HEAD", &head
)) {
3521 diff_tree_oid(&orig
, &head
, "",
3522 &log_tree_opt
.diffopt
);
3523 log_tree_diff_flush(&log_tree_opt
);
3526 flush_rewritten_pending();
3527 if (!stat(rebase_path_rewritten_list(), &st
) &&
3529 struct child_process child
= CHILD_PROCESS_INIT
;
3530 const char *post_rewrite_hook
=
3531 find_hook("post-rewrite");
3533 child
.in
= open(rebase_path_rewritten_list(), O_RDONLY
);
3535 argv_array_push(&child
.args
, "notes");
3536 argv_array_push(&child
.args
, "copy");
3537 argv_array_push(&child
.args
, "--for-rewrite=rebase");
3538 /* we don't care if this copying failed */
3539 run_command(&child
);
3541 if (post_rewrite_hook
) {
3542 struct child_process hook
= CHILD_PROCESS_INIT
;
3544 hook
.in
= open(rebase_path_rewritten_list(),
3546 hook
.stdout_to_stderr
= 1;
3547 argv_array_push(&hook
.args
, post_rewrite_hook
);
3548 argv_array_push(&hook
.args
, "rebase");
3549 /* we don't care if this hook failed */
3553 apply_autostash(opts
);
3555 fprintf(stderr
, "Successfully rebased and updated %s.\n",
3558 strbuf_release(&buf
);
3559 strbuf_release(&head_ref
);
3563 * Sequence of picks finished successfully; cleanup by
3564 * removing the .git/sequencer directory
3566 return sequencer_remove_state(opts
);
3569 static int continue_single_pick(void)
3571 const char *argv
[] = { "commit", NULL
};
3573 if (!file_exists(git_path_cherry_pick_head(the_repository
)) &&
3574 !file_exists(git_path_revert_head(the_repository
)))
3575 return error(_("no cherry-pick or revert in progress"));
3576 return run_command_v_opt(argv
, RUN_GIT_CMD
);
3579 static int commit_staged_changes(struct replay_opts
*opts
,
3580 struct todo_list
*todo_list
)
3582 unsigned int flags
= ALLOW_EMPTY
| EDIT_MSG
;
3583 unsigned int final_fixup
= 0, is_clean
;
3585 if (has_unstaged_changes(1))
3586 return error(_("cannot rebase: You have unstaged changes."));
3588 is_clean
= !has_uncommitted_changes(0);
3590 if (file_exists(rebase_path_amend())) {
3591 struct strbuf rev
= STRBUF_INIT
;
3592 struct object_id head
, to_amend
;
3594 if (get_oid("HEAD", &head
))
3595 return error(_("cannot amend non-existing commit"));
3596 if (!read_oneliner(&rev
, rebase_path_amend(), 0))
3597 return error(_("invalid file: '%s'"), rebase_path_amend());
3598 if (get_oid_hex(rev
.buf
, &to_amend
))
3599 return error(_("invalid contents: '%s'"),
3600 rebase_path_amend());
3601 if (!is_clean
&& oidcmp(&head
, &to_amend
))
3602 return error(_("\nYou have uncommitted changes in your "
3603 "working tree. Please, commit them\n"
3604 "first and then run 'git rebase "
3605 "--continue' again."));
3607 * When skipping a failed fixup/squash, we need to edit the
3608 * commit message, the current fixup list and count, and if it
3609 * was the last fixup/squash in the chain, we need to clean up
3610 * the commit message and if there was a squash, let the user
3613 if (!is_clean
|| !opts
->current_fixup_count
)
3614 ; /* this is not the final fixup */
3615 else if (oidcmp(&head
, &to_amend
) ||
3616 !file_exists(rebase_path_stopped_sha())) {
3617 /* was a final fixup or squash done manually? */
3618 if (!is_fixup(peek_command(todo_list
, 0))) {
3619 unlink(rebase_path_fixup_msg());
3620 unlink(rebase_path_squash_msg());
3621 unlink(rebase_path_current_fixups());
3622 strbuf_reset(&opts
->current_fixups
);
3623 opts
->current_fixup_count
= 0;
3626 /* we are in a fixup/squash chain */
3627 const char *p
= opts
->current_fixups
.buf
;
3628 int len
= opts
->current_fixups
.len
;
3630 opts
->current_fixup_count
--;
3632 BUG("Incorrect current_fixups:\n%s", p
);
3633 while (len
&& p
[len
- 1] != '\n')
3635 strbuf_setlen(&opts
->current_fixups
, len
);
3636 if (write_message(p
, len
, rebase_path_current_fixups(),
3638 return error(_("could not write file: '%s'"),
3639 rebase_path_current_fixups());
3642 * If a fixup/squash in a fixup/squash chain failed, the
3643 * commit message is already correct, no need to commit
3646 * Only if it is the final command in the fixup/squash
3647 * chain, and only if the chain is longer than a single
3648 * fixup/squash command (which was just skipped), do we
3649 * actually need to re-commit with a cleaned up commit
3652 if (opts
->current_fixup_count
> 0 &&
3653 !is_fixup(peek_command(todo_list
, 0))) {
3656 * If there was not a single "squash" in the
3657 * chain, we only need to clean up the commit
3658 * message, no need to bother the user with
3659 * opening the commit message in the editor.
3661 if (!starts_with(p
, "squash ") &&
3662 !strstr(p
, "\nsquash "))
3663 flags
= (flags
& ~EDIT_MSG
) | CLEANUP_MSG
;
3664 } else if (is_fixup(peek_command(todo_list
, 0))) {
3666 * We need to update the squash message to skip
3667 * the latest commit message.
3669 struct commit
*commit
;
3670 const char *path
= rebase_path_squash_msg();
3672 if (parse_head(&commit
) ||
3673 !(p
= get_commit_buffer(commit
, NULL
)) ||
3674 write_message(p
, strlen(p
), path
, 0)) {
3675 unuse_commit_buffer(commit
, p
);
3676 return error(_("could not write file: "
3679 unuse_commit_buffer(commit
, p
);
3683 strbuf_release(&rev
);
3688 const char *cherry_pick_head
= git_path_cherry_pick_head(the_repository
);
3690 if (file_exists(cherry_pick_head
) && unlink(cherry_pick_head
))
3691 return error(_("could not remove CHERRY_PICK_HEAD"));
3696 if (run_git_commit(final_fixup
? NULL
: rebase_path_message(),
3698 return error(_("could not commit staged changes."));
3699 unlink(rebase_path_amend());
3701 unlink(rebase_path_fixup_msg());
3702 unlink(rebase_path_squash_msg());
3704 if (opts
->current_fixup_count
> 0) {
3706 * Whether final fixup or not, we just cleaned up the commit
3709 unlink(rebase_path_current_fixups());
3710 strbuf_reset(&opts
->current_fixups
);
3711 opts
->current_fixup_count
= 0;
3716 int sequencer_continue(struct replay_opts
*opts
)
3718 struct todo_list todo_list
= TODO_LIST_INIT
;
3721 if (read_and_refresh_cache(opts
))
3724 if (read_populate_opts(opts
))
3726 if (is_rebase_i(opts
)) {
3727 if ((res
= read_populate_todo(&todo_list
, opts
)))
3728 goto release_todo_list
;
3729 if (commit_staged_changes(opts
, &todo_list
))
3731 } else if (!file_exists(get_todo_path(opts
)))
3732 return continue_single_pick();
3733 else if ((res
= read_populate_todo(&todo_list
, opts
)))
3734 goto release_todo_list
;
3736 if (!is_rebase_i(opts
)) {
3737 /* Verify that the conflict has been resolved */
3738 if (file_exists(git_path_cherry_pick_head(the_repository
)) ||
3739 file_exists(git_path_revert_head(the_repository
))) {
3740 res
= continue_single_pick();
3742 goto release_todo_list
;
3744 if (index_differs_from("HEAD", NULL
, 0)) {
3745 res
= error_dirty_index(opts
);
3746 goto release_todo_list
;
3748 todo_list
.current
++;
3749 } else if (file_exists(rebase_path_stopped_sha())) {
3750 struct strbuf buf
= STRBUF_INIT
;
3751 struct object_id oid
;
3753 if (read_oneliner(&buf
, rebase_path_stopped_sha(), 1) &&
3754 !get_oid_committish(buf
.buf
, &oid
))
3755 record_in_rewritten(&oid
, peek_command(&todo_list
, 0));
3756 strbuf_release(&buf
);
3759 res
= pick_commits(&todo_list
, opts
);
3761 todo_list_release(&todo_list
);
3765 static int single_pick(struct commit
*cmit
, struct replay_opts
*opts
)
3767 setenv(GIT_REFLOG_ACTION
, action_name(opts
), 0);
3768 return do_pick_commit(opts
->action
== REPLAY_PICK
?
3769 TODO_PICK
: TODO_REVERT
, cmit
, opts
, 0);
3772 int sequencer_pick_revisions(struct replay_opts
*opts
)
3774 struct todo_list todo_list
= TODO_LIST_INIT
;
3775 struct object_id oid
;
3779 if (read_and_refresh_cache(opts
))
3782 for (i
= 0; i
< opts
->revs
->pending
.nr
; i
++) {
3783 struct object_id oid
;
3784 const char *name
= opts
->revs
->pending
.objects
[i
].name
;
3786 /* This happens when using --stdin. */
3790 if (!get_oid(name
, &oid
)) {
3791 if (!lookup_commit_reference_gently(the_repository
, &oid
, 1)) {
3792 enum object_type type
= oid_object_info(the_repository
,
3795 return error(_("%s: can't cherry-pick a %s"),
3796 name
, type_name(type
));
3799 return error(_("%s: bad revision"), name
);
3803 * If we were called as "git cherry-pick <commit>", just
3804 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
3805 * REVERT_HEAD, and don't touch the sequencer state.
3806 * This means it is possible to cherry-pick in the middle
3807 * of a cherry-pick sequence.
3809 if (opts
->revs
->cmdline
.nr
== 1 &&
3810 opts
->revs
->cmdline
.rev
->whence
== REV_CMD_REV
&&
3811 opts
->revs
->no_walk
&&
3812 !opts
->revs
->cmdline
.rev
->flags
) {
3813 struct commit
*cmit
;
3814 if (prepare_revision_walk(opts
->revs
))
3815 return error(_("revision walk setup failed"));
3816 cmit
= get_revision(opts
->revs
);
3818 return error(_("empty commit set passed"));
3819 if (get_revision(opts
->revs
))
3820 BUG("unexpected extra commit from walk");
3821 return single_pick(cmit
, opts
);
3825 * Start a new cherry-pick/ revert sequence; but
3826 * first, make sure that an existing one isn't in
3830 if (walk_revs_populate_todo(&todo_list
, opts
) ||
3831 create_seq_dir() < 0)
3833 if (get_oid("HEAD", &oid
) && (opts
->action
== REPLAY_REVERT
))
3834 return error(_("can't revert as initial commit"));
3835 if (save_head(oid_to_hex(&oid
)))
3837 if (save_opts(opts
))
3839 update_abort_safety_file();
3840 res
= pick_commits(&todo_list
, opts
);
3841 todo_list_release(&todo_list
);
3845 void append_signoff(struct strbuf
*msgbuf
, size_t ignore_footer
, unsigned flag
)
3847 unsigned no_dup_sob
= flag
& APPEND_SIGNOFF_DEDUP
;
3848 struct strbuf sob
= STRBUF_INIT
;
3851 strbuf_addstr(&sob
, sign_off_header
);
3852 strbuf_addstr(&sob
, fmt_name(getenv("GIT_COMMITTER_NAME"),
3853 getenv("GIT_COMMITTER_EMAIL")));
3854 strbuf_addch(&sob
, '\n');
3857 strbuf_complete_line(msgbuf
);
3860 * If the whole message buffer is equal to the sob, pretend that we
3861 * found a conforming footer with a matching sob
3863 if (msgbuf
->len
- ignore_footer
== sob
.len
&&
3864 !strncmp(msgbuf
->buf
, sob
.buf
, sob
.len
))
3867 has_footer
= has_conforming_footer(msgbuf
, &sob
, ignore_footer
);
3870 const char *append_newlines
= NULL
;
3871 size_t len
= msgbuf
->len
- ignore_footer
;
3875 * The buffer is completely empty. Leave foom for
3876 * the title and body to be filled in by the user.
3878 append_newlines
= "\n\n";
3879 } else if (len
== 1) {
3881 * Buffer contains a single newline. Add another
3882 * so that we leave room for the title and body.
3884 append_newlines
= "\n";
3885 } else if (msgbuf
->buf
[len
- 2] != '\n') {
3887 * Buffer ends with a single newline. Add another
3888 * so that there is an empty line between the message
3891 append_newlines
= "\n";
3892 } /* else, the buffer already ends with two newlines. */
3894 if (append_newlines
)
3895 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
3896 append_newlines
, strlen(append_newlines
));
3899 if (has_footer
!= 3 && (!no_dup_sob
|| has_footer
!= 2))
3900 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
3903 strbuf_release(&sob
);
3906 struct labels_entry
{
3907 struct hashmap_entry entry
;
3908 char label
[FLEX_ARRAY
];
3911 static int labels_cmp(const void *fndata
, const struct labels_entry
*a
,
3912 const struct labels_entry
*b
, const void *key
)
3914 return key
? strcmp(a
->label
, key
) : strcmp(a
->label
, b
->label
);
3917 struct string_entry
{
3918 struct oidmap_entry entry
;
3919 char string
[FLEX_ARRAY
];
3922 struct label_state
{
3923 struct oidmap commit2label
;
3924 struct hashmap labels
;
3928 static const char *label_oid(struct object_id
*oid
, const char *label
,
3929 struct label_state
*state
)
3931 struct labels_entry
*labels_entry
;
3932 struct string_entry
*string_entry
;
3933 struct object_id dummy
;
3937 string_entry
= oidmap_get(&state
->commit2label
, oid
);
3939 return string_entry
->string
;
3942 * For "uninteresting" commits, i.e. commits that are not to be
3943 * rebased, and which can therefore not be labeled, we use a unique
3944 * abbreviation of the commit name. This is slightly more complicated
3945 * than calling find_unique_abbrev() because we also need to make
3946 * sure that the abbreviation does not conflict with any other
3949 * We disallow "interesting" commits to be labeled by a string that
3950 * is a valid full-length hash, to ensure that we always can find an
3951 * abbreviation for any uninteresting commit's names that does not
3952 * clash with any other label.
3957 strbuf_reset(&state
->buf
);
3958 strbuf_grow(&state
->buf
, GIT_SHA1_HEXSZ
);
3959 label
= p
= state
->buf
.buf
;
3961 find_unique_abbrev_r(p
, oid
, default_abbrev
);
3964 * We may need to extend the abbreviated hash so that there is
3965 * no conflicting label.
3967 if (hashmap_get_from_hash(&state
->labels
, strihash(p
), p
)) {
3968 size_t i
= strlen(p
) + 1;
3970 oid_to_hex_r(p
, oid
);
3971 for (; i
< GIT_SHA1_HEXSZ
; i
++) {
3974 if (!hashmap_get_from_hash(&state
->labels
,
3980 } else if (((len
= strlen(label
)) == the_hash_algo
->hexsz
&&
3981 !get_oid_hex(label
, &dummy
)) ||
3982 (len
== 1 && *label
== '#') ||
3983 hashmap_get_from_hash(&state
->labels
,
3984 strihash(label
), label
)) {
3986 * If the label already exists, or if the label is a valid full
3987 * OID, or the label is a '#' (which we use as a separator
3988 * between merge heads and oneline), we append a dash and a
3989 * number to make it unique.
3991 struct strbuf
*buf
= &state
->buf
;
3994 strbuf_add(buf
, label
, len
);
3996 for (i
= 2; ; i
++) {
3997 strbuf_setlen(buf
, len
);
3998 strbuf_addf(buf
, "-%d", i
);
3999 if (!hashmap_get_from_hash(&state
->labels
,
4008 FLEX_ALLOC_STR(labels_entry
, label
, label
);
4009 hashmap_entry_init(labels_entry
, strihash(label
));
4010 hashmap_add(&state
->labels
, labels_entry
);
4012 FLEX_ALLOC_STR(string_entry
, string
, label
);
4013 oidcpy(&string_entry
->entry
.oid
, oid
);
4014 oidmap_put(&state
->commit2label
, string_entry
);
4016 return string_entry
->string
;
4019 static int make_script_with_merges(struct pretty_print_context
*pp
,
4020 struct rev_info
*revs
, FILE *out
,
4023 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
4024 int rebase_cousins
= flags
& TODO_LIST_REBASE_COUSINS
;
4025 struct strbuf buf
= STRBUF_INIT
, oneline
= STRBUF_INIT
;
4026 struct strbuf label
= STRBUF_INIT
;
4027 struct commit_list
*commits
= NULL
, **tail
= &commits
, *iter
;
4028 struct commit_list
*tips
= NULL
, **tips_tail
= &tips
;
4029 struct commit
*commit
;
4030 struct oidmap commit2todo
= OIDMAP_INIT
;
4031 struct string_entry
*entry
;
4032 struct oidset interesting
= OIDSET_INIT
, child_seen
= OIDSET_INIT
,
4033 shown
= OIDSET_INIT
;
4034 struct label_state state
= { OIDMAP_INIT
, { NULL
}, STRBUF_INIT
};
4036 int abbr
= flags
& TODO_LIST_ABBREVIATE_CMDS
;
4037 const char *cmd_pick
= abbr
? "p" : "pick",
4038 *cmd_label
= abbr
? "l" : "label",
4039 *cmd_reset
= abbr
? "t" : "reset",
4040 *cmd_merge
= abbr
? "m" : "merge";
4042 oidmap_init(&commit2todo
, 0);
4043 oidmap_init(&state
.commit2label
, 0);
4044 hashmap_init(&state
.labels
, (hashmap_cmp_fn
) labels_cmp
, NULL
, 0);
4045 strbuf_init(&state
.buf
, 32);
4047 if (revs
->cmdline
.nr
&& (revs
->cmdline
.rev
[0].flags
& BOTTOM
)) {
4048 struct object_id
*oid
= &revs
->cmdline
.rev
[0].item
->oid
;
4049 FLEX_ALLOC_STR(entry
, string
, "onto");
4050 oidcpy(&entry
->entry
.oid
, oid
);
4051 oidmap_put(&state
.commit2label
, entry
);
4056 * - get onelines for all commits
4057 * - gather all branch tips (i.e. 2nd or later parents of merges)
4058 * - label all branch tips
4060 while ((commit
= get_revision(revs
))) {
4061 struct commit_list
*to_merge
;
4062 const char *p1
, *p2
;
4063 struct object_id
*oid
;
4066 tail
= &commit_list_insert(commit
, tail
)->next
;
4067 oidset_insert(&interesting
, &commit
->object
.oid
);
4069 is_empty
= is_original_commit_empty(commit
);
4070 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
))
4073 strbuf_reset(&oneline
);
4074 pretty_print_commit(pp
, commit
, &oneline
);
4076 to_merge
= commit
->parents
? commit
->parents
->next
: NULL
;
4078 /* non-merge commit: easy case */
4080 if (!keep_empty
&& is_empty
)
4081 strbuf_addf(&buf
, "%c ", comment_line_char
);
4082 strbuf_addf(&buf
, "%s %s %s", cmd_pick
,
4083 oid_to_hex(&commit
->object
.oid
),
4086 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
4087 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
4088 oidmap_put(&commit2todo
, entry
);
4093 /* Create a label */
4094 strbuf_reset(&label
);
4095 if (skip_prefix(oneline
.buf
, "Merge ", &p1
) &&
4096 (p1
= strchr(p1
, '\'')) &&
4097 (p2
= strchr(++p1
, '\'')))
4098 strbuf_add(&label
, p1
, p2
- p1
);
4099 else if (skip_prefix(oneline
.buf
, "Merge pull request ",
4101 (p1
= strstr(p1
, " from ")))
4102 strbuf_addstr(&label
, p1
+ strlen(" from "));
4104 strbuf_addbuf(&label
, &oneline
);
4106 for (p1
= label
.buf
; *p1
; p1
++)
4111 strbuf_addf(&buf
, "%s -C %s",
4112 cmd_merge
, oid_to_hex(&commit
->object
.oid
));
4114 /* label the tips of merged branches */
4115 for (; to_merge
; to_merge
= to_merge
->next
) {
4116 oid
= &to_merge
->item
->object
.oid
;
4117 strbuf_addch(&buf
, ' ');
4119 if (!oidset_contains(&interesting
, oid
)) {
4120 strbuf_addstr(&buf
, label_oid(oid
, NULL
,
4125 tips_tail
= &commit_list_insert(to_merge
->item
,
4128 strbuf_addstr(&buf
, label_oid(oid
, label
.buf
, &state
));
4130 strbuf_addf(&buf
, " # %s", oneline
.buf
);
4132 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
4133 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
4134 oidmap_put(&commit2todo
, entry
);
4139 * - label branch points
4140 * - add HEAD to the branch tips
4142 for (iter
= commits
; iter
; iter
= iter
->next
) {
4143 struct commit_list
*parent
= iter
->item
->parents
;
4144 for (; parent
; parent
= parent
->next
) {
4145 struct object_id
*oid
= &parent
->item
->object
.oid
;
4146 if (!oidset_contains(&interesting
, oid
))
4148 if (!oidset_contains(&child_seen
, oid
))
4149 oidset_insert(&child_seen
, oid
);
4151 label_oid(oid
, "branch-point", &state
);
4154 /* Add HEAD as implict "tip of branch" */
4156 tips_tail
= &commit_list_insert(iter
->item
,
4161 * Third phase: output the todo list. This is a bit tricky, as we
4162 * want to avoid jumping back and forth between revisions. To
4163 * accomplish that goal, we walk backwards from the branch tips,
4164 * gathering commits not yet shown, reversing the list on the fly,
4165 * then outputting that list (labeling revisions as needed).
4167 fprintf(out
, "%s onto\n", cmd_label
);
4168 for (iter
= tips
; iter
; iter
= iter
->next
) {
4169 struct commit_list
*list
= NULL
, *iter2
;
4171 commit
= iter
->item
;
4172 if (oidset_contains(&shown
, &commit
->object
.oid
))
4174 entry
= oidmap_get(&state
.commit2label
, &commit
->object
.oid
);
4177 fprintf(out
, "\n%c Branch %s\n", comment_line_char
, entry
->string
);
4181 while (oidset_contains(&interesting
, &commit
->object
.oid
) &&
4182 !oidset_contains(&shown
, &commit
->object
.oid
)) {
4183 commit_list_insert(commit
, &list
);
4184 if (!commit
->parents
) {
4188 commit
= commit
->parents
->item
;
4192 fprintf(out
, "%s %s\n", cmd_reset
,
4193 rebase_cousins
? "onto" : "[new root]");
4195 const char *to
= NULL
;
4197 entry
= oidmap_get(&state
.commit2label
,
4198 &commit
->object
.oid
);
4201 else if (!rebase_cousins
)
4202 to
= label_oid(&commit
->object
.oid
, NULL
,
4205 if (!to
|| !strcmp(to
, "onto"))
4206 fprintf(out
, "%s onto\n", cmd_reset
);
4208 strbuf_reset(&oneline
);
4209 pretty_print_commit(pp
, commit
, &oneline
);
4210 fprintf(out
, "%s %s # %s\n",
4211 cmd_reset
, to
, oneline
.buf
);
4215 for (iter2
= list
; iter2
; iter2
= iter2
->next
) {
4216 struct object_id
*oid
= &iter2
->item
->object
.oid
;
4217 entry
= oidmap_get(&commit2todo
, oid
);
4218 /* only show if not already upstream */
4220 fprintf(out
, "%s\n", entry
->string
);
4221 entry
= oidmap_get(&state
.commit2label
, oid
);
4223 fprintf(out
, "%s %s\n",
4224 cmd_label
, entry
->string
);
4225 oidset_insert(&shown
, oid
);
4228 free_commit_list(list
);
4231 free_commit_list(commits
);
4232 free_commit_list(tips
);
4234 strbuf_release(&label
);
4235 strbuf_release(&oneline
);
4236 strbuf_release(&buf
);
4238 oidmap_free(&commit2todo
, 1);
4239 oidmap_free(&state
.commit2label
, 1);
4240 hashmap_free(&state
.labels
, 1);
4241 strbuf_release(&state
.buf
);
4246 int sequencer_make_script(FILE *out
, int argc
, const char **argv
,
4249 char *format
= NULL
;
4250 struct pretty_print_context pp
= {0};
4251 struct strbuf buf
= STRBUF_INIT
;
4252 struct rev_info revs
;
4253 struct commit
*commit
;
4254 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
4255 const char *insn
= flags
& TODO_LIST_ABBREVIATE_CMDS
? "p" : "pick";
4256 int rebase_merges
= flags
& TODO_LIST_REBASE_MERGES
;
4258 init_revisions(&revs
, NULL
);
4259 revs
.verbose_header
= 1;
4261 revs
.max_parents
= 1;
4262 revs
.cherry_mark
= 1;
4265 revs
.right_only
= 1;
4266 revs
.sort_order
= REV_SORT_IN_GRAPH_ORDER
;
4267 revs
.topo_order
= 1;
4269 revs
.pretty_given
= 1;
4270 git_config_get_string("rebase.instructionFormat", &format
);
4271 if (!format
|| !*format
) {
4273 format
= xstrdup("%s");
4275 get_commit_format(format
, &revs
);
4277 pp
.fmt
= revs
.commit_format
;
4278 pp
.output_encoding
= get_log_output_encoding();
4280 if (setup_revisions(argc
, argv
, &revs
, NULL
) > 1)
4281 return error(_("make_script: unhandled options"));
4283 if (prepare_revision_walk(&revs
) < 0)
4284 return error(_("make_script: error preparing revisions"));
4287 return make_script_with_merges(&pp
, &revs
, out
, flags
);
4289 while ((commit
= get_revision(&revs
))) {
4290 int is_empty
= is_original_commit_empty(commit
);
4292 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
))
4295 if (!keep_empty
&& is_empty
)
4296 strbuf_addf(&buf
, "%c ", comment_line_char
);
4297 strbuf_addf(&buf
, "%s %s ", insn
,
4298 oid_to_hex(&commit
->object
.oid
));
4299 pretty_print_commit(&pp
, commit
, &buf
);
4300 strbuf_addch(&buf
, '\n');
4301 fputs(buf
.buf
, out
);
4303 strbuf_release(&buf
);
4308 * Add commands after pick and (series of) squash/fixup commands
4311 int sequencer_add_exec_commands(const char *commands
)
4313 const char *todo_file
= rebase_path_todo();
4314 struct todo_list todo_list
= TODO_LIST_INIT
;
4315 struct strbuf
*buf
= &todo_list
.buf
;
4316 size_t offset
= 0, commands_len
= strlen(commands
);
4319 if (strbuf_read_file(&todo_list
.buf
, todo_file
, 0) < 0)
4320 return error(_("could not read '%s'."), todo_file
);
4322 if (parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
)) {
4323 todo_list_release(&todo_list
);
4324 return error(_("unusable todo list: '%s'"), todo_file
);
4328 * Insert <commands> after every pick. Here, fixup/squash chains
4329 * are considered part of the pick, so we insert the commands *after*
4330 * those chains if there are any.
4333 for (i
= 0; i
< todo_list
.nr
; i
++) {
4334 enum todo_command command
= todo_list
.items
[i
].command
;
4337 /* skip fixup/squash chains */
4338 if (command
== TODO_COMMENT
)
4340 else if (is_fixup(command
)) {
4345 todo_list
.items
[insert
].offset_in_buf
+
4346 offset
, commands
, commands_len
);
4347 offset
+= commands_len
;
4351 if (command
== TODO_PICK
|| command
== TODO_MERGE
)
4355 /* insert or append final <commands> */
4356 if (insert
>= 0 && insert
< todo_list
.nr
)
4357 strbuf_insert(buf
, todo_list
.items
[insert
].offset_in_buf
+
4358 offset
, commands
, commands_len
);
4359 else if (insert
>= 0 || !offset
)
4360 strbuf_add(buf
, commands
, commands_len
);
4362 i
= write_message(buf
->buf
, buf
->len
, todo_file
, 0);
4363 todo_list_release(&todo_list
);
4367 int transform_todos(unsigned flags
)
4369 const char *todo_file
= rebase_path_todo();
4370 struct todo_list todo_list
= TODO_LIST_INIT
;
4371 struct strbuf buf
= STRBUF_INIT
;
4372 struct todo_item
*item
;
4375 if (strbuf_read_file(&todo_list
.buf
, todo_file
, 0) < 0)
4376 return error(_("could not read '%s'."), todo_file
);
4378 if (parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
)) {
4379 todo_list_release(&todo_list
);
4380 return error(_("unusable todo list: '%s'"), todo_file
);
4383 for (item
= todo_list
.items
, i
= 0; i
< todo_list
.nr
; i
++, item
++) {
4384 /* if the item is not a command write it and continue */
4385 if (item
->command
>= TODO_COMMENT
) {
4386 strbuf_addf(&buf
, "%.*s\n", item
->arg_len
, item
->arg
);
4390 /* add command to the buffer */
4391 if (flags
& TODO_LIST_ABBREVIATE_CMDS
)
4392 strbuf_addch(&buf
, command_to_char(item
->command
));
4394 strbuf_addstr(&buf
, command_to_string(item
->command
));
4398 const char *oid
= flags
& TODO_LIST_SHORTEN_IDS
?
4399 short_commit_name(item
->commit
) :
4400 oid_to_hex(&item
->commit
->object
.oid
);
4402 if (item
->command
== TODO_MERGE
) {
4403 if (item
->flags
& TODO_EDIT_MERGE_MSG
)
4404 strbuf_addstr(&buf
, " -c");
4406 strbuf_addstr(&buf
, " -C");
4409 strbuf_addf(&buf
, " %s", oid
);
4412 /* add all the rest */
4414 strbuf_addch(&buf
, '\n');
4416 strbuf_addf(&buf
, " %.*s\n", item
->arg_len
, item
->arg
);
4419 i
= write_message(buf
.buf
, buf
.len
, todo_file
, 0);
4420 todo_list_release(&todo_list
);
4425 CHECK_IGNORE
= 0, CHECK_WARN
, CHECK_ERROR
4428 static enum check_level
get_missing_commit_check_level(void)
4432 if (git_config_get_value("rebase.missingcommitscheck", &value
) ||
4433 !strcasecmp("ignore", value
))
4434 return CHECK_IGNORE
;
4435 if (!strcasecmp("warn", value
))
4437 if (!strcasecmp("error", value
))
4439 warning(_("unrecognized setting %s for option "
4440 "rebase.missingCommitsCheck. Ignoring."), value
);
4441 return CHECK_IGNORE
;
4444 define_commit_slab(commit_seen
, unsigned char);
4446 * Check if the user dropped some commits by mistake
4447 * Behaviour determined by rebase.missingCommitsCheck.
4448 * Check if there is an unrecognized command or a
4449 * bad SHA-1 in a command.
4451 int check_todo_list(void)
4453 enum check_level check_level
= get_missing_commit_check_level();
4454 struct strbuf todo_file
= STRBUF_INIT
;
4455 struct todo_list todo_list
= TODO_LIST_INIT
;
4456 struct strbuf missing
= STRBUF_INIT
;
4457 int advise_to_edit_todo
= 0, res
= 0, i
;
4458 struct commit_seen commit_seen
;
4460 init_commit_seen(&commit_seen
);
4462 strbuf_addstr(&todo_file
, rebase_path_todo());
4463 if (strbuf_read_file_or_whine(&todo_list
.buf
, todo_file
.buf
) < 0) {
4467 advise_to_edit_todo
= res
=
4468 parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
);
4470 if (res
|| check_level
== CHECK_IGNORE
)
4473 /* Mark the commits in git-rebase-todo as seen */
4474 for (i
= 0; i
< todo_list
.nr
; i
++) {
4475 struct commit
*commit
= todo_list
.items
[i
].commit
;
4477 *commit_seen_at(&commit_seen
, commit
) = 1;
4480 todo_list_release(&todo_list
);
4481 strbuf_addstr(&todo_file
, ".backup");
4482 if (strbuf_read_file_or_whine(&todo_list
.buf
, todo_file
.buf
) < 0) {
4486 strbuf_release(&todo_file
);
4487 res
= !!parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
);
4489 /* Find commits in git-rebase-todo.backup yet unseen */
4490 for (i
= todo_list
.nr
- 1; i
>= 0; i
--) {
4491 struct todo_item
*item
= todo_list
.items
+ i
;
4492 struct commit
*commit
= item
->commit
;
4493 if (commit
&& !*commit_seen_at(&commit_seen
, commit
)) {
4494 strbuf_addf(&missing
, " - %s %.*s\n",
4495 short_commit_name(commit
),
4496 item
->arg_len
, item
->arg
);
4497 *commit_seen_at(&commit_seen
, commit
) = 1;
4501 /* Warn about missing commits */
4505 if (check_level
== CHECK_ERROR
)
4506 advise_to_edit_todo
= res
= 1;
4509 _("Warning: some commits may have been dropped accidentally.\n"
4510 "Dropped commits (newer to older):\n"));
4512 /* Make the list user-friendly and display */
4513 fputs(missing
.buf
, stderr
);
4514 strbuf_release(&missing
);
4516 fprintf(stderr
, _("To avoid this message, use \"drop\" to "
4517 "explicitly remove a commit.\n\n"
4518 "Use 'git config rebase.missingCommitsCheck' to change "
4519 "the level of warnings.\n"
4520 "The possible behaviours are: ignore, warn, error.\n\n"));
4523 clear_commit_seen(&commit_seen
);
4524 strbuf_release(&todo_file
);
4525 todo_list_release(&todo_list
);
4527 if (advise_to_edit_todo
)
4529 _("You can fix this with 'git rebase --edit-todo' "
4530 "and then run 'git rebase --continue'.\n"
4531 "Or you can abort the rebase with 'git rebase"
4537 static int rewrite_file(const char *path
, const char *buf
, size_t len
)
4540 int fd
= open(path
, O_WRONLY
| O_TRUNC
);
4542 return error_errno(_("could not open '%s' for writing"), path
);
4543 if (write_in_full(fd
, buf
, len
) < 0)
4544 rc
= error_errno(_("could not write to '%s'"), path
);
4545 if (close(fd
) && !rc
)
4546 rc
= error_errno(_("could not close '%s'"), path
);
4550 /* skip picking commits whose parents are unchanged */
4551 int skip_unnecessary_picks(void)
4553 const char *todo_file
= rebase_path_todo();
4554 struct strbuf buf
= STRBUF_INIT
;
4555 struct todo_list todo_list
= TODO_LIST_INIT
;
4556 struct object_id onto_oid
, *oid
= &onto_oid
, *parent_oid
;
4559 if (!read_oneliner(&buf
, rebase_path_onto(), 0))
4560 return error(_("could not read 'onto'"));
4561 if (get_oid(buf
.buf
, &onto_oid
)) {
4562 strbuf_release(&buf
);
4563 return error(_("need a HEAD to fixup"));
4565 strbuf_release(&buf
);
4567 if (strbuf_read_file_or_whine(&todo_list
.buf
, todo_file
) < 0)
4569 if (parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
) < 0) {
4570 todo_list_release(&todo_list
);
4574 for (i
= 0; i
< todo_list
.nr
; i
++) {
4575 struct todo_item
*item
= todo_list
.items
+ i
;
4577 if (item
->command
>= TODO_NOOP
)
4579 if (item
->command
!= TODO_PICK
)
4581 if (parse_commit(item
->commit
)) {
4582 todo_list_release(&todo_list
);
4583 return error(_("could not parse commit '%s'"),
4584 oid_to_hex(&item
->commit
->object
.oid
));
4586 if (!item
->commit
->parents
)
4587 break; /* root commit */
4588 if (item
->commit
->parents
->next
)
4589 break; /* merge commit */
4590 parent_oid
= &item
->commit
->parents
->item
->object
.oid
;
4591 if (hashcmp(parent_oid
->hash
, oid
->hash
))
4593 oid
= &item
->commit
->object
.oid
;
4596 int offset
= get_item_line_offset(&todo_list
, i
);
4597 const char *done_path
= rebase_path_done();
4599 fd
= open(done_path
, O_CREAT
| O_WRONLY
| O_APPEND
, 0666);
4601 error_errno(_("could not open '%s' for writing"),
4603 todo_list_release(&todo_list
);
4606 if (write_in_full(fd
, todo_list
.buf
.buf
, offset
) < 0) {
4607 error_errno(_("could not write to '%s'"), done_path
);
4608 todo_list_release(&todo_list
);
4614 if (rewrite_file(rebase_path_todo(), todo_list
.buf
.buf
+ offset
,
4615 todo_list
.buf
.len
- offset
) < 0) {
4616 todo_list_release(&todo_list
);
4620 todo_list
.current
= i
;
4621 if (is_fixup(peek_command(&todo_list
, 0)))
4622 record_in_rewritten(oid
, peek_command(&todo_list
, 0));
4625 todo_list_release(&todo_list
);
4626 printf("%s\n", oid_to_hex(oid
));
4631 struct subject2item_entry
{
4632 struct hashmap_entry entry
;
4634 char subject
[FLEX_ARRAY
];
4637 static int subject2item_cmp(const void *fndata
,
4638 const struct subject2item_entry
*a
,
4639 const struct subject2item_entry
*b
, const void *key
)
4641 return key
? strcmp(a
->subject
, key
) : strcmp(a
->subject
, b
->subject
);
4644 define_commit_slab(commit_todo_item
, struct todo_item
*);
4647 * Rearrange the todo list that has both "pick commit-id msg" and "pick
4648 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
4649 * after the former, and change "pick" to "fixup"/"squash".
4651 * Note that if the config has specified a custom instruction format, each log
4652 * message will have to be retrieved from the commit (as the oneline in the
4653 * script cannot be trusted) in order to normalize the autosquash arrangement.
4655 int rearrange_squash(void)
4657 const char *todo_file
= rebase_path_todo();
4658 struct todo_list todo_list
= TODO_LIST_INIT
;
4659 struct hashmap subject2item
;
4660 int res
= 0, rearranged
= 0, *next
, *tail
, i
;
4662 struct commit_todo_item commit_todo
;
4664 if (strbuf_read_file_or_whine(&todo_list
.buf
, todo_file
) < 0)
4666 if (parse_insn_buffer(todo_list
.buf
.buf
, &todo_list
) < 0) {
4667 todo_list_release(&todo_list
);
4671 init_commit_todo_item(&commit_todo
);
4673 * The hashmap maps onelines to the respective todo list index.
4675 * If any items need to be rearranged, the next[i] value will indicate
4676 * which item was moved directly after the i'th.
4678 * In that case, last[i] will indicate the index of the latest item to
4679 * be moved to appear after the i'th.
4681 hashmap_init(&subject2item
, (hashmap_cmp_fn
) subject2item_cmp
,
4682 NULL
, todo_list
.nr
);
4683 ALLOC_ARRAY(next
, todo_list
.nr
);
4684 ALLOC_ARRAY(tail
, todo_list
.nr
);
4685 ALLOC_ARRAY(subjects
, todo_list
.nr
);
4686 for (i
= 0; i
< todo_list
.nr
; i
++) {
4687 struct strbuf buf
= STRBUF_INIT
;
4688 struct todo_item
*item
= todo_list
.items
+ i
;
4689 const char *commit_buffer
, *subject
, *p
;
4692 struct subject2item_entry
*entry
;
4694 next
[i
] = tail
[i
] = -1;
4695 if (!item
->commit
|| item
->command
== TODO_DROP
) {
4700 if (is_fixup(item
->command
)) {
4701 todo_list_release(&todo_list
);
4702 clear_commit_todo_item(&commit_todo
);
4703 return error(_("the script was already rearranged."));
4706 *commit_todo_item_at(&commit_todo
, item
->commit
) = item
;
4708 parse_commit(item
->commit
);
4709 commit_buffer
= get_commit_buffer(item
->commit
, NULL
);
4710 find_commit_subject(commit_buffer
, &subject
);
4711 format_subject(&buf
, subject
, " ");
4712 subject
= subjects
[i
] = strbuf_detach(&buf
, &subject_len
);
4713 unuse_commit_buffer(item
->commit
, commit_buffer
);
4714 if ((skip_prefix(subject
, "fixup! ", &p
) ||
4715 skip_prefix(subject
, "squash! ", &p
))) {
4716 struct commit
*commit2
;
4721 if (!skip_prefix(p
, "fixup! ", &p
) &&
4722 !skip_prefix(p
, "squash! ", &p
))
4726 if ((entry
= hashmap_get_from_hash(&subject2item
,
4728 /* found by title */
4730 else if (!strchr(p
, ' ') &&
4732 lookup_commit_reference_by_name(p
)) &&
4733 *commit_todo_item_at(&commit_todo
, commit2
))
4734 /* found by commit name */
4735 i2
= *commit_todo_item_at(&commit_todo
, commit2
)
4738 /* copy can be a prefix of the commit subject */
4739 for (i2
= 0; i2
< i
; i2
++)
4741 starts_with(subjects
[i2
], p
))
4749 todo_list
.items
[i
].command
=
4750 starts_with(subject
, "fixup!") ?
4751 TODO_FIXUP
: TODO_SQUASH
;
4757 } else if (!hashmap_get_from_hash(&subject2item
,
4758 strhash(subject
), subject
)) {
4759 FLEX_ALLOC_MEM(entry
, subject
, subject
, subject_len
);
4761 hashmap_entry_init(entry
, strhash(entry
->subject
));
4762 hashmap_put(&subject2item
, entry
);
4767 struct strbuf buf
= STRBUF_INIT
;
4769 for (i
= 0; i
< todo_list
.nr
; i
++) {
4770 enum todo_command command
= todo_list
.items
[i
].command
;
4774 * Initially, all commands are 'pick's. If it is a
4775 * fixup or a squash now, we have rearranged it.
4777 if (is_fixup(command
))
4782 get_item_line(&todo_list
, cur
);
4784 get_item_line(&todo_list
, cur
+ 1);
4786 /* replace 'pick', by 'fixup' or 'squash' */
4787 command
= todo_list
.items
[cur
].command
;
4788 if (is_fixup(command
)) {
4790 todo_command_info
[command
].str
);
4791 bol
+= strcspn(bol
, " \t");
4794 strbuf_add(&buf
, bol
, eol
- bol
);
4800 res
= rewrite_file(todo_file
, buf
.buf
, buf
.len
);
4801 strbuf_release(&buf
);
4806 for (i
= 0; i
< todo_list
.nr
; i
++)
4809 hashmap_free(&subject2item
, 1);
4810 todo_list_release(&todo_list
);
4812 clear_commit_todo_item(&commit_todo
);