diff --git a/cmd/vic-machine/inspect/.godeps_rules b/cmd/vic-machine/inspect/.godeps_rules index 522eedba79..b377cf6521 100644 --- a/cmd/vic-machine/inspect/.godeps_rules +++ b/cmd/vic-machine/inspect/.godeps_rules @@ -10,3 +10,4 @@ ^cmd/vic-machine/converter/* ^cmd/vic-machine/create/* +^UNUSED diff --git a/infra/scripts/go-deps-enforcement.sh b/infra/scripts/go-deps-enforcement.sh index 396e08488f..1fc2387408 100755 --- a/infra/scripts/go-deps-enforcement.sh +++ b/infra/scripts/go-deps-enforcement.sh @@ -29,6 +29,17 @@ find-packages () { find "${@}" -type f -name '*.go' -exec dirname {} \; | sort --unique } +# Returns a list of all directories containing a rule file +# Arguments +# *: directories to search under +# +# Returns: +# directories with rule files +find-rule-dirs () { + find "${@}" -type f -name "$RULES_FILE" -exec dirname {} \; | sort --unique +} + + # Returns the path to the "nearest" rule file for a given package # Arguments # 1: package path @@ -102,7 +113,42 @@ for package in $(find-packages "${ENFORCE[@]}"); do echo "${invalid//^/ /}" echo "See $rules for details." echo "" - rc=1 + rc=$(( rc | 1 )) + fi +done + +export VIC_CACHE_DEPS=true #TODO: verify this doesn't leak! +# for each rule file +for directory in $(find-rule-dirs "${ENFORCE[@]}"); do + deps="" + # for each package under that rule file + for package in $(find-packages "$directory"); do + # find-rule for the package + rules="$(find-rule "$package")" + # if not the rule file from the outer loop (i.e, the directory is covered by a more specific file)s, continue + if [ "$directory" != "$(dirname "$rules")" ]; then + continue + fi + # accumulate deps + deps+="$(get-deps "$package")" + done + + # use grep to make sure each pattern matches at least one dep + unused=() + for rule in $(get-rules "$rules"); do + matches=$(echo "$deps" | grep -c -e "$rule" || true) + + # if not, error with the rule file and unmatched rule + if [ "$matches" = "0" ]; then + unused+=("$rule") + fi + done + + if [ ${#unused[@]} -ne 0 ]; then + echo "Unused rules in $rules:" + printf ' %s\n' "${unused[@]}" + echo "" + rc=$(( rc | 2 )) fi done