#!/usr/bin/env bash set -euo pipefail # check_generated_drift.sh — детект дрейфа сгенерированного Go-кода. # # Сравнивает ПО СОДЕРЖИМОМУ каталог свежей генерации стенда с рабочей копией # провайдера, из которой возможна прямая сборка: # # generated//go/ <-> provider/internal/resources_gen/ # # Каноническая сборка идёт через 03_build_and_upload_provider.sh (временная # копия со свежесгенерированным кодом). Этот скрипт — детектор: он не даёт # provider/internal/resources_gen незаметно протухнуть (каталог в .gitignore, # поэтому в git status дрейф не виден). # # Использование: # ./TOOLS/scripts/check_generated_drift.sh dev # dev | test | prod # # Выход: 0 — дрейфа нет; 1 — дрейф есть; 2 — ошибка аргументов. STAND="${1:-}" if [[ -z "$STAND" ]]; then echo "Usage: $0 # dev | test | prod" >&2 exit 2 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" GEN_GO_DIR="${ROOT_DIR}/generated/${STAND}/go" PROV_GO_DIR="${ROOT_DIR}/provider/internal/resources_gen" if [[ ! -d "$GEN_GO_DIR" ]]; then echo "ERROR: no generated go for stand '${STAND}': $GEN_GO_DIR" >&2 echo " Run: TOOLS/scripts/02_generate_resources_and_docs_v2.sh --profile TOOLS/config/${STAND}" >&2 exit 2 fi if [[ ! -d "$PROV_GO_DIR" ]]; then echo "DRIFT: provider resources_gen dir missing: $PROV_GO_DIR" >&2 exit 1 fi # Сравнение по содержимому, включая файлы, присутствующие только с одной стороны. if diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >/dev/null; then echo "OK: no drift for stand '${STAND}' (generated go == provider copy)." exit 0 fi echo "DRIFT DETECTED for stand '${STAND}':" >&2 echo " source: $GEN_GO_DIR" >&2 echo " target: $PROV_GO_DIR" >&2 echo "" >&2 echo "Сгенерированный код стенда расходится с рабочей копией провайдера." >&2 echo "Сборка должна идти через 03_build_and_upload_provider.sh (temp-копия);" >&2 echo "provider/internal/resources_gen надо привести в соответствие с generated." >&2 echo "Различия:" >&2 diff -rq "$GEN_GO_DIR" "$PROV_GO_DIR" >&2 || true exit 1