Skip to content

Commit ab51fa5

Browse files
feat(codenarc): adiciona suporte a identificacao de priority via violationMessage
1 parent 0da6997 commit ab51fa5

5 files changed

Lines changed: 301 additions & 96 deletions

File tree

entrypoint.sh

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,30 @@
11
#!/bin/sh
22
set -e
33

4+
# ========== ARQUIVOS TEMPORÁRIOS ==========
45
CODENARC_RESULT="result.txt"
56
LINE_VIOLATIONS="line_violations.txt"
67
FILE_VIOLATIONS="file_violations.txt"
78
VIOLATIONS_FLAG="/tmp/found_violations.txt"
89
ALL_DIFF="/tmp/all_diff.txt"
910
CHANGED_LINES_CACHE="/tmp/changed_lines.txt"
1011
CHANGED_FILES_CACHE="/tmp/changed_files.txt"
12+
TMP_VIOLATIONS="/tmp/violations.tmp"
1113

1214
cleanup_temp_files() {
1315
rm -f "$CODENARC_RESULT" "$LINE_VIOLATIONS" "$FILE_VIOLATIONS" "$VIOLATIONS_FLAG" \
1416
"$ALL_DIFF" "$CHANGED_LINES_CACHE" "$CHANGED_FILES_CACHE" \
15-
"${FILE_VIOLATIONS}.formatted" >/dev/null 2>&1
17+
"${FILE_VIOLATIONS}.formatted" "$TMP_VIOLATIONS" >/dev/null 2>&1
1618
}
17-
1819
trap 'cleanup_temp_files' EXIT
1920

21+
# ========== ETAPA 1 - EXECUTA CODENARC ==========
2022
run_codenarc() {
2123
report="${INPUT_REPORT:-compact:stdout}"
2224
includes_arg=""
23-
25+
2426
[ -n "$INPUT_SOURCE_FILES" ] && includes_arg="-includes=${INPUT_SOURCE_FILES}"
25-
27+
2628
echo "🔍 Executando CodeNarc..."
2729
java -jar /lib/codenarc-all.jar \
2830
-report="$report" \
@@ -32,14 +34,15 @@ run_codenarc() {
3234
> "$CODENARC_RESULT"
3335
}
3436

37+
# ========== ETAPA 2 - REVIEWDOG ==========
3538
run_reviewdog_with_config() {
3639
input_file="$1"
3740
efm="$2"
3841
reporter="$3"
3942
name="$4"
4043
filter_mode="$5"
4144
level="$6"
42-
45+
4346
< "$input_file" reviewdog \
4447
-efm="$efm" \
4548
-reporter="$reporter" \
@@ -57,16 +60,16 @@ separate_violations() {
5760

5861
run_reviewdog() {
5962
echo "📤 Enviando resultados para reviewdog..."
60-
63+
6164
separate_violations
62-
65+
6366
if [ -s "$LINE_VIOLATIONS" ]; then
6467
echo "📤 Enviando violações line-based (${INPUT_REPORTER:-github-pr-check})..."
6568
run_reviewdog_with_config "$LINE_VIOLATIONS" "%f:%l:%m" \
6669
"${INPUT_REPORTER:-github-pr-check}" "codenarc" \
6770
"${INPUT_FILTER_MODE}" "${INPUT_LEVEL}"
6871
fi
69-
72+
7073
if [ -s "$FILE_VIOLATIONS" ]; then
7174
true > "${FILE_VIOLATIONS}.formatted"
7275
while read -r violation; do
@@ -76,33 +79,38 @@ run_reviewdog() {
7679
echo "$violation" | sed 's/:null:/::/'
7780
fi
7881
done < "$FILE_VIOLATIONS" > "${FILE_VIOLATIONS}.formatted"
79-
82+
8083
if [ "${INPUT_REPORTER}" = "local" ]; then
81-
echo "📤 Enviando violações file-based (local)..."
8284
run_reviewdog_with_config "${FILE_VIOLATIONS}.formatted" "%f::%m" \
8385
"local" "codenarc" "nofilter" "${INPUT_LEVEL}"
8486
else
85-
echo "📤 Enviando violações file-based (github-pr-check)..."
8687
run_reviewdog_with_config "${FILE_VIOLATIONS}.formatted" "%f::%m" \
8788
"github-pr-check" "codenarc" "nofilter" "warning"
8889
fi
8990
fi
90-
91-
# fallback se nao houver violacoes categorizadas
91+
9292
if [ ! -s "$LINE_VIOLATIONS" ] && [ ! -s "$FILE_VIOLATIONS" ]; then
93-
echo "📝 Executando reviewdog padrão..."
9493
run_reviewdog_with_config "$CODENARC_RESULT" "%f:%l:%m" \
9594
"${INPUT_REPORTER:-github-pr-check}" "codenarc" \
9695
"${INPUT_FILTER_MODE}" "${INPUT_LEVEL}"
9796
fi
9897
}
9998

10099
generate_git_diff() {
100+
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
101+
echo "⚠️ Diretório não é um repositório Git; nenhuma comparação de diff será feita."
102+
return 0
103+
fi
104+
101105
if [ -n "$GITHUB_BASE_SHA" ] && [ -n "$GITHUB_HEAD_SHA" ]; then
102106
git fetch origin "$GITHUB_BASE_SHA" --depth=1 2>/dev/null || true
103107
git fetch origin "$GITHUB_HEAD_SHA" --depth=1 2>/dev/null || true
104108
git diff -U0 "$GITHUB_BASE_SHA" "$GITHUB_HEAD_SHA" -- '*.groovy'
105109
else
110+
if ! git rev-parse HEAD~1 >/dev/null 2>&1; then
111+
echo "⚠️ Nenhum commit anterior para comparar; diff vazio."
112+
return 0
113+
fi
106114
git diff -U0 HEAD~1 -- '*.groovy'
107115
fi
108116
}
@@ -119,10 +127,13 @@ parse_diff_range() {
119127
build_changed_lines_cache() {
120128
true > "$CHANGED_LINES_CACHE"
121129
true > "$CHANGED_FILES_CACHE"
122-
130+
123131
generate_git_diff > "$ALL_DIFF" 2>/dev/null || true
124-
[ ! -s "$ALL_DIFF" ] && return 0
125-
132+
[ ! -s "$ALL_DIFF" ] && {
133+
echo "ℹ️ Nenhum diff detectado; prosseguindo com cache vazio."
134+
return 0
135+
}
136+
126137
current_file=""
127138
while read -r line; do
128139
case "$line" in
@@ -150,6 +161,7 @@ build_changed_lines_cache() {
150161
done < "$ALL_DIFF"
151162
}
152163

164+
# ========== FUNÇÕES AUXILIARES ==========
153165
get_p1_count() {
154166
p1_count=$(grep -Eo "p1=[0-9]+" "$CODENARC_RESULT" | cut -d'=' -f2 | head -1)
155167
echo "${p1_count:-0}"
@@ -179,52 +191,63 @@ is_file_changed() {
179191
grep -q "^$1$" "$CHANGED_FILES_CACHE"
180192
}
181193

194+
# ========== ETAPA 4 - BLOQUEIO POR P1 ==========
182195
check_blocking_rules() {
183196
echo "🔎 Verificando violações bloqueantes (priority 1)..."
184197

185198
[ ! -f "$CODENARC_RESULT" ] && echo "❌ Resultado não encontrado" && return 1
186-
199+
187200
p1_count=$(get_p1_count)
188-
echo "📊 Total de P1 encontradas: $p1_count"
189-
190-
[ "$p1_count" -eq 0 ] && echo "✅ Nenhuma P1 detectada → merge permitido" && return 0
191-
192-
echo "⚠️ Verificando P1s em linhas alteradas..."
201+
echo "📊 Total de P1 encontradas no resumo: ${p1_count:-0}"
202+
[ "$p1_count" -eq 0 ] && { echo "✅ Nenhuma P1 detectada → merge permitido"; return 0; }
203+
204+
echo "⚙️ Preparando diff..."
193205
build_changed_lines_cache
194-
195206
allowed_patterns=$(get_allowed_patterns)
196-
[ -n "$allowed_patterns" ] && echo "🧩 Analisando apenas arquivos filtrados por INPUT_SOURCE_FILES"
197-
207+
[ -n "$allowed_patterns" ] && echo "🧩 Filtrando por INPUT_SOURCE_FILES"
208+
198209
echo "0" > "$VIOLATIONS_FLAG"
199-
200-
grep -E ':[0-9]+:|:null:|\|\|' "$CODENARC_RESULT" | while IFS=: read -r file line rest; do
210+
grep -E ':[0-9]+:|:null:|\|\|' "$CODENARC_RESULT" > "$TMP_VIOLATIONS" || true
211+
212+
while IFS=: read -r file line rest; do
213+
[ -z "$file" ] && continue
201214
if echo "$file" | grep -q '||'; then
202215
file=$(echo "$file" | cut -d'|' -f1)
203216
line=""
204217
fi
205-
[ -z "$file" ] && continue
206218
file_matches_patterns "$file" "$allowed_patterns" || continue
219+
220+
priority_marker=$(echo "$rest" | grep -o '\[P[0-9]\]' | head -1)
207221

222+
if [ -n "$priority_marker" ]; then
223+
[ "$priority_marker" != "[P1]" ] && continue
224+
fi
225+
208226
if [ -z "$line" ] || [ "$line" = "null" ]; then
209227
if is_file_changed "$file"; then
210-
echo "📍 Violação file-based em arquivo alterado: $file"
211-
echo "1" > "$VIOLATIONS_FLAG" && break
228+
echo "📍 Violação P1 file-based em arquivo alterado: $file"
229+
echo "1" > "$VIOLATIONS_FLAG"
230+
break
212231
fi
213232
elif is_line_changed "$line" "$file"; then
214-
echo "📍 Violação em linha alterada: $file:$line"
215-
echo "1" > "$VIOLATIONS_FLAG" && break
233+
echo "📍 Violação P1 em linha alterada: $file:$line"
234+
echo "1" > "$VIOLATIONS_FLAG"
235+
break
216236
fi
217-
done
218-
237+
done < "$TMP_VIOLATIONS"
238+
239+
rm -f "$TMP_VIOLATIONS"
240+
219241
if [ "$(cat "$VIOLATIONS_FLAG")" -eq 1 ]; then
220-
echo "P1s existem E há violações em linhas alteradas"
221-
echo "💡 Corrija as violacoes ou use o bypass autorizado pelo coordenador."
242+
echo "P1 encontrada em linha/arquivo alterado"
243+
echo "💡 Corrija as violações ou utilize o bypass autorizado."
222244
exit 1
223245
else
224-
echo "P1s existem mas fora das linhas alteradas → merge permitido"
246+
echo "Existência de P1 fora das linhas alteradas → merge permitido"
225247
fi
226248
}
227249

250+
# ========== EXECUÇÃO PRINCIPAL ==========
228251
if [ -n "${GITHUB_WORKSPACE}" ]; then
229252
cd "${GITHUB_WORKSPACE}/${INPUT_WORKDIR}" || exit
230253
git config --global --add safe.directory "$GITHUB_WORKSPACE"

0 commit comments

Comments
 (0)