BurningTimesAi/scripts/unity_auto_sync.sh

166 lines
5.8 KiB
Bash
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# unity_auto_sync.sh — Unity 프로젝트 git 자동 sync (BT5-Dev C안, 2026-04-23 PD 승인)
# Unity Editor GitAutoSync.cs(Process.Start) → 본 스크립트 호출 → 실제 git 작업
#
# 용법: unity_auto_sync.sh {init|pull|push|status}
#
# 경로 규약 (C34-11):
# UNITY_PROJECT_ROOT = paths.local.json 에서 읽음 (PC별 실값)
# UNITY_GIT_REMOTE = paths.local.json 에서 읽음 (Gitea 레포)
# BT 본 레포 루트는 git rev-parse 또는 BURNINGTIMES_ROOT 환경변수
set -u
ACTION="${1:-status}"
# BT 본 레포 루트 결정 — Unity Editor 호출 시 cwd=Unity 레포이므로 git rev-parse가 오판
# 탐색 순서: 환경변수 > 고정 경로 후보 > git rev-parse (fallback)
if [ -n "${BURNINGTIMES_ROOT:-}" ] && [ -d "$BURNINGTIMES_ROOT" ]; then
REPO_ROOT="$BURNINGTIMES_ROOT"
elif [ -d "E:/BurningTimes" ]; then
REPO_ROOT="E:/BurningTimes"
elif [ -d "$HOME/BurningTimes" ]; then
REPO_ROOT="$HOME/BurningTimes"
else
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
fi
if [ -z "$REPO_ROOT" ] || [ ! -d "$REPO_ROOT" ]; then
echo "❌ BT 본 레포 찾지 못함 — BURNINGTIMES_ROOT 환경변수 설정 필요" >&2
exit 2
fi
# paths.local.json 로드
PATHS_FILE="$REPO_ROOT/paths.local.json"
if [ ! -f "$PATHS_FILE" ]; then
echo "❌ paths.local.json 부재 — template 복사 후 값 입력 필요" >&2
exit 3
fi
# JSON 파싱 (jq 있으면 활용, 없으면 grep)
read_json() {
local key="$1"
if command -v jq >/dev/null 2>&1; then
jq -r ".${key} // empty" "$PATHS_FILE" 2>/dev/null
else
grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" "$PATHS_FILE" 2>/dev/null \
| sed 's/.*"\([^"]*\)"$/\1/'
fi
}
UNITY_ROOT=$(read_json "UNITY_PROJECT_ROOT")
UNITY_REMOTE=$(read_json "UNITY_GIT_REMOTE")
if [ -z "$UNITY_ROOT" ] || [ "$UNITY_ROOT" = "__SET_PER_PC__" ]; then
echo "❌ UNITY_PROJECT_ROOT 미설정 — paths.local.json 편집 필요" >&2
exit 4
fi
if [ ! -d "$UNITY_ROOT" ]; then
echo "❌ Unity 프로젝트 경로 부재: $UNITY_ROOT" >&2
exit 5
fi
# 로그 디렉토리 (BT C34-17 audit 중앙 저장소 연계)
LOG_DIR="$HOME/.claude/burningtimes-audit/unity_sync"
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/$(date +%Y-%m-%d).log"
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
cd "$UNITY_ROOT" || { echo "❌ cd 실패: $UNITY_ROOT" >&2; exit 6; }
# git 레포 미초기화 판정
if [ ! -d ".git" ]; then
if [ "$ACTION" = "init" ]; then
log "▶️ git init — Unity 프로젝트 레포 초기화"
git init -b main 2>&1 | tee -a "$LOG_FILE"
# Unity 표준 .gitignore·.gitattributes는 스크립트 외부에서 사전 배치 (Claude Code 직접 작성)
if [ -n "$UNITY_REMOTE" ] && [ "$UNITY_REMOTE" != "__SET_PER_PC__" ]; then
git remote add origin "$UNITY_REMOTE" 2>&1 | tee -a "$LOG_FILE"
log "✅ init + remote 설정 완료 (origin: $UNITY_REMOTE)"
else
log "⚠️ UNITY_GIT_REMOTE 미설정 — Gitea 레포 생성 후 수동 add 필요"
fi
log "📌 다음 단계: git add -A && git commit && push"
exit 0
else
echo "❌ Unity 프로젝트 git 레포 아님. 'init' 먼저 수행" >&2
exit 7
fi
fi
case "$ACTION" in
pull)
log "▶️ pull"
if git fetch origin 2>&1 | tee -a "$LOG_FILE" \
&& git merge --ff-only origin/main 2>&1 | tee -a "$LOG_FILE"; then
log "✅ pull 완료"
exit 0
else
log "❌ pull 실패 (충돌/네트워크/레포 미생성 가능) — 수동 개입 필요"
exit 8
fi
;;
push)
log "▶️ push — add + commit + push"
git add -A 2>&1 | tee -a "$LOG_FILE"
if git diff --cached --quiet; then
log " 스테이징 변경 없음"
# 선행 commit 있으면 push
if git log origin/main..HEAD --oneline 2>/dev/null | grep -q .; then
log "▶️ 로컬 선행 commit push 시도"
if git push origin main 2>&1 | tee -a "$LOG_FILE"; then
log "✅ 선행 commit push 완료"
exit 0
fi
fi
log " push 대상 없음 — 정상 종료"
exit 0
fi
# 현재 scene 추정 (Unity EditorBuildSettings 기반)
SCENE="unknown"
if [ -f "ProjectSettings/EditorBuildSettings.asset" ]; then
SCENE=$(grep -m1 "path:" "ProjectSettings/EditorBuildSettings.asset" 2>/dev/null \
| sed 's|.*path: ||;s|\.unity.*||;s|.*/||' || echo "unknown")
fi
N_FILES=$(git diff --cached --name-only | wc -l | tr -d ' ')
MSG="auto: $(date +'%Y-%m-%d %H:%M') · scene: ${SCENE:-unknown} · ${N_FILES} files"
git commit -m "$MSG" 2>&1 | tee -a "$LOG_FILE"
if git push origin main 2>&1 | tee -a "$LOG_FILE"; then
log "✅ push 완료: $MSG"
exit 0
else
log "❌ push 실패 — 로컬 commit 유지, 네트워크/원격 확인 필요"
exit 9
fi
;;
status)
log "▶️ status"
git status --short 2>&1 | tee -a "$LOG_FILE"
echo "--- 최근 3개 commit ---" | tee -a "$LOG_FILE"
git log -3 --oneline 2>&1 | tee -a "$LOG_FILE"
exit 0
;;
*)
cat <<EOF >&2
Usage: unity_auto_sync.sh {init|pull|push|status}
Actions:
init — git 레포 초기화 + remote 설정 (.gitignore/.gitattributes는 사전 배치)
pull — fetch + ff-only merge (충돌 시 중단)
push — add + commit(자동 메시지) + push
status — 작업 트리 상태 + 최근 3개 commit
Prerequisite:
paths.local.json 의 UNITY_PROJECT_ROOT · UNITY_GIT_REMOTE 설정 필수
EOF
exit 1
;;
esac