You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
3.1 KiB

#!/bin/sh
accept_rerere=t generate=no update= diff=
while case "$#,$1" in 0,*) break;; *,-*) ;; esac
do
case "$1" in
-n) accept_rerere= ;;
-d) update=${2?"diff with what?"}
diff=yes
generate=yes
shift ;;
-u) update=${2?"update what?"}
generate=yes
shift ;;
*) generate=yes
break ;;
esac
shift
done
case "$generate" in
no)
accept_rerere () {
if test -z "$accept_rerere"
then
return 1
fi
if git diff |
grep -e "^.+" -e "^+." |
grep -e "^..<<<<<<<" -e "^..=======" -e "^..>>>>>>>" >/dev/null
then
return 1
else
EDITOR=: git commit -a --no-verify
echo "Accepted previous resolution"
return 0
fi
}
while read branch eh
do
case "$branch" in '#'*) continue ;; esac
case "$eh" in
"")
save=$(git rev-parse --verify HEAD)
echo >&2 "* $branch"
git merge "$branch" || accept_rerere || exit
this=$(git rev-parse --verify HEAD)
if test "$this" = "$save"
then
:
elif git show-ref -q --verify "refs/merge-fix/$branch"
then
echo >&2 "Fixing up the merge"
git cherry-pick --no-commit "refs/merge-fix/$branch" &&
EDITOR=: git commit --amend -a || exit
fi
;;
pick" "*)
echo >&2 "* $eh"
git cherry-pick "$branch" || exit ;;
*) echo >&2 "Eh? $branch $eh"; exit ;;
esac
done
exit
esac
if test -n "$update" && test $# = 0
then
set x $(sed -n -e '2s/^# //p' <"$update") &&
shift
fi
# Generation (or updating)
x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
x40="$x40$x40$x40$x40$x40$x40$x40$x40"
LF='
'
show_merge () {
case "$msg" in
"Merge branch '"*"'"*)
branch=$(expr "$msg" : "Merge branch '\(.*\)'")
merge_hier=heads/
;;
"Merge remote branch '"*"'"*)
branch=$(expr "$msg" : "Merge remote branch '\(.*\)'")
merge_hier=
;;
*)
echo 2>&1 "Huh?: $msg"
return
;;
esac &&
tip=$(git rev-parse --verify "refs/$merge_hier$branch" 2>/dev/null) &&
merged=$(git name-rev --refs="refs/$merge_hier$branch" "$other" 2>/dev/null) &&
merged=$(expr "$merged" : "$x40 \(.*\)") &&
test "$merged" != undefined || {
other=$(git log -1 --pretty='format:%s' $other) &&
merged="$branch :rebased? $other"
}
}
show_pick () {
merged="$(git rev-parse --verify "$commit") pick $msg"
}
generate () {
PROGRAM=$1
shift
echo '#!/bin/sh'
echo "# $1"
echo 'case "$#,$1" in'
echo '1,-u|1,-d)'
echo " exec $PROGRAM" '"$1" "$0"'
echo 'esac'
echo "$PROGRAM" '"$@" <<\EOF'
git log --pretty=oneline --first-parent "$1" |
{
series=
while read commit msg
do
if other=$(git rev-parse -q --verify "$commit^2")
then
show_merge
else
show_pick
fi
if test -z "$series"
then
series="$merged"
else
series="$merged$LF$series"
fi
done
echo "$series"
}
echo EOF
}
if test -z "$update"
then
generate "$0" "$@"
elif test -z "$diff"
then
generate "$0" "$@" | diff -u "$update" -
if test $? = 0
then
echo >&2 "No changes."
else
echo >&2 -n "Update [Y/n]? "
read yesno
case "$yesno" in
[Yy]*)
generate "$0" "$@" |
sed -e 's/ :rebased?.*//' >"$update" ;;
*)
echo >&2 "No update then." ;;
esac
fi
else
generate "$0" "$@" | diff -u "$update" -
fi