From f74fde27d140f67ca6cbda97f7d2513c4411c749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vitor=20Ribeiro=20Santos?= <60783014+tbc-joaovitor@users.noreply.github.com> Date: Mon, 20 Jul 2026 19:56:01 -0300 Subject: [PATCH] =?UTF-8?q?fix(protheus):=20advpl-lint=20n=C3=A3o=20deixa?= =?UTF-8?q?=20mais=20lixo=20do=20appre=20no=20repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O hook roda `advpls appre` após todo Write/Edit em .prw/.tlpp. O appre grava 3 arquivos de trabalho por execução — .ppo e .errprw ao lado da fonte e console_error.log no cwd — e o hook nunca os limpava, sujando o repo do projeto. Fix: appre roda com a flag nativa -O e cwd num dir temporário descartável, apagado com rm -rf logo após capturar a saída. O hook só consome stdout/stderr, nunca esses arquivos, então descartá-los é seguro. Includes do PROTHEUS_INCLUDES são absolutizados (realpath) por causa do novo cwd. Validado: suíte tests/hooks/advpl-lint.test.sh (todos passam) + teste end-to-end com binário real TDS-LS 2.0 (antes deixava 3 artefatos, depois zero). Co-Authored-By: Claude Opus 4.8 (1M context) --- protheus/hooks/advpl-lint.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/protheus/hooks/advpl-lint.sh b/protheus/hooks/advpl-lint.sh index 75fbcc9..88b9f6c 100755 --- a/protheus/hooks/advpl-lint.sh +++ b/protheus/hooks/advpl-lint.sh @@ -55,7 +55,9 @@ while [[ "$_dir" != "/" ]]; do IFS=';,' read -ra _paths <<< "$_inc" for _p in "${_paths[@]}"; do _p=$(echo "$_p" | xargs) # trim - [[ -n "$_p" ]] && INCLUDE_FLAGS+=(-I "$_p") + # absolutizar: o appre roda com cwd num dir temporário (ver bloco de execução), + # então include relativo ao projeto precisa virar caminho absoluto aqui + [[ -n "$_p" ]] && INCLUDE_FLAGS+=(-I "$(realpath -m "$_p" 2>/dev/null || echo "$_p")") done fi break @@ -66,13 +68,20 @@ done # timeout interno: sem includes o appre pode TRAVAR (validado com binário real); # stderr capturado à parte — erro de pré-processamento não pode virar "ok" silencioso _ERR=$(mktemp) +# appre grava arquivos de trabalho a cada execução (.ppo e .errprw ao lado da fonte, +# console_error.log no cwd). Rodamos num dir descartável: -O reposiciona .ppo/.errprw e o +# cwd no tmpdir faz o console_error.log cair lá também — nada suja o repo do projeto. +# O hook só consome stdout/stderr; nunca lê esses arquivos, então descartá-los é seguro. +_WORK=$(mktemp -d) +_ABS_FILE=$(realpath "$FILE") if command -v timeout >/dev/null 2>&1; then - RAW=$(timeout 45 "$ADVPLS" appre "$FILE" "${INCLUDE_FLAGS[@]}" 2>"$_ERR") + RAW=$(cd "$_WORK" && timeout 45 "$ADVPLS" appre "$_ABS_FILE" -O "$_WORK" "${INCLUDE_FLAGS[@]}" 2>"$_ERR") _APPRE_RC=$? else - RAW=$("$ADVPLS" appre "$FILE" "${INCLUDE_FLAGS[@]}" 2>"$_ERR") + RAW=$(cd "$_WORK" && "$ADVPLS" appre "$_ABS_FILE" -O "$_WORK" "${INCLUDE_FLAGS[@]}" 2>"$_ERR") _APPRE_RC=$? fi +rm -rf "$_WORK" if [[ $_APPRE_RC -eq 124 ]]; then echo "⚠️ ADVPL LINT: advpls appre excedeu 45s (provável falta de includes) — configure PROTHEUS_INCLUDES= no CLAUDE.md do projeto" rm -f "$_ERR"; exit 0