| 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
 | 
|---|