Hugo Pointcheval 993c8b60ac
Some checks failed
continuous-integration/drone/pr Build is failing
refactor: rename tools/ to tool/ to follow dart conventions
2023-10-09 22:04:10 +02:00

106 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright (C) 2023 WYATT GROUP
# Please see the AUTHORS file for details.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# This script scrapes the latest version of the ruleset from the
# official Dart repository and tests it against the latest version of
# the Wyatt Analysis ruleset.
basename=$(basename "$0")
basepath=$(dirname "$0")
official_ruleset_url="https://raw.githubusercontent.com/dart-lang/sdk/main/pkg/linter/example/all.yaml"
red=$(tput setaf 1)
blue=$(tput setaf 4)
yellow=$(tput setaf 3)
reset=$(tput sgr0)
# Check for dependencies.
if ! command -v yq &>/dev/null; then
echo "yq could not be found. Please install it and try again."
echo "https://github.com/mikefarah/yq"
exit 1
fi
# Check for arguments, if no arguments read latest version from pubspec.yaml.
if [ $# -eq 0 ]; then
wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
else
wyatt_analysis_version=$1
fi
# Read latest version
wyatt_analysis_version=$(yq eval '.version' "${basepath}/../pubspec.yaml")
# Check if the version of the Wyatt Analysis ruleset is valid by checking if the file exists.
if [ ! -f "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" ]; then
echo "Wyatt Analysis version $wyatt_analysis_version could not be found."
exit 1
fi
echo "Found Wyatt Analysis version $wyatt_analysis_version"
# Generate temporary directory.
tmp_dir=$(mktemp -d)
# Download the official ruleset.
curl -s "$official_ruleset_url" >"$tmp_dir/official.yaml"
# List yaml elements in the official ruleset, "linter.rules" and save it in an array.
official_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/official.yaml"))
echo "Finding differences between the official ruleset and the Wyatt Analysis ruleset..."
echo "This may take a while..."
# Merges the wyatt dart analysis ruleset with the wyatt flutter analysis ruleset.
yq ea '. as $item ireduce ({}; . *+ $item)' "$basepath/../lib/analysis_options.$wyatt_analysis_version.yaml" "$basepath/../lib/analysis_options.flutter.$wyatt_analysis_version.yaml" >"$tmp_dir/wyatt.yaml"
# List yaml elements in the Wyatt Analysis ruleset, "linter.rules" and save it in an array.
wyatt_rules=($(yq eval '.linter.rules | .[]' "$tmp_dir/wyatt.yaml"))
# Read merged files, and list all ignored rules (starting with a # -).
ignored_rules=($(grep -oP '(?<=# - ).*' "$tmp_dir/wyatt.yaml"))
echo "Found $(echo "${official_rules[@]}" | wc -w) rules in the official ruleset."
echo "Found $(echo "${wyatt_rules[@]}" | wc -w) rules in the Wyatt Analysis ruleset."
echo "Found $(echo "${ignored_rules[@]}" | wc -w) ignored rules in the Wyatt Analysis ruleset."
# Iterate over the official ruleset.
for rule in "${official_rules[@]}"; do
# Check if the rule is in the Wyatt Analysis ruleset.
if ! grep -q "$rule" "$tmp_dir/wyatt.yaml"; then
echo "${red}+ $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
fi
done
# Iterate over the Wyatt Analysis ruleset and print the rules that are not in the official ruleset.
for rule in "${wyatt_rules[@]}"; do
# Check if the rule is in the official ruleset.
if ! grep -q "$rule" "$tmp_dir/official.yaml"; then
echo "${blue}- $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
fi
done
# Iterate over the ignored rules and print them.
for rule in "${ignored_rules[@]}"; do
echo "${yellow}~ $rule${reset} (https://dart.dev/tools/linter-rules/$rule)"
done
# Remove temporary directory.
rm -rf "$tmp_dir"
exit 0