1 # This shell script fragment is sourced by git-rebase to implement
2 # its interactive mode. "git rebase --interactive" makes it easy
3 # to fix up commits in the middle of a series and rearrange commits.
5 # Copyright (c) 2006 Johannes E. Schindelin
7 # The original idea comes from Eric W. Biederman, in
8 # https://public-inbox.org/git/m1odwkyuf5.fsf_-_@ebiederm.dsl.xmission.com/
10 # The file containing rebase commands, comments, and empty lines.
11 # This file is created by "git rebase -i" then edited by the user. As
12 # the lines are processed, they are removed from the front of this
13 # file and written to the tail of $done.
14 todo
="$state_dir"/git-rebase-todo
16 GIT_CHERRY_PICK_HELP
="$resolvemsg"
17 export GIT_CHERRY_PICK_HELP
19 # Initiate an action. If the cannot be any
20 # further action it may exec a command
21 # or exit and not return.
23 # TODO: Consider a cleaner return model so it
24 # never exits and always return 0 if process
27 # Parameter 1 is the action to initiate.
29 # Returns 0 if the action was able to complete
30 # and if 1 if further processing is required.
34 exec git rebase--helper
${force_rebase:+--no-ff} $allow_empty_message \
39 exec git rebase--helper
${force_rebase:+--no-ff} $allow_empty_message \
43 exec git rebase--helper
--edit-todo
46 exec git show REBASE_HEAD
--
55 orig_head
=$
(git rev-parse
--verify HEAD
) || die
"$(gettext "No HEAD?
")"
56 mkdir
-p "$state_dir" || die
"$(eval_gettext "Could not create temporary \
$state_dir")"
57 rm -f "$(git rev-parse --git-path REBASE_HEAD)"
59 : > "$state_dir"/interactive || die
"$(gettext "Could not mark as interactive
")"
63 init_revisions_and_shortrevisions
() {
64 shorthead
=$
(git rev-parse
--short $orig_head)
65 shortonto
=$
(git rev-parse
--short $onto)
66 if test -z "$rebase_root"
67 # this is now equivalent to ! -z "$upstream"
69 shortupstream
=$
(git rev-parse
--short $upstream)
70 revisions
=$upstream...
$orig_head
71 shortrevisions
=$shortupstream..
$shorthead
73 revisions
=$onto...
$orig_head
74 shortrevisions
=$shorthead
75 test -z "$squash_onto" ||
76 echo "$squash_onto" >"$state_dir"/squash-onto
80 git_rebase__interactive
() {
81 initiate_action
"$action"
83 if test $ret = 0; then
87 git rebase--helper
--prepare-branch "$switch_to" ${verbose:+--verbose}
90 init_revisions_and_shortrevisions
92 git rebase--helper
--make-script ${keep_empty:+--keep-empty} \
93 ${rebase_merges:+--rebase-merges} \
94 ${rebase_cousins:+--rebase-cousins} \
95 $revisions ${restrict_revision+^$restrict_revision} >"$todo" ||
96 die
"$(gettext "Could not generate todo list
")"
98 exec git rebase--helper
--complete-action "$shortrevisions" "$onto_name" \
99 "$shortonto" "$orig_head" "$cmd" $allow_empty_message \
100 ${autosquash:+--autosquash} ${keep_empty:+--keep-empty} \
101 ${verbose:+--verbose} ${force_rebase:+--no-ff}