diff --git a/scripts/check-huobao-upstream.sh b/scripts/check-huobao-upstream.sh new file mode 100755 index 0000000..5a153a5 --- /dev/null +++ b/scripts/check-huobao-upstream.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +REPO_URL="${HUOBAO_WATCH_REPO_URL:-https://github.com/chatfire-AI/huobao-canvas}" +REF_NAME="${HUOBAO_WATCH_REF:-refs/heads/main}" +STATE_DIR="${HUOBAO_WATCH_STATE_DIR:-$ROOT_DIR/.logs/upstream-watch}" +LAST_SHA_FILE="$STATE_DIR/huobao-canvas.last-sha" +LAST_CHECK_FILE="$STATE_DIR/huobao-canvas.last-check" +LATEST_REPORT_FILE="$STATE_DIR/huobao-canvas.latest-update.md" +LOG_FILE="$STATE_DIR/huobao-canvas.watch.log" + +mkdir -p "$STATE_DIR" + +timestamp() { + date "+%Y-%m-%d %H:%M:%S %z" +} + +log() { + printf "%s %s\n" "$(timestamp)" "$*" | tee -a "$LOG_FILE" +} + +notify() { + local title="$1" + local message="$2" + + if [[ "${HUOBAO_WATCH_NOTIFY:-1}" != "1" ]]; then + return 0 + fi + if ! command -v osascript >/dev/null 2>&1; then + return 0 + fi + + /usr/bin/osascript \ + -e 'on run argv' \ + -e 'display notification (item 2 of argv) with title (item 1 of argv)' \ + -e 'end run' \ + "$title" "$message" >/dev/null 2>&1 || true +} + +git_no_proxy() { + git -c http.proxy= -c https.proxy= "$@" +} + +remote_line="$(git_no_proxy ls-remote "$REPO_URL" "$REF_NAME" | head -n 1 || true)" +if [[ -z "$remote_line" ]]; then + log "ERROR failed to query $REPO_URL $REF_NAME" + notify "huobao-canvas 检查失败" "无法读取 GitHub 上游,请看 $LOG_FILE" + exit 1 +fi + +current_sha="$(awk '{print $1}' <<<"$remote_line")" +if [[ -z "$current_sha" ]]; then + log "ERROR empty sha from $REPO_URL $REF_NAME" + notify "huobao-canvas 检查失败" "上游返回空提交号,请看 $LOG_FILE" + exit 1 +fi + +previous_sha="" +if [[ -f "$LAST_SHA_FILE" ]]; then + previous_sha="$(tr -d '[:space:]' < "$LAST_SHA_FILE")" +fi + +printf "%s %s %s\n" "$(timestamp)" "$REPO_URL" "$current_sha" > "$LAST_CHECK_FILE" + +if [[ -z "$previous_sha" ]]; then + printf "%s\n" "$current_sha" > "$LAST_SHA_FILE" + log "initialized huobao-canvas upstream watch at $current_sha" + if [[ "${HUOBAO_WATCH_NOTIFY_ON_INIT:-0}" == "1" ]]; then + notify "huobao-canvas 已开始关注" "当前 main: ${current_sha:0:7}" + fi + exit 0 +fi + +if [[ "$current_sha" == "$previous_sha" ]]; then + log "unchanged huobao-canvas main at ${current_sha:0:7}" + if [[ "${HUOBAO_WATCH_NOTIFY_UNCHANGED:-0}" == "1" ]]; then + notify "huobao-canvas 无更新" "当前 main 仍是 ${current_sha:0:7}" + fi + exit 0 +fi + +tmp_dir="$(mktemp -d "${TMPDIR:-/tmp}/huobao-canvas-watch.XXXXXX")" +cleanup() { + rm -rf "$tmp_dir" +} +trap cleanup EXIT + +repo_dir="$tmp_dir/repo" +git_no_proxy clone --depth=50 "$REPO_URL" "$repo_dir" >/dev/null 2>&1 || { + log "ERROR update detected but failed to clone $REPO_URL" + notify "huobao-canvas 有更新但拉取失败" "${previous_sha:0:7} -> ${current_sha:0:7},请看 $LOG_FILE" + exit 1 +} + +latest_subject="$(git -C "$repo_dir" log -1 --format=%s "$current_sha" 2>/dev/null || echo "unknown commit")" +latest_author="$(git -C "$repo_dir" log -1 --format=%an "$current_sha" 2>/dev/null || echo "unknown author")" +latest_date="$(git -C "$repo_dir" log -1 --date=format-local:"%Y-%m-%d %H:%M:%S %z" --format=%ad "$current_sha" 2>/dev/null || echo "unknown date")" +commit_list="$(git -C "$repo_dir" log --oneline --max-count=20 "$previous_sha..$current_sha" 2>/dev/null || git -C "$repo_dir" log -1 --oneline "$current_sha")" +compare_url="https://github.com/chatfire-AI/huobao-canvas/compare/$previous_sha...$current_sha" + +cat > "$LATEST_REPORT_FILE" < "$LAST_SHA_FILE" +log "UPDATED huobao-canvas ${previous_sha:0:7} -> ${current_sha:0:7}: $latest_subject" +notify "huobao-canvas 有更新" "${previous_sha:0:7} -> ${current_sha:0:7}: $latest_subject" diff --git a/scripts/install-huobao-upstream-watch.sh b/scripts/install-huobao-upstream-watch.sh new file mode 100755 index 0000000..a904f7e --- /dev/null +++ b/scripts/install-huobao-upstream-watch.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +LABEL="com.skg.huobao-canvas.upstream-watch" +SOURCE_PLIST="$ROOT_DIR/scripts/launchd/$LABEL.plist" +INSTALL_DIR="$HOME/Library/LaunchAgents" +INSTALL_PLIST="$INSTALL_DIR/$LABEL.plist" +LAUNCHD_DOMAIN="gui/$(id -u)" +LOG_DIR="$ROOT_DIR/.logs/upstream-watch" + +if [[ ! -f "$SOURCE_PLIST" ]]; then + echo "missing launchd plist: $SOURCE_PLIST" >&2 + exit 1 +fi + +mkdir -p "$INSTALL_DIR" "$LOG_DIR" +cp "$SOURCE_PLIST" "$INSTALL_PLIST" +plutil -lint "$INSTALL_PLIST" >/dev/null + +launchctl bootout "$LAUNCHD_DOMAIN/$LABEL" >/dev/null 2>&1 || true +launchctl bootstrap "$LAUNCHD_DOMAIN" "$INSTALL_PLIST" +launchctl kickstart -k "$LAUNCHD_DOMAIN/$LABEL" + +echo "huobao-canvas upstream watch installed" +echo "label: $LABEL" +echo "schedule: daily 09:30 local time" +echo "plist: $INSTALL_PLIST" +echo "state/logs: $LOG_DIR" diff --git a/scripts/launchd/com.skg.huobao-canvas.upstream-watch.plist b/scripts/launchd/com.skg.huobao-canvas.upstream-watch.plist new file mode 100644 index 0000000..3c98583 --- /dev/null +++ b/scripts/launchd/com.skg.huobao-canvas.upstream-watch.plist @@ -0,0 +1,40 @@ + + + + + Label + com.skg.huobao-canvas.upstream-watch + ProgramArguments + + /bin/zsh + -lc + cd /Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 && exec ./scripts/check-huobao-upstream.sh + + WorkingDirectory + /Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 + EnvironmentVariables + + PATH + /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + HUOBAO_WATCH_NOTIFY + 1 + HUOBAO_WATCH_NOTIFY_UNCHANGED + 0 + + StandardOutPath + /Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证/.logs/upstream-watch/launchd.out.log + StandardErrorPath + /Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证/.logs/upstream-watch/launchd.err.log + RunAtLoad + + StartCalendarInterval + + Hour + 9 + Minute + 30 + + KeepAlive + + +