1# This shell script fragment is sourced by git-rebase to implement 2# its merge-based non-interactive mode that copes well with renamed 3# files. 4# 5# Copyright (c) 2010 Junio C Hamano. 6# 7 8prec=4 9 10read_state () { 11 onto_name=$(cat"$state_dir"/onto_name) && 12 end=$(cat"$state_dir"/end) && 13 msgnum=$(cat"$state_dir"/msgnum) 14} 15 16continue_merge () { 17test -d"$state_dir"|| die "$state_dirdirectory does not exist" 18 19 unmerged=$(git ls-files -u) 20iftest -n"$unmerged" 21then 22echo"You still have unmerged paths in your index" 23echo"did you forget to use git add?" 24 die "$resolvemsg" 25fi 26 27 cmt=$(cat"$state_dir/current") 28if! git diff-index --quiet --ignore-submodules HEAD -- 29then 30if! git commit ${gpg_sign_opt:+"$gpg_sign_opt"}--no-verify -C"$cmt" 31then 32echo"Commit failed, please do not call\"git commit\"" 33echo"directly, but instead do one of the following: " 34 die "$resolvemsg" 35fi 36iftest -z"$GIT_QUIET" 37then 38printf"Committed: %0${prec}d "$msgnum 39fi 40echo"$cmt$(git rev-parse HEAD^0)">>"$state_dir/rewritten" 41else 42iftest -z"$GIT_QUIET" 43then 44printf"Already applied: %0${prec}d "$msgnum 45fi 46fi 47test -z"$GIT_QUIET"&& 48 GIT_PAGER='' git log --format=%s -1"$cmt" 49 50# onto the next patch: 51 msgnum=$(($msgnum+1)) 52echo"$msgnum">"$state_dir/msgnum" 53} 54 55call_merge () { 56 msgnum="$1" 57echo"$msgnum">"$state_dir/msgnum" 58 cmt="$(cat "$state_dir/cmt.$msgnum")" 59echo"$cmt">"$state_dir/current" 60 hd=$(git rev-parse --verify HEAD) 61 cmt_name=$(git symbolic-ref HEAD 2> /dev/null ||echo HEAD) 62eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end-$msgnum))"' 63eval GITHEAD_$hd='$onto_name' 64export GITHEAD_$cmt GITHEAD_$hd 65iftest -n"$GIT_QUIET" 66then 67 GIT_MERGE_VERBOSITY=1&&export GIT_MERGE_VERBOSITY 68fi 69test -z"$strategy"&& strategy=recursive 70eval'git-merge-$strategy'$strategy_opts'"$cmt^" -- "$hd" "$cmt"' 71 rv=$? 72case"$rv"in 730) 74unset GITHEAD_$cmt GITHEAD_$hd 75return 76;; 771) 78 git rerere $allow_rerere_autoupdate 79 die "$resolvemsg" 80;; 812) 82echo"Strategy:$strategyfailed, try another"1>&2 83 die "$resolvemsg" 84;; 85*) 86 die "Unknown exit code ($rv) from command:" \ 87"git-merge-$strategy$cmt^ -- HEAD$cmt" 88;; 89esac 90} 91 92finish_rb_merge () { 93 move_to_original_branch 94iftest -s"$state_dir"/rewritten 95then 96 git notes copy --for-rewrite=rebase <"$state_dir"/rewritten 97 hook="$(git rev-parse --git-path hooks/post-rewrite)" 98test -x"$hook"&&"$hook" rebase <"$state_dir"/rewritten 99fi 100 say All done. 101} 102 103# The whole contents of this file is run by dot-sourcing it from 104# inside a shell function. It used to be that "return"s we see 105# below were not inside any function, and expected to return 106# to the function that dot-sourced us. 107# 108# However, FreeBSD /bin/sh misbehaves on such a construct and 109# continues to run the statements that follow such a "return". 110# As a work-around, we introduce an extra layer of a function 111# here, and immediately call it after defining it. 112git_rebase__merge () { 113 114case"$action"in 115continue) 116 read_state 117 continue_merge 118whiletest"$msgnum"-le"$end" 119do 120 call_merge "$msgnum" 121 continue_merge 122done 123 finish_rb_merge 124return 125;; 126skip) 127 read_state 128 git rerere clear 129 msgnum=$(($msgnum+1)) 130whiletest"$msgnum"-le"$end" 131do 132 call_merge "$msgnum" 133 continue_merge 134done 135 finish_rb_merge 136return 137;; 138esac 139 140mkdir-p"$state_dir" 141echo"$onto_name">"$state_dir/onto_name" 142write_basic_state 143 144msgnum=0 145for cmt in $(git rev-list --reverse --no-merges"$revisions") 146do 147 msgnum=$(($msgnum+1)) 148echo"$cmt">"$state_dir/cmt.$msgnum" 149done 150 151echo1>"$state_dir/msgnum" 152echo$msgnum>"$state_dir/end" 153 154end=$msgnum 155msgnum=1 156 157whiletest"$msgnum"-le"$end" 158do 159 call_merge "$msgnum" 160 continue_merge 161done 162 163finish_rb_merge 164 165} 166# ... and then we call the whole thing. 167git_rebase__merge