| #!/usr/bin/env bash |
| # Copyright 2021 Google LLC |
| # |
| # 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. |
| |
| # Find code files. |
| CODE_FILES=() |
| while IFS= read -r -d $'\0'; do |
| CODE_FILES+=("$REPLY") |
| done < <(find . -not \( -path '*/target' -prune \) -and -name '*.rs' -print0) |
| |
| # Find markdown files. |
| MD_FILES=() |
| while IFS= read -r -d $'\0'; do |
| MD_FILES+=("$REPLY") |
| done < <(find . -not \( -path '*/target' -prune \) -and -not \( -path '*/wycheproof' -prune \) -and -name '*.md' -print0) |
| |
| # Check that source files have the Apache License header. |
| # Automatically skips generated files. |
| check_license() { |
| local path="$1" |
| |
| if head -1 "$path" | grep -iq -e 'generated' -e '::prost::message'; then |
| return 0 |
| fi |
| |
| if echo "$path" | grep -q "/proto/"; then |
| return 0 |
| fi |
| |
| # Look for "Apache License" on the file header |
| if ! head -10 "$path" | grep -q 'Apache License'; then |
| # Format: $path:$line:$message |
| echo "$path:1:license header not found" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| # Check that any TODO markers in files have associated issue numbers |
| check_todo() { |
| local path="$1" |
| local result |
| result=$(grep --with-filename --line-number TODO "$path" | grep --invert-match --regexp='TODO(#[0-9][0-9]*)') |
| if [[ -n $result ]]; then |
| echo "TODO marker without issue number:" |
| echo "$result" |
| return 1 |
| fi |
| return 0 |
| } |
| |
| # Check that any calls that might panic have a comment noting why they're safe |
| check_panic() { |
| local path="$1" |
| if [[ $path =~ "test" || $path =~ "examples/" || $path =~ "rinkey/" || $path =~ "benches/" ]]; then |
| return 0 |
| fi |
| for needle in "panic!(" "unwrap(" "expect(" "unwrap_err(" "expect_err(" "unwrap_none(" "expect_none(" "unreachable!"; do |
| local result |
| result=$(grep --with-filename --line-number "$needle" "$path" | grep --invert-match --regexp='safe:'| grep --invert-match --regexp=':[0-9]*://') |
| if [[ -n $result ]]; then |
| echo "Un-annotated panic code:" |
| echo "$result" |
| return 1 |
| fi |
| done |
| return 0 |
| } |
| |
| errcount=0 |
| for f in "${CODE_FILES[@]}"; do |
| check_license "$f" |
| errcount=$((errcount + $?)) |
| check_todo "$f" |
| errcount=$((errcount + $?)) |
| check_panic "$f" |
| errcount=$((errcount + $?)) |
| done |
| |
| EMBEDMD="$(go env GOPATH)/bin/embedmd" |
| if [[ ! -x "$EMBEDMD" ]]; then |
| go install github.com/campoy/embedmd@97c13d6 |
| fi |
| for f in "${MD_FILES[@]}"; do |
| "$EMBEDMD" -d "$f" |
| errcount=$((errcount + $?)) |
| check_todo "$f" |
| errcount=$((errcount + $?)) |
| mdl "$f" |
| errcount=$((errcount + $?)) |
| done |
| |
| if [ $errcount -gt 0 ]; then |
| echo "$errcount errors detected" |
| exit 1 |
| fi |