#!/bin/bash # Run command on every commit within the range specified. If no command is # provided, use the default one to clean and build the whole tree. # # The default rune is rather simple. To do a cross-build, please put your usual # build rune in a shell script and invoke it with this script. # # Set NON_SYMBOLIC_REF=1 if you want to use this script in detached HEAD state. # This is currently used by automated test system. # Colors with ANSI escape sequences txt_info='' txt_err='' txt_clr='' # $GITLAB_CI should be "true" or "false". if [ "$GITLAB_CI" != true ]; then GITLAB_CI=false fi gitlab_log_section() { if $GITLAB_CI; then echo -n "section_$1:$(date +%s):$2 " fi if [ $# -ge 3 ]; then echo "$3" fi } log_section_last= log_section_start() { log_section_last="${1%\[collapsed=true\]}" gitlab_log_section 'start' "$1" "${txt_info}$2${txt_clr}" } log_section_end() { if [ "$log_section_last" ]; then gitlab_log_section 'end' "$log_section_last" log_section_last= fi } if test $# -lt 2 ; then echo "Usage:" echo " $0 [CMD]" echo " If [CMD] is not specified, run the default command" echo " git clean -fdx && ./configure && make -j4" exit 1 fi pushd `git rev-parse --show-toplevel` if ! $GITLAB_CI; then status=`git status -s` if test -n "$status"; then echo "Tree is dirty, aborted" exit 1 fi fi BASE=$1; shift TIP=$1; shift if [[ "_${NON_SYMBOLIC_REF}" != "_1" ]]; then ORIG=`git symbolic-ref -q --short HEAD` if test $? -ne 0; then echo "Detached HEAD, aborted" exit 1 fi else ORIG=`git rev-parse HEAD` fi ret=1 while read num rev; do log_section_start "commit_$rev[collapsed=true]" "Testing #$num $(git log -1 --abbrev=12 --format=tformat:'%h ("%s")' $rev)" git checkout $rev ret=$? if test $ret -ne 0; then log_section_end echo "${txt_err}Failed to checkout $num $rev with $ret${txt_clr}" break fi if test $# -eq 0 ; then git clean -fdx && ./configure && make -j4 elif $GITLAB_CI; then "$@" > "build-$num.log" 2>&1 else "$@" fi ret=$? if test $ret -ne 0; then if $GITLAB_CI; then cat "build-$num.log" fi log_section_end echo "${txt_err}Failed at $num $rev with $ret${txt_clr}" break fi echo log_section_end done < <(git rev-list $BASE..$TIP | nl -ba | tac) echo "Restoring original HEAD" git checkout $ORIG gco_ret=$? if test $gco_ret -ne 0; then echo "Failed to restore orignal HEAD. Check tree status before doing anything else!" exit $gco_ret fi if test $ret -eq 0; then echo "ok." fi exit $ret