Files

126 lines
3.3 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# watch.sh — Poll git remote for new commits, pull and re-run on change.
# Usage: ./watch.sh [poll_interval_seconds]
#
# Watches the git remote. On new commits:
# 1. git pull
# 2. pip install -r requirements.txt (if changed)
# 3. Re-run ingestion (if parser/docgen/ingest changed)
# 4. Restart MCP server
#
# Ctrl+C to stop.
set -euo pipefail
POLL_INTERVAL="${1:-10}"
MCP_PID=""
LAST_HASH=""
cleanup() {
echo -e "\n[watch] Shutting down..."
if [ -n "$MCP_PID" ] && kill -0 "$MCP_PID" 2>/dev/null; then
kill "$MCP_PID" 2>/dev/null
echo "[watch] MCP server stopped."
fi
exit 0
}
trap cleanup SIGINT SIGTERM
start_mcp() {
if [ -n "$MCP_PID" ] && kill -0 "$MCP_PID" 2>/dev/null; then
echo "[watch] Stopping MCP server (pid $MCP_PID)..."
kill "$MCP_PID" 2>/dev/null
wait "$MCP_PID" 2>/dev/null || true
fi
echo "[watch] Starting MCP server..."
uv run python mcp_server.py &
MCP_PID=$!
echo "[watch] MCP server started (pid $MCP_PID)"
}
get_local_hash() {
git rev-parse HEAD 2>/dev/null
}
get_remote_hash() {
git ls-remote origin HEAD 2>/dev/null | cut -f1
}
echo "[watch] Developer Intelligence POC — File Watcher"
echo "[watch] Polling every ${POLL_INTERVAL}s for new commits..."
echo ""
# Initial setup — always sync deps on start
echo "[watch] Syncing dependencies..."
uv sync
# Run db migrations
echo "[watch] Running db migrations..."
uv run python -c "from db import init_db; init_db()"
LAST_HASH=$(get_local_hash)
LAST_REQS=$(md5sum requirements.txt pyproject.toml 2>/dev/null || echo "none")
# Start MCP server
if [ -f "devintel.db" ]; then
start_mcp
else
echo "[watch] No database found. Run 'python ingest.py' first, then restart watch.sh"
echo "[watch] Watching for code changes only..."
fi
while true; do
sleep "$POLL_INTERVAL"
# Check remote
REMOTE_HASH=$(get_remote_hash)
if [ -z "$REMOTE_HASH" ]; then
continue
fi
LOCAL_HASH=$(get_local_hash)
if [ "$REMOTE_HASH" = "$LOCAL_HASH" ]; then
continue
fi
echo ""
echo "[watch] New commit detected: ${LOCAL_HASH:0:8}${REMOTE_HASH:0:8}"
echo "[watch] Pulling..."
git pull --ff-only origin master
# Check if requirements changed
NEW_REQS=$(md5sum requirements.txt pyproject.toml 2>/dev/null || echo "none")
if [ "$NEW_REQS" != "$LAST_REQS" ]; then
echo "[watch] Dependencies changed — syncing..."
uv sync
LAST_REQS="$NEW_REQS"
fi
# Always run db migrations
echo "[watch] Running db migrations..."
uv run python -c "from db import init_db; init_db()"
# Check if ingestion code changed
CHANGED_FILES=$(git diff --name-only "$LOCAL_HASH" "$REMOTE_HASH")
NEEDS_REINGEST=false
for f in $CHANGED_FILES; do
case "$f" in
go_parser.py|docgen.py|ingest.py|db.py)
NEEDS_REINGEST=true
;;
esac
done
if [ "$NEEDS_REINGEST" = true ] && [ -f "devintel.db" ]; then
echo "[watch] Ingestion code changed. Re-running ingestion..."
uv run python ingest.py
fi
# Always restart MCP server on any code change
if [ -f "devintel.db" ]; then
start_mcp
fi
echo "[watch] Updated to $(get_local_hash | head -c 8). Watching..."
done