#!/bin/bash

find_build_directory() {
  local build_dirs=(*/build.ninja)

  if [[ ! -e ${build_dirs[0]} ]]; then
    echo "error: No build directory found. Have you run 'meson build' yet?" >&2
    return 1
  elif (( ${#build_dirs[*]} > 1 )); then
    echo "error: Multiple build directories found. Unable to proceed." >&2
    return 1
  fi

  printf '%s\n' "${build_dirs[0]%/*}"
}


filter_targets_by_name() {
  if command -v jq &>/dev/null; then
    jq --arg re "$1" -r 'map(.name)[] | select(match($re))'
  else
    json_pp | awk -v filter="$1" -F'[:"]' \
        '$2 == "name" && $(NF - 1) ~ filter { print $(NF - 1) }'
  fi
}

# Make things simple and require that we're in the build root rather than
# trying to chase down the location of this script and the relative build dir.
if [[ ! -d .git ]]; then
  echo "This script must be run from the root of the repository" >&2
  exit 1
fi

build_dir=$(find_build_directory) || exit 1

mapfile -t targets < \
    <(meson introspect "$build_dir" --targets | filter_targets_by_name "-update-po$")

ninja -C "$build_dir" "${targets[@]}"
