11#! /bin/sh
22set -e
33
4+ # ========== ARQUIVOS TEMPORÁRIOS ==========
45CODENARC_RESULT=" result.txt"
56LINE_VIOLATIONS=" line_violations.txt"
67FILE_VIOLATIONS=" file_violations.txt"
78VIOLATIONS_FLAG=" /tmp/found_violations.txt"
89ALL_DIFF=" /tmp/all_diff.txt"
910CHANGED_LINES_CACHE=" /tmp/changed_lines.txt"
1011CHANGED_FILES_CACHE=" /tmp/changed_files.txt"
12+ TMP_VIOLATIONS=" /tmp/violations.tmp"
1113
1214cleanup_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-
1819trap ' cleanup_temp_files' EXIT
1920
21+ # ========== ETAPA 1 - EXECUTA CODENARC ==========
2022run_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 ==========
3538run_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
5861run_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
10099generate_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() {
119127build_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 ==========
153165get_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 ==========
182195check_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 ==========
228251if [ -n " ${GITHUB_WORKSPACE} " ]; then
229252 cd " ${GITHUB_WORKSPACE} /${INPUT_WORKDIR} " || exit
230253 git config --global --add safe.directory " $GITHUB_WORKSPACE "
0 commit comments