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. 4# 5# Copyright (c) 2006 Johannes E. Schindelin 6# 7# The original idea comes from Eric W. Biederman, in 8# https://public-inbox.org/git/m1odwkyuf5.fsf_-_@ebiederm.dsl.xmission.com/ 9# 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. 14todo="$state_dir"/git-rebase-todo 15 16GIT_CHERRY_PICK_HELP="$resolvemsg" 17export GIT_CHERRY_PICK_HELP 18 19comment_char=$(git config --get core.commentchar 2>/dev/null) 20case "$comment_char" in 21'' | auto) 22 comment_char="#" 23 ;; 24?) 25 ;; 26*) 27 comment_char=$(echo "$comment_char" | cut -c1) 28 ;; 29esac 30 31die_abort () { 32 apply_autostash 33 rm -rf "$state_dir" 34 die "$1" 35} 36 37has_action () { 38 test -n "$(git stripspace --strip-comments <"$1")" 39} 40 41git_sequence_editor () { 42 if test -z "$GIT_SEQUENCE_EDITOR" 43 then 44 GIT_SEQUENCE_EDITOR="$(git config sequence.editor)" 45 if [ -z "$GIT_SEQUENCE_EDITOR" ] 46 then 47 GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)" || return $? 48 fi 49 fi 50 51 eval "$GIT_SEQUENCE_EDITOR" '"$@"' 52} 53 54expand_todo_ids() { 55 git rebase--helper --expand-ids 56} 57 58collapse_todo_ids() { 59 git rebase--helper --shorten-ids 60} 61 62get_missing_commit_check_level () { 63 check_level=$(git config --get rebase.missingCommitsCheck) 64 check_level=${check_level:-ignore} 65 # Don't be case sensitive 66 printf '%s' "$check_level" | tr 'A-Z' 'a-z' 67} 68 69# Initiate an action. If the cannot be any 70# further action it may exec a command 71# or exit and not return. 72# 73# TODO: Consider a cleaner return model so it 74# never exits and always return 0 if process 75# is complete. 76# 77# Parameter 1 is the action to initiate. 78# 79# Returns 0 if the action was able to complete 80# and if 1 if further processing is required. 81initiate_action () { 82 case "$1" in 83 continue) 84 exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \ 85 --continue 86 ;; 87 skip) 88 git rerere clear 89 exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \ 90 --continue 91 ;; 92 edit-todo) 93 exec git rebase--helper --edit-todo 94 ;; 95 show-current-patch) 96 exec git show REBASE_HEAD -- 97 ;; 98 *) 99 return 1 # continue 100 ;; 101 esac 102} 103 104init_basic_state () { 105 orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")" 106 mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")" 107 rm -f "$(git rev-parse --git-path REBASE_HEAD)" 108 109 : > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")" 110 write_basic_state 111} 112 113init_revisions_and_shortrevisions () { 114 shorthead=$(git rev-parse --short $orig_head) 115 shortonto=$(git rev-parse --short $onto) 116 if test -z "$rebase_root" 117 # this is now equivalent to ! -z "$upstream" 118 then 119 shortupstream=$(git rev-parse --short $upstream) 120 revisions=$upstream...$orig_head 121 shortrevisions=$shortupstream..$shorthead 122 else 123 revisions=$onto...$orig_head 124 shortrevisions=$shorthead 125 test -z "$squash_onto" || 126 echo "$squash_onto" >"$state_dir"/squash-onto 127 fi 128} 129 130git_rebase__interactive () { 131 initiate_action "$action" 132 ret=$? 133 if test $ret = 0; then 134 return 0 135 fi 136 137 git rebase--helper --prepare-branch "$switch_to" ${verbose:+--verbose} 138 init_basic_state 139 140 init_revisions_and_shortrevisions 141 142 git rebase--helper --make-script ${keep_empty:+--keep-empty} \ 143 ${rebase_merges:+--rebase-merges} \ 144 ${rebase_cousins:+--rebase-cousins} \ 145 $revisions ${restrict_revision+^$restrict_revision} >"$todo" || 146 die "$(gettext "Could not generate todo list")" 147 148 exec git rebase--helper --complete-action "$shortrevisions" "$onto_name" \ 149 "$shortonto" "$orig_head" "$cmd" $allow_empty_message \ 150 ${autosquash:+--autosquash} ${keep_empty:+--keep-empty} \ 151 ${verbose:+--verbose} ${force_rebase:+--no-ff} 152}