From f861d0fa8c1d8ae41928d443d2f89fd043474bde Mon Sep 17 00:00:00 2001 From: Denozordec Date: Fri, 25 Sep 2026 23:54:48 +0700 Subject: [PATCH] fix(ci): restore changed-path detection on multi-commit pushes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Push-чекаут в quality-воркфлоу делался с fetch-depth: 2, поэтому BEFORE_SHA (github.event.before) при пуше нескольких коммитов отсутствовал в чекауте, и git diff падал с "fatal: bad object" (exit 128). Чекаут переведён на fetch-depth: 0; перед диффом добавлен guard git cat-file -e: если before недоступен (force-push), шаг не падает, а уходит в полный прогон через empty-diff fallback. --- .gitea/workflows/quality.yaml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitea/workflows/quality.yaml b/.gitea/workflows/quality.yaml index 8243112..69704af 100644 --- a/.gitea/workflows/quality.yaml +++ b/.gitea/workflows/quality.yaml @@ -52,8 +52,10 @@ jobs: fetch-depth: 0 - if: ${{ inputs.is_pull_request == false }} uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + # Полная история: BEFORE_SHA = github.event.before при multi-commit push + # лежит глубже shallow-среза, и git diff падает с "bad object". with: - fetch-depth: 2 + fetch-depth: 0 - id: detect name: Detect changed paths per module env: @@ -94,7 +96,14 @@ jobs: after="${HEAD_SHA:-$(git rev-parse HEAD)}" before="$BEFORE_SHA" if [ -n "$before" ] && [ "$before" != "0000000000000000000000000000000000000000" ]; then - FILES="$(git diff --name-only "$before" "$after")" + # Force-push мог отбросить before; отсутствие объекта — не ошибка, + # а сигнал уйти в полный прогон через пустой diff. + if git cat-file -e "$before^{commit}" 2>/dev/null; then + FILES="$(git diff --name-only "$before" "$after")" + else + echo "BEFORE_SHA $before not found in checkout — full pipeline fallback" + FILES="" + fi elif git rev-parse --verify HEAD~1 >/dev/null 2>&1; then FILES="$(git diff --name-only HEAD~1 HEAD)" else