#!/bin/bash
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

function error() {
  echo "$@" 1>&2
}

function get_branch_base_sha() {
  local branch_base_sha="$(git merge-base --fork-point FETCH_HEAD HEAD || git merge-base FETCH_HEAD HEAD)"
  echo "$branch_base_sha"
}

function check_changed_packages() {
  # Try get a merge base for the branch and calculate affected packages.
  # We need this check because some CIs can do a single branch clones with a limited history of commits.
  local packages
  local branch_base_sha="$(get_branch_base_sha)"
  if [[ "$branch_base_sha" != "" ]]; then
    echo "Checking for changed packages from $branch_base_sha"
    IFS=$'\n' packages=( $(git diff --name-only "$branch_base_sha" HEAD | grep -o "packages/[^/]*" | sed -e "s/packages\///g" | sort | uniq) )
  else
    error "Cannot find a merge base for the current branch to run an incremental build..."
    error "Please rebase your branch onto the latest master!"
    return 1
  fi

  CHANGED_PACKAGES=""
  CHANGED_PACKAGE_LIST=()

  # Filter out packages that have been deleted.
  for package in "${packages[@]}"; do
    if [ -d "$REPO_DIR/packages/$package" ]; then
      CHANGED_PACKAGES="${CHANGED_PACKAGES},$package"
      CHANGED_PACKAGE_LIST=("${CHANGED_PACKAGE_LIST[@]}" "$package")
    fi
  done

  if [[ "${#CHANGED_PACKAGE_LIST[@]}" == 0 ]]; then
    echo "No changes detected in packages."
  else
    echo "Detected changes in the following ${#CHANGED_PACKAGE_LIST[@]} package(s):"
    for package in "${CHANGED_PACKAGE_LIST[@]}"; do
      echo "$package"
    done
    echo ""
  fi
  return 0
}

# Runs the plugin tools from the plugin_tools git submodule.
function plugin_tools() {
  (pushd "$REPO_DIR/script/tool" && dart pub get && popd) >/dev/null
  dart run "$REPO_DIR/script/tool/lib/src/main.dart" "$@"
}
