#!/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.

# Do not exit when a non-zero return value is encountered to output all errors.
# See: https://github.com/flutter/flutter/issues/131680
# set -e
shopt -s nullglob

# Needed because if it is set, cd may print the path it changed to.
unset CDPATH

# On Mac OS, readlink -f doesn't work, so follow_links traverses the path one
# link at a time, and then cds into the link destination and find out where it
# ends up.
#
# The function is enclosed in a subshell to avoid changing the working directory
# of the caller.
function follow_links() (
  cd -P "$(dirname -- "$1")"
  file="$PWD/$(basename -- "$1")"
  while [[ -L "$file" ]]; do
    cd -P "$(dirname -- "$file")"
    file="$(readlink -- "$file")"
    cd -P "$(dirname -- "$file")"
    file="$PWD/$(basename -- "$file")"
  done
  echo "$file"
)

function dart_bin() {
  dart_path="$1/flutter/third_party/dart/tools/sdks/dart-sdk/bin"
  if [[ ! -e "$dart_path" ]]; then
    dart_path="$1/third_party/dart/tools/sdks/dart-sdk/bin"
  fi
  echo "$dart_path"
}

SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")")
SRC_DIR="$(
  cd "$SCRIPT_DIR/../.."
  pwd -P
)"
DART_BIN=$(dart_bin "$SRC_DIR")
PATH="$DART_BIN:$PATH"

# Use:
#   env VERBOSE=1 ./ci/licenses.sh
# to turn on verbose progress report printing. Set it to 2 to also output
# information about which patterns are taking the most time.
QUIET="--quiet"
if [[ "${VERBOSE}" == "1" ]]; then
  QUIET=""
fi
if [[ "${VERBOSE}" == "2" ]]; then
  QUIET="--verbose"
fi

echo "Verifying license script is still happy..."
echo "Using dart from: $(command -v dart)"

untracked_files="$(
  cd "$SRC_DIR/flutter"
  git status --ignored --short | grep -E "^!" | awk "{print\$2}"
)"
untracked_count="$(echo "$untracked_files" | wc -l)"
if [[ $untracked_count -gt 0 ]]; then
  echo ""
  echo "WARNING: There are $untracked_count untracked/ignored files or directories in the flutter repository."
  echo "False positives may occur."
  echo "You can use 'git clean -dxf' in the flutter dir to clean out these files."
  echo "BUT, be warned that this will recursively remove all these files and directories:"
  echo "$untracked_files"
  echo ""
fi

dart --version

# Runs the tests for the license script.
function run_tests() (
  cd "$SRC_DIR/flutter/tools/licenses"
  find . -name "*_test.dart" | xargs -n 1 dart --disable-dart-dev --enable-asserts
)

# Collects the license information from the repo.
# Runs in a subshell.
function collect_licenses() (
  cd "$SRC_DIR/flutter/tools/licenses"
  # `--interpret_irregexp`` tells dart to use interpreter mode for running
  # the regexp matching, rather than generating machine code for it.
  # For very large RegExps that are currently used in license script using
  # interpreter is faster than using unoptimized machine code, which has
  # no chance of being optimized(due to its size).
  dart \
    --disable-dart-dev \
    --enable-asserts \
    --interpret_irregexp \
    lib/main.dart \
    --src ../../.. \
    --out ../../../out/license_script_output \
    --golden ../../ci/licenses_golden \
    "${QUIET}"
)

# Verifies the licenses in the repo.
# Runs in a subshell.
function verify_licenses() (
  local exitStatus=0
  cd "$SRC_DIR"

  # These files trip up the script on Mac OS X.
  find . -name ".DS_Store" -exec rm -f {} \;

  collect_licenses

  for f in out/license_script_output/licenses_*; do
    if ! cmp -s "flutter/ci/licenses_golden/$(basename "$f")" "$f"; then
      echo "============================= ERROR ============================="
      echo "License script got different results than expected for $f."
      echo "Please rerun the licenses script locally to verify that it is"
      echo "correctly catching any new licenses for anything you may have"
      echo "changed, and then update this file:"
      echo "  flutter/sky/packages/sky_engine/LICENSE"
      echo "For more information, see the script in:"
      echo "  https://github.com/flutter/engine/tree/main/tools/licenses"
      echo ""
      diff -U 6 "flutter/ci/licenses_golden/$(basename "$f")" "$f"
      echo "================================================================="
      echo ""
      exitStatus=1
    fi
  done

  echo "Verifying license tool signature..."
  if ! cmp -s "flutter/ci/licenses_golden/tool_signature" "out/license_script_output/tool_signature"; then
    echo "============================= ERROR ============================="
    echo "The license tool signature has changed. This is expected when"
    echo "there have been changes to the license tool itself. Licenses have"
    echo "been re-computed for all components. If only the license script has"
    echo "changed, no diffs are typically expected in the output of the"
    echo "script. Verify the output, and if it looks correct, update the"
    echo "license tool signature golden file:"
    echo "  ci/licenses_golden/tool_signature"
    echo "For more information, see the script in:"
    echo "  https://github.com/flutter/engine/tree/main/tools/licenses"
    echo ""
    diff -U 6 "flutter/ci/licenses_golden/tool_signature" "out/license_script_output/tool_signature"
    echo "================================================================="
    echo ""
    exitStatus=1
  fi

  echo "Verifying excluded files list..."
  if ! cmp -s "flutter/ci/licenses_golden/excluded_files" "out/license_script_output/excluded_files"; then
    echo "============================= ERROR ============================="
    echo "The license is excluding a different number of files than previously."
    echo "This is only expected when new non-source files have been introduced."
    echo "Verify that all the newly ignored files are definitely not shipped with"
    echo "any binaries that we compile (including impellerc and Wasm)."
    echo "If the changes look correct, update this file:"
    echo "  ci/licenses_golden/excluded_files"
    echo "For more information, see the script in:"
    echo "  https://github.com/flutter/engine/tree/main/tools/licenses"
    echo ""
    diff -U 6 "flutter/ci/licenses_golden/excluded_files" "out/license_script_output/excluded_files"
    echo "================================================================="
    echo ""
    exitStatus=1
  fi

  echo "Checking license count in licenses_flutter..."

  local actualLicenseCount
  actualLicenseCount="$(tail -n 1 flutter/ci/licenses_golden/licenses_flutter | tr -dc '0-9')"
  local expectedLicenseCount=879 # When changing this number: Update the error message below as well describing the newly expected license types.

  if [[ $actualLicenseCount -ne $expectedLicenseCount ]]; then
    echo "=============================== ERROR ==============================="
    echo "The total license count in flutter/ci/licenses_golden/licenses_flutter"
    echo "changed from $expectedLicenseCount to $actualLicenseCount."
    echo "It's very likely that this is an unintentional change. Please"
    echo "double-check that all newly added files have a BSD-style license"
    echo "header with the following copyright:"
    echo "    Copyright 2013 The Flutter Authors. All rights reserved."
    echo "Files in 'third_party/txt' may have an Apache license header instead."
    echo "If you're absolutely sure that the change in license count is"
    echo "intentional, update 'flutter/ci/licenses.sh' with the new count."
    echo "================================================================="
    echo ""
    exitStatus=1
  fi

  if [[ $exitStatus -eq 0 ]]; then
    echo "Licenses are as expected."
  fi
  return $exitStatus
)

run_tests
verify_licenses
