#!/usr/bin/env bash # Requirements: # Run tests on the current and target branches. The directories are provided on the top. # Find the total coverage of each of them. # Success: # current_branch_total_coverage >= target_branch_total_coverage # for the new files in the provided list of directories, the coverage should be atleast 75% set -euo pipefail # This function needs some work! calculate_file_coverage() { local file=$1 local total_statements=0 local covered_statements=0 # Parse coverage report for the given file while read -r line; do echo $line # Each line format: "::\t" # Extract statements and coverage percentage statements=$(echo "$line" | awk -F: '{print $4}' | awk '{print $2}') coverage=$(echo "$line" | awk -F: '{print $4}' | awk '{print $NF}' | sed 's/%//') # Accumulate total statements and covered statements total_statements=$((total_statements + statements)) covered_statements=$(echo "$covered_statements + ($statements * $coverage / 100)" | bc) done < <(grep "$file" coverage_report.txt) # Calculate and print total coverage for the file if (( total_statements == 0 )); then echo "0.0" else echo "scale=2; ($covered_statements / $total_statements) * 100" | bc fi } # ============================ # Configuration Section # ============================ # Provide the directories for which coverage should be checked. # Directories can be nested. We'll add "/..." to each to ensure all sub-packages are included. # Example: DIRECTORIES="./registry ./another/path" DIRECTORIES="./registry" if [ $# -lt 1 ]; then echo "Usage: $0 " exit 1 fi TARGET_BRANCH=$1 # Convert directories into their recursive form (./dir => ./dir/...) # to ensure nested packages are included TEST_DIRS="" for d in $DIRECTORIES; do # If it doesn't already end with "..." then append it if [[ "$d" != *"..." ]]; then d="${d%/}/..." fi TEST_DIRS="$TEST_DIRS $d" done # ============================ # Setup # ============================ git fetch origin "${TARGET_BRANCH}:${TARGET_BRANCH}" git checkout "${TARGET_BRANCH}" # Run coverage on the target branch go test -coverprofile=coverage_target.out $TEST_DIRS TARGET_COV=$(go tool cover -func=coverage_target.out | grep total | awk '{print $3}' | sed 's/%//') # Go back to the current (feature) branch git checkout - # Run coverage on the current (feature) branch go test -coverprofile=coverage_current.out $TEST_DIRS CURRENT_COV=$(go tool cover -func=coverage_current.out | grep total | awk '{print $3}' | sed 's/%//') # Ensure the current branch coverage is not lower than the target branch coverage. if (( $(echo "$CURRENT_COV < $TARGET_COV" | bc -l) )); then echo "Coverage decreased from ${TARGET_COV}% to ${CURRENT_COV}%." exit 1 fi echo "Coverage checks passed! Current coverage: ${CURRENT_COV}%, Target coverage: ${TARGET_COV}%" # Identify newly added files in the current branch compared to the target branch. # NEW_FILES=$(git diff --name-status "${TARGET_BRANCH}...HEAD" | grep '^A' | awk '{print $2}' | grep '\.go$' | grep -v '_test\.go$') # echo "new files: ""$NEW_FILES" #go tool cover -func=coverage_current.out > coverage_report.txt # #for file in $NEW_FILES; do # # Check if the file is within one of the specified directories. # echo "new file is: "$file # IN_DIRS=false # for d in $DIRECTORIES; do # # Remove the trailing "/..." from the directory for a direct prefix check # base_dir="${d%/...}" # echo "base_dir value: "$d # normalized_base_dir="${base_dir#./}" # # If file starts with base_dir # if [[ $file == $normalized_base_dir* ]]; then # IN_DIRS=true # break # fi # done # # if [ "$IN_DIRS" = true ]; then # file_coverage=$(calculate_file_coverage "$file") # if (( $(echo "$file_coverage < 75.0" | bc -l) )); then # echo "New file $file has coverage of $file_coverage%, which is less than 75%." # else # echo "New file $file has coverage of $fcov%, which is better than 75%." # fi # fi #done echo "All checks passed! Current coverage: ${CURRENT_COV}%, Target coverage: ${TARGET_COV}%" rm -rf coverage_*