Browse Source
"git rebase --merge" as been reimplemented by reusing the internal machinery used for "git rebase -i". * en/rebase-merge-on-sequencer: rebase: implement --merge via the interactive machinery rebase: define linearization ordering and enforce it git-legacy-rebase: simplify unnecessary triply-nested if git-rebase, sequencer: extend --quiet option for the interactive machinery am, rebase--merge: do not overlook --skip'ed commits with post-rewrite t5407: add a test demonstrating how interactive handles --skip differently rebase: fix incompatible options error message rebase: make builtin and legacy script error messages the samemaint

17 changed files with 121 additions and 340 deletions
@ -1,164 +0,0 @@
@@ -1,164 +0,0 @@
|
||||
# This shell script fragment is sourced by git-rebase to implement |
||||
# its merge-based non-interactive mode that copes well with renamed |
||||
# files. |
||||
# |
||||
# Copyright (c) 2010 Junio C Hamano. |
||||
# |
||||
|
||||
prec=4 |
||||
|
||||
read_state () { |
||||
onto_name=$(cat "$state_dir"/onto_name) && |
||||
end=$(cat "$state_dir"/end) && |
||||
msgnum=$(cat "$state_dir"/msgnum) |
||||
} |
||||
|
||||
continue_merge () { |
||||
test -d "$state_dir" || die "$state_dir directory does not exist" |
||||
|
||||
unmerged=$(git ls-files -u) |
||||
if test -n "$unmerged" |
||||
then |
||||
echo "You still have unmerged paths in your index" |
||||
echo "did you forget to use git add?" |
||||
die "$resolvemsg" |
||||
fi |
||||
|
||||
cmt=$(cat "$state_dir/current") |
||||
if ! git diff-index --quiet --ignore-submodules HEAD -- |
||||
then |
||||
if ! git commit ${gpg_sign_opt:+"$gpg_sign_opt"} $signoff $allow_empty_message \ |
||||
--no-verify -C "$cmt" |
||||
then |
||||
echo "Commit failed, please do not call \"git commit\"" |
||||
echo "directly, but instead do one of the following: " |
||||
die "$resolvemsg" |
||||
fi |
||||
if test -z "$GIT_QUIET" |
||||
then |
||||
printf "Committed: %0${prec}d " $msgnum |
||||
fi |
||||
echo "$cmt $(git rev-parse HEAD^0)" >> "$state_dir/rewritten" |
||||
else |
||||
if test -z "$GIT_QUIET" |
||||
then |
||||
printf "Already applied: %0${prec}d " $msgnum |
||||
fi |
||||
fi |
||||
test -z "$GIT_QUIET" && |
||||
GIT_PAGER='' git log --format=%s -1 "$cmt" |
||||
|
||||
# onto the next patch: |
||||
msgnum=$(($msgnum + 1)) |
||||
echo "$msgnum" >"$state_dir/msgnum" |
||||
} |
||||
|
||||
call_merge () { |
||||
msgnum="$1" |
||||
echo "$msgnum" >"$state_dir/msgnum" |
||||
cmt="$(cat "$state_dir/cmt.$msgnum")" |
||||
echo "$cmt" > "$state_dir/current" |
||||
git update-ref REBASE_HEAD "$cmt" |
||||
hd=$(git rev-parse --verify HEAD) |
||||
cmt_name=$(git symbolic-ref HEAD 2> /dev/null || echo HEAD) |
||||
eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"' |
||||
eval GITHEAD_$hd='$onto_name' |
||||
export GITHEAD_$cmt GITHEAD_$hd |
||||
if test -n "$GIT_QUIET" |
||||
then |
||||
GIT_MERGE_VERBOSITY=1 && export GIT_MERGE_VERBOSITY |
||||
fi |
||||
test -z "$strategy" && strategy=recursive |
||||
# If cmt doesn't have a parent, don't include it as a base |
||||
base=$(git rev-parse --verify --quiet $cmt^) |
||||
eval 'git merge-$strategy' $strategy_opts $base ' -- "$hd" "$cmt"' |
||||
rv=$? |
||||
case "$rv" in |
||||
0) |
||||
unset GITHEAD_$cmt GITHEAD_$hd |
||||
return |
||||
;; |
||||
1) |
||||
git rerere $allow_rerere_autoupdate |
||||
die "$resolvemsg" |
||||
;; |
||||
2) |
||||
echo "Strategy: $strategy failed, try another" 1>&2 |
||||
die "$resolvemsg" |
||||
;; |
||||
*) |
||||
die "Unknown exit code ($rv) from command:" \ |
||||
"git merge-$strategy $cmt^ -- HEAD $cmt" |
||||
;; |
||||
esac |
||||
} |
||||
|
||||
finish_rb_merge () { |
||||
move_to_original_branch |
||||
if test -s "$state_dir"/rewritten |
||||
then |
||||
git notes copy --for-rewrite=rebase <"$state_dir"/rewritten |
||||
hook="$(git rev-parse --git-path hooks/post-rewrite)" |
||||
test -x "$hook" && "$hook" rebase <"$state_dir"/rewritten |
||||
fi |
||||
say All done. |
||||
} |
||||
|
||||
git_rebase__merge () { |
||||
|
||||
case "$action" in |
||||
continue) |
||||
read_state |
||||
continue_merge |
||||
while test "$msgnum" -le "$end" |
||||
do |
||||
call_merge "$msgnum" |
||||
continue_merge |
||||
done |
||||
finish_rb_merge |
||||
return |
||||
;; |
||||
skip) |
||||
read_state |
||||
git rerere clear |
||||
msgnum=$(($msgnum + 1)) |
||||
while test "$msgnum" -le "$end" |
||||
do |
||||
call_merge "$msgnum" |
||||
continue_merge |
||||
done |
||||
finish_rb_merge |
||||
return |
||||
;; |
||||
show-current-patch) |
||||
exec git show REBASE_HEAD -- |
||||
;; |
||||
esac |
||||
|
||||
mkdir -p "$state_dir" |
||||
echo "$onto_name" > "$state_dir/onto_name" |
||||
write_basic_state |
||||
rm -f "$(git rev-parse --git-path REBASE_HEAD)" |
||||
|
||||
msgnum=0 |
||||
for cmt in $(git rev-list --reverse --no-merges "$revisions") |
||||
do |
||||
msgnum=$(($msgnum + 1)) |
||||
echo "$cmt" > "$state_dir/cmt.$msgnum" |
||||
done |
||||
|
||||
echo 1 >"$state_dir/msgnum" |
||||
echo $msgnum >"$state_dir/end" |
||||
|
||||
end=$msgnum |
||||
msgnum=1 |
||||
|
||||
while test "$msgnum" -le "$end" |
||||
do |
||||
call_merge "$msgnum" |
||||
continue_merge |
||||
done |
||||
|
||||
finish_rb_merge |
||||
|
||||
} |
Loading…
Reference in new issue