play.wenpai.net/scripts/backstop-baseline.sh
elementary-qa a0f3c28a8c BackstopJS 基线按版本管理
新增 backstop-baseline.sh 脚本,支持 save/use/auto/list 操作,
通过符号链接切换 bitmaps_reference 指向不同版本基线。
WPMind v0.11.3 基线已保存。test-plugin 流程自动选择基线。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-19 21:56:50 +08:00

137 lines
5 KiB
Bash
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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.

#!/usr/bin/env bash
# BackstopJS 基线版本管理
# 用法:
# backstop-baseline.sh save <plugin> <version> — 保存当前参考图为指定版本基线
# backstop-baseline.sh use <plugin> <version> — 切换到指定版本基线
# backstop-baseline.sh latest <plugin> — 切换到最新版本基线
# backstop-baseline.sh list [plugin] — 列出可用基线
# backstop-baseline.sh auto <plugin> <version> — 自动选择: 有上一版本用上一版本,没有则用最新
set -euo pipefail
BASELINES_DIR="$HOME/backstop_data/baselines"
REF_DIR="$HOME/backstop_data/bitmaps_reference"
mkdir -p "$BASELINES_DIR"
cmd="${1:-help}"
plugin="${2:-}"
version="${3:-}"
die() { echo "[baseline] ERROR: $1" >&2; exit 1; }
# 版本排序semver 友好)
sorted_versions() {
local p="$1"
ls -1 "$BASELINES_DIR" 2>/dev/null \
| grep "^${p}-" \
| sed "s/^${p}-//" \
| sort -V
}
case "$cmd" in
save)
[ -z "$plugin" ] && die "用法: $0 save <plugin> <version>"
[ -z "$version" ] && die "用法: $0 save <plugin> <version>"
# 确认有参考图可保存
src="$REF_DIR"
[ -L "$src" ] && src="$(readlink -f "$src")"
count=$(find "$src" -maxdepth 1 -name "*.png" 2>/dev/null | wc -l)
[ "$count" -eq 0 ] && die "bitmaps_reference 中没有 PNG 文件"
dest="$BASELINES_DIR/${plugin}-${version}"
mkdir -p "$dest"
cp "$src"/*.png "$dest/"
echo "[baseline] 已保存 ${plugin} v${version} 基线 (${count} 张图片) → $dest"
;;
use)
[ -z "$plugin" ] && die "用法: $0 use <plugin> <version>"
[ -z "$version" ] && die "用法: $0 use <plugin> <version>"
target="$BASELINES_DIR/${plugin}-${version}"
[ ! -d "$target" ] && die "基线不存在: $target"
# 如果当前 bitmaps_reference 是真实目录且有内容,先备份
if [ -d "$REF_DIR" ] && [ ! -L "$REF_DIR" ]; then
count=$(find "$REF_DIR" -maxdepth 1 -name "*.png" 2>/dev/null | wc -l)
if [ "$count" -gt 0 ]; then
backup="$REF_DIR.backup.$(date +%Y%m%d%H%M%S)"
mv "$REF_DIR" "$backup"
echo "[baseline] 已备份原参考图 → $backup"
else
rm -rf "$REF_DIR"
fi
elif [ -L "$REF_DIR" ]; then
rm "$REF_DIR"
fi
ln -sf "$target" "$REF_DIR"
echo "[baseline] 已切换到 ${plugin} v${version} 基线"
;;
latest)
[ -z "$plugin" ] && die "用法: $0 latest <plugin>"
latest_ver=$(sorted_versions "$plugin" | tail -1)
[ -z "$latest_ver" ] && die "没有找到 ${plugin} 的基线"
exec "$0" use "$plugin" "$latest_ver"
;;
auto)
[ -z "$plugin" ] && die "用法: $0 auto <plugin> <new-version>"
[ -z "$version" ] && die "用法: $0 auto <plugin> <new-version>"
# 找到比当前版本小的最新版本
prev_ver=$(sorted_versions "$plugin" | grep -v "^${version}$" | tail -1 || true)
if [ -n "$prev_ver" ]; then
echo "[baseline] 找到上一版本基线: ${plugin} v${prev_ver}"
exec "$0" use "$plugin" "$prev_ver"
else
# 没有历史基线,尝试用最新的
any_ver=$(sorted_versions "$plugin" | tail -1 || true)
if [ -n "$any_ver" ]; then
echo "[baseline] 无上一版本,使用最新基线: ${plugin} v${any_ver}"
exec "$0" use "$plugin" "$any_ver"
else
echo "[baseline] 无可用基线,将以当前参考图运行(首次验收)"
exit 0
fi
fi
;;
list)
if [ -n "$plugin" ]; then
echo "[baseline] ${plugin} 可用基线:"
sorted_versions "$plugin" | while read -r v; do
count=$(find "$BASELINES_DIR/${plugin}-${v}" -name "*.png" | wc -l)
echo " v${v} (${count} 张)"
done
else
echo "[baseline] 所有基线:"
ls -1 "$BASELINES_DIR" 2>/dev/null | while read -r d; do
count=$(find "$BASELINES_DIR/$d" -name "*.png" | wc -l)
echo " $d (${count} 张)"
done
fi
# 显示当前激活的基线
if [ -L "$REF_DIR" ]; then
echo "[baseline] 当前激活: $(readlink "$REF_DIR" | xargs basename)"
else
echo "[baseline] 当前激活: 本地目录 (未关联版本)"
fi
;;
*)
echo "BackstopJS 基线版本管理"
echo ""
echo "用法:"
echo " $0 save <plugin> <version> 保存当前参考图为版本基线"
echo " $0 use <plugin> <version> 切换到指定版本基线"
echo " $0 latest <plugin> 切换到最新版本基线"
echo " $0 auto <plugin> <version> 自动选择上一版本基线"
echo " $0 list [plugin] 列出可用基线"
;;
esac