#!/usr/bin/env bash # ============================================================================= # QMDSearch 文件变化监视器(纯轮询,无需 fswatch / inotifywait) # # 作用:持续监听仓库代码变化,实现「每次更新代码后自动检测」。 # - 默认模式:检测到变化 → 本地跑测试 + 前端预构建 → 提示你运行 deploy.sh # - --auto 模式:检测到变化 → 直接调用 ./scripts/deploy.sh 全自动部署 # (注意:--auto 会在保存即提交推送,慎用,建议确认改动完整后再用) # # 用法: # ./scripts/watch.sh 监听并本地校验,提示部署 # ./scripts/watch.sh --auto 监听变化后全自动部署 # ./scripts/watch.sh --interval 5 轮询间隔秒数(默认 3) # ============================================================================= set -uo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT" AUTO=0 INTERVAL=3 while [[ $# -gt 0 ]]; do case "$1" in --auto) AUTO=1 ;; --interval) INTERVAL="${2:-3}"; shift ;; *) echo "未知参数: $1"; exit 2 ;; esac shift done SNAPSHOT="$(mktemp)" record(){ git status --porcelain > "$SNAPSHOT"; } record if [[ "$AUTO" -eq 1 ]]; then echo "[watch] 监听 $ROOT(AUTO 模式:变化即部署,间隔 ${INTERVAL}s,Ctrl-C 退出)" else echo "[watch] 监听 $ROOT(校验模式:变化即本地校验并提示,间隔 ${INTERVAL}s,Ctrl-C 退出)" fi while true; do sleep "$INTERVAL" if ! git status --porcelain | diff -q - "$SNAPSHOT" >/dev/null 2>&1; then echo "[watch] $(date '+%H:%M:%S') 检测到代码变化" if [[ "$AUTO" -eq 1 ]]; then bash "$ROOT/scripts/deploy.sh" else echo "[watch] 运行本地校验..." uv run pytest -q --no-header 2>&1 | tail -n 10 || true if git status --porcelain | awk '{print $2}' | grep -qE '^frontend/'; then echo "[watch] 前端变化,本地预构建..." (cd frontend && npm ci --no-audit --no-fund && npm run build) 2>&1 | tail -n 5 || true fi echo "[watch] 校验完成。确认无误后运行: ./scripts/deploy.sh" fi record fi done