Tools: add git-regtest.

This is a tool to run regression tests over a whole series of
commits. Typical usage:

  git checkout <topic branch>
  tools/git-regtest experimental

This runs 'make regressiontest' for every single commit between
experimental and HEAD of the topic branch. Very convenient to make
sure not a single commit introduces regressions.

If there are regressions, the tools stops at the commit bringing
in the regression, so you immediately know where to look.
This commit is contained in:
Markus Hitter 2015-07-30 16:32:04 +02:00
parent 5846961744
commit 421fe3d641
1 changed files with 66 additions and 0 deletions

66
tools/git-regtest Executable file
View File

@ -0,0 +1,66 @@
#!/bin/bash
if [ $# -ne 1 -o "$1" = "-h" -o "$1" = "--help" ]; then
echo "Usage: $(basename $0) <start commit>"
echo
echo "Example: $(basename $0) master"
echo
echo "This tool runs a regression test on every single commit since the"
echo "start commit, up to the current commit. Use it to make sure no"
echo "single commit introduces a regression. Can also be used to find out"
echo "which commit introduces the regression. Bisecting is fine for the"
echo "latter goal as well and may be faster, but also requires more thinking"
echo "of the user."
echo
echo "The tool stops as soon as a regression was detected."
echo
echo "IMPORTANT: the command to test for a regression is"
echo
echo " make regressiontest"
echo
echo "... so this command must be available."
echo
echo "Manual equivalent of this tool would be something like this:"
echo
echo " git checkout <current branch>~20"
echo " make regresssiontest"
echo " git checkout <current branch>~19"
echo " make regresssiontest"
echo " git checkout <current branch>~18"
echo " make regresssiontest"
echo " ..."
exit 1
fi
BASE_BRANCH=${1}
CURRENT_BRANCH=$(git status | awk '/^On branch/ { print $3; exit; }
/^HEAD detached/ { print $4; exit; }')
PARENTS=$(git log --oneline --ancestry-path \
${BASE_BRANCH}..${CURRENT_BRANCH} | wc -l)
let PARENTS1=${PARENTS}+1
echo "${PARENTS1} commits to go."
trap "echo -n \"Current commit is \"
git log HEAD^..HEAD | head -5 | tail -1" 0
while [ ${PARENTS} -ge 0 ]; do
echo "Next: ${CURRENT_BRANCH}~${PARENTS}"
sleep 3
# master and master~0 are different. Checking out the latter leads to a
# detached head state. This is confusing, avoid it.
if [ ${PARENTS} -eq 0 ]; then
git checkout ${CURRENT_BRANCH}
else
# The normal thing.
git checkout ${CURRENT_BRANCH}~${PARENTS}
fi
make regressiontests || exit 1
let PARENTS=${PARENTS}-1
done
echo "All commits ran regression tests successfully."