Skip to content

Commit f31b9b5

Browse files
committed
Update line length check
1 parent 96f1fdb commit f31b9b5

2 files changed

Lines changed: 149 additions & 107 deletions

File tree

.github/workflows/line-length-check.yml

Lines changed: 1 addition & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -17,111 +17,5 @@ jobs:
1717

1818
- name: Check line length in PR changes
1919
run: |
20-
# Get the base branch (usually main/master)
2120
BASE_BRANCH="${{ github.event.pull_request.base.ref }}"
22-
23-
echo "Checking line length (max 80 characters) for changed files in " \
24-
"src/, examples/, and native/ directories..."
25-
echo "================================================================"
26-
27-
# Create temporary files with unique names
28-
changed_files=$(mktemp)
29-
violations_file=$(mktemp)
30-
31-
# Get all changed files in this PR and filter for target directories
32-
git diff --name-only "origin/$BASE_BRANCH"...HEAD | \
33-
grep -E '^(src/|examples/|native/)' > "$changed_files" || true
34-
35-
# Initialize violation count
36-
violation_count=0
37-
38-
# Check each changed file
39-
while IFS= read -r file; do
40-
if [[ -f "$file" ]]; then
41-
# Skip WolfSSLProvider.java...
42-
# that legitimately exceed 80 characters
43-
if [[ "$file" == "src/java/com/wolfssl/provider/jsse/WolfSSLProvider.java" ]]; then
44-
echo " Skipping $file (contains security service mappings)"
45-
continue
46-
fi
47-
48-
# Skip certificate and key files
49-
if [[ "$file" =~ \.(pem|crt|cer|der|key)$ ]]; then
50-
echo " Skipping $file (certificate/key file)"
51-
continue
52-
fi
53-
54-
# Skip shell scripts (often have long command lines)
55-
if [[ "$file" =~ \.sh$ ]]; then
56-
echo " Skipping $file (shell script)"
57-
continue
58-
fi
59-
60-
echo "Checking: $file"
61-
62-
# Get added lines with actual file line numbers and check their length
63-
new_line_num=0
64-
git diff "origin/$BASE_BRANCH"...HEAD "$file" | \
65-
while IFS= read -r line; do
66-
# Track line numbers from diff headers - format: @@ -old_start,old_count +new_start,new_count @@
67-
if [[ "$line" =~ ^@@.*\+([0-9]+) ]]; then
68-
# Extract starting line number for new file (after +)
69-
# Subtract 1 because we'll increment before processing first line
70-
new_line_num=$((${BASH_REMATCH[1]} - 1))
71-
elif [[ "$line" =~ ^(\+[^+].*) ]]; then
72-
# This is an added line (not a +++ header)
73-
# Increment line number BEFORE processing (since this line exists in new file)
74-
new_line_num=$((new_line_num + 1))
75-
added_line="${line:1}" # Remove leading +
76-
char_count=${#added_line}
77-
78-
# Skip JNI method signatures and calls to avoid false positives
79-
# These are auto-generated names that can't be shortened
80-
if [[ $char_count -gt 80 ]]; then
81-
# Check if this is a JNI method signature, call, or parameter line that should be ignored
82-
if [[ "$added_line" =~ JNIEXPORT.*JNICALL.*Java_com_wolfssl_ ]] || \
83-
[[ "$added_line" =~ Java_com_wolfssl_.*\( ]] || \
84-
[[ "$added_line" =~ ^[[:space:]]*return[[:space:]]+Java_com_wolfssl_.* ]] || \
85-
[[ "$added_line" =~ ^[[:space:]]*\(JNIEnv\*[[:space:]]+env.*\) ]] || \
86-
[[ "$added_line" =~ ^[[:space:]]*JNIEnv\*[[:space:]]+env.* ]]; then
87-
echo " $file:$new_line_num - Skipping JNI method signature/call/parameters ($char_count characters)"
88-
echo " Line: $added_line"
89-
else
90-
echo " $file:$new_line_num - Line too long ($char_count characters)"
91-
echo " Line: $added_line"
92-
echo "violation" >> "$violations_file"
93-
fi
94-
fi
95-
elif [[ "$line" =~ ^[[:space:]] ]]; then
96-
# Context line (unchanged) - increment new file line number
97-
new_line_num=$((new_line_num + 1))
98-
# Removed lines (starting with -) don't affect new file line numbers
99-
fi
100-
done
101-
fi
102-
done < "$changed_files"
103-
104-
# Count violations
105-
if [[ -f "$violations_file" ]]; then
106-
violation_count=$(grep -c "violation" "$violations_file" || echo 0)
107-
else
108-
violation_count=0
109-
fi
110-
111-
echo "================================================================"
112-
113-
if [[ $violation_count -gt 0 ]]; then
114-
echo " Found $violation_count line(s) exceeding 80 " \
115-
"characters in PR changes"
116-
echo ""
117-
echo "Please ensure all lines are 80 characters or less " \
118-
"as per coding standards."
119-
echo "You can check line length in your editor or use this command:"
120-
echo " grep -n '.\{81,\}' <filename>"
121-
rm -f "$violations_file" "$changed_files"
122-
exit 1
123-
else
124-
echo "All changed lines are within the 80 character limit"
125-
rm -f "$violations_file" "$changed_files"
126-
exit 0
127-
fi
21+
scripts/line-length-check-added-lines.sh "origin/$BASE_BRANCH"
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
#!/usr/bin/env bash
2+
#
3+
# Check for >80-char lines introduced by the current diff, ignoring existing
4+
# long lines.
5+
#
6+
# To run automatically, create one of these files:
7+
# .git/hooks/pre-commit (local checks before commit)
8+
# .git/hooks/pre-push (checks before pushing to remote)
9+
#
10+
# Example hook file content:
11+
# #!/usr/bin/env bash
12+
# set -euo pipefail
13+
# if [[ -z "${BASE_REF:-}" ]]; then
14+
# BASE_REF="master"
15+
# fi
16+
# if [[ -f "scripts/line-length-check-added-lines.sh" ]]; then
17+
# scripts/line-length-check-added-lines.sh "$BASE_REF"
18+
# else
19+
# echo "line-length-check-added-lines.sh not found, skipping line length check"
20+
# fi
21+
22+
set -euo pipefail
23+
24+
BASE_INPUT="${1:-${BASE_BRANCH:-}}"
25+
if [[ -z "$BASE_INPUT" ]]; then
26+
echo "Usage: $0 <base-branch-or-ref>" >&2
27+
echo "Or set BASE_BRANCH in the environment." >&2
28+
exit 2
29+
fi
30+
BASE_REF="$BASE_INPUT"
31+
32+
echo "Checking line length (max 80 characters) against base ref: $BASE_REF"
33+
34+
all_files="$(mktemp)"
35+
long_lines="$(mktemp)"
36+
violations_file="$(mktemp)"
37+
38+
# Scan long lines across repo (tracked files), then filter to the diff.
39+
# Limit to src/, examples/, and native/ directories.
40+
git ls-files -- src examples native > "$all_files"
41+
42+
violation_count=0
43+
44+
while IFS= read -r file; do
45+
if [[ -f "$file" ]]; then
46+
if [[ "$file" == \
47+
"src/java/com/wolfssl/provider/jsse/WolfSSLProvider.java" ]]; then
48+
continue
49+
fi
50+
51+
if [[ "$file" =~ \.(pem|crt|cer|der|key)$ ]]; then
52+
continue
53+
fi
54+
55+
if [[ "$file" =~ \.sh$ ]]; then
56+
continue
57+
fi
58+
59+
if ! LC_ALL=C grep -Iq . "$file"; then
60+
continue
61+
fi
62+
63+
LC_ALL=C awk -v file="$file" \
64+
'length($0) > 80 { print file ":" FNR ":" $0 }' "$file" \
65+
>> "$long_lines"
66+
fi
67+
done < "$all_files"
68+
69+
while IFS= read -r entry; do
70+
file="${entry%%:*}"
71+
rest="${entry#*:}"
72+
line_num="${rest%%:*}"
73+
line_text="${rest#*:}"
74+
75+
if [[ "$file" != "${last_file:-}" ]]; then
76+
if [[ -n "${added_lines_file:-}" ]]; then
77+
rm -f "$added_lines_file"
78+
fi
79+
added_lines_file="$(mktemp)"
80+
git diff -U0 "$BASE_REF"...HEAD -- "$file" | \
81+
awk '
82+
/^@@/ {
83+
if (match($0, /\+[0-9]+/)) {
84+
n = substr($0, RSTART + 1, RLENGTH - 1)
85+
}
86+
next
87+
}
88+
/^\+[^+]/ {
89+
print n
90+
n++
91+
}
92+
' > "$added_lines_file"
93+
last_file="$file"
94+
fi
95+
96+
if grep -qx "$line_num" "$added_lines_file"; then
97+
jni_skip=0
98+
if [[ "$line_text" =~ JNIEXPORT.*JNICALL.*Java_com_wolfssl_ ]]; then
99+
jni_skip=1
100+
elif [[ "$line_text" =~ Java_com_wolfssl_.*\( ]]; then
101+
jni_skip=1
102+
elif [[ "$line_text" =~ \
103+
^[[:space:]]*return[[:space:]]+Java_com_wolfssl_.* ]]; then
104+
jni_skip=1
105+
elif [[ "$line_text" =~ \
106+
^[[:space:]]*\(JNIEnv\*[[:space:]]+env.*\) ]]; then
107+
jni_skip=1
108+
elif [[ "$line_text" =~ ^[[:space:]]*JNIEnv\*[[:space:]]+env.* ]]; then
109+
jni_skip=1
110+
fi
111+
112+
if [[ $jni_skip -eq 1 ]]; then
113+
printf " %s:%s - Skipping JNI line (%d chars)\n" \
114+
"$file" "$line_num" "${#line_text}"
115+
echo " Line: $line_text"
116+
else
117+
printf " %s:%s - Line too long (%d chars)\n" \
118+
"$file" "$line_num" "${#line_text}"
119+
echo " Line: $line_text"
120+
echo "violation" >> "$violations_file"
121+
fi
122+
fi
123+
done < "$long_lines"
124+
125+
if [[ -n "${added_lines_file:-}" ]]; then
126+
rm -f "$added_lines_file"
127+
fi
128+
129+
if [[ -f "$violations_file" ]]; then
130+
violation_count=$(grep -c "violation" "$violations_file" || true)
131+
violation_count=${violation_count:-0}
132+
else
133+
violation_count=0
134+
fi
135+
136+
if [[ $violation_count -gt 0 ]]; then
137+
echo " Found $violation_count line(s) exceeding 80 chars in PR changes"
138+
echo ""
139+
echo "Please ensure all lines are 80 characters or less."
140+
echo "Check line length in your editor or use:"
141+
echo " grep -n '.\{81,\}' <filename>"
142+
rm -f "$violations_file" "$all_files" "$long_lines"
143+
exit 1
144+
else
145+
echo "All changed lines are within the 80 character limit"
146+
rm -f "$violations_file" "$all_files" "$long_lines"
147+
exit 0
148+
fi

0 commit comments

Comments
 (0)