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 33rm-rf"$state_dir" 34 die "$1" 35} 36 37has_action () { 38test -n"$(git stripspace --strip-comments <"$1")" 39} 40 41git_sequence_editor () { 42iftest -z"$GIT_SEQUENCE_EDITOR" 43then 44 GIT_SEQUENCE_EDITOR="$(git config sequence.editor)" 45if[-z"$GIT_SEQUENCE_EDITOR"] 46then 47 GIT_SEQUENCE_EDITOR="$(git var GIT_EDITOR)"||return $? 48fi 49fi 50 51eval"$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 66printf'%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 () { 82case"$1"in 83continue) 84exec git rebase--helper${force_rebase:+--no-ff} $allow_empty_message \ 85--continue 86;; 87 skip) 88 git rerere clear 89exec git rebase--helper${force_rebase:+--no-ff} $allow_empty_message \ 90--continue 91;; 92 edit-todo) 93exec git rebase--helper --edit-todo 94;; 95 show-current-patch) 96exec git show REBASE_HEAD -- 97;; 98*) 99return1# continue 100;; 101esac 102} 103 104init_basic_state () { 105 orig_head=$(git rev-parse --verify HEAD)|| die "$(gettext "No HEAD?")" 106mkdir-p"$state_dir"|| die "$(eval_gettext "Could not create temporary \$state_dir")" 107rm-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) 116iftest -z"$rebase_root" 117# this is now equivalent to ! -z "$upstream" 118then 119 shortupstream=$(git rev-parse --short $upstream) 120 revisions=$upstream...$orig_head 121 shortrevisions=$shortupstream..$shorthead 122else 123 revisions=$onto...$orig_head 124 shortrevisions=$shorthead 125test -z"$squash_onto"|| 126echo"$squash_onto">"$state_dir"/squash-onto 127fi 128} 129 130git_rebase__interactive () { 131 initiate_action "$action" 132 ret=$? 133iftest$ret=0;then 134return0 135fi 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 148exec 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}