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

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 [[ -h "$file" ]]; do
    cd -P "$(dirname -- "$file")"
    file="$(readlink -- "$file")"
    cd -P "$(dirname -- "$file")"
    file="$PWD/$(basename -- "$file")"
  done
  echo "$file"
)

SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")")
SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)"
DART_BIN="$SRC_DIR/third_party/dart/tools/sdks/dart-sdk/bin"
PATH="$DART_BIN:$PATH"

# Use:
#   env VERBOSE=1 ./ci/licenses.sh
# to turn on verbose progress report printing.
QUIET="--quiet"
if [[ "${VERBOSE}" == "1" ]]; then
  QUIET=""
fi

echo "Verifying license script is still happy..."
echo "Using pub from $(command -v pub), 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

# Collects the license information from the repo.
# Runs in a subshell.
function collect_licenses() (
  cd "$SRC_DIR/flutter/tools/licenses"
  dart --enable-asserts 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 {} \;

  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/master/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/master/tools/licenses"
      echo ""
      diff -U 6 "flutter/ci/licenses_golden/tool_signature" "out/license_script_output/tool_signature"
      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=16 # When changing this number: Update the error message below as well describing all 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
)

verify_licenses
