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"
33 #include "commit-reach.h"
34 #include "rebase-interactive.h"
36 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
38 static const char sign_off_header
[] = "Signed-off-by: ";
39 static const char cherry_picked_prefix
[] = "(cherry picked from commit ";
41 GIT_PATH_FUNC(git_path_commit_editmsg
, "COMMIT_EDITMSG")
43 GIT_PATH_FUNC(git_path_seq_dir
, "sequencer")
45 static GIT_PATH_FUNC(git_path_todo_file
, "sequencer/todo")
46 static GIT_PATH_FUNC(git_path_opts_file
, "sequencer/opts")
47 static GIT_PATH_FUNC(git_path_head_file
, "sequencer/head")
48 static GIT_PATH_FUNC(git_path_abort_safety_file
, "sequencer/abort-safety")
50 static GIT_PATH_FUNC(rebase_path
, "rebase-merge")
52 * The file containing rebase commands, comments, and empty lines.
53 * This file is created by "git rebase -i" then edited by the user. As
54 * the lines are processed, they are removed from the front of this
55 * file and written to the tail of 'done'.
57 GIT_PATH_FUNC(rebase_path_todo
, "rebase-merge/git-rebase-todo")
58 GIT_PATH_FUNC(rebase_path_todo_backup
, "rebase-merge/git-rebase-todo.backup")
61 * The rebase command lines that have already been processed. A line
62 * is moved here when it is first handled, before any associated user
65 static GIT_PATH_FUNC(rebase_path_done
, "rebase-merge/done")
67 * The file to keep track of how many commands were already processed (e.g.
70 static GIT_PATH_FUNC(rebase_path_msgnum
, "rebase-merge/msgnum")
72 * The file to keep track of how many commands are to be processed in total
73 * (e.g. for the prompt).
75 static GIT_PATH_FUNC(rebase_path_msgtotal
, "rebase-merge/end")
77 * The commit message that is planned to be used for any changes that
78 * need to be committed following a user interaction.
80 static GIT_PATH_FUNC(rebase_path_message
, "rebase-merge/message")
82 * The file into which is accumulated the suggested commit message for
83 * squash/fixup commands. When the first of a series of squash/fixups
84 * is seen, the file is created and the commit message from the
85 * previous commit and from the first squash/fixup commit are written
86 * to it. The commit message for each subsequent squash/fixup commit
87 * is appended to the file as it is processed.
89 static GIT_PATH_FUNC(rebase_path_squash_msg
, "rebase-merge/message-squash")
91 * If the current series of squash/fixups has not yet included a squash
92 * command, then this file exists and holds the commit message of the
93 * original "pick" commit. (If the series ends without a "squash"
94 * command, then this can be used as the commit message of the combined
95 * commit without opening the editor.)
97 static GIT_PATH_FUNC(rebase_path_fixup_msg
, "rebase-merge/message-fixup")
99 * This file contains the list fixup/squash commands that have been
100 * accumulated into message-fixup or message-squash so far.
102 static GIT_PATH_FUNC(rebase_path_current_fixups
, "rebase-merge/current-fixups")
104 * A script to set the GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, and
105 * GIT_AUTHOR_DATE that will be used for the commit that is currently
108 static GIT_PATH_FUNC(rebase_path_author_script
, "rebase-merge/author-script")
110 * When an "edit" rebase command is being processed, the SHA1 of the
111 * commit to be edited is recorded in this file. When "git rebase
112 * --continue" is executed, if there are any staged changes then they
113 * will be amended to the HEAD commit, but only provided the HEAD
114 * commit is still the commit to be edited. When any other rebase
115 * command is processed, this file is deleted.
117 static GIT_PATH_FUNC(rebase_path_amend
, "rebase-merge/amend")
119 * When we stop at a given patch via the "edit" command, this file contains
120 * the abbreviated commit name of the corresponding patch.
122 static GIT_PATH_FUNC(rebase_path_stopped_sha
, "rebase-merge/stopped-sha")
124 * For the post-rewrite hook, we make a list of rewritten commits and
125 * their new sha1s. The rewritten-pending list keeps the sha1s of
126 * commits that have been processed, but not committed yet,
127 * e.g. because they are waiting for a 'squash' command.
129 static GIT_PATH_FUNC(rebase_path_rewritten_list
, "rebase-merge/rewritten-list")
130 static GIT_PATH_FUNC(rebase_path_rewritten_pending
,
131 "rebase-merge/rewritten-pending")
134 * The path of the file containing the OID of the "squash onto" commit, i.e.
135 * the dummy commit used for `reset [new root]`.
137 static GIT_PATH_FUNC(rebase_path_squash_onto
, "rebase-merge/squash-onto")
140 * The path of the file listing refs that need to be deleted after the rebase
141 * finishes. This is used by the `label` command to record the need for cleanup.
143 static GIT_PATH_FUNC(rebase_path_refs_to_delete
, "rebase-merge/refs-to-delete")
146 * The following files are written by git-rebase just after parsing the
149 static GIT_PATH_FUNC(rebase_path_gpg_sign_opt
, "rebase-merge/gpg_sign_opt")
150 static GIT_PATH_FUNC(rebase_path_cdate_is_adate
, "rebase-merge/cdate_is_adate")
151 static GIT_PATH_FUNC(rebase_path_ignore_date
, "rebase-merge/ignore_date")
152 static GIT_PATH_FUNC(rebase_path_orig_head
, "rebase-merge/orig-head")
153 static GIT_PATH_FUNC(rebase_path_verbose
, "rebase-merge/verbose")
154 static GIT_PATH_FUNC(rebase_path_quiet
, "rebase-merge/quiet")
155 static GIT_PATH_FUNC(rebase_path_signoff
, "rebase-merge/signoff")
156 static GIT_PATH_FUNC(rebase_path_head_name
, "rebase-merge/head-name")
157 static GIT_PATH_FUNC(rebase_path_onto
, "rebase-merge/onto")
158 static GIT_PATH_FUNC(rebase_path_autostash
, "rebase-merge/autostash")
159 static GIT_PATH_FUNC(rebase_path_strategy
, "rebase-merge/strategy")
160 static GIT_PATH_FUNC(rebase_path_strategy_opts
, "rebase-merge/strategy_opts")
161 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate
, "rebase-merge/allow_rerere_autoupdate")
162 static GIT_PATH_FUNC(rebase_path_reschedule_failed_exec
, "rebase-merge/reschedule-failed-exec")
164 static int git_sequencer_config(const char *k
, const char *v
, void *cb
)
166 struct replay_opts
*opts
= cb
;
169 if (!strcmp(k
, "commit.cleanup")) {
172 status
= git_config_string(&s
, k
, v
);
176 if (!strcmp(s
, "verbatim")) {
177 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
178 opts
->explicit_cleanup
= 1;
179 } else if (!strcmp(s
, "whitespace")) {
180 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
181 opts
->explicit_cleanup
= 1;
182 } else if (!strcmp(s
, "strip")) {
183 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_ALL
;
184 opts
->explicit_cleanup
= 1;
185 } else if (!strcmp(s
, "scissors")) {
186 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_SCISSORS
;
187 opts
->explicit_cleanup
= 1;
189 warning(_("invalid commit message cleanup mode '%s'"),
197 if (!strcmp(k
, "commit.gpgsign")) {
198 opts
->gpg_sign
= git_config_bool(k
, v
) ? xstrdup("") : NULL
;
202 status
= git_gpg_config(k
, v
, NULL
);
206 return git_diff_basic_config(k
, v
, NULL
);
209 void sequencer_init_config(struct replay_opts
*opts
)
211 opts
->default_msg_cleanup
= COMMIT_MSG_CLEANUP_NONE
;
212 git_config(git_sequencer_config
, opts
);
215 static inline int is_rebase_i(const struct replay_opts
*opts
)
217 return opts
->action
== REPLAY_INTERACTIVE_REBASE
;
220 static const char *get_dir(const struct replay_opts
*opts
)
222 if (is_rebase_i(opts
))
223 return rebase_path();
224 return git_path_seq_dir();
227 static const char *get_todo_path(const struct replay_opts
*opts
)
229 if (is_rebase_i(opts
))
230 return rebase_path_todo();
231 return git_path_todo_file();
235 * Returns 0 for non-conforming footer
236 * Returns 1 for conforming footer
237 * Returns 2 when sob exists within conforming footer
238 * Returns 3 when sob exists within conforming footer as last entry
240 static int has_conforming_footer(struct strbuf
*sb
, struct strbuf
*sob
,
241 size_t ignore_footer
)
243 struct process_trailer_options opts
= PROCESS_TRAILER_OPTIONS_INIT
;
244 struct trailer_info info
;
246 int found_sob
= 0, found_sob_last
= 0;
250 trailer_info_get(&info
, sb
->buf
, &opts
);
252 if (info
.trailer_start
== info
.trailer_end
)
255 for (i
= 0; i
< info
.trailer_nr
; i
++)
256 if (sob
&& !strncmp(info
.trailers
[i
], sob
->buf
, sob
->len
)) {
258 if (i
== info
.trailer_nr
- 1)
262 trailer_info_release(&info
);
271 static const char *gpg_sign_opt_quoted(struct replay_opts
*opts
)
273 static struct strbuf buf
= STRBUF_INIT
;
277 sq_quotef(&buf
, "-S%s", opts
->gpg_sign
);
281 int sequencer_remove_state(struct replay_opts
*opts
)
283 struct strbuf buf
= STRBUF_INIT
;
286 if (is_rebase_i(opts
) &&
287 strbuf_read_file(&buf
, rebase_path_refs_to_delete(), 0) > 0) {
290 char *eol
= strchr(p
, '\n');
293 if (delete_ref("(rebase -i) cleanup", p
, NULL
, 0) < 0) {
294 warning(_("could not delete '%s'"), p
);
303 free(opts
->gpg_sign
);
304 free(opts
->strategy
);
305 for (i
= 0; i
< opts
->xopts_nr
; i
++)
306 free(opts
->xopts
[i
]);
308 strbuf_release(&opts
->current_fixups
);
311 strbuf_addstr(&buf
, get_dir(opts
));
312 if (remove_dir_recursively(&buf
, 0))
313 ret
= error(_("could not remove '%s'"), buf
.buf
);
314 strbuf_release(&buf
);
319 static const char *action_name(const struct replay_opts
*opts
)
321 switch (opts
->action
) {
325 return N_("cherry-pick");
326 case REPLAY_INTERACTIVE_REBASE
:
327 return N_("rebase -i");
329 die(_("unknown action: %d"), opts
->action
);
332 struct commit_message
{
339 static const char *short_commit_name(struct commit
*commit
)
341 return find_unique_abbrev(&commit
->object
.oid
, DEFAULT_ABBREV
);
344 static int get_message(struct commit
*commit
, struct commit_message
*out
)
346 const char *abbrev
, *subject
;
349 out
->message
= logmsg_reencode(commit
, NULL
, get_commit_output_encoding());
350 abbrev
= short_commit_name(commit
);
352 subject_len
= find_commit_subject(out
->message
, &subject
);
354 out
->subject
= xmemdupz(subject
, subject_len
);
355 out
->label
= xstrfmt("%s... %s", abbrev
, out
->subject
);
356 out
->parent_label
= xstrfmt("parent of %s", out
->label
);
361 static void free_message(struct commit
*commit
, struct commit_message
*msg
)
363 free(msg
->parent_label
);
366 unuse_commit_buffer(commit
, msg
->message
);
369 static void print_advice(struct repository
*r
, int show_hint
,
370 struct replay_opts
*opts
)
372 char *msg
= getenv("GIT_CHERRY_PICK_HELP");
375 fprintf(stderr
, "%s\n", msg
);
377 * A conflict has occurred but the porcelain
378 * (typically rebase --interactive) wants to take care
379 * of the commit itself so remove CHERRY_PICK_HEAD
381 unlink(git_path_cherry_pick_head(r
));
387 advise(_("after resolving the conflicts, mark the corrected paths\n"
388 "with 'git add <paths>' or 'git rm <paths>'"));
390 advise(_("after resolving the conflicts, mark the corrected paths\n"
391 "with 'git add <paths>' or 'git rm <paths>'\n"
392 "and commit the result with 'git commit'"));
396 static int write_message(const void *buf
, size_t len
, const char *filename
,
399 struct lock_file msg_file
= LOCK_INIT
;
401 int msg_fd
= hold_lock_file_for_update(&msg_file
, filename
, 0);
403 return error_errno(_("could not lock '%s'"), filename
);
404 if (write_in_full(msg_fd
, buf
, len
) < 0) {
405 error_errno(_("could not write to '%s'"), filename
);
406 rollback_lock_file(&msg_file
);
409 if (append_eol
&& write(msg_fd
, "\n", 1) < 0) {
410 error_errno(_("could not write eol to '%s'"), filename
);
411 rollback_lock_file(&msg_file
);
414 if (commit_lock_file(&msg_file
) < 0)
415 return error(_("failed to finalize '%s'"), filename
);
421 * Reads a file that was presumably written by a shell script, i.e. with an
422 * end-of-line marker that needs to be stripped.
424 * Note that only the last end-of-line marker is stripped, consistent with the
425 * behavior of "$(cat path)" in a shell script.
427 * Returns 1 if the file was read, 0 if it could not be read or does not exist.
429 static int read_oneliner(struct strbuf
*buf
,
430 const char *path
, int skip_if_empty
)
432 int orig_len
= buf
->len
;
434 if (!file_exists(path
))
437 if (strbuf_read_file(buf
, path
, 0) < 0) {
438 warning_errno(_("could not read '%s'"), path
);
442 if (buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\n') {
443 if (--buf
->len
> orig_len
&& buf
->buf
[buf
->len
- 1] == '\r')
445 buf
->buf
[buf
->len
] = '\0';
448 if (skip_if_empty
&& buf
->len
== orig_len
)
454 static struct tree
*empty_tree(struct repository
*r
)
456 return lookup_tree(r
, the_hash_algo
->empty_tree
);
459 static int error_dirty_index(struct repository
*repo
, struct replay_opts
*opts
)
461 if (repo_read_index_unmerged(repo
))
462 return error_resolve_conflict(_(action_name(opts
)));
464 error(_("your local changes would be overwritten by %s."),
465 _(action_name(opts
)));
467 if (advice_commit_before_merge
)
468 advise(_("commit your changes or stash them to proceed."));
472 static void update_abort_safety_file(void)
474 struct object_id head
;
476 /* Do nothing on a single-pick */
477 if (!file_exists(git_path_seq_dir()))
480 if (!get_oid("HEAD", &head
))
481 write_file(git_path_abort_safety_file(), "%s", oid_to_hex(&head
));
483 write_file(git_path_abort_safety_file(), "%s", "");
486 static int fast_forward_to(struct repository
*r
,
487 const struct object_id
*to
,
488 const struct object_id
*from
,
490 struct replay_opts
*opts
)
492 struct ref_transaction
*transaction
;
493 struct strbuf sb
= STRBUF_INIT
;
494 struct strbuf err
= STRBUF_INIT
;
497 if (checkout_fast_forward(r
, from
, to
, 1))
498 return -1; /* the callee should have complained already */
500 strbuf_addf(&sb
, _("%s: fast-forward"), _(action_name(opts
)));
502 transaction
= ref_transaction_begin(&err
);
504 ref_transaction_update(transaction
, "HEAD",
505 to
, unborn
&& !is_rebase_i(opts
) ?
508 ref_transaction_commit(transaction
, &err
)) {
509 ref_transaction_free(transaction
);
510 error("%s", err
.buf
);
512 strbuf_release(&err
);
517 strbuf_release(&err
);
518 ref_transaction_free(transaction
);
519 update_abort_safety_file();
523 enum commit_msg_cleanup_mode
get_cleanup_mode(const char *cleanup_arg
,
526 if (!cleanup_arg
|| !strcmp(cleanup_arg
, "default"))
527 return use_editor
? COMMIT_MSG_CLEANUP_ALL
:
528 COMMIT_MSG_CLEANUP_SPACE
;
529 else if (!strcmp(cleanup_arg
, "verbatim"))
530 return COMMIT_MSG_CLEANUP_NONE
;
531 else if (!strcmp(cleanup_arg
, "whitespace"))
532 return COMMIT_MSG_CLEANUP_SPACE
;
533 else if (!strcmp(cleanup_arg
, "strip"))
534 return COMMIT_MSG_CLEANUP_ALL
;
535 else if (!strcmp(cleanup_arg
, "scissors"))
536 return use_editor
? COMMIT_MSG_CLEANUP_SCISSORS
:
537 COMMIT_MSG_CLEANUP_SPACE
;
539 die(_("Invalid cleanup mode %s"), cleanup_arg
);
543 * NB using int rather than enum cleanup_mode to stop clang's
544 * -Wtautological-constant-out-of-range-compare complaining that the comparison
547 static const char *describe_cleanup_mode(int cleanup_mode
)
549 static const char *modes
[] = { "whitespace",
554 if (cleanup_mode
< ARRAY_SIZE(modes
))
555 return modes
[cleanup_mode
];
557 BUG("invalid cleanup_mode provided (%d)", cleanup_mode
);
560 void append_conflicts_hint(struct index_state
*istate
,
561 struct strbuf
*msgbuf
, enum commit_msg_cleanup_mode cleanup_mode
)
565 if (cleanup_mode
== COMMIT_MSG_CLEANUP_SCISSORS
) {
566 strbuf_addch(msgbuf
, '\n');
567 wt_status_append_cut_line(msgbuf
);
568 strbuf_addch(msgbuf
, comment_line_char
);
571 strbuf_addch(msgbuf
, '\n');
572 strbuf_commented_addf(msgbuf
, "Conflicts:\n");
573 for (i
= 0; i
< istate
->cache_nr
;) {
574 const struct cache_entry
*ce
= istate
->cache
[i
++];
576 strbuf_commented_addf(msgbuf
, "\t%s\n", ce
->name
);
577 while (i
< istate
->cache_nr
&&
578 !strcmp(ce
->name
, istate
->cache
[i
]->name
))
584 static int do_recursive_merge(struct repository
*r
,
585 struct commit
*base
, struct commit
*next
,
586 const char *base_label
, const char *next_label
,
587 struct object_id
*head
, struct strbuf
*msgbuf
,
588 struct replay_opts
*opts
)
590 struct merge_options o
;
591 struct tree
*next_tree
, *base_tree
, *head_tree
;
594 struct lock_file index_lock
= LOCK_INIT
;
596 if (repo_hold_locked_index(r
, &index_lock
, LOCK_REPORT_ON_ERROR
) < 0)
601 init_merge_options(&o
, r
);
602 o
.ancestor
= base
? base_label
: "(empty tree)";
604 o
.branch2
= next
? next_label
: "(empty tree)";
605 if (is_rebase_i(opts
))
607 o
.show_rename_progress
= 1;
609 head_tree
= parse_tree_indirect(head
);
610 next_tree
= next
? get_commit_tree(next
) : empty_tree(r
);
611 base_tree
= base
? get_commit_tree(base
) : empty_tree(r
);
613 for (xopt
= opts
->xopts
; xopt
!= opts
->xopts
+ opts
->xopts_nr
; xopt
++)
614 parse_merge_opt(&o
, *xopt
);
616 clean
= merge_trees(&o
,
618 next_tree
, base_tree
);
619 if (is_rebase_i(opts
) && clean
<= 0)
620 fputs(o
.obuf
.buf
, stdout
);
621 strbuf_release(&o
.obuf
);
623 rollback_lock_file(&index_lock
);
627 if (write_locked_index(r
->index
, &index_lock
,
628 COMMIT_LOCK
| SKIP_IF_UNCHANGED
))
630 * TRANSLATORS: %s will be "revert", "cherry-pick" or
633 return error(_("%s: Unable to write new index file"),
634 _(action_name(opts
)));
637 append_conflicts_hint(r
->index
, msgbuf
,
638 opts
->default_msg_cleanup
);
643 static struct object_id
*get_cache_tree_oid(struct index_state
*istate
)
645 if (!istate
->cache_tree
)
646 istate
->cache_tree
= cache_tree();
648 if (!cache_tree_fully_valid(istate
->cache_tree
))
649 if (cache_tree_update(istate
, 0)) {
650 error(_("unable to update cache tree"));
654 return &istate
->cache_tree
->oid
;
657 static int is_index_unchanged(struct repository
*r
)
659 struct object_id head_oid
, *cache_tree_oid
;
660 struct commit
*head_commit
;
661 struct index_state
*istate
= r
->index
;
663 if (!resolve_ref_unsafe("HEAD", RESOLVE_REF_READING
, &head_oid
, NULL
))
664 return error(_("could not resolve HEAD commit"));
666 head_commit
= lookup_commit(r
, &head_oid
);
669 * If head_commit is NULL, check_commit, called from
670 * lookup_commit, would have indicated that head_commit is not
671 * a commit object already. parse_commit() will return failure
672 * without further complaints in such a case. Otherwise, if
673 * the commit is invalid, parse_commit() will complain. So
674 * there is nothing for us to say here. Just return failure.
676 if (parse_commit(head_commit
))
679 if (!(cache_tree_oid
= get_cache_tree_oid(istate
)))
682 return oideq(cache_tree_oid
, get_commit_tree_oid(head_commit
));
685 static int write_author_script(const char *message
)
687 struct strbuf buf
= STRBUF_INIT
;
692 if (!*message
|| starts_with(message
, "\n")) {
694 /* Missing 'author' line? */
695 unlink(rebase_path_author_script());
697 } else if (skip_prefix(message
, "author ", &message
))
699 else if ((eol
= strchr(message
, '\n')))
704 strbuf_addstr(&buf
, "GIT_AUTHOR_NAME='");
705 while (*message
&& *message
!= '\n' && *message
!= '\r')
706 if (skip_prefix(message
, " <", &message
))
708 else if (*message
!= '\'')
709 strbuf_addch(&buf
, *(message
++));
711 strbuf_addf(&buf
, "'\\%c'", *(message
++));
712 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_EMAIL='");
713 while (*message
&& *message
!= '\n' && *message
!= '\r')
714 if (skip_prefix(message
, "> ", &message
))
716 else if (*message
!= '\'')
717 strbuf_addch(&buf
, *(message
++));
719 strbuf_addf(&buf
, "'\\%c'", *(message
++));
720 strbuf_addstr(&buf
, "'\nGIT_AUTHOR_DATE='@");
721 while (*message
&& *message
!= '\n' && *message
!= '\r')
722 if (*message
!= '\'')
723 strbuf_addch(&buf
, *(message
++));
725 strbuf_addf(&buf
, "'\\%c'", *(message
++));
726 strbuf_addch(&buf
, '\'');
727 res
= write_message(buf
.buf
, buf
.len
, rebase_path_author_script(), 1);
728 strbuf_release(&buf
);
733 * Take a series of KEY='VALUE' lines where VALUE part is
734 * sq-quoted, and append <KEY, VALUE> at the end of the string list
736 static int parse_key_value_squoted(char *buf
, struct string_list
*list
)
739 struct string_list_item
*item
;
741 char *cp
= strchr(buf
, '=');
743 np
= strchrnul(buf
, '\n');
744 return error(_("no key present in '%.*s'"),
745 (int) (np
- buf
), buf
);
747 np
= strchrnul(cp
, '\n');
749 item
= string_list_append(list
, buf
);
751 buf
= np
+ (*np
== '\n');
755 return error(_("unable to dequote value of '%s'"),
757 item
->util
= xstrdup(cp
);
763 * Reads and parses the state directory's "author-script" file, and sets name,
764 * email and date accordingly.
765 * Returns 0 on success, -1 if the file could not be parsed.
767 * The author script is of the format:
769 * GIT_AUTHOR_NAME='$author_name'
770 * GIT_AUTHOR_EMAIL='$author_email'
771 * GIT_AUTHOR_DATE='$author_date'
773 * where $author_name, $author_email and $author_date are quoted. We are strict
774 * with our parsing, as the file was meant to be eval'd in the now-removed
775 * git-am.sh/git-rebase--interactive.sh scripts, and thus if the file differs
776 * from what this function expects, it is better to bail out than to do
777 * something that the user does not expect.
779 int read_author_script(const char *path
, char **name
, char **email
, char **date
,
782 struct strbuf buf
= STRBUF_INIT
;
783 struct string_list kv
= STRING_LIST_INIT_DUP
;
784 int retval
= -1; /* assume failure */
785 int i
, name_i
= -2, email_i
= -2, date_i
= -2, err
= 0;
787 if (strbuf_read_file(&buf
, path
, 256) <= 0) {
788 strbuf_release(&buf
);
789 if (errno
== ENOENT
&& allow_missing
)
792 return error_errno(_("could not open '%s' for reading"),
796 if (parse_key_value_squoted(buf
.buf
, &kv
))
799 for (i
= 0; i
< kv
.nr
; i
++) {
800 if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_NAME")) {
802 name_i
= error(_("'GIT_AUTHOR_NAME' already given"));
805 } else if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_EMAIL")) {
807 email_i
= error(_("'GIT_AUTHOR_EMAIL' already given"));
810 } else if (!strcmp(kv
.items
[i
].string
, "GIT_AUTHOR_DATE")) {
812 date_i
= error(_("'GIT_AUTHOR_DATE' already given"));
816 err
= error(_("unknown variable '%s'"),
821 error(_("missing 'GIT_AUTHOR_NAME'"));
823 error(_("missing 'GIT_AUTHOR_EMAIL'"));
825 error(_("missing 'GIT_AUTHOR_DATE'"));
826 if (date_i
< 0 || email_i
< 0 || date_i
< 0 || err
)
830 *name
= kv
.items
[name_i
].util
;
832 free(kv
.items
[name_i
].util
);
834 *email
= kv
.items
[email_i
].util
;
836 free(kv
.items
[email_i
].util
);
838 *date
= kv
.items
[date_i
].util
;
840 free(kv
.items
[date_i
].util
);
843 string_list_clear(&kv
, !!retval
);
844 strbuf_release(&buf
);
849 * Read a GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL AND GIT_AUTHOR_DATE from a
850 * file with shell quoting into struct argv_array. Returns -1 on
851 * error, 0 otherwise.
853 static int read_env_script(struct argv_array
*env
)
855 char *name
, *email
, *date
;
857 if (read_author_script(rebase_path_author_script(),
858 &name
, &email
, &date
, 0))
861 argv_array_pushf(env
, "GIT_AUTHOR_NAME=%s", name
);
862 argv_array_pushf(env
, "GIT_AUTHOR_EMAIL=%s", email
);
863 argv_array_pushf(env
, "GIT_AUTHOR_DATE=%s", date
);
871 static char *get_author(const char *message
)
876 a
= find_commit_header(message
, "author", &len
);
878 return xmemdupz(a
, len
);
883 /* Returns a "date" string that needs to be free()'d by the caller */
884 static char *read_author_date_or_null(void)
888 if (read_author_script(rebase_path_author_script(),
889 NULL
, NULL
, &date
, 0))
894 /* Construct a free()able author string with current time as the author date */
895 static char *ignore_author_date(const char *author
)
897 int len
= strlen(author
);
898 struct ident_split ident
;
899 struct strbuf new_author
= STRBUF_INIT
;
901 if (split_ident_line(&ident
, author
, len
) < 0) {
902 error(_("malformed ident line"));
905 len
= ident
.mail_end
- ident
.name_begin
+ 1;
907 strbuf_addf(&new_author
, "%.*s ", len
, ident
.name_begin
);
908 datestamp(&new_author
);
909 return strbuf_detach(&new_author
, NULL
);
912 static void push_dates(struct child_process
*child
, int change_committer_date
)
914 time_t now
= time(NULL
);
915 struct strbuf date
= STRBUF_INIT
;
917 strbuf_addf(&date
, "@%"PRIuMAX
, (uintmax_t)now
);
918 argv_array_pushf(&child
->env_array
, "GIT_AUTHOR_DATE=%s", date
.buf
);
919 if (change_committer_date
)
920 argv_array_pushf(&child
->env_array
, "GIT_COMMITTER_DATE=%s", date
.buf
);
921 strbuf_release(&date
);
924 static const char staged_changes_advice
[] =
925 N_("you have staged changes in your working tree\n"
926 "If these changes are meant to be squashed into the previous commit, run:\n"
928 " git commit --amend %s\n"
930 "If they are meant to go into a new commit, run:\n"
934 "In both cases, once you're done, continue with:\n"
936 " git rebase --continue\n");
938 #define ALLOW_EMPTY (1<<0)
939 #define EDIT_MSG (1<<1)
940 #define AMEND_MSG (1<<2)
941 #define CLEANUP_MSG (1<<3)
942 #define VERIFY_MSG (1<<4)
943 #define CREATE_ROOT_COMMIT (1<<5)
945 static int run_command_silent_on_success(struct child_process
*cmd
)
947 struct strbuf buf
= STRBUF_INIT
;
950 cmd
->stdout_to_stderr
= 1;
951 rc
= pipe_command(cmd
,
957 fputs(buf
.buf
, stderr
);
958 strbuf_release(&buf
);
963 * If we are cherry-pick, and if the merge did not result in
964 * hand-editing, we will hit this commit and inherit the original
965 * author date and name.
967 * If we are revert, or if our cherry-pick results in a hand merge,
968 * we had better say that the current user is responsible for that.
970 * An exception is when run_git_commit() is called during an
971 * interactive rebase: in that case, we will want to retain the
974 static int run_git_commit(struct repository
*r
,
976 struct replay_opts
*opts
,
979 struct child_process cmd
= CHILD_PROCESS_INIT
;
983 if (opts
->committer_date_is_author_date
) {
985 struct strbuf datebuf
= STRBUF_INIT
;
986 char *date
= read_author_date_or_null();
991 strbuf_addf(&datebuf
, "@%s", date
);
992 res
= setenv("GIT_COMMITTER_DATE",
993 opts
->ignore_date
? "" : datebuf
.buf
, 1);
995 strbuf_release(&datebuf
);
1002 if (is_rebase_i(opts
) && read_env_script(&cmd
.env_array
)) {
1003 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
1005 return error(_(staged_changes_advice
),
1009 argv_array_push(&cmd
.args
, "commit");
1011 if (!(flags
& VERIFY_MSG
))
1012 argv_array_push(&cmd
.args
, "-n");
1013 if ((flags
& AMEND_MSG
))
1014 argv_array_push(&cmd
.args
, "--amend");
1016 argv_array_pushf(&cmd
.args
, "-S%s", opts
->gpg_sign
);
1017 if (opts
->ignore_date
)
1018 push_dates(&cmd
, opts
->committer_date_is_author_date
);
1020 argv_array_pushl(&cmd
.args
, "-F", defmsg
, NULL
);
1021 else if (!(flags
& EDIT_MSG
))
1022 argv_array_pushl(&cmd
.args
, "-C", "HEAD", NULL
);
1023 if ((flags
& CLEANUP_MSG
))
1024 argv_array_push(&cmd
.args
, "--cleanup=strip");
1025 if ((flags
& EDIT_MSG
))
1026 argv_array_push(&cmd
.args
, "-e");
1027 else if (!(flags
& CLEANUP_MSG
) &&
1028 !opts
->signoff
&& !opts
->record_origin
&&
1029 !opts
->explicit_cleanup
)
1030 argv_array_push(&cmd
.args
, "--cleanup=verbatim");
1032 if ((flags
& ALLOW_EMPTY
))
1033 argv_array_push(&cmd
.args
, "--allow-empty");
1035 if (!(flags
& EDIT_MSG
))
1036 argv_array_push(&cmd
.args
, "--allow-empty-message");
1038 if (is_rebase_i(opts
) && !(flags
& EDIT_MSG
))
1039 return run_command_silent_on_success(&cmd
);
1041 return run_command(&cmd
);
1044 static int rest_is_empty(const struct strbuf
*sb
, int start
)
1049 /* Check if the rest is just whitespace and Signed-off-by's. */
1050 for (i
= start
; i
< sb
->len
; i
++) {
1051 nl
= memchr(sb
->buf
+ i
, '\n', sb
->len
- i
);
1057 if (strlen(sign_off_header
) <= eol
- i
&&
1058 starts_with(sb
->buf
+ i
, sign_off_header
)) {
1063 if (!isspace(sb
->buf
[i
++]))
1070 void cleanup_message(struct strbuf
*msgbuf
,
1071 enum commit_msg_cleanup_mode cleanup_mode
, int verbose
)
1073 if (verbose
|| /* Truncate the message just before the diff, if any. */
1074 cleanup_mode
== COMMIT_MSG_CLEANUP_SCISSORS
)
1075 strbuf_setlen(msgbuf
, wt_status_locate_end(msgbuf
->buf
, msgbuf
->len
));
1076 if (cleanup_mode
!= COMMIT_MSG_CLEANUP_NONE
)
1077 strbuf_stripspace(msgbuf
, cleanup_mode
== COMMIT_MSG_CLEANUP_ALL
);
1081 * Find out if the message in the strbuf contains only whitespace and
1082 * Signed-off-by lines.
1084 int message_is_empty(const struct strbuf
*sb
,
1085 enum commit_msg_cleanup_mode cleanup_mode
)
1087 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
1089 return rest_is_empty(sb
, 0);
1093 * See if the user edited the message in the editor or left what
1094 * was in the template intact
1096 int template_untouched(const struct strbuf
*sb
, const char *template_file
,
1097 enum commit_msg_cleanup_mode cleanup_mode
)
1099 struct strbuf tmpl
= STRBUF_INIT
;
1102 if (cleanup_mode
== COMMIT_MSG_CLEANUP_NONE
&& sb
->len
)
1105 if (!template_file
|| strbuf_read_file(&tmpl
, template_file
, 0) <= 0)
1108 strbuf_stripspace(&tmpl
, cleanup_mode
== COMMIT_MSG_CLEANUP_ALL
);
1109 if (!skip_prefix(sb
->buf
, tmpl
.buf
, &start
))
1111 strbuf_release(&tmpl
);
1112 return rest_is_empty(sb
, start
- sb
->buf
);
1115 int update_head_with_reflog(const struct commit
*old_head
,
1116 const struct object_id
*new_head
,
1117 const char *action
, const struct strbuf
*msg
,
1120 struct ref_transaction
*transaction
;
1121 struct strbuf sb
= STRBUF_INIT
;
1126 strbuf_addstr(&sb
, action
);
1127 strbuf_addstr(&sb
, ": ");
1130 nl
= strchr(msg
->buf
, '\n');
1132 strbuf_add(&sb
, msg
->buf
, nl
+ 1 - msg
->buf
);
1134 strbuf_addbuf(&sb
, msg
);
1135 strbuf_addch(&sb
, '\n');
1138 transaction
= ref_transaction_begin(err
);
1140 ref_transaction_update(transaction
, "HEAD", new_head
,
1141 old_head
? &old_head
->object
.oid
: &null_oid
,
1143 ref_transaction_commit(transaction
, err
)) {
1146 ref_transaction_free(transaction
);
1147 strbuf_release(&sb
);
1152 static int run_rewrite_hook(const struct object_id
*oldoid
,
1153 const struct object_id
*newoid
)
1155 struct child_process proc
= CHILD_PROCESS_INIT
;
1156 const char *argv
[3];
1158 struct strbuf sb
= STRBUF_INIT
;
1160 argv
[0] = find_hook("post-rewrite");
1169 proc
.stdout_to_stderr
= 1;
1170 proc
.trace2_hook_name
= "post-rewrite";
1172 code
= start_command(&proc
);
1175 strbuf_addf(&sb
, "%s %s\n", oid_to_hex(oldoid
), oid_to_hex(newoid
));
1176 sigchain_push(SIGPIPE
, SIG_IGN
);
1177 write_in_full(proc
.in
, sb
.buf
, sb
.len
);
1179 strbuf_release(&sb
);
1180 sigchain_pop(SIGPIPE
);
1181 return finish_command(&proc
);
1184 void commit_post_rewrite(struct repository
*r
,
1185 const struct commit
*old_head
,
1186 const struct object_id
*new_head
)
1188 struct notes_rewrite_cfg
*cfg
;
1190 cfg
= init_copy_notes_for_rewrite("amend");
1192 /* we are amending, so old_head is not NULL */
1193 copy_note_for_rewrite(cfg
, &old_head
->object
.oid
, new_head
);
1194 finish_copy_notes_for_rewrite(r
, cfg
, "Notes added by 'git commit --amend'");
1196 run_rewrite_hook(&old_head
->object
.oid
, new_head
);
1199 static int run_prepare_commit_msg_hook(struct repository
*r
,
1204 const char *name
, *arg1
= NULL
, *arg2
= NULL
;
1206 name
= git_path_commit_editmsg();
1207 if (write_message(msg
->buf
, msg
->len
, name
, 0))
1216 if (run_commit_hook(0, r
->index_file
, "prepare-commit-msg", name
,
1218 ret
= error(_("'prepare-commit-msg' hook failed"));
1223 static const char implicit_ident_advice_noconfig
[] =
1224 N_("Your name and email address were configured automatically based\n"
1225 "on your username and hostname. Please check that they are accurate.\n"
1226 "You can suppress this message by setting them explicitly. Run the\n"
1227 "following command and follow the instructions in your editor to edit\n"
1228 "your configuration file:\n"
1230 " git config --global --edit\n"
1232 "After doing this, you may fix the identity used for this commit with:\n"
1234 " git commit --amend --reset-author\n");
1236 static const char implicit_ident_advice_config
[] =
1237 N_("Your name and email address were configured automatically based\n"
1238 "on your username and hostname. Please check that they are accurate.\n"
1239 "You can suppress this message by setting them explicitly:\n"
1241 " git config --global user.name \"Your Name\"\n"
1242 " git config --global user.email you@example.com\n"
1244 "After doing this, you may fix the identity used for this commit with:\n"
1246 " git commit --amend --reset-author\n");
1248 static const char *implicit_ident_advice(void)
1250 char *user_config
= expand_user_path("~/.gitconfig", 0);
1251 char *xdg_config
= xdg_config_home("config");
1252 int config_exists
= file_exists(user_config
) || file_exists(xdg_config
);
1258 return _(implicit_ident_advice_config
);
1260 return _(implicit_ident_advice_noconfig
);
1264 void print_commit_summary(struct repository
*r
,
1266 const struct object_id
*oid
,
1269 struct rev_info rev
;
1270 struct commit
*commit
;
1271 struct strbuf format
= STRBUF_INIT
;
1273 struct pretty_print_context pctx
= {0};
1274 struct strbuf author_ident
= STRBUF_INIT
;
1275 struct strbuf committer_ident
= STRBUF_INIT
;
1277 commit
= lookup_commit(r
, oid
);
1279 die(_("couldn't look up newly created commit"));
1280 if (parse_commit(commit
))
1281 die(_("could not parse newly created commit"));
1283 strbuf_addstr(&format
, "format:%h] %s");
1285 format_commit_message(commit
, "%an <%ae>", &author_ident
, &pctx
);
1286 format_commit_message(commit
, "%cn <%ce>", &committer_ident
, &pctx
);
1287 if (strbuf_cmp(&author_ident
, &committer_ident
)) {
1288 strbuf_addstr(&format
, "\n Author: ");
1289 strbuf_addbuf_percentquote(&format
, &author_ident
);
1291 if (flags
& SUMMARY_SHOW_AUTHOR_DATE
) {
1292 struct strbuf date
= STRBUF_INIT
;
1294 format_commit_message(commit
, "%ad", &date
, &pctx
);
1295 strbuf_addstr(&format
, "\n Date: ");
1296 strbuf_addbuf_percentquote(&format
, &date
);
1297 strbuf_release(&date
);
1299 if (!committer_ident_sufficiently_given()) {
1300 strbuf_addstr(&format
, "\n Committer: ");
1301 strbuf_addbuf_percentquote(&format
, &committer_ident
);
1302 if (advice_implicit_identity
) {
1303 strbuf_addch(&format
, '\n');
1304 strbuf_addstr(&format
, implicit_ident_advice());
1307 strbuf_release(&author_ident
);
1308 strbuf_release(&committer_ident
);
1310 repo_init_revisions(r
, &rev
, prefix
);
1311 setup_revisions(0, NULL
, &rev
, NULL
);
1314 rev
.diffopt
.output_format
=
1315 DIFF_FORMAT_SHORTSTAT
| DIFF_FORMAT_SUMMARY
;
1317 rev
.verbose_header
= 1;
1318 rev
.show_root_diff
= 1;
1319 get_commit_format(format
.buf
, &rev
);
1320 rev
.always_show_header
= 0;
1321 rev
.diffopt
.detect_rename
= DIFF_DETECT_RENAME
;
1322 rev
.diffopt
.break_opt
= 0;
1323 diff_setup_done(&rev
.diffopt
);
1325 head
= resolve_ref_unsafe("HEAD", 0, NULL
, NULL
);
1327 die_errno(_("unable to resolve HEAD after creating commit"));
1328 if (!strcmp(head
, "HEAD"))
1329 head
= _("detached HEAD");
1331 skip_prefix(head
, "refs/heads/", &head
);
1332 printf("[%s%s ", head
, (flags
& SUMMARY_INITIAL_COMMIT
) ?
1333 _(" (root-commit)") : "");
1335 if (!log_tree_commit(&rev
, commit
)) {
1336 rev
.always_show_header
= 1;
1337 rev
.use_terminator
= 1;
1338 log_tree_commit(&rev
, commit
);
1341 strbuf_release(&format
);
1344 static int parse_head(struct repository
*r
, struct commit
**head
)
1346 struct commit
*current_head
;
1347 struct object_id oid
;
1349 if (get_oid("HEAD", &oid
)) {
1350 current_head
= NULL
;
1352 current_head
= lookup_commit_reference(r
, &oid
);
1354 return error(_("could not parse HEAD"));
1355 if (!oideq(&oid
, ¤t_head
->object
.oid
)) {
1356 warning(_("HEAD %s is not a commit!"),
1359 if (parse_commit(current_head
))
1360 return error(_("could not parse HEAD commit"));
1362 *head
= current_head
;
1368 * Try to commit without forking 'git commit'. In some cases we need
1369 * to run 'git commit' to display an error message
1372 * -1 - error unable to commit
1374 * 1 - run 'git commit'
1376 static int try_to_commit(struct repository
*r
,
1377 struct strbuf
*msg
, const char *author
,
1378 struct replay_opts
*opts
, unsigned int flags
,
1379 struct object_id
*oid
)
1381 struct object_id tree
;
1382 struct commit
*current_head
= NULL
;
1383 struct commit_list
*parents
= NULL
;
1384 struct commit_extra_header
*extra
= NULL
;
1385 struct strbuf err
= STRBUF_INIT
;
1386 struct strbuf commit_msg
= STRBUF_INIT
;
1387 char *author_to_free
= NULL
;
1388 const char *hook_commit
= NULL
;
1389 enum commit_msg_cleanup_mode cleanup
;
1392 if (parse_head(r
, ¤t_head
))
1394 if (flags
& AMEND_MSG
) {
1395 const char *exclude_gpgsig
[] = { "gpgsig", NULL
};
1396 const char *out_enc
= get_commit_output_encoding();
1397 const char *message
= logmsg_reencode(current_head
, NULL
,
1401 const char *orig_message
= NULL
;
1403 find_commit_subject(message
, &orig_message
);
1405 strbuf_addstr(msg
, orig_message
);
1406 hook_commit
= "HEAD";
1408 author
= author_to_free
= get_author(message
);
1409 unuse_commit_buffer(current_head
, message
);
1411 res
= error(_("unable to parse commit author"));
1414 parents
= copy_commit_list(current_head
->parents
);
1415 extra
= read_commit_extra_headers(current_head
, exclude_gpgsig
);
1416 } else if (current_head
&&
1417 (!(flags
& CREATE_ROOT_COMMIT
) || (flags
& AMEND_MSG
))) {
1418 commit_list_insert(current_head
, &parents
);
1421 if (opts
->committer_date_is_author_date
) {
1422 int len
= strlen(author
);
1423 struct ident_split ident
;
1424 struct strbuf date
= STRBUF_INIT
;
1426 if (split_ident_line(&ident
, author
, len
) < 0) {
1427 res
= error(_("malformed ident line"));
1430 if (!ident
.date_begin
) {
1431 res
= error(_("corrupted author without date information"));
1435 strbuf_addf(&date
, "@%.*s %.*s",
1436 (int)(ident
.date_end
- ident
.date_begin
), ident
.date_begin
,
1437 (int)(ident
.tz_end
- ident
.tz_begin
), ident
.tz_begin
);
1438 res
= setenv("GIT_COMMITTER_DATE",
1439 opts
->ignore_date
? "" : date
.buf
, 1);
1440 strbuf_release(&date
);
1446 if (write_index_as_tree(&tree
, r
->index
, r
->index_file
, 0, NULL
)) {
1447 res
= error(_("git write-tree failed to write a tree"));
1451 if (!(flags
& ALLOW_EMPTY
)) {
1452 struct commit
*first_parent
= current_head
;
1454 if (flags
& AMEND_MSG
) {
1455 if (current_head
->parents
) {
1456 first_parent
= current_head
->parents
->item
;
1457 if (repo_parse_commit(r
, first_parent
)) {
1458 res
= error(_("could not parse HEAD commit"));
1462 first_parent
= NULL
;
1465 if (oideq(first_parent
1466 ? get_commit_tree_oid(first_parent
)
1467 : the_hash_algo
->empty_tree
,
1469 res
= 1; /* run 'git commit' to display error message */
1474 if (find_hook("prepare-commit-msg")) {
1475 res
= run_prepare_commit_msg_hook(r
, msg
, hook_commit
);
1478 if (strbuf_read_file(&commit_msg
, git_path_commit_editmsg(),
1480 res
= error_errno(_("unable to read commit message "
1482 git_path_commit_editmsg());
1488 if (flags
& CLEANUP_MSG
)
1489 cleanup
= COMMIT_MSG_CLEANUP_ALL
;
1490 else if ((opts
->signoff
|| opts
->record_origin
) &&
1491 !opts
->explicit_cleanup
)
1492 cleanup
= COMMIT_MSG_CLEANUP_SPACE
;
1494 cleanup
= opts
->default_msg_cleanup
;
1496 if (cleanup
!= COMMIT_MSG_CLEANUP_NONE
)
1497 strbuf_stripspace(msg
, cleanup
== COMMIT_MSG_CLEANUP_ALL
);
1498 if ((flags
& EDIT_MSG
) && message_is_empty(msg
, cleanup
)) {
1499 res
= 1; /* run 'git commit' to display error message */
1505 if (opts
->ignore_date
) {
1506 author
= ignore_author_date(author
);
1511 free(author_to_free
);
1512 author_to_free
= (char *)author
;
1514 if (commit_tree_extended(msg
->buf
, msg
->len
, &tree
, parents
,
1515 oid
, author
, opts
->gpg_sign
, extra
)) {
1516 res
= error(_("failed to write commit object"));
1520 if (update_head_with_reflog(current_head
, oid
,
1521 getenv("GIT_REFLOG_ACTION"), msg
, &err
)) {
1522 res
= error("%s", err
.buf
);
1526 run_commit_hook(0, r
->index_file
, "post-commit", NULL
);
1527 if (flags
& AMEND_MSG
)
1528 commit_post_rewrite(r
, current_head
, oid
);
1531 free_commit_extra_headers(extra
);
1532 strbuf_release(&err
);
1533 strbuf_release(&commit_msg
);
1534 free(author_to_free
);
1539 static int do_commit(struct repository
*r
,
1540 const char *msg_file
, const char *author
,
1541 struct replay_opts
*opts
, unsigned int flags
)
1545 if (!(flags
& EDIT_MSG
) && !(flags
& VERIFY_MSG
)) {
1546 struct object_id oid
;
1547 struct strbuf sb
= STRBUF_INIT
;
1549 if (msg_file
&& strbuf_read_file(&sb
, msg_file
, 2048) < 0)
1550 return error_errno(_("unable to read commit message "
1554 res
= try_to_commit(r
, msg_file
? &sb
: NULL
,
1555 author
, opts
, flags
, &oid
);
1556 strbuf_release(&sb
);
1558 unlink(git_path_cherry_pick_head(r
));
1559 unlink(git_path_merge_msg(r
));
1560 if (!is_rebase_i(opts
))
1561 print_commit_summary(r
, NULL
, &oid
,
1562 SUMMARY_SHOW_AUTHOR_DATE
);
1567 return run_git_commit(r
, msg_file
, opts
, flags
);
1572 static int is_original_commit_empty(struct commit
*commit
)
1574 const struct object_id
*ptree_oid
;
1576 if (parse_commit(commit
))
1577 return error(_("could not parse commit %s"),
1578 oid_to_hex(&commit
->object
.oid
));
1579 if (commit
->parents
) {
1580 struct commit
*parent
= commit
->parents
->item
;
1581 if (parse_commit(parent
))
1582 return error(_("could not parse parent commit %s"),
1583 oid_to_hex(&parent
->object
.oid
));
1584 ptree_oid
= get_commit_tree_oid(parent
);
1586 ptree_oid
= the_hash_algo
->empty_tree
; /* commit is root */
1589 return oideq(ptree_oid
, get_commit_tree_oid(commit
));
1593 * Do we run "git commit" with "--allow-empty"?
1595 static int allow_empty(struct repository
*r
,
1596 struct replay_opts
*opts
,
1597 struct commit
*commit
)
1599 int index_unchanged
, empty_commit
;
1604 * (1) we do not allow empty at all and error out.
1606 * (2) we allow ones that were initially empty, but
1607 * forbid the ones that become empty;
1609 * (3) we allow both.
1611 if (!opts
->allow_empty
)
1612 return 0; /* let "git commit" barf as necessary */
1614 index_unchanged
= is_index_unchanged(r
);
1615 if (index_unchanged
< 0)
1616 return index_unchanged
;
1617 if (!index_unchanged
)
1618 return 0; /* we do not have to say --allow-empty */
1620 if (opts
->keep_redundant_commits
)
1623 empty_commit
= is_original_commit_empty(commit
);
1624 if (empty_commit
< 0)
1625 return empty_commit
;
1635 } todo_command_info
[] = {
1652 static const char *command_to_string(const enum todo_command command
)
1654 if (command
< TODO_COMMENT
)
1655 return todo_command_info
[command
].str
;
1656 die(_("unknown command: %d"), command
);
1659 static char command_to_char(const enum todo_command command
)
1661 if (command
< TODO_COMMENT
&& todo_command_info
[command
].c
)
1662 return todo_command_info
[command
].c
;
1663 return comment_line_char
;
1666 static int is_noop(const enum todo_command command
)
1668 return TODO_NOOP
<= command
;
1671 static int is_fixup(enum todo_command command
)
1673 return command
== TODO_FIXUP
|| command
== TODO_SQUASH
;
1676 /* Does this command create a (non-merge) commit? */
1677 static int is_pick_or_similar(enum todo_command command
)
1692 static int update_squash_messages(struct repository
*r
,
1693 enum todo_command command
,
1694 struct commit
*commit
,
1695 struct replay_opts
*opts
)
1697 struct strbuf buf
= STRBUF_INIT
;
1699 const char *message
, *body
;
1700 const char *encoding
= get_commit_output_encoding();
1702 if (opts
->current_fixup_count
> 0) {
1703 struct strbuf header
= STRBUF_INIT
;
1706 if (strbuf_read_file(&buf
, rebase_path_squash_msg(), 9) <= 0)
1707 return error(_("could not read '%s'"),
1708 rebase_path_squash_msg());
1710 eol
= buf
.buf
[0] != comment_line_char
?
1711 buf
.buf
: strchrnul(buf
.buf
, '\n');
1713 strbuf_addf(&header
, "%c ", comment_line_char
);
1714 strbuf_addf(&header
, _("This is a combination of %d commits."),
1715 opts
->current_fixup_count
+ 2);
1716 strbuf_splice(&buf
, 0, eol
- buf
.buf
, header
.buf
, header
.len
);
1717 strbuf_release(&header
);
1719 struct object_id head
;
1720 struct commit
*head_commit
;
1721 const char *head_message
, *body
;
1723 if (get_oid("HEAD", &head
))
1724 return error(_("need a HEAD to fixup"));
1725 if (!(head_commit
= lookup_commit_reference(r
, &head
)))
1726 return error(_("could not read HEAD"));
1727 if (!(head_message
= logmsg_reencode(head_commit
, NULL
, encoding
)))
1728 return error(_("could not read HEAD's commit message"));
1730 find_commit_subject(head_message
, &body
);
1731 if (write_message(body
, strlen(body
),
1732 rebase_path_fixup_msg(), 0)) {
1733 unuse_commit_buffer(head_commit
, head_message
);
1734 return error(_("cannot write '%s'"),
1735 rebase_path_fixup_msg());
1738 strbuf_addf(&buf
, "%c ", comment_line_char
);
1739 strbuf_addf(&buf
, _("This is a combination of %d commits."), 2);
1740 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1741 strbuf_addstr(&buf
, _("This is the 1st commit message:"));
1742 strbuf_addstr(&buf
, "\n\n");
1743 strbuf_addstr(&buf
, body
);
1745 unuse_commit_buffer(head_commit
, head_message
);
1748 if (!(message
= logmsg_reencode(commit
, NULL
, encoding
)))
1749 return error(_("could not read commit message of %s"),
1750 oid_to_hex(&commit
->object
.oid
));
1751 find_commit_subject(message
, &body
);
1753 if (command
== TODO_SQUASH
) {
1754 unlink(rebase_path_fixup_msg());
1755 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1756 strbuf_addf(&buf
, _("This is the commit message #%d:"),
1757 ++opts
->current_fixup_count
+ 1);
1758 strbuf_addstr(&buf
, "\n\n");
1759 strbuf_addstr(&buf
, body
);
1760 } else if (command
== TODO_FIXUP
) {
1761 strbuf_addf(&buf
, "\n%c ", comment_line_char
);
1762 strbuf_addf(&buf
, _("The commit message #%d will be skipped:"),
1763 ++opts
->current_fixup_count
+ 1);
1764 strbuf_addstr(&buf
, "\n\n");
1765 strbuf_add_commented_lines(&buf
, body
, strlen(body
));
1767 return error(_("unknown command: %d"), command
);
1768 unuse_commit_buffer(commit
, message
);
1770 res
= write_message(buf
.buf
, buf
.len
, rebase_path_squash_msg(), 0);
1771 strbuf_release(&buf
);
1774 strbuf_addf(&opts
->current_fixups
, "%s%s %s",
1775 opts
->current_fixups
.len
? "\n" : "",
1776 command_to_string(command
),
1777 oid_to_hex(&commit
->object
.oid
));
1778 res
= write_message(opts
->current_fixups
.buf
,
1779 opts
->current_fixups
.len
,
1780 rebase_path_current_fixups(), 0);
1786 static void flush_rewritten_pending(void)
1788 struct strbuf buf
= STRBUF_INIT
;
1789 struct object_id newoid
;
1792 if (strbuf_read_file(&buf
, rebase_path_rewritten_pending(), (GIT_MAX_HEXSZ
+ 1) * 2) > 0 &&
1793 !get_oid("HEAD", &newoid
) &&
1794 (out
= fopen_or_warn(rebase_path_rewritten_list(), "a"))) {
1795 char *bol
= buf
.buf
, *eol
;
1798 eol
= strchrnul(bol
, '\n');
1799 fprintf(out
, "%.*s %s\n", (int)(eol
- bol
),
1800 bol
, oid_to_hex(&newoid
));
1806 unlink(rebase_path_rewritten_pending());
1808 strbuf_release(&buf
);
1811 static void record_in_rewritten(struct object_id
*oid
,
1812 enum todo_command next_command
)
1814 FILE *out
= fopen_or_warn(rebase_path_rewritten_pending(), "a");
1819 fprintf(out
, "%s\n", oid_to_hex(oid
));
1822 if (!is_fixup(next_command
))
1823 flush_rewritten_pending();
1826 static int do_pick_commit(struct repository
*r
,
1827 enum todo_command command
,
1828 struct commit
*commit
,
1829 struct replay_opts
*opts
,
1830 int final_fixup
, int *check_todo
)
1832 unsigned int flags
= opts
->edit
? EDIT_MSG
: 0;
1833 const char *msg_file
= opts
->edit
? NULL
: git_path_merge_msg(r
);
1834 struct object_id head
;
1835 struct commit
*base
, *next
, *parent
;
1836 const char *base_label
, *next_label
;
1837 char *author
= NULL
;
1838 struct commit_message msg
= { NULL
, NULL
, NULL
, NULL
};
1839 struct strbuf msgbuf
= STRBUF_INIT
;
1840 int res
, unborn
= 0, reword
= 0, allow
;
1842 if (opts
->no_commit
) {
1844 * We do not intend to commit immediately. We just want to
1845 * merge the differences in, so let's compute the tree
1846 * that represents the "current" state for merge-recursive
1849 if (write_index_as_tree(&head
, r
->index
, r
->index_file
, 0, NULL
))
1850 return error(_("your index file is unmerged."));
1852 unborn
= get_oid("HEAD", &head
);
1853 /* Do we want to generate a root commit? */
1854 if (is_pick_or_similar(command
) && opts
->have_squash_onto
&&
1855 oideq(&head
, &opts
->squash_onto
)) {
1856 if (is_fixup(command
))
1857 return error(_("cannot fixup root commit"));
1858 flags
|= CREATE_ROOT_COMMIT
;
1861 oidcpy(&head
, the_hash_algo
->empty_tree
);
1862 if (index_differs_from(r
, unborn
? empty_tree_oid_hex() : "HEAD",
1864 return error_dirty_index(r
, opts
);
1866 discard_index(r
->index
);
1868 if (!commit
->parents
)
1870 else if (commit
->parents
->next
) {
1871 /* Reverting or cherry-picking a merge commit */
1873 struct commit_list
*p
;
1875 if (!opts
->mainline
)
1876 return error(_("commit %s is a merge but no -m option was given."),
1877 oid_to_hex(&commit
->object
.oid
));
1879 for (cnt
= 1, p
= commit
->parents
;
1880 cnt
!= opts
->mainline
&& p
;
1883 if (cnt
!= opts
->mainline
|| !p
)
1884 return error(_("commit %s does not have parent %d"),
1885 oid_to_hex(&commit
->object
.oid
), opts
->mainline
);
1887 } else if (1 < opts
->mainline
)
1889 * Non-first parent explicitly specified as mainline for
1892 return error(_("commit %s does not have parent %d"),
1893 oid_to_hex(&commit
->object
.oid
), opts
->mainline
);
1895 parent
= commit
->parents
->item
;
1897 if (get_message(commit
, &msg
) != 0)
1898 return error(_("cannot get commit message for %s"),
1899 oid_to_hex(&commit
->object
.oid
));
1901 if (opts
->allow_ff
&& !is_fixup(command
) &&
1902 ((parent
&& oideq(&parent
->object
.oid
, &head
)) ||
1903 (!parent
&& unborn
))) {
1904 if (is_rebase_i(opts
))
1905 write_author_script(msg
.message
);
1906 res
= fast_forward_to(r
, &commit
->object
.oid
, &head
, unborn
,
1908 if (res
|| command
!= TODO_REWORD
)
1912 goto fast_forward_edit
;
1914 if (parent
&& parse_commit(parent
) < 0)
1915 /* TRANSLATORS: The first %s will be a "todo" command like
1916 "revert" or "pick", the second %s a SHA1. */
1917 return error(_("%s: cannot parse parent commit %s"),
1918 command_to_string(command
),
1919 oid_to_hex(&parent
->object
.oid
));
1922 * "commit" is an existing commit. We would want to apply
1923 * the difference it introduces since its first parent "prev"
1924 * on top of the current HEAD if we are cherry-pick. Or the
1925 * reverse of it if we are revert.
1928 if (command
== TODO_REVERT
) {
1930 base_label
= msg
.label
;
1932 next_label
= msg
.parent_label
;
1933 strbuf_addstr(&msgbuf
, "Revert \"");
1934 strbuf_addstr(&msgbuf
, msg
.subject
);
1935 strbuf_addstr(&msgbuf
, "\"\n\nThis reverts commit ");
1936 strbuf_addstr(&msgbuf
, oid_to_hex(&commit
->object
.oid
));
1938 if (commit
->parents
&& commit
->parents
->next
) {
1939 strbuf_addstr(&msgbuf
, ", reversing\nchanges made to ");
1940 strbuf_addstr(&msgbuf
, oid_to_hex(&parent
->object
.oid
));
1942 strbuf_addstr(&msgbuf
, ".\n");
1947 base_label
= msg
.parent_label
;
1949 next_label
= msg
.label
;
1951 /* Append the commit log message to msgbuf. */
1952 if (find_commit_subject(msg
.message
, &p
))
1953 strbuf_addstr(&msgbuf
, p
);
1955 if (opts
->record_origin
) {
1956 strbuf_complete_line(&msgbuf
);
1957 if (!has_conforming_footer(&msgbuf
, NULL
, 0))
1958 strbuf_addch(&msgbuf
, '\n');
1959 strbuf_addstr(&msgbuf
, cherry_picked_prefix
);
1960 strbuf_addstr(&msgbuf
, oid_to_hex(&commit
->object
.oid
));
1961 strbuf_addstr(&msgbuf
, ")\n");
1963 if (!is_fixup(command
))
1964 author
= get_author(msg
.message
);
1967 if (command
== TODO_REWORD
)
1969 else if (is_fixup(command
)) {
1970 if (update_squash_messages(r
, command
, commit
, opts
))
1974 msg_file
= rebase_path_squash_msg();
1975 else if (file_exists(rebase_path_fixup_msg())) {
1976 flags
|= CLEANUP_MSG
;
1977 msg_file
= rebase_path_fixup_msg();
1979 const char *dest
= git_path_squash_msg(r
);
1981 if (copy_file(dest
, rebase_path_squash_msg(), 0666))
1982 return error(_("could not rename '%s' to '%s'"),
1983 rebase_path_squash_msg(), dest
);
1984 unlink(git_path_merge_msg(r
));
1990 if (opts
->signoff
&& !is_fixup(command
))
1991 append_signoff(&msgbuf
, 0, 0);
1993 if (is_rebase_i(opts
) && write_author_script(msg
.message
) < 0)
1995 else if (!opts
->strategy
|| !strcmp(opts
->strategy
, "recursive") || command
== TODO_REVERT
) {
1996 res
= do_recursive_merge(r
, base
, next
, base_label
, next_label
,
1997 &head
, &msgbuf
, opts
);
2001 res
|= write_message(msgbuf
.buf
, msgbuf
.len
,
2002 git_path_merge_msg(r
), 0);
2004 struct commit_list
*common
= NULL
;
2005 struct commit_list
*remotes
= NULL
;
2007 res
= write_message(msgbuf
.buf
, msgbuf
.len
,
2008 git_path_merge_msg(r
), 0);
2010 commit_list_insert(base
, &common
);
2011 commit_list_insert(next
, &remotes
);
2012 res
|= try_merge_command(r
, opts
->strategy
,
2013 opts
->xopts_nr
, (const char **)opts
->xopts
,
2014 common
, oid_to_hex(&head
), remotes
);
2015 free_commit_list(common
);
2016 free_commit_list(remotes
);
2018 strbuf_release(&msgbuf
);
2021 * If the merge was clean or if it failed due to conflict, we write
2022 * CHERRY_PICK_HEAD for the subsequent invocation of commit to use.
2023 * However, if the merge did not even start, then we don't want to
2026 if (command
== TODO_PICK
&& !opts
->no_commit
&& (res
== 0 || res
== 1) &&
2027 update_ref(NULL
, "CHERRY_PICK_HEAD", &commit
->object
.oid
, NULL
,
2028 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
2030 if (command
== TODO_REVERT
&& ((opts
->no_commit
&& res
== 0) || res
== 1) &&
2031 update_ref(NULL
, "REVERT_HEAD", &commit
->object
.oid
, NULL
,
2032 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
2036 error(command
== TODO_REVERT
2037 ? _("could not revert %s... %s")
2038 : _("could not apply %s... %s"),
2039 short_commit_name(commit
), msg
.subject
);
2040 print_advice(r
, res
== 1, opts
);
2041 repo_rerere(r
, opts
->allow_rerere_auto
);
2045 allow
= allow_empty(r
, opts
, commit
);
2050 flags
|= ALLOW_EMPTY
;
2051 if (!opts
->no_commit
) {
2052 if (author
|| command
== TODO_REVERT
|| (flags
& AMEND_MSG
))
2053 res
= do_commit(r
, msg_file
, author
, opts
, flags
);
2055 res
= error(_("unable to parse commit author"));
2056 *check_todo
= !!(flags
& EDIT_MSG
);
2057 if (!res
&& reword
) {
2059 res
= run_git_commit(r
, NULL
, opts
, EDIT_MSG
|
2060 VERIFY_MSG
| AMEND_MSG
|
2061 (flags
& ALLOW_EMPTY
));
2067 if (!res
&& final_fixup
) {
2068 unlink(rebase_path_fixup_msg());
2069 unlink(rebase_path_squash_msg());
2070 unlink(rebase_path_current_fixups());
2071 strbuf_reset(&opts
->current_fixups
);
2072 opts
->current_fixup_count
= 0;
2076 free_message(commit
, &msg
);
2078 update_abort_safety_file();
2083 static int prepare_revs(struct replay_opts
*opts
)
2086 * picking (but not reverting) ranges (but not individual revisions)
2087 * should be done in reverse
2089 if (opts
->action
== REPLAY_PICK
&& !opts
->revs
->no_walk
)
2090 opts
->revs
->reverse
^= 1;
2092 if (prepare_revision_walk(opts
->revs
))
2093 return error(_("revision walk setup failed"));
2098 static int read_and_refresh_cache(struct repository
*r
,
2099 struct replay_opts
*opts
)
2101 struct lock_file index_lock
= LOCK_INIT
;
2102 int index_fd
= repo_hold_locked_index(r
, &index_lock
, 0);
2103 if (repo_read_index(r
) < 0) {
2104 rollback_lock_file(&index_lock
);
2105 return error(_("git %s: failed to read the index"),
2106 _(action_name(opts
)));
2108 refresh_index(r
->index
, REFRESH_QUIET
|REFRESH_UNMERGED
, NULL
, NULL
, NULL
);
2109 if (index_fd
>= 0) {
2110 if (write_locked_index(r
->index
, &index_lock
,
2111 COMMIT_LOCK
| SKIP_IF_UNCHANGED
)) {
2112 return error(_("git %s: failed to refresh the index"),
2113 _(action_name(opts
)));
2119 enum todo_item_flags
{
2120 TODO_EDIT_MERGE_MSG
= 1
2123 void todo_list_release(struct todo_list
*todo_list
)
2125 strbuf_release(&todo_list
->buf
);
2126 FREE_AND_NULL(todo_list
->items
);
2127 todo_list
->nr
= todo_list
->alloc
= 0;
2130 static struct todo_item
*append_new_todo(struct todo_list
*todo_list
)
2132 ALLOC_GROW(todo_list
->items
, todo_list
->nr
+ 1, todo_list
->alloc
);
2133 todo_list
->total_nr
++;
2134 return todo_list
->items
+ todo_list
->nr
++;
2137 const char *todo_item_get_arg(struct todo_list
*todo_list
,
2138 struct todo_item
*item
)
2140 return todo_list
->buf
.buf
+ item
->arg_offset
;
2143 static int is_command(enum todo_command command
, const char **bol
)
2145 const char *str
= todo_command_info
[command
].str
;
2146 const char nick
= todo_command_info
[command
].c
;
2147 const char *p
= *bol
+ 1;
2149 return skip_prefix(*bol
, str
, bol
) ||
2150 ((nick
&& **bol
== nick
) &&
2151 (*p
== ' ' || *p
== '\t' || *p
== '\n' || *p
== '\r' || !*p
) &&
2155 static int parse_insn_line(struct repository
*r
, struct todo_item
*item
,
2156 const char *buf
, const char *bol
, char *eol
)
2158 struct object_id commit_oid
;
2159 char *end_of_object_name
;
2160 int i
, saved
, status
, padding
;
2165 bol
+= strspn(bol
, " \t");
2167 if (bol
== eol
|| *bol
== '\r' || *bol
== comment_line_char
) {
2168 item
->command
= TODO_COMMENT
;
2169 item
->commit
= NULL
;
2170 item
->arg_offset
= bol
- buf
;
2171 item
->arg_len
= eol
- bol
;
2175 for (i
= 0; i
< TODO_COMMENT
; i
++)
2176 if (is_command(i
, &bol
)) {
2180 if (i
>= TODO_COMMENT
)
2183 /* Eat up extra spaces/ tabs before object name */
2184 padding
= strspn(bol
, " \t");
2187 if (item
->command
== TODO_NOOP
|| item
->command
== TODO_BREAK
) {
2189 return error(_("%s does not accept arguments: '%s'"),
2190 command_to_string(item
->command
), bol
);
2191 item
->commit
= NULL
;
2192 item
->arg_offset
= bol
- buf
;
2193 item
->arg_len
= eol
- bol
;
2198 return error(_("missing arguments for %s"),
2199 command_to_string(item
->command
));
2201 if (item
->command
== TODO_EXEC
|| item
->command
== TODO_LABEL
||
2202 item
->command
== TODO_RESET
) {
2203 item
->commit
= NULL
;
2204 item
->arg_offset
= bol
- buf
;
2205 item
->arg_len
= (int)(eol
- bol
);
2209 if (item
->command
== TODO_MERGE
) {
2210 if (skip_prefix(bol
, "-C", &bol
))
2211 bol
+= strspn(bol
, " \t");
2212 else if (skip_prefix(bol
, "-c", &bol
)) {
2213 bol
+= strspn(bol
, " \t");
2214 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2216 item
->flags
|= TODO_EDIT_MERGE_MSG
;
2217 item
->commit
= NULL
;
2218 item
->arg_offset
= bol
- buf
;
2219 item
->arg_len
= (int)(eol
- bol
);
2224 end_of_object_name
= (char *) bol
+ strcspn(bol
, " \t\n");
2225 saved
= *end_of_object_name
;
2226 *end_of_object_name
= '\0';
2227 status
= get_oid(bol
, &commit_oid
);
2228 *end_of_object_name
= saved
;
2230 bol
= end_of_object_name
+ strspn(end_of_object_name
, " \t");
2231 item
->arg_offset
= bol
- buf
;
2232 item
->arg_len
= (int)(eol
- bol
);
2235 return error(_("could not parse '%.*s'"),
2236 (int)(end_of_object_name
- bol
), bol
);
2238 item
->commit
= lookup_commit_reference(r
, &commit_oid
);
2239 return !item
->commit
;
2242 int sequencer_get_last_command(struct repository
*r
, enum replay_action
*action
)
2244 const char *todo_file
, *bol
;
2245 struct strbuf buf
= STRBUF_INIT
;
2248 todo_file
= git_path_todo_file();
2249 if (strbuf_read_file(&buf
, todo_file
, 0) < 0) {
2250 if (errno
== ENOENT
|| errno
== ENOTDIR
)
2253 return error_errno("unable to open '%s'", todo_file
);
2255 bol
= buf
.buf
+ strspn(buf
.buf
, " \t\r\n");
2256 if (is_command(TODO_PICK
, &bol
) && (*bol
== ' ' || *bol
== '\t'))
2257 *action
= REPLAY_PICK
;
2258 else if (is_command(TODO_REVERT
, &bol
) &&
2259 (*bol
== ' ' || *bol
== '\t'))
2260 *action
= REPLAY_REVERT
;
2264 strbuf_release(&buf
);
2269 int todo_list_parse_insn_buffer(struct repository
*r
, char *buf
,
2270 struct todo_list
*todo_list
)
2272 struct todo_item
*item
;
2273 char *p
= buf
, *next_p
;
2274 int i
, res
= 0, fixup_okay
= file_exists(rebase_path_done());
2276 todo_list
->current
= todo_list
->nr
= 0;
2278 for (i
= 1; *p
; i
++, p
= next_p
) {
2279 char *eol
= strchrnul(p
, '\n');
2281 next_p
= *eol
? eol
+ 1 /* skip LF */ : eol
;
2283 if (p
!= eol
&& eol
[-1] == '\r')
2284 eol
--; /* strip Carriage Return */
2286 item
= append_new_todo(todo_list
);
2287 item
->offset_in_buf
= p
- todo_list
->buf
.buf
;
2288 if (parse_insn_line(r
, item
, buf
, p
, eol
)) {
2289 res
= error(_("invalid line %d: %.*s"),
2290 i
, (int)(eol
- p
), p
);
2291 item
->command
= TODO_COMMENT
+ 1;
2292 item
->arg_offset
= p
- buf
;
2293 item
->arg_len
= (int)(eol
- p
);
2294 item
->commit
= NULL
;
2299 else if (is_fixup(item
->command
))
2300 return error(_("cannot '%s' without a previous commit"),
2301 command_to_string(item
->command
));
2302 else if (!is_noop(item
->command
))
2309 static int count_commands(struct todo_list
*todo_list
)
2313 for (i
= 0; i
< todo_list
->nr
; i
++)
2314 if (todo_list
->items
[i
].command
!= TODO_COMMENT
)
2320 static int get_item_line_offset(struct todo_list
*todo_list
, int index
)
2322 return index
< todo_list
->nr
?
2323 todo_list
->items
[index
].offset_in_buf
: todo_list
->buf
.len
;
2326 static const char *get_item_line(struct todo_list
*todo_list
, int index
)
2328 return todo_list
->buf
.buf
+ get_item_line_offset(todo_list
, index
);
2331 static int get_item_line_length(struct todo_list
*todo_list
, int index
)
2333 return get_item_line_offset(todo_list
, index
+ 1)
2334 - get_item_line_offset(todo_list
, index
);
2337 static ssize_t
strbuf_read_file_or_whine(struct strbuf
*sb
, const char *path
)
2342 fd
= open(path
, O_RDONLY
);
2344 return error_errno(_("could not open '%s'"), path
);
2345 len
= strbuf_read(sb
, fd
, 0);
2348 return error(_("could not read '%s'."), path
);
2352 static int have_finished_the_last_pick(void)
2354 struct strbuf buf
= STRBUF_INIT
;
2356 const char *todo_path
= git_path_todo_file();
2359 if (strbuf_read_file(&buf
, todo_path
, 0) < 0) {
2360 if (errno
== ENOENT
) {
2363 error_errno("unable to open '%s'", todo_path
);
2367 /* If there is only one line then we are done */
2368 eol
= strchr(buf
.buf
, '\n');
2369 if (!eol
|| !eol
[1])
2372 strbuf_release(&buf
);
2377 void sequencer_post_commit_cleanup(struct repository
*r
, int verbose
)
2379 struct replay_opts opts
= REPLAY_OPTS_INIT
;
2380 int need_cleanup
= 0;
2382 if (file_exists(git_path_cherry_pick_head(r
))) {
2383 if (!unlink(git_path_cherry_pick_head(r
)) && verbose
)
2384 warning(_("cancelling a cherry picking in progress"));
2385 opts
.action
= REPLAY_PICK
;
2389 if (file_exists(git_path_revert_head(r
))) {
2390 if (!unlink(git_path_revert_head(r
)) && verbose
)
2391 warning(_("cancelling a revert in progress"));
2392 opts
.action
= REPLAY_REVERT
;
2399 if (!have_finished_the_last_pick())
2402 sequencer_remove_state(&opts
);
2405 static void todo_list_write_total_nr(struct todo_list
*todo_list
)
2407 FILE *f
= fopen_or_warn(rebase_path_msgtotal(), "w");
2410 fprintf(f
, "%d\n", todo_list
->total_nr
);
2415 static int read_populate_todo(struct repository
*r
,
2416 struct todo_list
*todo_list
,
2417 struct replay_opts
*opts
)
2420 const char *todo_file
= get_todo_path(opts
);
2423 strbuf_reset(&todo_list
->buf
);
2424 if (strbuf_read_file_or_whine(&todo_list
->buf
, todo_file
) < 0)
2427 res
= stat(todo_file
, &st
);
2429 return error(_("could not stat '%s'"), todo_file
);
2430 fill_stat_data(&todo_list
->stat
, &st
);
2432 res
= todo_list_parse_insn_buffer(r
, todo_list
->buf
.buf
, todo_list
);
2434 if (is_rebase_i(opts
))
2435 return error(_("please fix this using "
2436 "'git rebase --edit-todo'."));
2437 return error(_("unusable instruction sheet: '%s'"), todo_file
);
2440 if (!todo_list
->nr
&&
2441 (!is_rebase_i(opts
) || !file_exists(rebase_path_done())))
2442 return error(_("no commits parsed."));
2444 if (!is_rebase_i(opts
)) {
2445 enum todo_command valid
=
2446 opts
->action
== REPLAY_PICK
? TODO_PICK
: TODO_REVERT
;
2449 for (i
= 0; i
< todo_list
->nr
; i
++)
2450 if (valid
== todo_list
->items
[i
].command
)
2452 else if (valid
== TODO_PICK
)
2453 return error(_("cannot cherry-pick during a revert."));
2455 return error(_("cannot revert during a cherry-pick."));
2458 if (is_rebase_i(opts
)) {
2459 struct todo_list done
= TODO_LIST_INIT
;
2461 if (strbuf_read_file(&done
.buf
, rebase_path_done(), 0) > 0 &&
2462 !todo_list_parse_insn_buffer(r
, done
.buf
.buf
, &done
))
2463 todo_list
->done_nr
= count_commands(&done
);
2465 todo_list
->done_nr
= 0;
2467 todo_list
->total_nr
= todo_list
->done_nr
2468 + count_commands(todo_list
);
2469 todo_list_release(&done
);
2471 todo_list_write_total_nr(todo_list
);
2477 static int git_config_string_dup(char **dest
,
2478 const char *var
, const char *value
)
2481 return config_error_nonbool(var
);
2483 *dest
= xstrdup(value
);
2487 static int populate_opts_cb(const char *key
, const char *value
, void *data
)
2489 struct replay_opts
*opts
= data
;
2494 else if (!strcmp(key
, "options.no-commit"))
2495 opts
->no_commit
= git_config_bool_or_int(key
, value
, &error_flag
);
2496 else if (!strcmp(key
, "options.edit"))
2497 opts
->edit
= git_config_bool_or_int(key
, value
, &error_flag
);
2498 else if (!strcmp(key
, "options.allow-empty"))
2500 git_config_bool_or_int(key
, value
, &error_flag
);
2501 else if (!strcmp(key
, "options.allow-empty-message"))
2502 opts
->allow_empty_message
=
2503 git_config_bool_or_int(key
, value
, &error_flag
);
2504 else if (!strcmp(key
, "options.keep-redundant-commits"))
2505 opts
->keep_redundant_commits
=
2506 git_config_bool_or_int(key
, value
, &error_flag
);
2507 else if (!strcmp(key
, "options.signoff"))
2508 opts
->signoff
= git_config_bool_or_int(key
, value
, &error_flag
);
2509 else if (!strcmp(key
, "options.record-origin"))
2510 opts
->record_origin
= git_config_bool_or_int(key
, value
, &error_flag
);
2511 else if (!strcmp(key
, "options.allow-ff"))
2512 opts
->allow_ff
= git_config_bool_or_int(key
, value
, &error_flag
);
2513 else if (!strcmp(key
, "options.mainline"))
2514 opts
->mainline
= git_config_int(key
, value
);
2515 else if (!strcmp(key
, "options.strategy"))
2516 git_config_string_dup(&opts
->strategy
, key
, value
);
2517 else if (!strcmp(key
, "options.gpg-sign"))
2518 git_config_string_dup(&opts
->gpg_sign
, key
, value
);
2519 else if (!strcmp(key
, "options.strategy-option")) {
2520 ALLOC_GROW(opts
->xopts
, opts
->xopts_nr
+ 1, opts
->xopts_alloc
);
2521 opts
->xopts
[opts
->xopts_nr
++] = xstrdup(value
);
2522 } else if (!strcmp(key
, "options.allow-rerere-auto"))
2523 opts
->allow_rerere_auto
=
2524 git_config_bool_or_int(key
, value
, &error_flag
) ?
2525 RERERE_AUTOUPDATE
: RERERE_NOAUTOUPDATE
;
2526 else if (!strcmp(key
, "options.default-msg-cleanup")) {
2527 opts
->explicit_cleanup
= 1;
2528 opts
->default_msg_cleanup
= get_cleanup_mode(value
, 1);
2530 return error(_("invalid key: %s"), key
);
2533 return error(_("invalid value for %s: %s"), key
, value
);
2538 void parse_strategy_opts(struct replay_opts
*opts
, char *raw_opts
)
2541 char *strategy_opts_string
= raw_opts
;
2543 if (*strategy_opts_string
== ' ')
2544 strategy_opts_string
++;
2546 opts
->xopts_nr
= split_cmdline(strategy_opts_string
,
2547 (const char ***)&opts
->xopts
);
2548 for (i
= 0; i
< opts
->xopts_nr
; i
++) {
2549 const char *arg
= opts
->xopts
[i
];
2551 skip_prefix(arg
, "--", &arg
);
2552 opts
->xopts
[i
] = xstrdup(arg
);
2556 static void read_strategy_opts(struct replay_opts
*opts
, struct strbuf
*buf
)
2559 if (!read_oneliner(buf
, rebase_path_strategy(), 0))
2561 opts
->strategy
= strbuf_detach(buf
, NULL
);
2562 if (!read_oneliner(buf
, rebase_path_strategy_opts(), 0))
2565 parse_strategy_opts(opts
, buf
->buf
);
2568 static int read_populate_opts(struct replay_opts
*opts
)
2570 if (is_rebase_i(opts
)) {
2571 struct strbuf buf
= STRBUF_INIT
;
2573 if (read_oneliner(&buf
, rebase_path_gpg_sign_opt(), 1)) {
2574 if (!starts_with(buf
.buf
, "-S"))
2577 free(opts
->gpg_sign
);
2578 opts
->gpg_sign
= xstrdup(buf
.buf
+ 2);
2583 if (read_oneliner(&buf
, rebase_path_allow_rerere_autoupdate(), 1)) {
2584 if (!strcmp(buf
.buf
, "--rerere-autoupdate"))
2585 opts
->allow_rerere_auto
= RERERE_AUTOUPDATE
;
2586 else if (!strcmp(buf
.buf
, "--no-rerere-autoupdate"))
2587 opts
->allow_rerere_auto
= RERERE_NOAUTOUPDATE
;
2591 if (file_exists(rebase_path_verbose()))
2594 if (file_exists(rebase_path_quiet()))
2597 if (file_exists(rebase_path_signoff())) {
2602 if (file_exists(rebase_path_cdate_is_adate())) {
2604 opts
->committer_date_is_author_date
= 1;
2607 if (file_exists(rebase_path_ignore_date())) {
2609 opts
->ignore_date
= 1;
2612 if (file_exists(rebase_path_reschedule_failed_exec()))
2613 opts
->reschedule_failed_exec
= 1;
2615 read_strategy_opts(opts
, &buf
);
2616 strbuf_release(&buf
);
2618 if (read_oneliner(&opts
->current_fixups
,
2619 rebase_path_current_fixups(), 1)) {
2620 const char *p
= opts
->current_fixups
.buf
;
2621 opts
->current_fixup_count
= 1;
2622 while ((p
= strchr(p
, '\n'))) {
2623 opts
->current_fixup_count
++;
2628 if (read_oneliner(&buf
, rebase_path_squash_onto(), 0)) {
2629 if (get_oid_hex(buf
.buf
, &opts
->squash_onto
) < 0)
2630 return error(_("unusable squash-onto"));
2631 opts
->have_squash_onto
= 1;
2637 if (!file_exists(git_path_opts_file()))
2640 * The function git_parse_source(), called from git_config_from_file(),
2641 * may die() in case of a syntactically incorrect file. We do not care
2642 * about this case, though, because we wrote that file ourselves, so we
2643 * are pretty certain that it is syntactically correct.
2645 if (git_config_from_file(populate_opts_cb
, git_path_opts_file(), opts
) < 0)
2646 return error(_("malformed options sheet: '%s'"),
2647 git_path_opts_file());
2651 static void write_strategy_opts(struct replay_opts
*opts
)
2654 struct strbuf buf
= STRBUF_INIT
;
2656 for (i
= 0; i
< opts
->xopts_nr
; ++i
)
2657 strbuf_addf(&buf
, " --%s", opts
->xopts
[i
]);
2659 write_file(rebase_path_strategy_opts(), "%s\n", buf
.buf
);
2660 strbuf_release(&buf
);
2663 int write_basic_state(struct replay_opts
*opts
, const char *head_name
,
2664 struct commit
*onto
, const char *orig_head
)
2666 const char *quiet
= getenv("GIT_QUIET");
2669 write_file(rebase_path_head_name(), "%s\n", head_name
);
2671 write_file(rebase_path_onto(), "%s\n",
2672 oid_to_hex(&onto
->object
.oid
));
2674 write_file(rebase_path_orig_head(), "%s\n", orig_head
);
2677 write_file(rebase_path_quiet(), "%s\n", quiet
);
2679 write_file(rebase_path_verbose(), "%s", "");
2681 write_file(rebase_path_strategy(), "%s\n", opts
->strategy
);
2682 if (opts
->xopts_nr
> 0)
2683 write_strategy_opts(opts
);
2685 if (opts
->allow_rerere_auto
== RERERE_AUTOUPDATE
)
2686 write_file(rebase_path_allow_rerere_autoupdate(), "--rerere-autoupdate\n");
2687 else if (opts
->allow_rerere_auto
== RERERE_NOAUTOUPDATE
)
2688 write_file(rebase_path_allow_rerere_autoupdate(), "--no-rerere-autoupdate\n");
2691 write_file(rebase_path_gpg_sign_opt(), "-S%s\n", opts
->gpg_sign
);
2693 write_file(rebase_path_signoff(), "--signoff\n");
2694 if (opts
->committer_date_is_author_date
)
2695 write_file(rebase_path_cdate_is_adate(), "%s", "");
2696 if (opts
->ignore_date
)
2697 write_file(rebase_path_ignore_date(), "%s", "");
2698 if (opts
->reschedule_failed_exec
)
2699 write_file(rebase_path_reschedule_failed_exec(), "%s", "");
2704 static int walk_revs_populate_todo(struct todo_list
*todo_list
,
2705 struct replay_opts
*opts
)
2707 enum todo_command command
= opts
->action
== REPLAY_PICK
?
2708 TODO_PICK
: TODO_REVERT
;
2709 const char *command_string
= todo_command_info
[command
].str
;
2710 const char *encoding
;
2711 struct commit
*commit
;
2713 if (prepare_revs(opts
))
2716 encoding
= get_log_output_encoding();
2718 while ((commit
= get_revision(opts
->revs
))) {
2719 struct todo_item
*item
= append_new_todo(todo_list
);
2720 const char *commit_buffer
= logmsg_reencode(commit
, NULL
, encoding
);
2721 const char *subject
;
2724 item
->command
= command
;
2725 item
->commit
= commit
;
2726 item
->arg_offset
= 0;
2728 item
->offset_in_buf
= todo_list
->buf
.len
;
2729 subject_len
= find_commit_subject(commit_buffer
, &subject
);
2730 strbuf_addf(&todo_list
->buf
, "%s %s %.*s\n", command_string
,
2731 short_commit_name(commit
), subject_len
, subject
);
2732 unuse_commit_buffer(commit
, commit_buffer
);
2736 return error(_("empty commit set passed"));
2741 static int create_seq_dir(struct repository
*r
)
2743 enum replay_action action
;
2744 const char *in_progress_error
= NULL
;
2745 const char *in_progress_advice
= NULL
;
2746 unsigned int advise_skip
= file_exists(git_path_revert_head(r
)) ||
2747 file_exists(git_path_cherry_pick_head(r
));
2749 if (!sequencer_get_last_command(r
, &action
)) {
2752 in_progress_error
= _("revert is already in progress");
2753 in_progress_advice
=
2754 _("try \"git revert (--continue | %s--abort | --quit)\"");
2757 in_progress_error
= _("cherry-pick is already in progress");
2758 in_progress_advice
=
2759 _("try \"git cherry-pick (--continue | %s--abort | --quit)\"");
2762 BUG("unexpected action in create_seq_dir");
2765 if (in_progress_error
) {
2766 error("%s", in_progress_error
);
2767 if (advice_sequencer_in_use
)
2768 advise(in_progress_advice
,
2769 advise_skip
? "--skip | " : "");
2772 if (mkdir(git_path_seq_dir(), 0777) < 0)
2773 return error_errno(_("could not create sequencer directory '%s'"),
2774 git_path_seq_dir());
2779 static int save_head(const char *head
)
2781 struct lock_file head_lock
= LOCK_INIT
;
2782 struct strbuf buf
= STRBUF_INIT
;
2786 fd
= hold_lock_file_for_update(&head_lock
, git_path_head_file(), 0);
2788 return error_errno(_("could not lock HEAD"));
2789 strbuf_addf(&buf
, "%s\n", head
);
2790 written
= write_in_full(fd
, buf
.buf
, buf
.len
);
2791 strbuf_release(&buf
);
2793 error_errno(_("could not write to '%s'"), git_path_head_file());
2794 rollback_lock_file(&head_lock
);
2797 if (commit_lock_file(&head_lock
) < 0)
2798 return error(_("failed to finalize '%s'"), git_path_head_file());
2802 static int rollback_is_safe(void)
2804 struct strbuf sb
= STRBUF_INIT
;
2805 struct object_id expected_head
, actual_head
;
2807 if (strbuf_read_file(&sb
, git_path_abort_safety_file(), 0) >= 0) {
2809 if (get_oid_hex(sb
.buf
, &expected_head
)) {
2810 strbuf_release(&sb
);
2811 die(_("could not parse %s"), git_path_abort_safety_file());
2813 strbuf_release(&sb
);
2815 else if (errno
== ENOENT
)
2816 oidclr(&expected_head
);
2818 die_errno(_("could not read '%s'"), git_path_abort_safety_file());
2820 if (get_oid("HEAD", &actual_head
))
2821 oidclr(&actual_head
);
2823 return oideq(&actual_head
, &expected_head
);
2826 static int reset_merge(const struct object_id
*oid
)
2829 struct argv_array argv
= ARGV_ARRAY_INIT
;
2831 argv_array_pushl(&argv
, "reset", "--merge", NULL
);
2833 if (!is_null_oid(oid
))
2834 argv_array_push(&argv
, oid_to_hex(oid
));
2836 ret
= run_command_v_opt(argv
.argv
, RUN_GIT_CMD
);
2837 argv_array_clear(&argv
);
2842 static int rollback_single_pick(struct repository
*r
)
2844 struct object_id head_oid
;
2846 if (!file_exists(git_path_cherry_pick_head(r
)) &&
2847 !file_exists(git_path_revert_head(r
)))
2848 return error(_("no cherry-pick or revert in progress"));
2849 if (read_ref_full("HEAD", 0, &head_oid
, NULL
))
2850 return error(_("cannot resolve HEAD"));
2851 if (is_null_oid(&head_oid
))
2852 return error(_("cannot abort from a branch yet to be born"));
2853 return reset_merge(&head_oid
);
2856 static int skip_single_pick(void)
2858 struct object_id head
;
2860 if (read_ref_full("HEAD", 0, &head
, NULL
))
2861 return error(_("cannot resolve HEAD"));
2862 return reset_merge(&head
);
2865 int sequencer_rollback(struct repository
*r
, struct replay_opts
*opts
)
2868 struct object_id oid
;
2869 struct strbuf buf
= STRBUF_INIT
;
2872 f
= fopen(git_path_head_file(), "r");
2873 if (!f
&& errno
== ENOENT
) {
2875 * There is no multiple-cherry-pick in progress.
2876 * If CHERRY_PICK_HEAD or REVERT_HEAD indicates
2877 * a single-cherry-pick in progress, abort that.
2879 return rollback_single_pick(r
);
2882 return error_errno(_("cannot open '%s'"), git_path_head_file());
2883 if (strbuf_getline_lf(&buf
, f
)) {
2884 error(_("cannot read '%s': %s"), git_path_head_file(),
2885 ferror(f
) ? strerror(errno
) : _("unexpected end of file"));
2890 if (parse_oid_hex(buf
.buf
, &oid
, &p
) || *p
!= '\0') {
2891 error(_("stored pre-cherry-pick HEAD file '%s' is corrupt"),
2892 git_path_head_file());
2895 if (is_null_oid(&oid
)) {
2896 error(_("cannot abort from a branch yet to be born"));
2900 if (!rollback_is_safe()) {
2901 /* Do not error, just do not rollback */
2902 warning(_("You seem to have moved HEAD. "
2903 "Not rewinding, check your HEAD!"));
2905 if (reset_merge(&oid
))
2907 strbuf_release(&buf
);
2908 return sequencer_remove_state(opts
);
2910 strbuf_release(&buf
);
2914 int sequencer_skip(struct repository
*r
, struct replay_opts
*opts
)
2916 enum replay_action action
= -1;
2917 sequencer_get_last_command(r
, &action
);
2920 * Check whether the subcommand requested to skip the commit is actually
2921 * in progress and that it's safe to skip the commit.
2923 * opts->action tells us which subcommand requested to skip the commit.
2924 * If the corresponding .git/<ACTION>_HEAD exists, we know that the
2925 * action is in progress and we can skip the commit.
2927 * Otherwise we check that the last instruction was related to the
2928 * particular subcommand we're trying to execute and barf if that's not
2931 * Finally we check that the rollback is "safe", i.e., has the HEAD
2932 * moved? In this case, it doesn't make sense to "reset the merge" and
2933 * "skip the commit" as the user already handled this by committing. But
2934 * we'd not want to barf here, instead give advice on how to proceed. We
2935 * only need to check that when .git/<ACTION>_HEAD doesn't exist because
2936 * it gets removed when the user commits, so if it still exists we're
2937 * sure the user can't have committed before.
2939 switch (opts
->action
) {
2941 if (!file_exists(git_path_revert_head(r
))) {
2942 if (action
!= REPLAY_REVERT
)
2943 return error(_("no revert in progress"));
2944 if (!rollback_is_safe())
2949 if (!file_exists(git_path_cherry_pick_head(r
))) {
2950 if (action
!= REPLAY_PICK
)
2951 return error(_("no cherry-pick in progress"));
2952 if (!rollback_is_safe())
2957 BUG("unexpected action in sequencer_skip");
2960 if (skip_single_pick())
2961 return error(_("failed to skip the commit"));
2962 if (!is_directory(git_path_seq_dir()))
2965 return sequencer_continue(r
, opts
);
2968 error(_("there is nothing to skip"));
2970 if (advice_resolve_conflict
) {
2971 advise(_("have you committed already?\n"
2972 "try \"git %s --continue\""),
2973 action
== REPLAY_REVERT
? "revert" : "cherry-pick");
2978 static int save_todo(struct todo_list
*todo_list
, struct replay_opts
*opts
)
2980 struct lock_file todo_lock
= LOCK_INIT
;
2981 const char *todo_path
= get_todo_path(opts
);
2982 int next
= todo_list
->current
, offset
, fd
;
2985 * rebase -i writes "git-rebase-todo" without the currently executing
2986 * command, appending it to "done" instead.
2988 if (is_rebase_i(opts
))
2991 fd
= hold_lock_file_for_update(&todo_lock
, todo_path
, 0);
2993 return error_errno(_("could not lock '%s'"), todo_path
);
2994 offset
= get_item_line_offset(todo_list
, next
);
2995 if (write_in_full(fd
, todo_list
->buf
.buf
+ offset
,
2996 todo_list
->buf
.len
- offset
) < 0)
2997 return error_errno(_("could not write to '%s'"), todo_path
);
2998 if (commit_lock_file(&todo_lock
) < 0)
2999 return error(_("failed to finalize '%s'"), todo_path
);
3001 if (is_rebase_i(opts
) && next
> 0) {
3002 const char *done
= rebase_path_done();
3003 int fd
= open(done
, O_CREAT
| O_WRONLY
| O_APPEND
, 0666);
3008 if (write_in_full(fd
, get_item_line(todo_list
, next
- 1),
3009 get_item_line_length(todo_list
, next
- 1))
3011 ret
= error_errno(_("could not write to '%s'"), done
);
3013 ret
= error_errno(_("failed to finalize '%s'"), done
);
3019 static int save_opts(struct replay_opts
*opts
)
3021 const char *opts_file
= git_path_opts_file();
3024 if (opts
->no_commit
)
3025 res
|= git_config_set_in_file_gently(opts_file
,
3026 "options.no-commit", "true");
3028 res
|= git_config_set_in_file_gently(opts_file
,
3029 "options.edit", "true");
3030 if (opts
->allow_empty
)
3031 res
|= git_config_set_in_file_gently(opts_file
,
3032 "options.allow-empty", "true");
3033 if (opts
->allow_empty_message
)
3034 res
|= git_config_set_in_file_gently(opts_file
,
3035 "options.allow-empty-message", "true");
3036 if (opts
->keep_redundant_commits
)
3037 res
|= git_config_set_in_file_gently(opts_file
,
3038 "options.keep-redundant-commits", "true");
3040 res
|= git_config_set_in_file_gently(opts_file
,
3041 "options.signoff", "true");
3042 if (opts
->record_origin
)
3043 res
|= git_config_set_in_file_gently(opts_file
,
3044 "options.record-origin", "true");
3046 res
|= git_config_set_in_file_gently(opts_file
,
3047 "options.allow-ff", "true");
3048 if (opts
->mainline
) {
3049 struct strbuf buf
= STRBUF_INIT
;
3050 strbuf_addf(&buf
, "%d", opts
->mainline
);
3051 res
|= git_config_set_in_file_gently(opts_file
,
3052 "options.mainline", buf
.buf
);
3053 strbuf_release(&buf
);
3056 res
|= git_config_set_in_file_gently(opts_file
,
3057 "options.strategy", opts
->strategy
);
3059 res
|= git_config_set_in_file_gently(opts_file
,
3060 "options.gpg-sign", opts
->gpg_sign
);
3063 for (i
= 0; i
< opts
->xopts_nr
; i
++)
3064 res
|= git_config_set_multivar_in_file_gently(opts_file
,
3065 "options.strategy-option",
3066 opts
->xopts
[i
], "^$", 0);
3068 if (opts
->allow_rerere_auto
)
3069 res
|= git_config_set_in_file_gently(opts_file
,
3070 "options.allow-rerere-auto",
3071 opts
->allow_rerere_auto
== RERERE_AUTOUPDATE
?
3074 if (opts
->explicit_cleanup
)
3075 res
|= git_config_set_in_file_gently(opts_file
,
3076 "options.default-msg-cleanup",
3077 describe_cleanup_mode(opts
->default_msg_cleanup
));
3081 static int make_patch(struct repository
*r
,
3082 struct commit
*commit
,
3083 struct replay_opts
*opts
)
3085 struct strbuf buf
= STRBUF_INIT
;
3086 struct rev_info log_tree_opt
;
3087 const char *subject
, *p
;
3090 p
= short_commit_name(commit
);
3091 if (write_message(p
, strlen(p
), rebase_path_stopped_sha(), 1) < 0)
3093 if (update_ref("rebase", "REBASE_HEAD", &commit
->object
.oid
,
3094 NULL
, REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
))
3095 res
|= error(_("could not update %s"), "REBASE_HEAD");
3097 strbuf_addf(&buf
, "%s/patch", get_dir(opts
));
3098 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
3099 repo_init_revisions(r
, &log_tree_opt
, NULL
);
3100 log_tree_opt
.abbrev
= 0;
3101 log_tree_opt
.diff
= 1;
3102 log_tree_opt
.diffopt
.output_format
= DIFF_FORMAT_PATCH
;
3103 log_tree_opt
.disable_stdin
= 1;
3104 log_tree_opt
.no_commit_id
= 1;
3105 log_tree_opt
.diffopt
.file
= fopen(buf
.buf
, "w");
3106 log_tree_opt
.diffopt
.use_color
= GIT_COLOR_NEVER
;
3107 if (!log_tree_opt
.diffopt
.file
)
3108 res
|= error_errno(_("could not open '%s'"), buf
.buf
);
3110 res
|= log_tree_commit(&log_tree_opt
, commit
);
3111 fclose(log_tree_opt
.diffopt
.file
);
3115 strbuf_addf(&buf
, "%s/message", get_dir(opts
));
3116 if (!file_exists(buf
.buf
)) {
3117 const char *encoding
= get_commit_output_encoding();
3118 const char *commit_buffer
= logmsg_reencode(commit
, NULL
, encoding
);
3119 find_commit_subject(commit_buffer
, &subject
);
3120 res
|= write_message(subject
, strlen(subject
), buf
.buf
, 1);
3121 unuse_commit_buffer(commit
, commit_buffer
);
3123 strbuf_release(&buf
);
3128 static int intend_to_amend(void)
3130 struct object_id head
;
3133 if (get_oid("HEAD", &head
))
3134 return error(_("cannot read HEAD"));
3136 p
= oid_to_hex(&head
);
3137 return write_message(p
, strlen(p
), rebase_path_amend(), 1);
3140 static int error_with_patch(struct repository
*r
,
3141 struct commit
*commit
,
3142 const char *subject
, int subject_len
,
3143 struct replay_opts
*opts
,
3144 int exit_code
, int to_amend
)
3147 if (make_patch(r
, commit
, opts
))
3149 } else if (copy_file(rebase_path_message(),
3150 git_path_merge_msg(r
), 0666))
3151 return error(_("unable to copy '%s' to '%s'"),
3152 git_path_merge_msg(r
), rebase_path_message());
3155 if (intend_to_amend())
3159 _("You can amend the commit now, with\n"
3161 " git commit --amend %s\n"
3163 "Once you are satisfied with your changes, run\n"
3165 " git rebase --continue\n"),
3166 gpg_sign_opt_quoted(opts
));
3167 } else if (exit_code
) {
3169 fprintf_ln(stderr
, _("Could not apply %s... %.*s"),
3170 short_commit_name(commit
), subject_len
, subject
);
3173 * We don't have the hash of the parent so
3174 * just print the line from the todo file.
3176 fprintf_ln(stderr
, _("Could not merge %.*s"),
3177 subject_len
, subject
);
3183 static int error_failed_squash(struct repository
*r
,
3184 struct commit
*commit
,
3185 struct replay_opts
*opts
,
3187 const char *subject
)
3189 if (copy_file(rebase_path_message(), rebase_path_squash_msg(), 0666))
3190 return error(_("could not copy '%s' to '%s'"),
3191 rebase_path_squash_msg(), rebase_path_message());
3192 unlink(git_path_merge_msg(r
));
3193 if (copy_file(git_path_merge_msg(r
), rebase_path_message(), 0666))
3194 return error(_("could not copy '%s' to '%s'"),
3195 rebase_path_message(),
3196 git_path_merge_msg(r
));
3197 return error_with_patch(r
, commit
, subject
, subject_len
, opts
, 1, 0);
3200 static int do_exec(struct repository
*r
, const char *command_line
)
3202 struct argv_array child_env
= ARGV_ARRAY_INIT
;
3203 const char *child_argv
[] = { NULL
, NULL
};
3206 fprintf(stderr
, "Executing: %s\n", command_line
);
3207 child_argv
[0] = command_line
;
3208 argv_array_pushf(&child_env
, "GIT_DIR=%s", absolute_path(get_git_dir()));
3209 argv_array_pushf(&child_env
, "GIT_WORK_TREE=%s",
3210 absolute_path(get_git_work_tree()));
3211 status
= run_command_v_opt_cd_env(child_argv
, RUN_USING_SHELL
, NULL
,
3214 /* force re-reading of the cache */
3215 if (discard_index(r
->index
) < 0 || repo_read_index(r
) < 0)
3216 return error(_("could not read index"));
3218 dirty
= require_clean_work_tree(r
, "rebase", NULL
, 1, 1);
3221 warning(_("execution failed: %s\n%s"
3222 "You can fix the problem, and then run\n"
3224 " git rebase --continue\n"
3227 dirty
? N_("and made changes to the index and/or the "
3228 "working tree\n") : "");
3230 /* command not found */
3233 warning(_("execution succeeded: %s\nbut "
3234 "left changes to the index and/or the working tree\n"
3235 "Commit or stash your changes, and then run\n"
3237 " git rebase --continue\n"
3238 "\n"), command_line
);
3242 argv_array_clear(&child_env
);
3247 static int safe_append(const char *filename
, const char *fmt
, ...)
3250 struct lock_file lock
= LOCK_INIT
;
3251 int fd
= hold_lock_file_for_update(&lock
, filename
,
3252 LOCK_REPORT_ON_ERROR
);
3253 struct strbuf buf
= STRBUF_INIT
;
3258 if (strbuf_read_file(&buf
, filename
, 0) < 0 && errno
!= ENOENT
) {
3259 error_errno(_("could not read '%s'"), filename
);
3260 rollback_lock_file(&lock
);
3263 strbuf_complete(&buf
, '\n');
3265 strbuf_vaddf(&buf
, fmt
, ap
);
3268 if (write_in_full(fd
, buf
.buf
, buf
.len
) < 0) {
3269 error_errno(_("could not write to '%s'"), filename
);
3270 strbuf_release(&buf
);
3271 rollback_lock_file(&lock
);
3274 if (commit_lock_file(&lock
) < 0) {
3275 strbuf_release(&buf
);
3276 rollback_lock_file(&lock
);
3277 return error(_("failed to finalize '%s'"), filename
);
3280 strbuf_release(&buf
);
3284 static int do_label(struct repository
*r
, const char *name
, int len
)
3286 struct ref_store
*refs
= get_main_ref_store(r
);
3287 struct ref_transaction
*transaction
;
3288 struct strbuf ref_name
= STRBUF_INIT
, err
= STRBUF_INIT
;
3289 struct strbuf msg
= STRBUF_INIT
;
3291 struct object_id head_oid
;
3293 if (len
== 1 && *name
== '#')
3294 return error(_("illegal label name: '%.*s'"), len
, name
);
3296 strbuf_addf(&ref_name
, "refs/rewritten/%.*s", len
, name
);
3297 strbuf_addf(&msg
, "rebase -i (label) '%.*s'", len
, name
);
3299 transaction
= ref_store_transaction_begin(refs
, &err
);
3301 error("%s", err
.buf
);
3303 } else if (get_oid("HEAD", &head_oid
)) {
3304 error(_("could not read HEAD"));
3306 } else if (ref_transaction_update(transaction
, ref_name
.buf
, &head_oid
,
3307 NULL
, 0, msg
.buf
, &err
) < 0 ||
3308 ref_transaction_commit(transaction
, &err
)) {
3309 error("%s", err
.buf
);
3312 ref_transaction_free(transaction
);
3313 strbuf_release(&err
);
3314 strbuf_release(&msg
);
3317 ret
= safe_append(rebase_path_refs_to_delete(),
3318 "%s\n", ref_name
.buf
);
3319 strbuf_release(&ref_name
);
3324 static const char *reflog_message(struct replay_opts
*opts
,
3325 const char *sub_action
, const char *fmt
, ...);
3327 static int do_reset(struct repository
*r
,
3328 const char *name
, int len
,
3329 struct replay_opts
*opts
)
3331 struct strbuf ref_name
= STRBUF_INIT
;
3332 struct object_id oid
;
3333 struct lock_file lock
= LOCK_INIT
;
3334 struct tree_desc desc
;
3336 struct unpack_trees_options unpack_tree_opts
;
3339 if (repo_hold_locked_index(r
, &lock
, LOCK_REPORT_ON_ERROR
) < 0)
3342 if (len
== 10 && !strncmp("[new root]", name
, len
)) {
3343 if (!opts
->have_squash_onto
) {
3345 if (commit_tree("", 0, the_hash_algo
->empty_tree
,
3346 NULL
, &opts
->squash_onto
,
3348 return error(_("writing fake root commit"));
3349 opts
->have_squash_onto
= 1;
3350 hex
= oid_to_hex(&opts
->squash_onto
);
3351 if (write_message(hex
, strlen(hex
),
3352 rebase_path_squash_onto(), 0))
3353 return error(_("writing squash-onto"));
3355 oidcpy(&oid
, &opts
->squash_onto
);
3359 /* Determine the length of the label */
3360 for (i
= 0; i
< len
; i
++)
3361 if (isspace(name
[i
]))
3365 strbuf_addf(&ref_name
, "refs/rewritten/%.*s", len
, name
);
3366 if (get_oid(ref_name
.buf
, &oid
) &&
3367 get_oid(ref_name
.buf
+ strlen("refs/rewritten/"), &oid
)) {
3368 error(_("could not read '%s'"), ref_name
.buf
);
3369 rollback_lock_file(&lock
);
3370 strbuf_release(&ref_name
);
3375 memset(&unpack_tree_opts
, 0, sizeof(unpack_tree_opts
));
3376 setup_unpack_trees_porcelain(&unpack_tree_opts
, "reset");
3377 unpack_tree_opts
.head_idx
= 1;
3378 unpack_tree_opts
.src_index
= r
->index
;
3379 unpack_tree_opts
.dst_index
= r
->index
;
3380 unpack_tree_opts
.fn
= oneway_merge
;
3381 unpack_tree_opts
.merge
= 1;
3382 unpack_tree_opts
.update
= 1;
3384 if (repo_read_index_unmerged(r
)) {
3385 rollback_lock_file(&lock
);
3386 strbuf_release(&ref_name
);
3387 return error_resolve_conflict(_(action_name(opts
)));
3390 if (!fill_tree_descriptor(r
, &desc
, &oid
)) {
3391 error(_("failed to find tree of %s"), oid_to_hex(&oid
));
3392 rollback_lock_file(&lock
);
3393 free((void *)desc
.buffer
);
3394 strbuf_release(&ref_name
);
3398 if (unpack_trees(1, &desc
, &unpack_tree_opts
)) {
3399 rollback_lock_file(&lock
);
3400 free((void *)desc
.buffer
);
3401 strbuf_release(&ref_name
);
3405 tree
= parse_tree_indirect(&oid
);
3406 prime_cache_tree(r
, r
->index
, tree
);
3408 if (write_locked_index(r
->index
, &lock
, COMMIT_LOCK
) < 0)
3409 ret
= error(_("could not write index"));
3410 free((void *)desc
.buffer
);
3413 ret
= update_ref(reflog_message(opts
, "reset", "'%.*s'",
3414 len
, name
), "HEAD", &oid
,
3415 NULL
, 0, UPDATE_REFS_MSG_ON_ERR
);
3417 strbuf_release(&ref_name
);
3421 static struct commit
*lookup_label(const char *label
, int len
,
3424 struct commit
*commit
;
3427 strbuf_addf(buf
, "refs/rewritten/%.*s", len
, label
);
3428 commit
= lookup_commit_reference_by_name(buf
->buf
);
3430 /* fall back to non-rewritten ref or commit */
3431 strbuf_splice(buf
, 0, strlen("refs/rewritten/"), "", 0);
3432 commit
= lookup_commit_reference_by_name(buf
->buf
);
3436 error(_("could not resolve '%s'"), buf
->buf
);
3441 static int do_merge(struct repository
*r
,
3442 struct commit
*commit
,
3443 const char *arg
, int arg_len
,
3444 int flags
, struct replay_opts
*opts
)
3446 int run_commit_flags
= (flags
& TODO_EDIT_MERGE_MSG
) ?
3447 EDIT_MSG
| VERIFY_MSG
: 0;
3448 struct strbuf ref_name
= STRBUF_INIT
;
3449 struct commit
*head_commit
, *merge_commit
, *i
;
3450 struct commit_list
*bases
, *j
, *reversed
= NULL
;
3451 struct commit_list
*to_merge
= NULL
, **tail
= &to_merge
;
3452 const char *strategy
= !opts
->xopts_nr
&&
3453 (!opts
->strategy
|| !strcmp(opts
->strategy
, "recursive")) ?
3454 NULL
: opts
->strategy
;
3455 struct merge_options o
;
3456 int merge_arg_len
, oneline_offset
, can_fast_forward
, ret
, k
;
3457 static struct lock_file lock
;
3460 if (repo_hold_locked_index(r
, &lock
, LOCK_REPORT_ON_ERROR
) < 0) {
3465 head_commit
= lookup_commit_reference_by_name("HEAD");
3467 ret
= error(_("cannot merge without a current revision"));
3472 * For octopus merges, the arg starts with the list of revisions to be
3473 * merged. The list is optionally followed by '#' and the oneline.
3475 merge_arg_len
= oneline_offset
= arg_len
;
3476 for (p
= arg
; p
- arg
< arg_len
; p
+= strspn(p
, " \t\n")) {
3479 if (*p
== '#' && (!p
[1] || isspace(p
[1]))) {
3480 p
+= 1 + strspn(p
+ 1, " \t\n");
3481 oneline_offset
= p
- arg
;
3484 k
= strcspn(p
, " \t\n");
3487 merge_commit
= lookup_label(p
, k
, &ref_name
);
3488 if (!merge_commit
) {
3489 ret
= error(_("unable to parse '%.*s'"), k
, p
);
3492 tail
= &commit_list_insert(merge_commit
, tail
)->next
;
3494 merge_arg_len
= p
- arg
;
3498 ret
= error(_("nothing to merge: '%.*s'"), arg_len
, arg
);
3502 if (opts
->have_squash_onto
&&
3503 oideq(&head_commit
->object
.oid
, &opts
->squash_onto
)) {
3505 * When the user tells us to "merge" something into a
3506 * "[new root]", let's simply fast-forward to the merge head.
3508 rollback_lock_file(&lock
);
3510 ret
= error(_("octopus merge cannot be executed on "
3511 "top of a [new root]"));
3513 ret
= fast_forward_to(r
, &to_merge
->item
->object
.oid
,
3514 &head_commit
->object
.oid
, 0,
3520 const char *encoding
= get_commit_output_encoding();
3521 const char *message
= logmsg_reencode(commit
, NULL
, encoding
);
3526 ret
= error(_("could not get commit message of '%s'"),
3527 oid_to_hex(&commit
->object
.oid
));
3530 write_author_script(message
);
3531 find_commit_subject(message
, &body
);
3533 ret
= write_message(body
, len
, git_path_merge_msg(r
), 0);
3534 unuse_commit_buffer(commit
, message
);
3536 error_errno(_("could not write '%s'"),
3537 git_path_merge_msg(r
));
3541 struct strbuf buf
= STRBUF_INIT
;
3544 strbuf_addf(&buf
, "author %s", git_author_info(0));
3545 write_author_script(buf
.buf
);
3548 if (oneline_offset
< arg_len
) {
3549 p
= arg
+ oneline_offset
;
3550 len
= arg_len
- oneline_offset
;
3552 strbuf_addf(&buf
, "Merge %s '%.*s'",
3553 to_merge
->next
? "branches" : "branch",
3554 merge_arg_len
, arg
);
3559 ret
= write_message(p
, len
, git_path_merge_msg(r
), 0);
3560 strbuf_release(&buf
);
3562 error_errno(_("could not write '%s'"),
3563 git_path_merge_msg(r
));
3569 * If HEAD is not identical to the first parent of the original merge
3570 * commit, we cannot fast-forward.
3572 can_fast_forward
= opts
->allow_ff
&& commit
&& commit
->parents
&&
3573 oideq(&commit
->parents
->item
->object
.oid
,
3574 &head_commit
->object
.oid
);
3577 * If any merge head is different from the original one, we cannot
3580 if (can_fast_forward
) {
3581 struct commit_list
*p
= commit
->parents
->next
;
3583 for (j
= to_merge
; j
&& p
; j
= j
->next
, p
= p
->next
)
3584 if (!oideq(&j
->item
->object
.oid
,
3585 &p
->item
->object
.oid
)) {
3586 can_fast_forward
= 0;
3590 * If the number of merge heads differs from the original merge
3591 * commit, we cannot fast-forward.
3594 can_fast_forward
= 0;
3597 if (can_fast_forward
) {
3598 rollback_lock_file(&lock
);
3599 ret
= fast_forward_to(r
, &commit
->object
.oid
,
3600 &head_commit
->object
.oid
, 0, opts
);
3601 if (flags
& TODO_EDIT_MERGE_MSG
) {
3602 run_commit_flags
|= AMEND_MSG
;
3603 goto fast_forward_edit
;
3608 if (strategy
|| to_merge
->next
) {
3610 struct child_process cmd
= CHILD_PROCESS_INIT
;
3612 if (read_env_script(&cmd
.env_array
)) {
3613 const char *gpg_opt
= gpg_sign_opt_quoted(opts
);
3615 ret
= error(_(staged_changes_advice
), gpg_opt
, gpg_opt
);
3620 argv_array_push(&cmd
.args
, "merge");
3621 argv_array_push(&cmd
.args
, "-s");
3623 argv_array_push(&cmd
.args
, "octopus");
3625 argv_array_push(&cmd
.args
, strategy
);
3626 for (k
= 0; k
< opts
->xopts_nr
; k
++)
3627 argv_array_pushf(&cmd
.args
,
3628 "-X%s", opts
->xopts
[k
]);
3630 argv_array_push(&cmd
.args
, "--no-edit");
3631 argv_array_push(&cmd
.args
, "--no-ff");
3632 argv_array_push(&cmd
.args
, "--no-log");
3633 argv_array_push(&cmd
.args
, "--no-stat");
3634 argv_array_push(&cmd
.args
, "-F");
3635 argv_array_push(&cmd
.args
, git_path_merge_msg(r
));
3637 argv_array_push(&cmd
.args
, opts
->gpg_sign
);
3638 if (opts
->ignore_date
)
3639 push_dates(&cmd
, opts
->committer_date_is_author_date
);
3641 /* Add the tips to be merged */
3642 for (j
= to_merge
; j
; j
= j
->next
)
3643 argv_array_push(&cmd
.args
,
3644 oid_to_hex(&j
->item
->object
.oid
));
3646 strbuf_release(&ref_name
);
3647 unlink(git_path_cherry_pick_head(r
));
3648 rollback_lock_file(&lock
);
3650 rollback_lock_file(&lock
);
3651 ret
= run_command(&cmd
);
3653 /* force re-reading of the cache */
3654 if (!ret
&& (discard_index(r
->index
) < 0 ||
3655 repo_read_index(r
) < 0))
3656 ret
= error(_("could not read index"));
3660 merge_commit
= to_merge
->item
;
3661 bases
= get_merge_bases(head_commit
, merge_commit
);
3662 if (bases
&& oideq(&merge_commit
->object
.oid
,
3663 &bases
->item
->object
.oid
)) {
3665 /* skip merging an ancestor of HEAD */
3669 write_message(oid_to_hex(&merge_commit
->object
.oid
), the_hash_algo
->hexsz
,
3670 git_path_merge_head(r
), 0);
3671 write_message("no-ff", 5, git_path_merge_mode(r
), 0);
3673 for (j
= bases
; j
; j
= j
->next
)
3674 commit_list_insert(j
->item
, &reversed
);
3675 free_commit_list(bases
);
3678 init_merge_options(&o
, r
);
3680 o
.branch2
= ref_name
.buf
;
3681 o
.buffer_output
= 2;
3683 ret
= merge_recursive(&o
, head_commit
, merge_commit
, reversed
, &i
);
3685 fputs(o
.obuf
.buf
, stdout
);
3686 strbuf_release(&o
.obuf
);
3688 error(_("could not even attempt to merge '%.*s'"),
3689 merge_arg_len
, arg
);
3693 * The return value of merge_recursive() is 1 on clean, and 0 on
3696 * Let's reverse that, so that do_merge() returns 0 upon success and
3697 * 1 upon failed merge (keeping the return value -1 for the cases where
3698 * we will want to reschedule the `merge` command).
3702 if (r
->index
->cache_changed
&&
3703 write_locked_index(r
->index
, &lock
, COMMIT_LOCK
)) {
3704 ret
= error(_("merge: Unable to write new index file"));
3708 rollback_lock_file(&lock
);
3710 repo_rerere(r
, opts
->allow_rerere_auto
);
3713 * In case of problems, we now want to return a positive
3714 * value (a negative one would indicate that the `merge`
3715 * command needs to be rescheduled).
3718 ret
= !!run_git_commit(r
, git_path_merge_msg(r
), opts
,
3722 strbuf_release(&ref_name
);
3723 rollback_lock_file(&lock
);
3724 free_commit_list(to_merge
);
3728 static int is_final_fixup(struct todo_list
*todo_list
)
3730 int i
= todo_list
->current
;
3732 if (!is_fixup(todo_list
->items
[i
].command
))
3735 while (++i
< todo_list
->nr
)
3736 if (is_fixup(todo_list
->items
[i
].command
))
3738 else if (!is_noop(todo_list
->items
[i
].command
))
3743 static enum todo_command
peek_command(struct todo_list
*todo_list
, int offset
)
3747 for (i
= todo_list
->current
+ offset
; i
< todo_list
->nr
; i
++)
3748 if (!is_noop(todo_list
->items
[i
].command
))
3749 return todo_list
->items
[i
].command
;
3754 static int apply_autostash(struct replay_opts
*opts
)
3756 struct strbuf stash_sha1
= STRBUF_INIT
;
3757 struct child_process child
= CHILD_PROCESS_INIT
;
3760 if (!read_oneliner(&stash_sha1
, rebase_path_autostash(), 1)) {
3761 strbuf_release(&stash_sha1
);
3764 strbuf_trim(&stash_sha1
);
3767 child
.no_stdout
= 1;
3768 child
.no_stderr
= 1;
3769 argv_array_push(&child
.args
, "stash");
3770 argv_array_push(&child
.args
, "apply");
3771 argv_array_push(&child
.args
, stash_sha1
.buf
);
3772 if (!run_command(&child
))
3773 fprintf(stderr
, _("Applied autostash.\n"));
3775 struct child_process store
= CHILD_PROCESS_INIT
;
3778 argv_array_push(&store
.args
, "stash");
3779 argv_array_push(&store
.args
, "store");
3780 argv_array_push(&store
.args
, "-m");
3781 argv_array_push(&store
.args
, "autostash");
3782 argv_array_push(&store
.args
, "-q");
3783 argv_array_push(&store
.args
, stash_sha1
.buf
);
3784 if (run_command(&store
))
3785 ret
= error(_("cannot store %s"), stash_sha1
.buf
);
3788 _("Applying autostash resulted in conflicts.\n"
3789 "Your changes are safe in the stash.\n"
3790 "You can run \"git stash pop\" or"
3791 " \"git stash drop\" at any time.\n"));
3794 strbuf_release(&stash_sha1
);
3798 static const char *reflog_message(struct replay_opts
*opts
,
3799 const char *sub_action
, const char *fmt
, ...)
3802 static struct strbuf buf
= STRBUF_INIT
;
3806 strbuf_addstr(&buf
, action_name(opts
));
3808 strbuf_addf(&buf
, " (%s)", sub_action
);
3810 strbuf_addstr(&buf
, ": ");
3811 strbuf_vaddf(&buf
, fmt
, ap
);
3818 static int run_git_checkout(struct repository
*r
, struct replay_opts
*opts
,
3819 const char *commit
, const char *action
)
3821 struct child_process cmd
= CHILD_PROCESS_INIT
;
3826 argv_array_push(&cmd
.args
, "checkout");
3827 argv_array_push(&cmd
.args
, commit
);
3828 argv_array_pushf(&cmd
.env_array
, GIT_REFLOG_ACTION
"=%s", action
);
3831 ret
= run_command(&cmd
);
3833 ret
= run_command_silent_on_success(&cmd
);
3836 discard_index(r
->index
);
3841 int prepare_branch_to_be_rebased(struct repository
*r
, struct replay_opts
*opts
,
3846 if (commit
&& *commit
) {
3847 action
= reflog_message(opts
, "start", "checkout %s", commit
);
3848 if (run_git_checkout(r
, opts
, commit
, action
))
3849 return error(_("could not checkout %s"), commit
);
3855 static int checkout_onto(struct repository
*r
, struct replay_opts
*opts
,
3856 const char *onto_name
, const struct object_id
*onto
,
3857 const char *orig_head
)
3859 struct object_id oid
;
3860 const char *action
= reflog_message(opts
, "start", "checkout %s", onto_name
);
3862 if (get_oid(orig_head
, &oid
))
3863 return error(_("%s: not a valid OID"), orig_head
);
3865 if (run_git_checkout(r
, opts
, oid_to_hex(onto
), action
)) {
3866 apply_autostash(opts
);
3867 sequencer_remove_state(opts
);
3868 return error(_("could not detach HEAD"));
3871 return update_ref(NULL
, "ORIG_HEAD", &oid
, NULL
, 0, UPDATE_REFS_MSG_ON_ERR
);
3874 static int stopped_at_head(struct repository
*r
)
3876 struct object_id head
;
3877 struct commit
*commit
;
3878 struct commit_message message
;
3880 if (get_oid("HEAD", &head
) ||
3881 !(commit
= lookup_commit(r
, &head
)) ||
3882 parse_commit(commit
) || get_message(commit
, &message
))
3883 fprintf(stderr
, _("Stopped at HEAD\n"));
3885 fprintf(stderr
, _("Stopped at %s\n"), message
.label
);
3886 free_message(commit
, &message
);
3892 static const char rescheduled_advice
[] =
3893 N_("Could not execute the todo command\n"
3897 "It has been rescheduled; To edit the command before continuing, please\n"
3898 "edit the todo list first:\n"
3900 " git rebase --edit-todo\n"
3901 " git rebase --continue\n");
3903 static int pick_commits(struct repository
*r
,
3904 struct todo_list
*todo_list
,
3905 struct replay_opts
*opts
)
3907 int res
= 0, reschedule
= 0;
3909 setenv(GIT_REFLOG_ACTION
, action_name(opts
), 0);
3911 assert(!(opts
->signoff
|| opts
->no_commit
||
3912 opts
->record_origin
|| opts
->edit
||
3913 opts
->committer_date_is_author_date
||
3914 opts
->ignore_date
));
3915 if (read_and_refresh_cache(r
, opts
))
3918 while (todo_list
->current
< todo_list
->nr
) {
3919 struct todo_item
*item
= todo_list
->items
+ todo_list
->current
;
3920 const char *arg
= todo_item_get_arg(todo_list
, item
);
3923 if (save_todo(todo_list
, opts
))
3925 if (is_rebase_i(opts
)) {
3926 if (item
->command
!= TODO_COMMENT
) {
3927 FILE *f
= fopen(rebase_path_msgnum(), "w");
3929 todo_list
->done_nr
++;
3932 fprintf(f
, "%d\n", todo_list
->done_nr
);
3936 fprintf(stderr
, "Rebasing (%d/%d)%s",
3938 todo_list
->total_nr
,
3939 opts
->verbose
? "\n" : "\r");
3941 unlink(rebase_path_message());
3942 unlink(rebase_path_author_script());
3943 unlink(rebase_path_stopped_sha());
3944 unlink(rebase_path_amend());
3945 unlink(git_path_merge_head(r
));
3946 delete_ref(NULL
, "REBASE_HEAD", NULL
, REF_NO_DEREF
);
3948 if (item
->command
== TODO_BREAK
) {
3951 return stopped_at_head(r
);
3954 if (item
->command
<= TODO_SQUASH
) {
3955 if (is_rebase_i(opts
))
3956 setenv("GIT_REFLOG_ACTION", reflog_message(opts
,
3957 command_to_string(item
->command
), NULL
),
3959 res
= do_pick_commit(r
, item
->command
, item
->commit
,
3960 opts
, is_final_fixup(todo_list
),
3962 if (is_rebase_i(opts
) && res
< 0) {
3964 advise(_(rescheduled_advice
),
3965 get_item_line_length(todo_list
,
3966 todo_list
->current
),
3967 get_item_line(todo_list
,
3968 todo_list
->current
));
3969 todo_list
->current
--;
3970 if (save_todo(todo_list
, opts
))
3973 if (item
->command
== TODO_EDIT
) {
3974 struct commit
*commit
= item
->commit
;
3979 _("Stopped at %s... %.*s\n"),
3980 short_commit_name(commit
),
3981 item
->arg_len
, arg
);
3983 return error_with_patch(r
, commit
,
3984 arg
, item
->arg_len
, opts
, res
, !res
);
3986 if (is_rebase_i(opts
) && !res
)
3987 record_in_rewritten(&item
->commit
->object
.oid
,
3988 peek_command(todo_list
, 1));
3989 if (res
&& is_fixup(item
->command
)) {
3992 return error_failed_squash(r
, item
->commit
, opts
,
3993 item
->arg_len
, arg
);
3994 } else if (res
&& is_rebase_i(opts
) && item
->commit
) {
3996 struct object_id oid
;
3999 * If we are rewording and have either
4000 * fast-forwarded already, or are about to
4001 * create a new root commit, we want to amend,
4002 * otherwise we do not.
4004 if (item
->command
== TODO_REWORD
&&
4005 !get_oid("HEAD", &oid
) &&
4006 (oideq(&item
->commit
->object
.oid
, &oid
) ||
4007 (opts
->have_squash_onto
&&
4008 oideq(&opts
->squash_onto
, &oid
))))
4011 return res
| error_with_patch(r
, item
->commit
,
4012 arg
, item
->arg_len
, opts
,
4015 } else if (item
->command
== TODO_EXEC
) {
4016 char *end_of_arg
= (char *)(arg
+ item
->arg_len
);
4017 int saved
= *end_of_arg
;
4022 res
= do_exec(r
, arg
);
4023 *end_of_arg
= saved
;
4026 if (opts
->reschedule_failed_exec
)
4030 } else if (item
->command
== TODO_LABEL
) {
4031 if ((res
= do_label(r
, arg
, item
->arg_len
)))
4033 } else if (item
->command
== TODO_RESET
) {
4034 if ((res
= do_reset(r
, arg
, item
->arg_len
, opts
)))
4036 } else if (item
->command
== TODO_MERGE
) {
4037 if ((res
= do_merge(r
, item
->commit
,
4039 item
->flags
, opts
)) < 0)
4041 else if (item
->commit
)
4042 record_in_rewritten(&item
->commit
->object
.oid
,
4043 peek_command(todo_list
, 1));
4045 /* failed with merge conflicts */
4046 return error_with_patch(r
, item
->commit
,
4049 } else if (!is_noop(item
->command
))
4050 return error(_("unknown command %d"), item
->command
);
4053 advise(_(rescheduled_advice
),
4054 get_item_line_length(todo_list
,
4055 todo_list
->current
),
4056 get_item_line(todo_list
, todo_list
->current
));
4057 todo_list
->current
--;
4058 if (save_todo(todo_list
, opts
))
4061 return error_with_patch(r
,
4065 } else if (is_rebase_i(opts
) && check_todo
&& !res
) {
4068 if (stat(get_todo_path(opts
), &st
)) {
4069 res
= error_errno(_("could not stat '%s'"),
4070 get_todo_path(opts
));
4071 } else if (match_stat_data(&todo_list
->stat
, &st
)) {
4072 /* Reread the todo file if it has changed. */
4073 todo_list_release(todo_list
);
4074 if (read_populate_todo(r
, todo_list
, opts
))
4075 res
= -1; /* message was printed */
4076 /* `current` will be incremented below */
4077 todo_list
->current
= -1;
4081 todo_list
->current
++;
4086 if (is_rebase_i(opts
)) {
4087 struct strbuf head_ref
= STRBUF_INIT
, buf
= STRBUF_INIT
;
4090 /* Stopped in the middle, as planned? */
4091 if (todo_list
->current
< todo_list
->nr
)
4094 if (read_oneliner(&head_ref
, rebase_path_head_name(), 0) &&
4095 starts_with(head_ref
.buf
, "refs/")) {
4097 struct object_id head
, orig
;
4100 if (get_oid("HEAD", &head
)) {
4101 res
= error(_("cannot read HEAD"));
4103 strbuf_release(&head_ref
);
4104 strbuf_release(&buf
);
4107 if (!read_oneliner(&buf
, rebase_path_orig_head(), 0) ||
4108 get_oid_hex(buf
.buf
, &orig
)) {
4109 res
= error(_("could not read orig-head"));
4110 goto cleanup_head_ref
;
4113 if (!read_oneliner(&buf
, rebase_path_onto(), 0)) {
4114 res
= error(_("could not read 'onto'"));
4115 goto cleanup_head_ref
;
4117 msg
= reflog_message(opts
, "finish", "%s onto %s",
4118 head_ref
.buf
, buf
.buf
);
4119 if (update_ref(msg
, head_ref
.buf
, &head
, &orig
,
4120 REF_NO_DEREF
, UPDATE_REFS_MSG_ON_ERR
)) {
4121 res
= error(_("could not update %s"),
4123 goto cleanup_head_ref
;
4125 msg
= reflog_message(opts
, "finish", "returning to %s",
4127 if (create_symref("HEAD", head_ref
.buf
, msg
)) {
4128 res
= error(_("could not update HEAD to %s"),
4130 goto cleanup_head_ref
;
4135 if (opts
->verbose
) {
4136 struct rev_info log_tree_opt
;
4137 struct object_id orig
, head
;
4139 memset(&log_tree_opt
, 0, sizeof(log_tree_opt
));
4140 repo_init_revisions(r
, &log_tree_opt
, NULL
);
4141 log_tree_opt
.diff
= 1;
4142 log_tree_opt
.diffopt
.output_format
=
4143 DIFF_FORMAT_DIFFSTAT
;
4144 log_tree_opt
.disable_stdin
= 1;
4146 if (read_oneliner(&buf
, rebase_path_orig_head(), 0) &&
4147 !get_oid(buf
.buf
, &orig
) &&
4148 !get_oid("HEAD", &head
)) {
4149 diff_tree_oid(&orig
, &head
, "",
4150 &log_tree_opt
.diffopt
);
4151 log_tree_diff_flush(&log_tree_opt
);
4154 flush_rewritten_pending();
4155 if (!stat(rebase_path_rewritten_list(), &st
) &&
4157 struct child_process child
= CHILD_PROCESS_INIT
;
4158 const char *post_rewrite_hook
=
4159 find_hook("post-rewrite");
4161 child
.in
= open(rebase_path_rewritten_list(), O_RDONLY
);
4163 argv_array_push(&child
.args
, "notes");
4164 argv_array_push(&child
.args
, "copy");
4165 argv_array_push(&child
.args
, "--for-rewrite=rebase");
4166 /* we don't care if this copying failed */
4167 run_command(&child
);
4169 if (post_rewrite_hook
) {
4170 struct child_process hook
= CHILD_PROCESS_INIT
;
4172 hook
.in
= open(rebase_path_rewritten_list(),
4174 hook
.stdout_to_stderr
= 1;
4175 hook
.trace2_hook_name
= "post-rewrite";
4176 argv_array_push(&hook
.args
, post_rewrite_hook
);
4177 argv_array_push(&hook
.args
, "rebase");
4178 /* we don't care if this hook failed */
4182 apply_autostash(opts
);
4188 "Successfully rebased and updated %s.\n",
4192 strbuf_release(&buf
);
4193 strbuf_release(&head_ref
);
4197 * Sequence of picks finished successfully; cleanup by
4198 * removing the .git/sequencer directory
4200 return sequencer_remove_state(opts
);
4203 static int continue_single_pick(struct repository
*r
)
4205 const char *argv
[] = { "commit", NULL
};
4207 if (!file_exists(git_path_cherry_pick_head(r
)) &&
4208 !file_exists(git_path_revert_head(r
)))
4209 return error(_("no cherry-pick or revert in progress"));
4210 return run_command_v_opt(argv
, RUN_GIT_CMD
);
4213 static int commit_staged_changes(struct repository
*r
,
4214 struct replay_opts
*opts
,
4215 struct todo_list
*todo_list
)
4217 unsigned int flags
= ALLOW_EMPTY
| EDIT_MSG
;
4218 unsigned int final_fixup
= 0, is_clean
;
4220 if (has_unstaged_changes(r
, 1))
4221 return error(_("cannot rebase: You have unstaged changes."));
4223 is_clean
= !has_uncommitted_changes(r
, 0);
4225 if (file_exists(rebase_path_amend())) {
4226 struct strbuf rev
= STRBUF_INIT
;
4227 struct object_id head
, to_amend
;
4229 if (get_oid("HEAD", &head
))
4230 return error(_("cannot amend non-existing commit"));
4231 if (!read_oneliner(&rev
, rebase_path_amend(), 0))
4232 return error(_("invalid file: '%s'"), rebase_path_amend());
4233 if (get_oid_hex(rev
.buf
, &to_amend
))
4234 return error(_("invalid contents: '%s'"),
4235 rebase_path_amend());
4236 if (!is_clean
&& !oideq(&head
, &to_amend
))
4237 return error(_("\nYou have uncommitted changes in your "
4238 "working tree. Please, commit them\n"
4239 "first and then run 'git rebase "
4240 "--continue' again."));
4242 * When skipping a failed fixup/squash, we need to edit the
4243 * commit message, the current fixup list and count, and if it
4244 * was the last fixup/squash in the chain, we need to clean up
4245 * the commit message and if there was a squash, let the user
4248 if (!is_clean
|| !opts
->current_fixup_count
)
4249 ; /* this is not the final fixup */
4250 else if (!oideq(&head
, &to_amend
) ||
4251 !file_exists(rebase_path_stopped_sha())) {
4252 /* was a final fixup or squash done manually? */
4253 if (!is_fixup(peek_command(todo_list
, 0))) {
4254 unlink(rebase_path_fixup_msg());
4255 unlink(rebase_path_squash_msg());
4256 unlink(rebase_path_current_fixups());
4257 strbuf_reset(&opts
->current_fixups
);
4258 opts
->current_fixup_count
= 0;
4261 /* we are in a fixup/squash chain */
4262 const char *p
= opts
->current_fixups
.buf
;
4263 int len
= opts
->current_fixups
.len
;
4265 opts
->current_fixup_count
--;
4267 BUG("Incorrect current_fixups:\n%s", p
);
4268 while (len
&& p
[len
- 1] != '\n')
4270 strbuf_setlen(&opts
->current_fixups
, len
);
4271 if (write_message(p
, len
, rebase_path_current_fixups(),
4273 return error(_("could not write file: '%s'"),
4274 rebase_path_current_fixups());
4277 * If a fixup/squash in a fixup/squash chain failed, the
4278 * commit message is already correct, no need to commit
4281 * Only if it is the final command in the fixup/squash
4282 * chain, and only if the chain is longer than a single
4283 * fixup/squash command (which was just skipped), do we
4284 * actually need to re-commit with a cleaned up commit
4287 if (opts
->current_fixup_count
> 0 &&
4288 !is_fixup(peek_command(todo_list
, 0))) {
4291 * If there was not a single "squash" in the
4292 * chain, we only need to clean up the commit
4293 * message, no need to bother the user with
4294 * opening the commit message in the editor.
4296 if (!starts_with(p
, "squash ") &&
4297 !strstr(p
, "\nsquash "))
4298 flags
= (flags
& ~EDIT_MSG
) | CLEANUP_MSG
;
4299 } else if (is_fixup(peek_command(todo_list
, 0))) {
4301 * We need to update the squash message to skip
4302 * the latest commit message.
4304 struct commit
*commit
;
4305 const char *path
= rebase_path_squash_msg();
4306 const char *encoding
= get_commit_output_encoding();
4308 if (parse_head(r
, &commit
) ||
4309 !(p
= logmsg_reencode(commit
, NULL
, encoding
)) ||
4310 write_message(p
, strlen(p
), path
, 0)) {
4311 unuse_commit_buffer(commit
, p
);
4312 return error(_("could not write file: "
4315 unuse_commit_buffer(commit
, p
);
4319 strbuf_release(&rev
);
4324 const char *cherry_pick_head
= git_path_cherry_pick_head(r
);
4326 if (file_exists(cherry_pick_head
) && unlink(cherry_pick_head
))
4327 return error(_("could not remove CHERRY_PICK_HEAD"));
4332 if (run_git_commit(r
, final_fixup
? NULL
: rebase_path_message(),
4334 return error(_("could not commit staged changes."));
4335 unlink(rebase_path_amend());
4336 unlink(git_path_merge_head(r
));
4338 unlink(rebase_path_fixup_msg());
4339 unlink(rebase_path_squash_msg());
4341 if (opts
->current_fixup_count
> 0) {
4343 * Whether final fixup or not, we just cleaned up the commit
4346 unlink(rebase_path_current_fixups());
4347 strbuf_reset(&opts
->current_fixups
);
4348 opts
->current_fixup_count
= 0;
4353 int sequencer_continue(struct repository
*r
, struct replay_opts
*opts
)
4355 struct todo_list todo_list
= TODO_LIST_INIT
;
4358 if (read_and_refresh_cache(r
, opts
))
4361 if (read_populate_opts(opts
))
4363 if (is_rebase_i(opts
)) {
4364 if ((res
= read_populate_todo(r
, &todo_list
, opts
)))
4365 goto release_todo_list
;
4366 if (commit_staged_changes(r
, opts
, &todo_list
)) {
4368 goto release_todo_list
;
4370 } else if (!file_exists(get_todo_path(opts
)))
4371 return continue_single_pick(r
);
4372 else if ((res
= read_populate_todo(r
, &todo_list
, opts
)))
4373 goto release_todo_list
;
4375 if (!is_rebase_i(opts
)) {
4376 /* Verify that the conflict has been resolved */
4377 if (file_exists(git_path_cherry_pick_head(r
)) ||
4378 file_exists(git_path_revert_head(r
))) {
4379 res
= continue_single_pick(r
);
4381 goto release_todo_list
;
4383 if (index_differs_from(r
, "HEAD", NULL
, 0)) {
4384 res
= error_dirty_index(r
, opts
);
4385 goto release_todo_list
;
4387 todo_list
.current
++;
4388 } else if (file_exists(rebase_path_stopped_sha())) {
4389 struct strbuf buf
= STRBUF_INIT
;
4390 struct object_id oid
;
4392 if (read_oneliner(&buf
, rebase_path_stopped_sha(), 1) &&
4393 !get_oid_committish(buf
.buf
, &oid
))
4394 record_in_rewritten(&oid
, peek_command(&todo_list
, 0));
4395 strbuf_release(&buf
);
4398 res
= pick_commits(r
, &todo_list
, opts
);
4400 todo_list_release(&todo_list
);
4404 static int single_pick(struct repository
*r
,
4405 struct commit
*cmit
,
4406 struct replay_opts
*opts
)
4410 setenv(GIT_REFLOG_ACTION
, action_name(opts
), 0);
4411 return do_pick_commit(r
, opts
->action
== REPLAY_PICK
?
4412 TODO_PICK
: TODO_REVERT
, cmit
, opts
, 0,
4416 int sequencer_pick_revisions(struct repository
*r
,
4417 struct replay_opts
*opts
)
4419 struct todo_list todo_list
= TODO_LIST_INIT
;
4420 struct object_id oid
;
4424 if (read_and_refresh_cache(r
, opts
))
4427 for (i
= 0; i
< opts
->revs
->pending
.nr
; i
++) {
4428 struct object_id oid
;
4429 const char *name
= opts
->revs
->pending
.objects
[i
].name
;
4431 /* This happens when using --stdin. */
4435 if (!get_oid(name
, &oid
)) {
4436 if (!lookup_commit_reference_gently(r
, &oid
, 1)) {
4437 enum object_type type
= oid_object_info(r
,
4440 return error(_("%s: can't cherry-pick a %s"),
4441 name
, type_name(type
));
4444 return error(_("%s: bad revision"), name
);
4448 * If we were called as "git cherry-pick <commit>", just
4449 * cherry-pick/revert it, set CHERRY_PICK_HEAD /
4450 * REVERT_HEAD, and don't touch the sequencer state.
4451 * This means it is possible to cherry-pick in the middle
4452 * of a cherry-pick sequence.
4454 if (opts
->revs
->cmdline
.nr
== 1 &&
4455 opts
->revs
->cmdline
.rev
->whence
== REV_CMD_REV
&&
4456 opts
->revs
->no_walk
&&
4457 !opts
->revs
->cmdline
.rev
->flags
) {
4458 struct commit
*cmit
;
4459 if (prepare_revision_walk(opts
->revs
))
4460 return error(_("revision walk setup failed"));
4461 cmit
= get_revision(opts
->revs
);
4463 return error(_("empty commit set passed"));
4464 if (get_revision(opts
->revs
))
4465 BUG("unexpected extra commit from walk");
4466 return single_pick(r
, cmit
, opts
);
4470 * Start a new cherry-pick/ revert sequence; but
4471 * first, make sure that an existing one isn't in
4475 if (walk_revs_populate_todo(&todo_list
, opts
) ||
4476 create_seq_dir(r
) < 0)
4478 if (get_oid("HEAD", &oid
) && (opts
->action
== REPLAY_REVERT
))
4479 return error(_("can't revert as initial commit"));
4480 if (save_head(oid_to_hex(&oid
)))
4482 if (save_opts(opts
))
4484 update_abort_safety_file();
4485 res
= pick_commits(r
, &todo_list
, opts
);
4486 todo_list_release(&todo_list
);
4490 void append_signoff(struct strbuf
*msgbuf
, size_t ignore_footer
, unsigned flag
)
4492 unsigned no_dup_sob
= flag
& APPEND_SIGNOFF_DEDUP
;
4493 struct strbuf sob
= STRBUF_INIT
;
4496 strbuf_addstr(&sob
, sign_off_header
);
4497 strbuf_addstr(&sob
, fmt_name(WANT_COMMITTER_IDENT
));
4498 strbuf_addch(&sob
, '\n');
4501 strbuf_complete_line(msgbuf
);
4504 * If the whole message buffer is equal to the sob, pretend that we
4505 * found a conforming footer with a matching sob
4507 if (msgbuf
->len
- ignore_footer
== sob
.len
&&
4508 !strncmp(msgbuf
->buf
, sob
.buf
, sob
.len
))
4511 has_footer
= has_conforming_footer(msgbuf
, &sob
, ignore_footer
);
4514 const char *append_newlines
= NULL
;
4515 size_t len
= msgbuf
->len
- ignore_footer
;
4519 * The buffer is completely empty. Leave foom for
4520 * the title and body to be filled in by the user.
4522 append_newlines
= "\n\n";
4523 } else if (len
== 1) {
4525 * Buffer contains a single newline. Add another
4526 * so that we leave room for the title and body.
4528 append_newlines
= "\n";
4529 } else if (msgbuf
->buf
[len
- 2] != '\n') {
4531 * Buffer ends with a single newline. Add another
4532 * so that there is an empty line between the message
4535 append_newlines
= "\n";
4536 } /* else, the buffer already ends with two newlines. */
4538 if (append_newlines
)
4539 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
4540 append_newlines
, strlen(append_newlines
));
4543 if (has_footer
!= 3 && (!no_dup_sob
|| has_footer
!= 2))
4544 strbuf_splice(msgbuf
, msgbuf
->len
- ignore_footer
, 0,
4547 strbuf_release(&sob
);
4550 struct labels_entry
{
4551 struct hashmap_entry entry
;
4552 char label
[FLEX_ARRAY
];
4555 static int labels_cmp(const void *fndata
, const struct hashmap_entry
*eptr
,
4556 const struct hashmap_entry
*entry_or_key
, const void *key
)
4558 const struct labels_entry
*a
, *b
;
4560 a
= container_of(eptr
, const struct labels_entry
, entry
);
4561 b
= container_of(entry_or_key
, const struct labels_entry
, entry
);
4563 return key
? strcmp(a
->label
, key
) : strcmp(a
->label
, b
->label
);
4566 struct string_entry
{
4567 struct oidmap_entry entry
;
4568 char string
[FLEX_ARRAY
];
4571 struct label_state
{
4572 struct oidmap commit2label
;
4573 struct hashmap labels
;
4577 static const char *label_oid(struct object_id
*oid
, const char *label
,
4578 struct label_state
*state
)
4580 struct labels_entry
*labels_entry
;
4581 struct string_entry
*string_entry
;
4582 struct object_id dummy
;
4585 string_entry
= oidmap_get(&state
->commit2label
, oid
);
4587 return string_entry
->string
;
4590 * For "uninteresting" commits, i.e. commits that are not to be
4591 * rebased, and which can therefore not be labeled, we use a unique
4592 * abbreviation of the commit name. This is slightly more complicated
4593 * than calling find_unique_abbrev() because we also need to make
4594 * sure that the abbreviation does not conflict with any other
4597 * We disallow "interesting" commits to be labeled by a string that
4598 * is a valid full-length hash, to ensure that we always can find an
4599 * abbreviation for any uninteresting commit's names that does not
4600 * clash with any other label.
4602 strbuf_reset(&state
->buf
);
4606 strbuf_grow(&state
->buf
, GIT_MAX_HEXSZ
);
4607 label
= p
= state
->buf
.buf
;
4609 find_unique_abbrev_r(p
, oid
, default_abbrev
);
4612 * We may need to extend the abbreviated hash so that there is
4613 * no conflicting label.
4615 if (hashmap_get_from_hash(&state
->labels
, strihash(p
), p
)) {
4616 size_t i
= strlen(p
) + 1;
4618 oid_to_hex_r(p
, oid
);
4619 for (; i
< the_hash_algo
->hexsz
; i
++) {
4622 if (!hashmap_get_from_hash(&state
->labels
,
4629 struct strbuf
*buf
= &state
->buf
;
4632 * Sanitize labels by replacing non-alpha-numeric characters
4633 * (including white-space ones) by dashes, as they might be
4634 * illegal in file names (and hence in ref names).
4636 * Note that we retain non-ASCII UTF-8 characters (identified
4637 * via the most significant bit). They should be all acceptable
4638 * in file names. We do not validate the UTF-8 here, that's not
4639 * the job of this function.
4641 for (; *label
; label
++)
4642 if ((*label
& 0x80) || isalnum(*label
))
4643 strbuf_addch(buf
, *label
);
4644 /* avoid leading dash and double-dashes */
4645 else if (buf
->len
&& buf
->buf
[buf
->len
- 1] != '-')
4646 strbuf_addch(buf
, '-');
4648 strbuf_addstr(buf
, "rev-");
4649 strbuf_add_unique_abbrev(buf
, oid
, default_abbrev
);
4653 if ((buf
->len
== the_hash_algo
->hexsz
&&
4654 !get_oid_hex(label
, &dummy
)) ||
4655 (buf
->len
== 1 && *label
== '#') ||
4656 hashmap_get_from_hash(&state
->labels
,
4657 strihash(label
), label
)) {
4659 * If the label already exists, or if the label is a
4660 * valid full OID, or the label is a '#' (which we use
4661 * as a separator between merge heads and oneline), we
4662 * append a dash and a number to make it unique.
4664 size_t len
= buf
->len
;
4666 for (i
= 2; ; i
++) {
4667 strbuf_setlen(buf
, len
);
4668 strbuf_addf(buf
, "-%d", i
);
4669 if (!hashmap_get_from_hash(&state
->labels
,
4679 FLEX_ALLOC_STR(labels_entry
, label
, label
);
4680 hashmap_entry_init(&labels_entry
->entry
, strihash(label
));
4681 hashmap_add(&state
->labels
, &labels_entry
->entry
);
4683 FLEX_ALLOC_STR(string_entry
, string
, label
);
4684 oidcpy(&string_entry
->entry
.oid
, oid
);
4685 oidmap_put(&state
->commit2label
, string_entry
);
4687 return string_entry
->string
;
4690 static int make_script_with_merges(struct pretty_print_context
*pp
,
4691 struct rev_info
*revs
, struct strbuf
*out
,
4694 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
4695 int rebase_cousins
= flags
& TODO_LIST_REBASE_COUSINS
;
4696 int root_with_onto
= flags
& TODO_LIST_ROOT_WITH_ONTO
;
4697 struct strbuf buf
= STRBUF_INIT
, oneline
= STRBUF_INIT
;
4698 struct strbuf label
= STRBUF_INIT
;
4699 struct commit_list
*commits
= NULL
, **tail
= &commits
, *iter
;
4700 struct commit_list
*tips
= NULL
, **tips_tail
= &tips
;
4701 struct commit
*commit
;
4702 struct oidmap commit2todo
= OIDMAP_INIT
;
4703 struct string_entry
*entry
;
4704 struct oidset interesting
= OIDSET_INIT
, child_seen
= OIDSET_INIT
,
4705 shown
= OIDSET_INIT
;
4706 struct label_state state
= { OIDMAP_INIT
, { NULL
}, STRBUF_INIT
};
4708 int abbr
= flags
& TODO_LIST_ABBREVIATE_CMDS
;
4709 const char *cmd_pick
= abbr
? "p" : "pick",
4710 *cmd_label
= abbr
? "l" : "label",
4711 *cmd_reset
= abbr
? "t" : "reset",
4712 *cmd_merge
= abbr
? "m" : "merge";
4714 oidmap_init(&commit2todo
, 0);
4715 oidmap_init(&state
.commit2label
, 0);
4716 hashmap_init(&state
.labels
, labels_cmp
, NULL
, 0);
4717 strbuf_init(&state
.buf
, 32);
4719 if (revs
->cmdline
.nr
&& (revs
->cmdline
.rev
[0].flags
& BOTTOM
)) {
4720 struct labels_entry
*onto_label_entry
;
4721 struct object_id
*oid
= &revs
->cmdline
.rev
[0].item
->oid
;
4722 FLEX_ALLOC_STR(entry
, string
, "onto");
4723 oidcpy(&entry
->entry
.oid
, oid
);
4724 oidmap_put(&state
.commit2label
, entry
);
4726 FLEX_ALLOC_STR(onto_label_entry
, label
, "onto");
4727 hashmap_entry_init(&onto_label_entry
->entry
, strihash("onto"));
4728 hashmap_add(&state
.labels
, &onto_label_entry
->entry
);
4733 * - get onelines for all commits
4734 * - gather all branch tips (i.e. 2nd or later parents of merges)
4735 * - label all branch tips
4737 while ((commit
= get_revision(revs
))) {
4738 struct commit_list
*to_merge
;
4739 const char *p1
, *p2
;
4740 struct object_id
*oid
;
4743 tail
= &commit_list_insert(commit
, tail
)->next
;
4744 oidset_insert(&interesting
, &commit
->object
.oid
);
4746 is_empty
= is_original_commit_empty(commit
);
4747 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
))
4750 strbuf_reset(&oneline
);
4751 pretty_print_commit(pp
, commit
, &oneline
);
4753 to_merge
= commit
->parents
? commit
->parents
->next
: NULL
;
4755 /* non-merge commit: easy case */
4757 if (!keep_empty
&& is_empty
)
4758 strbuf_addf(&buf
, "%c ", comment_line_char
);
4759 strbuf_addf(&buf
, "%s %s %s", cmd_pick
,
4760 oid_to_hex(&commit
->object
.oid
),
4763 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
4764 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
4765 oidmap_put(&commit2todo
, entry
);
4770 /* Create a label */
4771 strbuf_reset(&label
);
4772 if (skip_prefix(oneline
.buf
, "Merge ", &p1
) &&
4773 (p1
= strchr(p1
, '\'')) &&
4774 (p2
= strchr(++p1
, '\'')))
4775 strbuf_add(&label
, p1
, p2
- p1
);
4776 else if (skip_prefix(oneline
.buf
, "Merge pull request ",
4778 (p1
= strstr(p1
, " from ")))
4779 strbuf_addstr(&label
, p1
+ strlen(" from "));
4781 strbuf_addbuf(&label
, &oneline
);
4784 strbuf_addf(&buf
, "%s -C %s",
4785 cmd_merge
, oid_to_hex(&commit
->object
.oid
));
4787 /* label the tips of merged branches */
4788 for (; to_merge
; to_merge
= to_merge
->next
) {
4789 oid
= &to_merge
->item
->object
.oid
;
4790 strbuf_addch(&buf
, ' ');
4792 if (!oidset_contains(&interesting
, oid
)) {
4793 strbuf_addstr(&buf
, label_oid(oid
, NULL
,
4798 tips_tail
= &commit_list_insert(to_merge
->item
,
4801 strbuf_addstr(&buf
, label_oid(oid
, label
.buf
, &state
));
4803 strbuf_addf(&buf
, " # %s", oneline
.buf
);
4805 FLEX_ALLOC_STR(entry
, string
, buf
.buf
);
4806 oidcpy(&entry
->entry
.oid
, &commit
->object
.oid
);
4807 oidmap_put(&commit2todo
, entry
);
4812 * - label branch points
4813 * - add HEAD to the branch tips
4815 for (iter
= commits
; iter
; iter
= iter
->next
) {
4816 struct commit_list
*parent
= iter
->item
->parents
;
4817 for (; parent
; parent
= parent
->next
) {
4818 struct object_id
*oid
= &parent
->item
->object
.oid
;
4819 if (!oidset_contains(&interesting
, oid
))
4821 if (oidset_insert(&child_seen
, oid
))
4822 label_oid(oid
, "branch-point", &state
);
4825 /* Add HEAD as implicit "tip of branch" */
4827 tips_tail
= &commit_list_insert(iter
->item
,
4832 * Third phase: output the todo list. This is a bit tricky, as we
4833 * want to avoid jumping back and forth between revisions. To
4834 * accomplish that goal, we walk backwards from the branch tips,
4835 * gathering commits not yet shown, reversing the list on the fly,
4836 * then outputting that list (labeling revisions as needed).
4838 strbuf_addf(out
, "%s onto\n", cmd_label
);
4839 for (iter
= tips
; iter
; iter
= iter
->next
) {
4840 struct commit_list
*list
= NULL
, *iter2
;
4842 commit
= iter
->item
;
4843 if (oidset_contains(&shown
, &commit
->object
.oid
))
4845 entry
= oidmap_get(&state
.commit2label
, &commit
->object
.oid
);
4848 strbuf_addf(out
, "\n%c Branch %s\n", comment_line_char
, entry
->string
);
4850 strbuf_addch(out
, '\n');
4852 while (oidset_contains(&interesting
, &commit
->object
.oid
) &&
4853 !oidset_contains(&shown
, &commit
->object
.oid
)) {
4854 commit_list_insert(commit
, &list
);
4855 if (!commit
->parents
) {
4859 commit
= commit
->parents
->item
;
4863 strbuf_addf(out
, "%s %s\n", cmd_reset
,
4864 rebase_cousins
|| root_with_onto
?
4865 "onto" : "[new root]");
4867 const char *to
= NULL
;
4869 entry
= oidmap_get(&state
.commit2label
,
4870 &commit
->object
.oid
);
4873 else if (!rebase_cousins
)
4874 to
= label_oid(&commit
->object
.oid
, NULL
,
4877 if (!to
|| !strcmp(to
, "onto"))
4878 strbuf_addf(out
, "%s onto\n", cmd_reset
);
4880 strbuf_reset(&oneline
);
4881 pretty_print_commit(pp
, commit
, &oneline
);
4882 strbuf_addf(out
, "%s %s # %s\n",
4883 cmd_reset
, to
, oneline
.buf
);
4887 for (iter2
= list
; iter2
; iter2
= iter2
->next
) {
4888 struct object_id
*oid
= &iter2
->item
->object
.oid
;
4889 entry
= oidmap_get(&commit2todo
, oid
);
4890 /* only show if not already upstream */
4892 strbuf_addf(out
, "%s\n", entry
->string
);
4893 entry
= oidmap_get(&state
.commit2label
, oid
);
4895 strbuf_addf(out
, "%s %s\n",
4896 cmd_label
, entry
->string
);
4897 oidset_insert(&shown
, oid
);
4900 free_commit_list(list
);
4903 free_commit_list(commits
);
4904 free_commit_list(tips
);
4906 strbuf_release(&label
);
4907 strbuf_release(&oneline
);
4908 strbuf_release(&buf
);
4910 oidmap_free(&commit2todo
, 1);
4911 oidmap_free(&state
.commit2label
, 1);
4912 hashmap_free_entries(&state
.labels
, struct labels_entry
, entry
);
4913 strbuf_release(&state
.buf
);
4918 int sequencer_make_script(struct repository
*r
, struct strbuf
*out
, int argc
,
4919 const char **argv
, unsigned flags
)
4921 char *format
= NULL
;
4922 struct pretty_print_context pp
= {0};
4923 struct rev_info revs
;
4924 struct commit
*commit
;
4925 int keep_empty
= flags
& TODO_LIST_KEEP_EMPTY
;
4926 const char *insn
= flags
& TODO_LIST_ABBREVIATE_CMDS
? "p" : "pick";
4927 int rebase_merges
= flags
& TODO_LIST_REBASE_MERGES
;
4929 repo_init_revisions(r
, &revs
, NULL
);
4930 revs
.verbose_header
= 1;
4932 revs
.max_parents
= 1;
4933 revs
.cherry_mark
= 1;
4936 revs
.right_only
= 1;
4937 revs
.sort_order
= REV_SORT_IN_GRAPH_ORDER
;
4938 revs
.topo_order
= 1;
4940 revs
.pretty_given
= 1;
4941 git_config_get_string("rebase.instructionFormat", &format
);
4942 if (!format
|| !*format
) {
4944 format
= xstrdup("%s");
4946 get_commit_format(format
, &revs
);
4948 pp
.fmt
= revs
.commit_format
;
4949 pp
.output_encoding
= get_log_output_encoding();
4951 if (setup_revisions(argc
, argv
, &revs
, NULL
) > 1)
4952 return error(_("make_script: unhandled options"));
4954 if (prepare_revision_walk(&revs
) < 0)
4955 return error(_("make_script: error preparing revisions"));
4958 return make_script_with_merges(&pp
, &revs
, out
, flags
);
4960 while ((commit
= get_revision(&revs
))) {
4961 int is_empty
= is_original_commit_empty(commit
);
4963 if (!is_empty
&& (commit
->object
.flags
& PATCHSAME
))
4965 if (!keep_empty
&& is_empty
)
4966 strbuf_addf(out
, "%c ", comment_line_char
);
4967 strbuf_addf(out
, "%s %s ", insn
,
4968 oid_to_hex(&commit
->object
.oid
));
4969 pretty_print_commit(&pp
, commit
, out
);
4970 strbuf_addch(out
, '\n');
4976 * Add commands after pick and (series of) squash/fixup commands
4979 void todo_list_add_exec_commands(struct todo_list
*todo_list
,
4980 struct string_list
*commands
)
4982 struct strbuf
*buf
= &todo_list
->buf
;
4983 size_t base_offset
= buf
->len
;
4984 int i
, insert
, nr
= 0, alloc
= 0;
4985 struct todo_item
*items
= NULL
, *base_items
= NULL
;
4987 base_items
= xcalloc(commands
->nr
, sizeof(struct todo_item
));
4988 for (i
= 0; i
< commands
->nr
; i
++) {
4989 size_t command_len
= strlen(commands
->items
[i
].string
);
4991 strbuf_addstr(buf
, commands
->items
[i
].string
);
4992 strbuf_addch(buf
, '\n');
4994 base_items
[i
].command
= TODO_EXEC
;
4995 base_items
[i
].offset_in_buf
= base_offset
;
4996 base_items
[i
].arg_offset
= base_offset
+ strlen("exec ");
4997 base_items
[i
].arg_len
= command_len
- strlen("exec ");
4999 base_offset
+= command_len
+ 1;
5003 * Insert <commands> after every pick. Here, fixup/squash chains
5004 * are considered part of the pick, so we insert the commands *after*
5005 * those chains if there are any.
5007 * As we insert the exec commands immediately after rearranging
5008 * any fixups and before the user edits the list, a fixup chain
5009 * can never contain comments (any comments are empty picks that
5010 * have been commented out because the user did not specify
5011 * --keep-empty). So, it is safe to insert an exec command
5012 * without looking at the command following a comment.
5015 for (i
= 0; i
< todo_list
->nr
; i
++) {
5016 enum todo_command command
= todo_list
->items
[i
].command
;
5017 if (insert
&& !is_fixup(command
)) {
5018 ALLOC_GROW(items
, nr
+ commands
->nr
, alloc
);
5019 COPY_ARRAY(items
+ nr
, base_items
, commands
->nr
);
5025 ALLOC_GROW(items
, nr
+ 1, alloc
);
5026 items
[nr
++] = todo_list
->items
[i
];
5028 if (command
== TODO_PICK
|| command
== TODO_MERGE
)
5032 /* insert or append final <commands> */
5033 if (insert
|| nr
== todo_list
->nr
) {
5034 ALLOC_GROW(items
, nr
+ commands
->nr
, alloc
);
5035 COPY_ARRAY(items
+ nr
, base_items
, commands
->nr
);
5040 FREE_AND_NULL(todo_list
->items
);
5041 todo_list
->items
= items
;
5043 todo_list
->alloc
= alloc
;
5046 static void todo_list_to_strbuf(struct repository
*r
, struct todo_list
*todo_list
,
5047 struct strbuf
*buf
, int num
, unsigned flags
)
5049 struct todo_item
*item
;
5050 int i
, max
= todo_list
->nr
;
5052 if (num
> 0 && num
< max
)
5055 for (item
= todo_list
->items
, i
= 0; i
< max
; i
++, item
++) {
5056 /* if the item is not a command write it and continue */
5057 if (item
->command
>= TODO_COMMENT
) {
5058 strbuf_addf(buf
, "%.*s\n", item
->arg_len
,
5059 todo_item_get_arg(todo_list
, item
));
5063 /* add command to the buffer */
5064 if (flags
& TODO_LIST_ABBREVIATE_CMDS
)
5065 strbuf_addch(buf
, command_to_char(item
->command
));
5067 strbuf_addstr(buf
, command_to_string(item
->command
));
5071 const char *oid
= flags
& TODO_LIST_SHORTEN_IDS
?
5072 short_commit_name(item
->commit
) :
5073 oid_to_hex(&item
->commit
->object
.oid
);
5075 if (item
->command
== TODO_MERGE
) {
5076 if (item
->flags
& TODO_EDIT_MERGE_MSG
)
5077 strbuf_addstr(buf
, " -c");
5079 strbuf_addstr(buf
, " -C");
5082 strbuf_addf(buf
, " %s", oid
);
5085 /* add all the rest */
5087 strbuf_addch(buf
, '\n');
5089 strbuf_addf(buf
, " %.*s\n", item
->arg_len
,
5090 todo_item_get_arg(todo_list
, item
));
5094 int todo_list_write_to_file(struct repository
*r
, struct todo_list
*todo_list
,
5095 const char *file
, const char *shortrevisions
,
5096 const char *shortonto
, int num
, unsigned flags
)
5099 struct strbuf buf
= STRBUF_INIT
;
5101 todo_list_to_strbuf(r
, todo_list
, &buf
, num
, flags
);
5102 if (flags
& TODO_LIST_APPEND_TODO_HELP
)
5103 append_todo_help(flags
& TODO_LIST_KEEP_EMPTY
, count_commands(todo_list
),
5104 shortrevisions
, shortonto
, &buf
);
5106 res
= write_message(buf
.buf
, buf
.len
, file
, 0);
5107 strbuf_release(&buf
);
5112 static const char edit_todo_list_advice
[] =
5113 N_("You can fix this with 'git rebase --edit-todo' "
5114 "and then run 'git rebase --continue'.\n"
5115 "Or you can abort the rebase with 'git rebase"
5118 int check_todo_list_from_file(struct repository
*r
)
5120 struct todo_list old_todo
= TODO_LIST_INIT
, new_todo
= TODO_LIST_INIT
;
5123 if (strbuf_read_file_or_whine(&new_todo
.buf
, rebase_path_todo()) < 0) {
5128 if (strbuf_read_file_or_whine(&old_todo
.buf
, rebase_path_todo_backup()) < 0) {
5133 res
= todo_list_parse_insn_buffer(r
, old_todo
.buf
.buf
, &old_todo
);
5135 res
= todo_list_parse_insn_buffer(r
, new_todo
.buf
.buf
, &new_todo
);
5137 res
= todo_list_check(&old_todo
, &new_todo
);
5139 fprintf(stderr
, _(edit_todo_list_advice
));
5141 todo_list_release(&old_todo
);
5142 todo_list_release(&new_todo
);
5147 /* skip picking commits whose parents are unchanged */
5148 static int skip_unnecessary_picks(struct repository
*r
,
5149 struct todo_list
*todo_list
,
5150 struct object_id
*base_oid
)
5152 struct object_id
*parent_oid
;
5155 for (i
= 0; i
< todo_list
->nr
; i
++) {
5156 struct todo_item
*item
= todo_list
->items
+ i
;
5158 if (item
->command
>= TODO_NOOP
)
5160 if (item
->command
!= TODO_PICK
)
5162 if (parse_commit(item
->commit
)) {
5163 return error(_("could not parse commit '%s'"),
5164 oid_to_hex(&item
->commit
->object
.oid
));
5166 if (!item
->commit
->parents
)
5167 break; /* root commit */
5168 if (item
->commit
->parents
->next
)
5169 break; /* merge commit */
5170 parent_oid
= &item
->commit
->parents
->item
->object
.oid
;
5171 if (!oideq(parent_oid
, base_oid
))
5173 oidcpy(base_oid
, &item
->commit
->object
.oid
);
5176 const char *done_path
= rebase_path_done();
5178 if (todo_list_write_to_file(r
, todo_list
, done_path
, NULL
, NULL
, i
, 0)) {
5179 error_errno(_("could not write to '%s'"), done_path
);
5183 MOVE_ARRAY(todo_list
->items
, todo_list
->items
+ i
, todo_list
->nr
- i
);
5185 todo_list
->current
= 0;
5186 todo_list
->done_nr
+= i
;
5188 if (is_fixup(peek_command(todo_list
, 0)))
5189 record_in_rewritten(base_oid
, peek_command(todo_list
, 0));
5195 int complete_action(struct repository
*r
, struct replay_opts
*opts
, unsigned flags
,
5196 const char *shortrevisions
, const char *onto_name
,
5197 struct commit
*onto
, const char *orig_head
,
5198 struct string_list
*commands
, unsigned autosquash
,
5199 struct todo_list
*todo_list
)
5201 const char *shortonto
, *todo_file
= rebase_path_todo();
5202 struct todo_list new_todo
= TODO_LIST_INIT
;
5203 struct strbuf
*buf
= &todo_list
->buf
;
5204 struct object_id oid
= onto
->object
.oid
;
5207 shortonto
= find_unique_abbrev(&oid
, DEFAULT_ABBREV
);
5209 if (buf
->len
== 0) {
5210 struct todo_item
*item
= append_new_todo(todo_list
);
5211 item
->command
= TODO_NOOP
;
5212 item
->commit
= NULL
;
5213 item
->arg_len
= item
->arg_offset
= item
->flags
= item
->offset_in_buf
= 0;
5216 if (autosquash
&& todo_list_rearrange_squash(todo_list
))
5220 todo_list_add_exec_commands(todo_list
, commands
);
5222 if (count_commands(todo_list
) == 0) {
5223 apply_autostash(opts
);
5224 sequencer_remove_state(opts
);
5226 return error(_("nothing to do"));
5229 res
= edit_todo_list(r
, todo_list
, &new_todo
, shortrevisions
,
5233 else if (res
== -2) {
5234 apply_autostash(opts
);
5235 sequencer_remove_state(opts
);
5238 } else if (res
== -3) {
5239 apply_autostash(opts
);
5240 sequencer_remove_state(opts
);
5241 todo_list_release(&new_todo
);
5243 return error(_("nothing to do"));
5246 if (todo_list_parse_insn_buffer(r
, new_todo
.buf
.buf
, &new_todo
) ||
5247 todo_list_check(todo_list
, &new_todo
)) {
5248 fprintf(stderr
, _(edit_todo_list_advice
));
5249 checkout_onto(r
, opts
, onto_name
, &onto
->object
.oid
, orig_head
);
5250 todo_list_release(&new_todo
);
5255 if (opts
->allow_ff
&& skip_unnecessary_picks(r
, &new_todo
, &oid
)) {
5256 todo_list_release(&new_todo
);
5257 return error(_("could not skip unnecessary pick commands"));
5260 if (todo_list_write_to_file(r
, &new_todo
, todo_file
, NULL
, NULL
, -1,
5261 flags
& ~(TODO_LIST_SHORTEN_IDS
))) {
5262 todo_list_release(&new_todo
);
5263 return error_errno(_("could not write '%s'"), todo_file
);
5268 if (checkout_onto(r
, opts
, onto_name
, &oid
, orig_head
))
5271 if (require_clean_work_tree(r
, "rebase", "", 1, 1))
5274 todo_list_write_total_nr(&new_todo
);
5275 res
= pick_commits(r
, &new_todo
, opts
);
5278 todo_list_release(&new_todo
);
5283 struct subject2item_entry
{
5284 struct hashmap_entry entry
;
5286 char subject
[FLEX_ARRAY
];
5289 static int subject2item_cmp(const void *fndata
,
5290 const struct hashmap_entry
*eptr
,
5291 const struct hashmap_entry
*entry_or_key
,
5294 const struct subject2item_entry
*a
, *b
;
5296 a
= container_of(eptr
, const struct subject2item_entry
, entry
);
5297 b
= container_of(entry_or_key
, const struct subject2item_entry
, entry
);
5299 return key
? strcmp(a
->subject
, key
) : strcmp(a
->subject
, b
->subject
);
5302 define_commit_slab(commit_todo_item
, struct todo_item
*);
5305 * Rearrange the todo list that has both "pick commit-id msg" and "pick
5306 * commit-id fixup!/squash! msg" in it so that the latter is put immediately
5307 * after the former, and change "pick" to "fixup"/"squash".
5309 * Note that if the config has specified a custom instruction format, each log
5310 * message will have to be retrieved from the commit (as the oneline in the
5311 * script cannot be trusted) in order to normalize the autosquash arrangement.
5313 int todo_list_rearrange_squash(struct todo_list
*todo_list
)
5315 struct hashmap subject2item
;
5316 int rearranged
= 0, *next
, *tail
, i
, nr
= 0, alloc
= 0;
5318 struct commit_todo_item commit_todo
;
5319 struct todo_item
*items
= NULL
;
5321 init_commit_todo_item(&commit_todo
);
5323 * The hashmap maps onelines to the respective todo list index.
5325 * If any items need to be rearranged, the next[i] value will indicate
5326 * which item was moved directly after the i'th.
5328 * In that case, last[i] will indicate the index of the latest item to
5329 * be moved to appear after the i'th.
5331 hashmap_init(&subject2item
, subject2item_cmp
, NULL
, todo_list
->nr
);
5332 ALLOC_ARRAY(next
, todo_list
->nr
);
5333 ALLOC_ARRAY(tail
, todo_list
->nr
);
5334 ALLOC_ARRAY(subjects
, todo_list
->nr
);
5335 for (i
= 0; i
< todo_list
->nr
; i
++) {
5336 struct strbuf buf
= STRBUF_INIT
;
5337 struct todo_item
*item
= todo_list
->items
+ i
;
5338 const char *commit_buffer
, *subject
, *p
;
5341 struct subject2item_entry
*entry
;
5343 next
[i
] = tail
[i
] = -1;
5344 if (!item
->commit
|| item
->command
== TODO_DROP
) {
5349 if (is_fixup(item
->command
)) {
5350 clear_commit_todo_item(&commit_todo
);
5351 return error(_("the script was already rearranged."));
5354 *commit_todo_item_at(&commit_todo
, item
->commit
) = item
;
5356 parse_commit(item
->commit
);
5357 commit_buffer
= logmsg_reencode(item
->commit
, NULL
, "UTF-8");
5358 find_commit_subject(commit_buffer
, &subject
);
5359 format_subject(&buf
, subject
, " ");
5360 subject
= subjects
[i
] = strbuf_detach(&buf
, &subject_len
);
5361 unuse_commit_buffer(item
->commit
, commit_buffer
);
5362 if ((skip_prefix(subject
, "fixup! ", &p
) ||
5363 skip_prefix(subject
, "squash! ", &p
))) {
5364 struct commit
*commit2
;
5369 if (!skip_prefix(p
, "fixup! ", &p
) &&
5370 !skip_prefix(p
, "squash! ", &p
))
5374 entry
= hashmap_get_entry_from_hash(&subject2item
,
5376 struct subject2item_entry
,
5379 /* found by title */
5381 else if (!strchr(p
, ' ') &&
5383 lookup_commit_reference_by_name(p
)) &&
5384 *commit_todo_item_at(&commit_todo
, commit2
))
5385 /* found by commit name */
5386 i2
= *commit_todo_item_at(&commit_todo
, commit2
)
5389 /* copy can be a prefix of the commit subject */
5390 for (i2
= 0; i2
< i
; i2
++)
5392 starts_with(subjects
[i2
], p
))
5400 todo_list
->items
[i
].command
=
5401 starts_with(subject
, "fixup!") ?
5402 TODO_FIXUP
: TODO_SQUASH
;
5408 } else if (!hashmap_get_from_hash(&subject2item
,
5409 strhash(subject
), subject
)) {
5410 FLEX_ALLOC_MEM(entry
, subject
, subject
, subject_len
);
5412 hashmap_entry_init(&entry
->entry
,
5413 strhash(entry
->subject
));
5414 hashmap_put(&subject2item
, &entry
->entry
);
5419 for (i
= 0; i
< todo_list
->nr
; i
++) {
5420 enum todo_command command
= todo_list
->items
[i
].command
;
5424 * Initially, all commands are 'pick's. If it is a
5425 * fixup or a squash now, we have rearranged it.
5427 if (is_fixup(command
))
5431 ALLOC_GROW(items
, nr
+ 1, alloc
);
5432 items
[nr
++] = todo_list
->items
[cur
];
5437 FREE_AND_NULL(todo_list
->items
);
5438 todo_list
->items
= items
;
5440 todo_list
->alloc
= alloc
;
5445 for (i
= 0; i
< todo_list
->nr
; i
++)
5448 hashmap_free_entries(&subject2item
, struct subject2item_entry
, entry
);
5450 clear_commit_todo_item(&commit_todo
);