diff --git a/ci/builders/linux_unopt.json b/ci/builders/linux_unopt.json index 8b9208bbdb057..5b85fca508a17 100644 --- a/ci/builders/linux_unopt.json +++ b/ci/builders/linux_unopt.json @@ -40,6 +40,10 @@ "name": "test:format_and_dart_test", "script": "flutter/ci/format.sh" }, + { + "nane": "test:GeneratedPluginRegistant.java omitted", + "script": "flutter/ci/test/format_no_generated_java_test.sh" + }, { "language": "python3", "name": "test: Host_Tests_for_host_debug_unopt", diff --git a/ci/format.sh b/ci/format.sh index 0425eb380eb7c..bcde4aedcff0d 100755 --- a/ci/format.sh +++ b/ci/format.sh @@ -32,6 +32,29 @@ SRC_DIR="$(cd "$SCRIPT_DIR/../.."; pwd -P)" DART_SDK_DIR="${SRC_DIR}/third_party/dart/tools/sdks/dart-sdk" DART="${DART_SDK_DIR}/bin/dart" +# Check if a file named **/GeneratedPluginRegistrant.java exists in the project. +# If it does, fail the build and print a message to the user pointing them to +# the file and instructing them to remove it. +# +# See: https://github.com/flutter/flutter/issues/143782. + +# The expected path to the file. Any *other* path is unexpected. +EXPECTED_PATHS=("./shell/platform/android/test/io/flutter/plugins/GeneratedPluginRegistrant.java") + +# Find all files named GeneratedPluginRegistrant.java in the project. +GENERATED_PLUGIN_REGISTRANT_PATHS=$(find "$SRC_DIR/flutter" -name "GeneratedPluginRegistrant.java") + +# Check for GeneratedPluginRegistrant.java in unexpected locations +for expected_path in "${EXPECTED_PATHS[@]}"; do + found_files=$(find . -name "GeneratedPluginRegistrant.java" -not -path "$expected_path") + + for file in $found_files; do + echo "Error: Unexpected GeneratedPluginRegistrant.java found: $file" + echo "Please remove the unexpected file and see: https://github.com/flutter/flutter/issues/143782" + exit 1 + done +done + cd "$SCRIPT_DIR" "$DART" \ --disable-dart-dev \ diff --git a/ci/test/format_no_generated_java_test.sh b/ci/test/format_no_generated_java_test.sh new file mode 100755 index 0000000000000..4d9c7ce4f4a6d --- /dev/null +++ b/ci/test/format_no_generated_java_test.sh @@ -0,0 +1,58 @@ +#!/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 + +# 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 +)" +FLUTTER_DIR="$SRC_DIR/flutter" + +# Creates a file named `GeneratedPluginRegistrant.java` in the project outside +# of it's expected location in shell/platform/android/test/... (where the exact +# name and location is required to get loaded). +# +# This file is typically generated by Flutter tooling and should not exist. +touch "$FLUTTER_DIR/GeneratedPluginRegistrant.java" + +# Create a trap that, on exit, removes the file. +function cleanup() { + rm -f "$FLUTTER_DIR/GeneratedPluginRegistrant.java" +} +trap cleanup EXIT + +# Runs ../format.sh and verifies that it fails with the expected error message. +# If it fails, the script prints an error message and exits with a non-zero status. +"$FLUTTER_DIR/ci/format.sh" || { + echo "PASS: analyze.sh failed as expected" + exit 0 +} + +echo "FAIL: format.sh did not fail as expected" +exit 1