blob: 5924f6bf9ec7fedbc50b6f7c14ec4c518c7bf48a [file] [log] [blame]
#!/bin/bash
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Scripts to search blocked words.
#
# Usage: search_blocked_words.sh [/path/to/word_list.txt]
#
# You can search the current directory for globally blocked words:
#
# $ search_blocked_words.sh
#
# You can pass the project's unblocked_terms.txt to narrow the search scope:
#
# $ search_blocked_words.sh ./unblocked_terms.txt
input_file=${1:-~/trunk/src/repohooks/blocked_terms.txt}
if [[ ! -r "${input_file}" ]]; then
echo "Error: '${input_file}' not found."
echo "This script is expected to run in CrOS SDK chroot."
echo "Read repohooks/README.md for more information."
exit 1
fi
all=$(git ls-tree -r --name-only HEAD)
# Create list of paths without symlinks.
paths=()
while IFS= read -r path; do
[[ -L "${path}" ]] && continue
paths+=("${path}")
done <<< "${all}"
# Create lists of dirs, files, symlinks. Must be basename and have no duplicate.
# We use xargs (instead of directly feeding to dirname or basename) to avoid
# exceeding argument size limit.
dirs=$(echo "${all}" | xargs dirname | sort -u | xargs basename -a)
files=$(echo "${all}" | xargs basename -a)
results_ok=()
results_nok=()
total_count=0
while read -r regex; do
# Skip blank and comment lines.
[[ -z "${regex}" ]] && continue
[[ "${regex}" == "#"* ]] && continue
# Count matching lines.
line_count=$(printf '%s\n' "${paths[@]}" | xargs -d '\n' \
grep -E -i -I -c "${regex}" | awk -F: '{ s+=$2 } END { print s }')
# Count matching paths.
path_count=$(printf '%s\n' "${paths[@]}" | xargs -d '\n' \
grep -E -i -I -l "${regex}" | wc -l)
# Count matching file & dir names.
name_count=$(echo "${files}" "${dirs}" | grep -E -i -c "${regex}")
# Save result.
current_result="${regex} ${line_count} ${path_count} ${name_count}"
if [[ $(($line_count + $name_count)) -eq 0 ]]; then
results_ok+=("${current_result}");
else
results_nok+=("${current_result}");
fi
# Increment total counter
total_count=$(($total_count + $line_count + $name_count))
done < "${input_file}"
results=("reg_exp #lines #files #filenames" "${results_ok[@]}" \
"${results_nok[@]}")
# Present results.
printf '%s\n' "${results[@]}" | column --table --table-right 2,3,4
printf '=%.0s' {1..50}
printf '\nTotal number of infractions: %d\n' "${total_count}"