|  | #!/bin/bash | 
|  |  | 
|  | set -e | 
|  |  | 
|  | # This script finds `pubspec.yaml` files that do not contain a top-level | 
|  | # `resolution: workspace` key-value pair, in order to help identify packages | 
|  | # as part of <https://github.com/flutter/flutter/issues/147883>. | 
|  | # | 
|  | # Usage: | 
|  | #   tools/find_pubspecs_to_workspacify.sh | 
|  |  | 
|  | # 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" | 
|  | ) | 
|  |  | 
|  | SCRIPT_DIR=$(follow_links "$(dirname -- "${BASH_SOURCE[0]}")") | 
|  | SRC_DIR="$( | 
|  | cd "$SCRIPT_DIR/../.." | 
|  | pwd -P | 
|  | )" | 
|  | FLUTTER_DIR="$( | 
|  | cd "$SRC_DIR/flutter" | 
|  | pwd -P | 
|  | )" | 
|  |  | 
|  | # Patterns, that, if matched, should be ignored. | 
|  | IGNORE_PATTERNS=( | 
|  | # Root pubspec.yaml file. | 
|  | '.*flutter\/pubspec.yaml' | 
|  |  | 
|  | # Anything fuchsia-related. | 
|  | '.*shell\/platform\/fuchsia.*' | 
|  |  | 
|  | # Anything web-related. | 
|  | '.*web_sdk.*' | 
|  |  | 
|  | # Anything in the `prebuilts` directory. | 
|  | '.*prebuilts.*' | 
|  |  | 
|  | # Anything in the `third_party` directory. | 
|  | '.*third_party.*' | 
|  | ) | 
|  |  | 
|  | # Find all pubspec.yaml files that do not contain a top-level `resolution: workspace` key-value pair. | 
|  | find "$FLUTTER_DIR" -name pubspec.yaml -print0 | while IFS= read -r -d '' pubspec; do | 
|  | # Check if the pubspec.yaml file should be ignored. | 
|  | for pattern in "${IGNORE_PATTERNS[@]}"; do | 
|  | if [[ "$pubspec" =~ $pattern ]]; then | 
|  | continue 2 | 
|  | fi | 
|  | done | 
|  |  | 
|  | # Check if the pubspec.yaml file contains a top-level `resolution: workspace` key-value pair. | 
|  | if ! grep -q '^resolution: workspace' "$pubspec"; then | 
|  | echo "$pubspec" | 
|  | fi | 
|  | done |