mirror of
https://github.com/material-components/material-components-ios.git
synced 2026-02-20 08:27:32 +08:00
When looking at which files are included in bazel targets and which are not, we should exclude any files that were deleted. If not, any PR that deletes a file could potentially produce a false positive and get blocked from submission. Closes #6428
153 lines
4.3 KiB
Bash
Executable File
153 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright 2018-present the Material Components for iOS authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# Finds all newly-added files that are missing BUILD targets
|
|
|
|
# Unique identifier for GitHub comments posted by this script.
|
|
COMMENT_IDENTIFIER='bazel-rule-coverage'
|
|
|
|
## Import Github Comment library script
|
|
if [ -n "$KOKORO_BUILD_NUMBER" ]; then
|
|
# Import source methods for managing GitHub comments
|
|
scripts_dir='github/repo/scripts/lib'
|
|
else
|
|
scripts_dir="$(dirname $0)/lib"
|
|
fi
|
|
|
|
source "${scripts_dir}/github_comments.sh"
|
|
|
|
# Required for posting and deleting comments
|
|
source "${scripts_dir}/select_xcode.sh"
|
|
|
|
if [ -n "$XCODE_VERSION" ]; then
|
|
select_xcode "$XCODE_VERSION"
|
|
fi
|
|
|
|
# Generates a list of files that were modified since the target branch
|
|
modified_files() {
|
|
# Move to our cloned repository
|
|
if [ -n "$KOKORO_BUILD_NUMBER" ]; then
|
|
pushd github/repo >> /dev/null
|
|
fi
|
|
|
|
# `target_branch` is either the Pull Request destination branch (where it will be merged) or if
|
|
# none can be determined, defaults to `develop`.
|
|
if [ -n "$KOKORO_GITHUB_PULL_REQUEST_TARGET_BRANCH" ]; then
|
|
target_branch="origin/${KOKORO_GITHUB_PULL_REQUEST_TARGET_BRANCH}"
|
|
else
|
|
target_branch=develop
|
|
fi
|
|
|
|
# `base_sha` is the merge base of `target_branch` and the current HEAD.
|
|
base_sha=$(git merge-base "${target_branch}" HEAD)
|
|
|
|
# `TARGET` is then all bazel targets affected by changes in the commit range between `base_sha`
|
|
# and `HEAD`. By default, that becomes all changes between the `develop` branch and the latest
|
|
# commit.
|
|
range="${base_sha}...HEAD"
|
|
|
|
git diff --name-status "${range}" \
|
|
| grep -v -E '^D' \
|
|
| grep -E '(\.swift|\.h|\.m)$' \
|
|
| while read LINE; do \
|
|
echo "$LINE" | sed -nE 's/.*[[:blank:]]+([[:alnum:]_\-\.\/+]+)$/\1/p'; \
|
|
done \
|
|
| sort \
|
|
| uniq
|
|
|
|
if [ -n "$KOKORO_BUILD_NUMBER" ]; then
|
|
popd >> /dev/null
|
|
fi
|
|
}
|
|
|
|
# Deletes any previously-posted comment and posts a comment to GitHub with
|
|
# the list of source files not in a bazel target.
|
|
update_comment() {
|
|
if [ -n "$GITHUB_API_TOKEN" ]; then
|
|
delete_comment "$COMMENT_IDENTIFIER"
|
|
fi
|
|
|
|
if [ -n "$1" ]; then
|
|
comment_tmp_path=$(mktemp -d)
|
|
comment_tmp_file="${comment_tmp_path}/comment.tmp"
|
|
echo -e "The following files are not in any BUILD targets:\n" >> "$comment_tmp_file"
|
|
echo -e "\`\`\`\n${1}\n\`\`\`\n" >> "$comment_tmp_file"
|
|
|
|
cat "$comment_tmp_file"
|
|
if [ -n "$GITHUB_API_TOKEN" ]; then
|
|
post_comment "$COMMENT_IDENTIFIER" "$comment_tmp_file"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Determines if any of the modified files are not included in a bazel rule.
|
|
check_files_covered() {
|
|
update_comment # Deletes any previously-posted comment
|
|
|
|
files=$(modified_files)
|
|
SAVEIFS=$IFS
|
|
IFS=$'\n'
|
|
files=($files)
|
|
IFS=$SAVEIFS
|
|
|
|
if [ -z "$files" ]; then
|
|
echo "No source files were modified"
|
|
exit 0
|
|
fi
|
|
|
|
if [ -n "$KOKORO_BUILD_NUMBER" ]; then
|
|
pushd github/repo >> /dev/null
|
|
|
|
# We must upgrade bazel prior to running bazel query because we rely on features in bazel
|
|
# 0.20.
|
|
bazel version
|
|
use_bazel.sh 0.20.0
|
|
bazel version
|
|
fi
|
|
|
|
num_files="${#files[@]}"
|
|
current_index=0
|
|
for file in "${files[@]}"; do
|
|
targets=$(bazel query "'$file'" --output=package 2>/dev/null)
|
|
if [ -z "$targets" ]; then
|
|
if [ -z "$missing_targets" ]; then
|
|
missing_targets="$file"
|
|
else
|
|
missing_targets="${missing_targets}\n${file}"
|
|
fi
|
|
exit_status=1
|
|
fi
|
|
((current_index++))
|
|
if (( current_index % 25==0 )); then
|
|
echo "Processing file $current_index / $num_files"
|
|
fi
|
|
done
|
|
|
|
if [ -n "$KOKORO_BUILD_NUMBER" ]; then
|
|
popd >> /dev/null
|
|
fi
|
|
|
|
if (( exit_status != 0 )); then
|
|
missing_targets=$(echo -e "$missing_targets" | sort | uniq)
|
|
update_comment "$missing_targets"
|
|
fi
|
|
|
|
exit $exit_status
|
|
}
|
|
|
|
check_files_covered
|
|
|