| [dcc228] | 1 | #!/bin/bash
 | 
|---|
 | 2 | #
 | 
|---|
 | 3 | # This script checks each commit in a given interval by:
 | 
|---|
 | 4 | # - checking out the commit in a clean manner
 | 
|---|
 | 5 | # - compiling completely (with debug)
 | 
|---|
 | 6 | # - running the testsuite
 | 
|---|
 | 7 | # and rounding all up in a suitable log to tell what if went wrong.
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | # check sufficiently given arguments
 | 
|---|
 | 10 | if [ -z $4 ]; then
 | 
|---|
 | 11 |         echo "Usage: $0 <source repo> <Path where to check> <first commit> <second commit> [...parameters for configure...]"
 | 
|---|
 | 12 |         echo "This will check each of the commits in the inclusive interval [first, second]."
 | 
|---|
 | 13 |         exit 255
 | 
|---|
 | 14 | fi
 | 
|---|
 | 15 | # check source
 | 
|---|
 | 16 | SOURCEDIR=`realpath $1`
 | 
|---|
 | 17 | shift
 | 
|---|
 | 18 | if [ ! $? -eq 0 ]; then
 | 
|---|
 | 19 |         echo "Please install realpath package!"
 | 
|---|
 | 20 |         exit 128
 | 
|---|
 | 21 | fi
 | 
|---|
 | 22 | DIR=$1
 | 
|---|
 | 23 | shift
 | 
|---|
 | 24 | base=$1
 | 
|---|
 | 25 | shift
 | 
|---|
 | 26 | limit=$1
 | 
|---|
 | 27 | shift
 | 
|---|
 | 28 | 
 | 
|---|
 | 29 | # some variables
 | 
|---|
 | 30 | LOG="`pwd`/commitcheck-${base}-${limit}"
 | 
|---|
 | 31 | checkdir="commitchecking"
 | 
|---|
 | 32 | cores=12
 | 
|---|
 | 33 | 
 | 
|---|
 | 34 | # check whether base dir contains valid repo
 | 
|---|
 | 35 | if [ ! -e $SOURCEDIR ]; then
 | 
|---|
 | 36 |         echo "$SOURCEDIR does not exist!"
 | 
|---|
 | 37 |         exit 255
 | 
|---|
 | 38 | fi
 | 
|---|
 | 39 | if [ ! -e $SOURCEDIR/HEAD ]; then
 | 
|---|
 | 40 |         if [ ! -e $SOURCEDIR/.git ]; then
 | 
|---|
 | 41 |                 echo "$SOURCEDIR does not contain a git repository!" | tee -a ${LOG}.log
 | 
|---|
 | 42 |                 exit 255
 | 
|---|
 | 43 |         else
 | 
|---|
 | 44 |                 SOURCEDIR="$SOURCEDIR/.git"
 | 
|---|
 | 45 |         fi
 | 
|---|
 | 46 | fi
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 | # check whether target is empty and create clone of git repo
 | 
|---|
 | 49 | if [ -e $DIR ]; then
 | 
|---|
 | 50 |         echo "Target directory $DIR must not be present!"
 | 
|---|
 | 51 |         exit 255
 | 
|---|
 | 52 | fi
 | 
|---|
 | 53 | echo -e "#Begin of Logfile" >${LOG}.log
 | 
|---|
 | 54 | git clone $SOURCEDIR $DIR | tee -a ${LOG}.log
 | 
|---|
 | 55 | DIR=`realpath $DIR`
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | # we are set go to target dir
 | 
|---|
 | 58 | OLDDIR=`pwd`
 | 
|---|
 | 59 | cd $DIR
 | 
|---|
 | 60 | 
 | 
|---|
 | 61 | # check whether both given commit names are valid
 | 
|---|
 | 62 | test=`git rev-list ${base}..${limit} &>/dev/null`
 | 
|---|
 | 63 | if [ $? -eq 128 ]; then
 | 
|---|
 | 64 |         # try with remote on either side
 | 
|---|
 | 65 |         test=`git rev-list remotes/origin/${base}..${limit} &>/dev/null`
 | 
|---|
 | 66 |         if [ $? -eq 128 ]; then
 | 
|---|
 | 67 |                 test=`git rev-list ${base}..remotes/origin/${limit} &>/dev/null`
 | 
|---|
 | 68 |                 if [ $? -eq 128 ]; then
 | 
|---|
 | 69 |                         test=`git rev-list remotes/origin/${base}..remotes/origin/${limit} &>/dev/null`
 | 
|---|
 | 70 |                         if [ $? -eq 128 ]; then
 | 
|---|
 | 71 |                                 echo "At least one of the given commits ${base} or ${limit} does not exist!" | tee -a ${LOG}.log
 | 
|---|
 | 72 |                                 exit 255
 | 
|---|
 | 73 |                         else
 | 
|---|
 | 74 |                                 echo "Using remotes/origin/${base} instead of ${base} and remotes/origin/${limit} instead of ${limit}"
 | 
|---|
 | 75 |                                 base="remotes/origin/${base}"
 | 
|---|
 | 76 |                                 limit="remotes/origin/${limit}"
 | 
|---|
 | 77 |                         fi
 | 
|---|
 | 78 |                 else
 | 
|---|
 | 79 |                         echo "Using remotes/origin/${limit} instead of ${limit}."
 | 
|---|
 | 80 |                         limit="remotes/origin/${limit}"
 | 
|---|
 | 81 |                 fi
 | 
|---|
 | 82 |         else
 | 
|---|
 | 83 |                 echo "Using remotes/origin/${base} instead of ${base}."
 | 
|---|
 | 84 |                 base="remotes/origin/${base}"
 | 
|---|
 | 85 |         fi
 | 
|---|
 | 86 | fi
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | # calculate the number of commits
 | 
|---|
 | 89 | commitscount=`git rev-list --no-merges ${base}..${limit} | wc -l`
 | 
|---|
 | 90 | if [ $commitscount -eq 0 ]; then
 | 
|---|
 | 91 |         echo "There are no commits to check!" | tee -a ${LOG}.log
 | 
|---|
 | 92 |         echo "Maybe you have given first and second wrong way round?" | tee -a ${LOG}.log
 | 
|---|
 | 93 |         echo "Remember: First has to be older than second." | tee -a ${LOG}.log
 | 
|---|
 | 94 |         exit 1
 | 
|---|
 | 95 | fi
 | 
|---|
 | 96 | # DON't set limit for HEAD~: git starts counting at 0, wc however at 1, but git does not include last commit ${base} in the list!
 | 
|---|
 | 97 | let commitlimit=$commitscount
 | 
|---|
 | 98 | # and check whether it conincides with ${base}
 | 
|---|
 | 99 | basecommitdescribe=`git describe ${base}`
 | 
|---|
 | 100 | topcommitdescribe=`git describe ${limit}`
 | 
|---|
 | 101 | basecommitdescribefromtop=`git describe ${limit}~${commitlimit}`
 | 
|---|
 | 102 | if [ "$basecommitdescribe" != "$basecommitdescribefromtop" ]; then
 | 
|---|
 | 103 |         echo "Something went wrong internally!" | tee -a ${LOG}.log
 | 
|---|
 | 104 |         echo "Compared $basecommitdescribe with $basecommitdescribefromtop ..."
 | 
|---|
 | 105 |         echo "The number of commits calculated in between does not lead to the base commit." | tee -a ${LOG}.log
 | 
|---|
 | 106 |         exit 128
 | 
|---|
 | 107 | fi
 | 
|---|
 | 108 | 
 | 
|---|
 | 109 | # ============== PERFORMING CHECKS ==========================
 | 
|---|
 | 110 | echo "We are checking all commits from ${base} to ${limit}." | tee -a ${LOG}.log
 | 
|---|
 | 111 | echo "Base: ${basecommitdescribe}" | tee -a ${LOG}.log
 | 
|---|
 | 112 | echo -e "Top: ${topcommitdescribe}\n" | tee -a ${LOG}.log
 | 
|---|
 | 113 | # first fast overview without debug, then thorough with debug
 | 
|---|
 | 114 | for debug_option in "--disable-debug" "--enable-debug"; do
 | 
|---|
 | 115 |         i=${commitlimit}
 | 
|---|
 | 116 |         while [ $i -ge 0 ]; do
 | 
|---|
 | 117 |                 let nr=${commitlimit}-$i
 | 
|---|
 | 118 |                 git checkout -f ${limit}~${i}
 | 
|---|
 | 119 |                 ./bootstrap
 | 
|---|
 | 120 |                 rm -rf $checkdir
 | 
|---|
 | 121 |                 mkdir -p $checkdir
 | 
|---|
 | 122 |                 cd $checkdir
 | 
|---|
 | 123 |                 echo "Now testing version `git describe --dirty --always` with $debug_option" &>${LOG}-${nr}.log
 | 
|---|
 | 124 |                 ../configure --prefix=${DIR}/$checkdir ${debug_option} "$@" &>>${LOG}-${nr}.log
 | 
|---|
 | 125 |                 make -k -j${cores} check &>>${LOG}-${nr}.log
 | 
|---|
 | 126 |                 if [ $? -gt 0 ]; then
 | 
|---|
 | 127 |                         echo -e "${nr}: `git describe --dirty --always`, ${debug_option}: FAILED." >>${LOG}.log
 | 
|---|
 | 128 |                 else
 | 
|---|
 | 129 |                         echo -e "${nr}: `git describe --dirty --always`, ${debug_option}: ok." >>${LOG}.log
 | 
|---|
 | 130 |                 fi
 | 
|---|
 | 131 |                 cd ..
 | 
|---|
 | 132 |                 ((i-=1));
 | 
|---|
 | 133 |         done
 | 
|---|
 | 134 | done
 | 
|---|
 | 135 | # =================== DONE =================================
 | 
|---|
 | 136 | 
 | 
|---|
 | 137 | echo -e "#End of Logfile" >>${LOG}.log
 | 
|---|
 | 138 | cd $OLDDIR
 | 
|---|
 | 139 | exit 0
 | 
|---|