-#!/bin/bash
-
-LOG_FILE="../merge.log"
-build_host="sprygo"
-build_dir="/scratch/sfr/next"
-build_cmd="bin/build_next"
+#!/bin/sh
no_build=false
-[ "$1" = "-n" ] && {
+if [ "$1" = "-n" ]; then
shift
no_build=true
-}
-
-tree=$1
-ver=$2
+fi
-rev=$(git rev-parse -verify "next-$ver/$tree")
-[ "$rev" ] || {
- echo "No such tree/date" 1>&2
- exit 1
-}
+if [ "$1" ]; then
+ tree=$1
+ shift
+else
+ tree=
+fi
+if [ "$1" ]; then
+ ver="next-${1#next-}"
+ shift
+else
+ ver=$(git tag -l next-\* | sort | tail -n 1)
+fi
-[ -n "$3" ] && build_host="$3"
+tools_dir=$(dirname "$0")
+. "$tools_dir/common.sh"
log()
{
- echo "$@" | tee -a $LOG_FILE
+ echo "$@" | tee -a "$LOG_FILE"
}
execute()
{
- log "$" $@
- $@ 2>&1 | tee -a $LOG_FILE
- return ${PIPESTATUS[0]}
+ log '$' "$@"
+ _out="$( "$@" 2>&1 )"
+ _err=$?
+ echo "$_out" | tee -a "$LOG_FILE"
+ return "$_err"
}
-GIT_EDITOR=: execute git reset --hard 'HEAD^' || {
+line="$(tail -n 1 "$SHA1_FILE")"
+
+# strip everything after the first tab character
+stree=${line%% *}
+if [ "$tree" ]; then
+ if [ "$tree" != "$stree" ]; then
+ echo "That is not the last tree merged ($tree v $stree)" 1>&2
+ exit 1
+ fi
+else
+ tree="$stree"
+fi
+
+rev=$(git show "$ver:Next/SHA1s" | sed -n "s/^$tree\t\t*//p")
+if [ -z "$rev" ]; then
+ echo "No previous tree/date ($tree/$ver)" 1>&2
+ exit 1
+fi
+
+bad_rev=$(git rev-parse --verify 'HEAD^2')
+
+tab="\t"
+if [ "${#tree}" -lt 8 ]; then
+ tab="\t\t"
+fi
+
+# strip evrything up to the last tab character
+srev=${line##* }
+if [ "$bad_rev" != "$srev" ]; then
+ echo "bad last line in $SHA1_FILE" 1>&2
+ exit 1
+fi
+
+if ! execute git reset --hard 'HEAD^'; then
echo "git reset failed" 1>&2
bash -i || exit
-}
+fi
-log Merging "next-$ver/$tree"
-execute git merge "next-$ver/$tree" || {
+log Merging "$ver version of $tree"
+if ! execute git merge -m "$ver/$tree" "$rev"; then
echo Merge failed 1>&2
- bash -i || exit
- GIT_EDITOR=: execute git commit -v -a
+ echo "$ver version of $tree" >>../merge.debug
+ git diff >>../merge.debug 2>&1
+ if git diff 2>&1 | grep -E -q '<<<<<|^\*'; then
+ bash -i || exit
+ fi
+ execute git commit --no-edit -v -a
execute git diff -M --stat --summary 'HEAD^..'
-}
+fi
+if [ -f "../merge-fixes/$tree" ]; then
+ while read -r p <&7; do
+ if ! "$bin_dir/merge_fix" -n "$p"; then
+ bash -i || exit
+ fi 7<&-
+ done 7<"../merge-fixes/$tree"
+fi
-$no_build && exit 0
+sed -i '$d' "$SHA1_FILE"
+printf "%s$tab%s\n" "$tree" "$rev" >>"$SHA1_FILE"
-rsync -avH --exclude .git --delete . "$build_host":"$build_dir"/. || {
- echo Rsync failed 1>&2
+if ! git push -f "${build_host}${build_host:+:}${build_dir}" master:refs/heads/next; then
+ echo git push failed 1>&2
bash -i || exit
-}
+fi
-echo "Building using $build_cmd on $build_host"
-ssh "$build_host" "$build_cmd" || {
+$no_build && exit 0
+
+if ! "$bin_dir/do_build" "$tree"; then
echo Build failed 1>&2
bash -i || exit
-}
+fi
-d=$(date --date "5 hours ago" '+%Y%m%d')
-git update-ref "refs/heads/next-$d/broken/$tree" "refs/heads/next-$d/$tree"
-git update-ref "refs/heads/next-$d/$tree" "refs/heads/next-$ver/$tree"
+printf '%s\n' "$ver" >"$top_dir/old-versions/$tree"
exit 0