95 lines
3.4 KiB
Bash
95 lines
3.4 KiB
Bash
#!/bin/bash
|
|
# UserPromptSubmit hook — 보조(fallback) 원격 동기화
|
|
# 변경 이력:
|
|
# - 2026-04-15: 5분 throttle fetch + ff-only merge (초기)
|
|
# - 2026-04-17 AM: throttle 30초 단축 (polling 시도)
|
|
# - 2026-04-17 PM: 300초 복원. PD님 지적 "30초 polling은 네트워크 부하 + 근본 해결 아님".
|
|
# 주 동기화는 scripts/sync_signal.sh (로컬 IPC 시그널) 담당. 본 스크립트는
|
|
# 시그널이 없거나 다른 PC에서 push된 경우를 위한 fallback.
|
|
|
|
THROTTLE_DIR="$HOME/.claude/.burningtimes_throttle"
|
|
mkdir -p "$THROTTLE_DIR" 2>/dev/null
|
|
|
|
GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
|
|
[ -z "$GIT_DIR" ] && exit 0
|
|
|
|
REPO_HASH=$(echo "$GIT_DIR" | sha1sum 2>/dev/null | cut -d' ' -f1)
|
|
THROTTLE_FILE="$THROTTLE_DIR/last_fetch_$REPO_HASH"
|
|
THROTTLE_SECONDS=300 # fallback 역할 — 주 동기화는 sync_signal.sh
|
|
|
|
if [ -f "$THROTTLE_FILE" ]; then
|
|
LAST=$(cat "$THROTTLE_FILE" 2>/dev/null || echo 0)
|
|
NOW=$(date +%s)
|
|
if [ $((NOW - LAST)) -lt $THROTTLE_SECONDS ]; then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
git fetch origin 2>/dev/null
|
|
date +%s > "$THROTTLE_FILE"
|
|
|
|
CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -5)
|
|
if [ -n "$CHANGES" ]; then
|
|
echo "📌 [auto-sync] origin/main 변경 검출:"
|
|
echo "$CHANGES"
|
|
|
|
# 로컬 미커밋 변경 자동 stash (conflict 회피)
|
|
STASHED=0
|
|
if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then
|
|
if git stash push -u -m "auto-sync-$(date +%s)" > /dev/null 2>&1; then
|
|
STASHED=1
|
|
fi
|
|
fi
|
|
|
|
# ff-only 시도 → 실패 시 일반 merge (non-ff) 시도
|
|
if git merge origin/main --no-edit --ff-only 2>/dev/null; then
|
|
echo "✅ 실시간 동기화 완료 (fast-forward)"
|
|
elif git merge origin/main --no-edit 2>/dev/null; then
|
|
echo "✅ 실시간 동기화 완료 (merge commit)"
|
|
else
|
|
echo "⚠️ 자동 merge 실패 — 수동 해결 필요 (git merge origin/main)"
|
|
git merge --abort 2>/dev/null
|
|
fi
|
|
|
|
# stash 복원
|
|
if [ "$STASHED" -eq 1 ]; then
|
|
if git stash pop > /dev/null 2>&1; then
|
|
:
|
|
else
|
|
echo "⚠️ stash pop 실패 — 수동 복원 필요 (git stash list 확인)"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# 소통 허브 inbox 스캔 — 자기 부서 수신 채널에 신규 파일 감지
|
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
if [ -n "$REPO_ROOT" ]; then
|
|
INBOX_HASH_FILE="$THROTTLE_DIR/inbox_hash_$REPO_HASH"
|
|
CURRENT_DIR=$(pwd)
|
|
INBOX_DIRS=""
|
|
case "$CURRENT_DIR" in
|
|
*개발팀*) INBOX_DIRS="$REPO_ROOT/공유/소통/PM→개발팀 $REPO_ROOT/공유/소통/기획팀→개발팀" ;;
|
|
*기획팀*) INBOX_DIRS="$REPO_ROOT/공유/소통/PM→기획팀 $REPO_ROOT/공유/소통/개발팀→기획팀" ;;
|
|
*) INBOX_DIRS="$REPO_ROOT/공유/소통/개발팀→PM $REPO_ROOT/공유/소통/기획팀→PM" ;;
|
|
esac
|
|
|
|
INBOX_FILES=""
|
|
for DIR in $INBOX_DIRS; do
|
|
if [ -d "$DIR" ]; then
|
|
FILES=$(find "$DIR" -maxdepth 1 -name '*.md' -not -name 'README.md' 2>/dev/null | sort)
|
|
INBOX_FILES="$INBOX_FILES$FILES"
|
|
fi
|
|
done
|
|
|
|
if [ -n "$INBOX_FILES" ]; then
|
|
CURRENT_INBOX_HASH=$(echo "$INBOX_FILES" | sha1sum 2>/dev/null | cut -d' ' -f1)
|
|
PREV_INBOX_HASH=$(cat "$INBOX_HASH_FILE" 2>/dev/null)
|
|
if [ "$CURRENT_INBOX_HASH" != "$PREV_INBOX_HASH" ]; then
|
|
COUNT=$(echo "$INBOX_FILES" | grep -c '.md$')
|
|
echo "📬 [inbox] 소통 허브 수신함에 파일 ${COUNT}건 — 확인 필요"
|
|
echo "$CURRENT_INBOX_HASH" > "$INBOX_HASH_FILE"
|
|
fi
|
|
fi
|
|
fi
|
|
exit 0
|