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