163 lines
2.9 KiB
Bash
Executable File
163 lines
2.9 KiB
Bash
Executable File
#!/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
|
|
git cherry-pick --no-commit "refs/merge-fix/$branch" &&
|
|
EDITOR=: git commit --amend -a
|
|
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 '"*"'"*" into "*)
|
|
branch=$(expr "$msg" : "Merge branch '\(.*\)'")
|
|
merge_hier=heads/
|
|
;;
|
|
"Merge remote branch '"*"'"*" into "*)
|
|
branch=$(expr "$msg" : "Merge remote branch '\(.*\)'")
|
|
merge_hier=
|
|
;;
|
|
*)
|
|
echo 2>&1 "Huh?: $msg"
|
|
exit 1
|
|
;;
|
|
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 "$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
|