template-common/update-hash.sh
htlee b6124b7c9d feat: v1.6.1 custom_pre_commit 프로젝트 해시 분기 지원
- content_hashes_custom_precommit 필드 추가 (pre-commit 제외 해시)
- push/mr/release Step 0.5: custom_pre_commit 플래그에 따라 해시 비교 분기
- update-hash.sh: HASH_NO_PC_FILE 초기화 버그 수정 + 두 세트 해시 동시 계산
2026-03-06 15:29:15 +09:00

154 lines
5.0 KiB
Bash

#!/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 (macOS) 또는 sha256sum (Linux)
#==============================================================================
set -e
# shasum 호환 (macOS: shasum, Linux: sha256sum)
if command -v shasum &>/dev/null; then
SHA_CMD="shasum -a 256"
elif command -v sha256sum &>/dev/null; then
SHA_CMD="sha256sum"
else
echo "ERROR: shasum 또는 sha256sum이 필요합니다."
exit 1
fi
# 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"
# 임시 디렉토리
WORK_TMPDIR=$(mktemp -d)
trap "rm -rf $WORK_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 "$WORK_TMPDIR/common"
for dir in $MANAGED_DIRS $MANAGED_SKILLS; do
if [ -d "$dir" ]; then
mkdir -p "$WORK_TMPDIR/common/$dir"
find "$dir" -type f -exec sh -c 'cp "$1" "'"$WORK_TMPDIR/common"'/$1"' _ {} \;
fi
done
COMMON_COUNT=$(cd "$WORK_TMPDIR/common" && find . -type f | wc -l | tr -d ' ')
echo "Common 파일: ${COMMON_COUNT}"
# 2. 각 타입별 해시 계산 → 파일로 저장
HASH_FILE="$WORK_TMPDIR/hashes.json"
HASH_NO_PC_FILE="$WORK_TMPDIR/hashes_no_pc.json"
echo "{" > "$HASH_FILE"
echo "{" > "$HASH_NO_PC_FILE"
FIRST=true
for TYPE in $TYPES; do
echo ""
echo "--- $TYPE ---"
# common 파일 복사
rm -rf "$WORK_TMPDIR/combined"
cp -r "$WORK_TMPDIR/common" "$WORK_TMPDIR/combined"
# 타입별 파일 다운로드
TYPE_COUNT=0
for FILE in $TYPE_SPECIFIC_FILES; do
URL="${GITEA_URL}/gc/template-${TYPE}/raw/branch/develop/${FILE}"
TARGET="$WORK_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 "$WORK_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 | $SHA_CMD | cut -d' ' -f1)
# 해시 계산 — pre-commit 제외 (custom_pre_commit 프로젝트용)
HASH_NO_PC=$(cd "$WORK_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 ! -path '.githooks/pre-commit' 2>/dev/null | sort | xargs cat 2>/dev/null | $SHA_CMD | cut -d' ' -f1)
if [ "$FIRST" = true ]; then
FIRST=false
else
echo "," >> "$HASH_FILE"
echo "," >> "$HASH_NO_PC_FILE"
fi
printf ' "%s": "%s"' "$TYPE" "$HASH" >> "$HASH_FILE"
printf ' "%s": "%s"' "$TYPE" "$HASH_NO_PC" >> "$HASH_NO_PC_FILE"
echo " 타입별 파일: ${TYPE_COUNT}개 추가"
echo " 해시(전체): $HASH"
echo " 해시(pre-commit 제외): $HASH_NO_PC"
done
echo "" >> "$HASH_FILE"
echo "}" >> "$HASH_FILE"
echo "" >> "$HASH_NO_PC_FILE"
echo "}" >> "$HASH_NO_PC_FILE"
# 3. workflow-version.json 갱신
echo ""
echo "=== workflow-version.json 갱신 ==="
python3 -c "
import json
with open('$HASH_FILE', 'r') as f:
hashes = json.load(f)
with open('$HASH_NO_PC_FILE', 'r') as f:
hashes_no_pc = json.load(f)
with open('workflow-version.json', 'r') as f:
data = json.load(f)
data['content_hashes'] = hashes
data['content_hashes_custom_precommit'] = hashes_no_pc
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}')
print()
print('content_hashes_custom_precommit 갱신 완료:')
for t, h in hashes_no_pc.items():
print(f' {t}: {h}')
"
echo ""
echo "✅ 완료. workflow-version.json을 커밋하세요."