147 lines
6.3 KiB
YAML
147 lines
6.3 KiB
YAML
name: Line Length Check
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [ '*' ]
|
|
|
|
# Cancel superseded in-progress runs for the same PR.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
jobs:
|
|
line-length-check:
|
|
runs-on: ubuntu-latest
|
|
name: Check 80 character line limit
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Check line length in PR changes
|
|
run: |
|
|
# Get the base branch (usually main/master)
|
|
BASE_BRANCH="${{ github.event.pull_request.base.ref }}"
|
|
|
|
echo "Checking line length (max 80 characters) for changed files in " \
|
|
"src/, examples/, and jni/ directories..."
|
|
echo "================================================================"
|
|
|
|
# Create temporary files with unique names
|
|
changed_files=$(mktemp)
|
|
violations_file=$(mktemp)
|
|
|
|
# Get all changed files in this PR and filter for target directories
|
|
git diff --name-only "origin/$BASE_BRANCH"...HEAD | \
|
|
grep -E '^(src/|examples/|jni/)' > "$changed_files" || true
|
|
|
|
# Initialize violation count
|
|
violation_count=0
|
|
|
|
# Check each changed file
|
|
while IFS= read -r file; do
|
|
if [[ -f "$file" ]]; then
|
|
# Skip WolfCryptProvider.java as it contains service mappings
|
|
# that legitimately exceed 80 characters
|
|
if [[ "$file" == "src/main/java/com/wolfssl/provider/jce/WolfCryptProvider.java" ]]; then
|
|
echo "Skipping $file (contains security service mappings)"
|
|
continue
|
|
fi
|
|
|
|
# Skip auto-generated JNI header files in jni/include/
|
|
# These are generated by javac -h and contain long function
|
|
# signatures that cannot be controlled
|
|
if [[ "$file" =~ ^jni/include/.*\.h$ ]]; then
|
|
echo "Skipping $file (auto-generated JNI header)"
|
|
continue
|
|
fi
|
|
|
|
# Skip shell scripts in examples/ directory
|
|
# These often contain long command lines that are better kept on
|
|
# single lines for readability
|
|
if [[ "$file" =~ ^examples/.*\.sh$ ]]; then
|
|
echo "Skipping $file (shell script in examples)"
|
|
continue
|
|
fi
|
|
|
|
# Skip certificate/key files. These carry encoded key material
|
|
# and OpenSSL text dumps (long Issuer/Subject lines) that cannot
|
|
# be wrapped. Skip the whole certs tree since some files there
|
|
# (CRLs and similar) do not use a .pem or .der extension.
|
|
if [[ "$file" =~ ^examples/certs/ ]] || \
|
|
[[ "$file" =~ \.(pem|der)$ ]]; then
|
|
echo "Skipping $file (certificate/key file)"
|
|
continue
|
|
fi
|
|
|
|
echo "Checking: $file"
|
|
|
|
# Get added lines with actual file line numbers and check their length
|
|
new_line_num=0
|
|
git diff "origin/$BASE_BRANCH"...HEAD "$file" | \
|
|
while IFS= read -r line; do
|
|
# Track line numbers from diff headers - format: @@ -old_start,old_count +new_start,new_count @@
|
|
if [[ "$line" =~ ^@@.*\+([0-9]+) ]]; then
|
|
# Extract starting line number for new file (after +)
|
|
# Subtract 1 because we'll increment before processing first line
|
|
new_line_num=$((${BASH_REMATCH[1]} - 1))
|
|
elif [[ "$line" =~ ^(\+[^+].*) ]]; then
|
|
# This is an added line (not a +++ header)
|
|
# Increment line number BEFORE processing (since this line exists in new file)
|
|
new_line_num=$((new_line_num + 1))
|
|
added_line="${line:1}" # Remove leading +
|
|
char_count=${#added_line}
|
|
|
|
# Skip JNI method signatures and calls to avoid false positives
|
|
# These are auto-generated names that can't be shortened
|
|
if [[ $char_count -gt 80 ]]; then
|
|
# Check if this is a JNI method signature, call, or parameter line that should be ignored
|
|
if [[ "$added_line" =~ JNIEXPORT.*JNICALL.*Java_com_wolfssl_ ]] || \
|
|
[[ "$added_line" =~ Java_com_wolfssl_.*\( ]] || \
|
|
[[ "$added_line" =~ ^[[:space:]]*return[[:space:]]+Java_com_wolfssl_.* ]] || \
|
|
[[ "$added_line" =~ ^[[:space:]]*\(JNIEnv\*[[:space:]]+env.*\) ]] || \
|
|
[[ "$added_line" =~ ^[[:space:]]*JNIEnv\*[[:space:]]+env.* ]]; then
|
|
echo "$file:$new_line_num - Skipping JNI method signature/call/parameters ($char_count characters)"
|
|
echo " Line: $added_line"
|
|
else
|
|
echo "❌ $file:$new_line_num - Line too long ($char_count characters)"
|
|
echo " Line: $added_line"
|
|
echo "violation" >> "$violations_file"
|
|
fi
|
|
fi
|
|
elif [[ "$line" =~ ^[[:space:]] ]]; then
|
|
# Context line (unchanged) - increment new file line number
|
|
new_line_num=$((new_line_num + 1))
|
|
# Removed lines (starting with -) don't affect new file line numbers
|
|
fi
|
|
done
|
|
fi
|
|
done < "$changed_files"
|
|
|
|
# Count violations
|
|
if [[ -f "$violations_file" ]]; then
|
|
violation_count=$(grep -c "violation" "$violations_file" || echo 0)
|
|
else
|
|
violation_count=0
|
|
fi
|
|
|
|
echo "================================================================"
|
|
|
|
if [[ $violation_count -gt 0 ]]; then
|
|
echo "❌ Found $violation_count line(s) exceeding 80 " \
|
|
"characters in PR changes"
|
|
echo ""
|
|
echo "Please ensure all lines are 80 characters or less " \
|
|
"as per coding standards."
|
|
echo "You can check line length in your editor or use this command:"
|
|
echo " grep -n '.\{81,\}' <filename>"
|
|
rm -f "$violations_file" "$changed_files"
|
|
exit 1
|
|
else
|
|
echo "✅ All changed lines are within the 80 character limit"
|
|
rm -f "$violations_file" "$changed_files"
|
|
exit 0
|
|
fi
|