# Usage: affected-plugins.sh [--event=pull_request|push] [<base> [<head>]]
#
#   --event   CI event type. For "pull_request" or "push", only the
#             plugins touched between <base> and <head> are listed
#             (falling back to all plugins if the top-level
#             CMakeLists.txt or run.cmake itself changed, since those
#             affect every build). For any other value, or when
#             omitted, all plugins are listed.
#   <base>    defaults to the merge-base of HEAD with origin/main
#   <head>    defaults to HEAD

set -e
cd "$(dirname "$0")"

event=
while [ $# -gt 0 ]; do
  case "$1" in
    --event=*) event=${1#--event=}; shift ;;
    --event) event=$2; shift 2 ;;
    *) break ;;
  esac
done

all_plugins() {
  for d in */; do
    [ -f "$d/CMakeLists.txt" ] && printf '%s ' "${d%/}"
  done
  echo
}

case "$event" in
  pull_request|push) ;;
  *) all_plugins; exit 0 ;;
esac

base=${1:-$(git merge-base HEAD origin/main)}
head=${2:-HEAD}

changed=$(git diff --name-only "$base" "$head")

if echo "$changed" | grep -qxE 'CMakeLists\.txt|run\.cmake'; then
  all_plugins
  exit 0
fi

echo "$changed" | cut -d/ -f1 | sort -u | while read -r d; do
  [ -f "$d/CMakeLists.txt" ] && printf '%s ' "$d"
done || true
echo