blob: 4f4be6a52804f4d95635f93b0c06f4764cf1c2f3 [file] [log] [blame] [edit]
#!/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