#!/bin/bash #============================================================================== # update-hash.sh — 팀 워크플로우 content_hashes 갱신 스크립트 # # template-common 리포 루트에서 실행한다. # common 파일 + 각 타입별 파일을 결합하여 SHA256 해시를 계산하고 # workflow-version.json의 content_hashes 필드를 갱신한다. # # 사용법: # cd template-common && bash update-hash.sh # # 의존성: curl, python3, shasum #============================================================================== set -e # Gitea URL 읽기 GITEA_URL=$(python3 -c "import json; print(json.load(open('workflow-version.json')).get('gitea_url', 'https://gitea.gc-si.dev'))" 2>/dev/null) if [ -z "$GITEA_URL" ]; then echo "ERROR: workflow-version.json에서 gitea_url을 읽을 수 없습니다." exit 1 fi TYPES=("java-maven" "java-gradle" "react-ts") TYPE_SPECIFIC_FILES=(".claude/rules/code-style.md" ".claude/rules/naming.md" ".claude/rules/testing.md" ".githooks/pre-commit") # 임시 디렉토리 TMPDIR=$(mktemp -d) trap "rm -rf $TMPDIR" EXIT echo "=== 팀 워크플로우 해시 갱신 ===" echo "Gitea URL: $GITEA_URL" echo "" # 1. common 관리 파일을 임시 디렉토리에 복사 MANAGED_DIRS=".claude/rules .claude/agents .claude/scripts .githooks" MANAGED_SKILLS=".claude/skills/push .claude/skills/mr .claude/skills/create-mr .claude/skills/release .claude/skills/version .claude/skills/fix-issue" mkdir -p "$TMPDIR/common" for dir in $MANAGED_DIRS $MANAGED_SKILLS; do if [ -d "$dir" ]; then mkdir -p "$TMPDIR/common/$dir" find "$dir" -type f -exec sh -c 'cp "$1" "'"$TMPDIR/common"'/$1"' _ {} \; fi done COMMON_COUNT=$(cd "$TMPDIR/common" && find . -type f | wc -l | tr -d ' ') echo "Common 파일: ${COMMON_COUNT}개" # 2. 각 타입별 해시 계산 declare -A HASHES for TYPE in "${TYPES[@]}"; do echo "" echo "--- $TYPE ---" # common 파일 복사 rm -rf "$TMPDIR/combined" cp -r "$TMPDIR/common" "$TMPDIR/combined" # 타입별 파일 다운로드 TYPE_COUNT=0 for FILE in "${TYPE_SPECIFIC_FILES[@]}"; do URL="${GITEA_URL}/gc/template-${TYPE}/raw/branch/develop/${FILE}" TARGET="$TMPDIR/combined/$FILE" mkdir -p "$(dirname "$TARGET")" if curl -sf --max-time 10 "$URL" -o "$TARGET" 2>/dev/null; then echo " ✓ $FILE" TYPE_COUNT=$((TYPE_COUNT + 1)) else echo " ✗ $FILE (다운로드 실패, 건너뜀)" fi done # 해시 계산 (find | sort | xargs cat | shasum — 로컬 계산과 동일한 방식) HASH=$(cd "$TMPDIR/combined" && find .claude/rules .claude/agents .claude/scripts .githooks \ .claude/skills/push .claude/skills/mr .claude/skills/create-mr \ .claude/skills/release .claude/skills/version .claude/skills/fix-issue \ -type f 2>/dev/null | sort | xargs cat 2>/dev/null | shasum -a 256 | cut -d' ' -f1) HASHES[$TYPE]=$HASH echo " 타입별 파일: ${TYPE_COUNT}개 추가" echo " 해시: $HASH" done # 3. workflow-version.json 갱신 echo "" echo "=== workflow-version.json 갱신 ===" # Python으로 직접 갱신 (bash 변수 전달) python3 -c " import json hashes = { $(for TYPE in "${TYPES[@]}"; do echo " '${TYPE}': '${HASHES[$TYPE]}'," done) } with open('workflow-version.json', 'r') as f: data = json.load(f) data['content_hashes'] = hashes with open('workflow-version.json', 'w') as f: json.dump(data, f, indent=2, ensure_ascii=False) f.write('\n') print('content_hashes 갱신 완료:') for t, h in hashes.items(): print(f' {t}: {h}') " echo "" echo "✅ 완료. workflow-version.json을 커밋하세요."