#!/bin/sh

set -eu

if [ -r /etc/default/debci ]; then
  . /etc/default/debci
fi

usage() {
  cat <<EOF
usage: debci [OPTIONS]

Options:

  -f, --force               Force test run on packages, even if no package in
                            its dependency chain changed. A package will still
                            not be tested if it was already tested today.
  -j N                      Test at most N packages in parallel
                            (default: 1)

$@
EOF
}

short_options='j:f'
long_options='force'

debci_base_dir=$(readlink -f $(dirname $(readlink -f $0))/..)
cd $debci_base_dir
. lib/environment.sh
. lib/functions.sh

run() {
  if which update-testbed >/dev/null 2>/dev/null; then
    log "I: Updating backend testbed"
    update-testbed
  else
    log "W: Backend $debci_backend does not provide a way to update testbed!"
  fi
  log "I: Finished update of backend testbed"

  log "I: start processing of all packages"

  process_all_packages

  log "I: finished processing of all packages"
}

process_all_packages() {
  local packages="$(debci-list-packages)"

  local start=$(date +%s)

  if [ "$maxjobs" -eq 1 ]; then
    for pkg in $packages; do
      debci-test $force "$pkg"
    done
  else
    parallel -j "$maxjobs" debci-test $force -- $packages
  fi

  local finish=$(date +%s)

  $debci_base_dir/scripts/cleanup

  $debci_base_dir/scripts/generate-index $(($finish - $start))
}

# default configuration
maxjobs=1
force=''

while true; do
  arg="$1"
  shift
  case "$arg" in
    -j)
      maxjobs="$1"
      shift
      ;;
    -f|--force)
      force="$arg"
      ;;
    --)
      break
      ;;
  esac
done

(
  flock -n 9 || exit 0
  run "$@"
) 9>/var/lock/debci.lock

