refactor: 迁移至 bashly CLI 与功能域模块结构

- CLI 定义迁移至 src/bashly.yml(bashly 1.4 生成参数解析),入口收敛为 src/root_command.sh
- 源码按功能域重组:config/storage/integrate/media/pipeline,消除扁平散落
- 新增零依赖测试框架 tests/(123 用例)与 CI 流水线(lint + test + build + 产物一致性)
- build.sh 支持版本单一来源注入与 --check 产物校验;新增 lint.sh(bash -n + shellcheck 零容忍)
- 删除旧单文件 media_organizer.sh 与旧扁平模块
This commit is contained in:
Shuery committed 2026-08-14 22:41:28 +08:00
1 parent d978a13a83
commit 0df07ad0ae
48 files changed
+5813 -6812

No files matched your search

+96
View File
@@ -0,0 +1,96 @@
# ============================================================================
# 账本与冷却模块测试(src/lib/ledger.sh)
# ============================================================================
setup() {
TEST_DIR="$(mktemp -d)"
CACHE_DIR="$TEST_DIR/cache"
DRY_RUN=false
FAIL_RETRY_COOLDOWN_HOURS=1
LEDGER_LINKED=()
LEDGER_INODE=()
COOLDOWN_MAP=()
CORRECTIONS_MAP=()
}
teardown() {
rm -rf "$TEST_DIR"
}
# ledger_mark_linked + ledger_is_linked:标记后判定已链接
test_ledger_mark_and_is_linked() {
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
mkdir -p "$TEST_DIR/dest"
echo data >"$src"
ln "$src" "$dest"
ledger_mark_linked "$src" "$dest"
assert_success ledger_is_linked "$src"
}
# ledger_is_linked:目标被删 → 失效(重新识别)
test_ledger_is_linked_invalid_when_dest_deleted() {
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
mkdir -p "$TEST_DIR/dest"
echo data >"$src"
ln "$src" "$dest"
ledger_mark_linked "$src" "$dest"
rm -f "$dest"
assert_failure ledger_is_linked "$src"
}
# ledger_is_linked:未标记 → 未链接
test_ledger_is_linked_unmarked() {
local src="$TEST_DIR/a.mkv"
echo data >"$src"
assert_failure ledger_is_linked "$src"
}
# cooldown_set + cooldown_active:冷却期内判定
test_cooldown_set_and_active() {
local src="$TEST_DIR/a.mkv"
echo data >"$src"
cooldown_set "$src" "request_failed"
assert_success cooldown_active "$src"
}
# cooldown_active:源文件消失 → 不冷却(允许重试)
test_cooldown_inactive_when_src_gone() {
local src="$TEST_DIR/a.mkv"
echo data >"$src"
cooldown_set "$src" "request_failed"
rm -f "$src"
assert_failure cooldown_active "$src"
}
# cooldown_active:过期 → 不冷却
test_cooldown_inactive_when_expired() {
local src="$TEST_DIR/a.mkv"
echo data >"$src"
COOLDOWN_MAP["$src"]=$(($(date +%s) - 10))
assert_failure cooldown_active "$src"
}
# ledger_flush:落盘 linked.json 并可重新加载
test_ledger_flush_roundtrip() {
local src="$TEST_DIR/a.mkv" dest="$TEST_DIR/dest/a.mkv"
mkdir -p "$TEST_DIR/dest"
echo data >"$src"
ln "$src" "$dest"
ledger_mark_linked "$src" "$dest"
ledger_flush
assert_file_exists "$CACHE_DIR/media_organizer/linked.json"
LEDGER_LINKED=()
LEDGER_INODE=()
ledger_load
assert_success ledger_is_linked "$src"
}
# ledger_flush:干运行零持久化副作用
test_ledger_flush_skipped_in_dry_run() {
local src="$TEST_DIR/a.mkv"
echo data >"$src"
ledger_mark_linked "$src" "$TEST_DIR/dest.mkv"
DRY_RUN=true
ledger_flush
assert_file_absent "$CACHE_DIR/media_organizer/linked.json"
}