#!/bin/bash no_build=false [ "$1" = "-n" ] && { shift no_build=true } 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 . "$(dirname $0)/common.sh" log() { echo "$@" | tee -a $LOG_FILE } execute() { log "$" $@ $@ 2>&1 | tee -a $LOG_FILE return ${PIPESTATUS[0]} } line="$(tail -n 1 $SHA1_FILE)" # strip everything after the first tab character stree=${line%% *} if [ "$tree" ]; then [ "$tree" = "$stree" ] || { echo "That is not the last tree merged ($tree v $stree)" 1>&2 exit 1 } else tree="$stree" fi rev=$(git show ${ver}:Next/SHA1s | sed -n "s/^$tree\t\t*//p") [ "$rev" ] || { echo "No previous tree/date ($tree/$ver)" 1>&2 exit 1 } bad_rev=$(git rev-parse --verify 'HEAD^2') tab="\t" [ $(echo "$tree" | wc -c) -le 8 ] && tab="\t\t" # strip evrything up to the last tab character srev=${line##* } [ "$bad_rev" = "$srev" ] || { echo "bad last line in $SHA1_FILE" 1>&2 exit 1 } GIT_EDITOR=: execute git reset --hard 'HEAD^' || { echo "git reset failed" 1>&2 bash -i || exit } log Merging "$ver version of $tree" execute git merge -m "$ver/$tree" "$rev" || { echo Merge failed 1>&2 echo "$ver version of $tree" >>../merge.debug git diff >>../merge.debug 2>&1 git diff 2>&1 | egrep -q '<<<<<|^\*' && { bash -i || exit } GIT_EDITOR=: execute git commit -v -a execute git diff -M --stat --summary 'HEAD^..' } [ -f "../merge-fixes/$tree" ] && { for p in $(cat "../merge-fixes/$tree"); do $(dirname $0)/merge_fix -n "$p" || { bash -i || exit } done } d=$(date --date "5 hours ago" '+%Y%m%d') sed -i '$d' $SHA1_FILE printf "%s$tab%s\n" $tree $rev >>$SHA1_FILE git push -f "${build_host}${build_host:+:}${build_dir}" master:refs/heads/next || { echo git push failed 1>&2 bash -i || exit } $no_build && exit 0 "$bin_dir/do_build" "$tree" || { echo Build failed 1>&2 bash -i || exit } exit 0