diff options
Diffstat (limited to 'rep-test')
-rwxr-xr-x | rep-test | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/rep-test b/rep-test new file mode 100755 index 0000000..2e45840 --- /dev/null +++ b/rep-test @@ -0,0 +1,179 @@ +#! /usr/bin/env bash + +# Test repository. +# +# Usage: update [options] <dir> +# +# First, the script determines the list of repositories/sections. If <dir> +# contains the 'repositories' file, then it is the only repository to be +# tested. Otherwise, every first-level subdirectory of <dir> that doesn't +# start with '.' and contains the 'repositories' file is to be tested. +# +# Then, it makes sure that every package in every repository can be built +# in a clean configuration. +# +# -n +# Only test new packages. For this to work, <dir> should be (part of) a +# git repository. Untracked (and changed) files are considered new. +# +# -e <subdir> +# Exclude the specified sub-directory. Currently only one directory can +# be excluded. +# +# -t <toolchain> +# Specify the build2 toolchain install/stage directory. The script will +# use <toolchain>/bin/b and <toolchain>/bin/bpkd instead of just b and +# bpkg. +# +# -c <option>|<module>|<var> +# Specify additional options, modules, or configuration variables to pass +# to the bpkg create command. For example: +# +# -c cxx -c config.cxx.loptions=-L/usr/local/lib +# +usage="usage: $0 [options] <dir>" + +trap 'exit 1' ERR +set -o errtrace # Trap in functions. + +function info () { echo "$*" 1>&2; } +function error () { info "$*"; exit 1; } + +dir= +cfg=/tmp/test-cfg +toolchain= +exclude= +co=() # Use a bash array to handle arguments with spaces (say "-Ifoo -Ibar"). +new=n + +while [ $# -gt 0 ]; do + case $1 in + -e) + shift + exclude=${1%/} + shift + ;; + -t) + shift + toolchain=${1%/} + shift + ;; + -c) + shift + co=("${co[@]}" "$1") + shift + ;; + -n) + new=y + shift + ;; + *) + dir=${1%/} + shift + break + ;; + esac +done + +if [ -z "$dir" ]; then + error $usage +fi + +if [ -z "$toolchain" ]; then + b="b" + bpkg="bpkg" +else + b="$toolchain/bin/b" + if [ ! -x $b ]; then + error "$b does not exist or is not executable" + fi + bo="--build $b" + + bpkg="$toolchain/bin/bpkg" + if [ ! -x $bpkg ]; then + error "$bpkg does not exist or is not executable" + fi +fi + +if [ "$new" = "y" ]; then + new=( `git -C $dir status --untracked-files=all --porcelain . | \ +sed -e 's%^\(??\| M\|M \) .*/\(.*\)$%\2%'` ) + if [ ${#new[@]} -eq 0 ]; then + info "no new packages in $dir" + exit 0 + fi + info "testing only ${new[@]}" +else + new=() +fi + +function check_new () # <pkg> <ver> +{ + if [ ${#new[@]} -eq 0 ]; then + return 0 + fi + + for f in ${new[@]}; do + if [[ $f == $1-$2.?* ]]; then + return 0 + fi + done + + return 1 +} + +# Determine the list of repositories. +# +rep= + +if [ -f "$dir/repositories" ]; then + rep=$dir +else + sub=`find $dir -mindepth 1 -maxdepth 1 -type d -name '[^.]*'` + if [ -z "$sub" ]; then + error "no subdirectories in $dir/" + fi + + for d in $sub; do + if [ `basename $d` = "$exclude" ]; then + info "skipping excluded $d/" + continue + fi + if [ -f "$d/repositories" ]; then + rep+=" $d" + else + info "no 'repositories' file in $d/, skipping" + fi + done + + if [ -z "$rep" ]; then + error "no repositories in $dir/" + fi +fi + +# Test repositories. +# +for r in $rep; do + info "testing $r" + + IFS=$'\n' + pkg=( `$bpkg rep-info --packages $r` ) + IFS=$' \t\n' + + for p in "${pkg[@]}"; do + nv=( $p ) + n=${nv[0]} + v=${nv[1]} + + if ! check_new $n $v; then + continue + fi + + info "testing $n $v" + + $bpkg $bo create -d $cfg --wipe "${co[@]}" + $bpkg add -d $cfg $r + $bpkg fetch -d $cfg + $bpkg $bo build -d $cfg --yes $n/$v + done +done |