X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=merge_old_version;h=c5975ecc75e5f150b4d86408fdd644021ec199e7;hb=HEAD;hp=117c8ea5b3e2cd6a3f81d7f5d60c0019abbb24dd;hpb=2e06b9fa1987fc605256698a9243fd6f3b50d25b;p=next-scripts diff --git a/merge_old_version b/merge_old_version index 117c8ea..d0d8403 100755 --- a/merge_old_version +++ b/merge_old_version @@ -1,86 +1,113 @@ -#!/bin/bash +#!/bin/sh no_build=false -[ "$1" = "-n" ] && { +if [ "$1" = "-n" ]; then shift no_build=true -} - -tree=$1 -shift -ver=$1 -shift +fi -rev=$(git show next-${ver}:Next/SHA1s | sed -n "s/^$tree\t\t*//p") -[ "$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 -. "$(dirname $0)/common.sh" +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" } +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') -line="$(tail -n 1 $SHA1_FILE)" tab="\t" -[ $(echo "$tree" | wc -c) -le 8 ] && tab="\t\t" -expected=$(printf "%s$tab%s" $tree $bad_rev) -[ "$line" = "$expected" ] || { +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 -GIT_EDITOR=: execute git reset --hard 'HEAD^' || { +if ! execute git reset --hard 'HEAD^'; then echo "git reset failed" 1>&2 bash -i || exit -} +fi log Merging "$ver version of $tree" -execute git merge -m "$ver/$tree" "$rev" || { +if ! execute git merge -m "$ver/$tree" "$rev"; then echo Merge failed 1>&2 echo "$ver version of $tree" >>../merge.debug git diff >>../merge.debug 2>&1 - git diff 2>&1 | egrep -q '<<<<<|^\*' && { + if git diff 2>&1 | grep -E -q '<<<<<|^\*'; then bash -i || exit - } - GIT_EDITOR=: execute git commit -v -a + fi + execute git commit --no-edit -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" || { +fi +if [ -f "../merge-fixes/$tree" ]; then + while read -r p <&7; do + if ! "$bin_dir/merge_fix" -n "$p"; then bash -i || exit - } - done -} - -d=$(date --date "5 hours ago" '+%Y%m%d') + fi 7<&- + done 7<"../merge-fixes/$tree" +fi -sed -i '$d' $SHA1_FILE -printf "%s$tab%s\n" $tree $rev >>$SHA1_FILE - -$no_build && exit 0 +sed -i '$d' "$SHA1_FILE" +printf "%s$tab%s\n" "$tree" "$rev" >>"$SHA1_FILE" -git push -f "$build_host":"$build_dir" master:refs/heads/next || { +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 + +$no_build && exit 0 -"$bin_dir/do_build" || { +if ! "$bin_dir/do_build" "$tree"; then echo Build failed 1>&2 bash -i || exit -} +fi + +printf '%s\n' "$ver" >"$top_dir/old-versions/$tree" exit 0