Skip to content

🐛 修复多设备同步脚本排序错乱 - #1690

Open
CodFrm wants to merge 2 commits into
mainfrom
fix/1682-sync-script-order
Open

🐛 修复多设备同步脚本排序错乱#1690
CodFrm wants to merge 2 commits into
mainfrom
fix/1682-sync-script-order

Conversation

@CodFrm

@CodFrm CodFrm commented Aug 24, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

背景

脚本排序沿用脚本内容的 updatetime 参与状态同步。排序本身没有可靠推进该时钟,且状态中的启用与排序共用同一个冲突维度,导致两台设备通过云同步排序后可能采用过期位置并打乱顺序。10 脚本真实浏览器复现中,期望顺序 6,1,2,3,4,5,7,8,9,10 会收敛为 7,8,9,10,6,1,2,3,4,5

本次改动

  • scriptcat-sync.json 的脚本状态增加可选 sortUpdatetime,将启用状态与排序状态按各自时钟合并。
  • 拖动、置顶和旧排序规范化仅更新位置实际变化的脚本,不修改脚本内容 updatetime
  • 将未同步排序意图持久化到本地 pending_sort_status,Service Worker 重启后继续同步,成功写入对应排序时钟后才清理。
  • 保持连续整数 Script.sort,不增加 Script 字段、数据库表、排序版本号或插入排序模型。
  • 保持双方均无 sortUpdatetime 时原有整条状态 LWW 行为,兼容旧版 scriptcat-sync.json

实现考虑

排序事件和全量同步复用同一云同步任务队列,避免同步写回期间清除更新的排序意图。写回前的二次云端读取分别选择较新的启用状态和排序状态;缺少排序时钟的一侧使用 updatetime 作为兼容回退。

真实浏览器复现还发现历史 sort=-1 会被 getAllScripts() 本地规范化但不进入同步。该路径现在会等待批量写入,并只为位置发生变化的脚本登记排序时钟。

已知限制

  • 真实 provider 验证使用 MinIO S3;本 PR 未使用坚果云/WebDAV 账号重新验证。排序状态合并位于 provider 无关的同步服务层。
  • 全量 Vitest 首轮在并发运行下有 11 个既有测试超过 340ms/850ms timeout;将对应 7 个文件单独一起重跑后 54/54 通过。相关排序与同步测试 162/162 通过。

建议审查重点

  • 新旧 scriptcat-sync.json 混用时的兼容回退及启用/排序双轴合并。
  • pending 排序状态在 Service Worker 重启、写入失败和同步队列竞争下的清理条件。
  • 拖动、置顶和历史排序规范化是否严格只写位置变化的脚本,并保持 Script.updatetime 不变。

关联

Fixes #1682

验证

  • pnpm exec vitest run src/app/service/service_worker/synchronize.test.ts src/app/service/service_worker/script.test.ts — 2 files / 162 tests passed。
  • pnpm run lint — Prettier、TypeScript、i18n、issue templates、ESLint passed。
  • pnpm exec vitest run — 4201 passed;11 个并发 timeout,未出现本改动相关断言失败。
  • pnpm exec vitest run scripts/git-staged-snapshot.test.mjs src/pages/confirm/App.test.tsx src/pages/options/routes/Agent/OPFS/index.test.tsx src/locales/i18n-usage.test.ts tests/runtime/gm_api.test.ts src/app/service/service_worker/trash_event_partition.test.ts src/app/service/agent/service_worker/task_service.test.ts — 首轮 timeout 的 7 files / 54 tests passed。
  • pnpm run dev — MV3 扩展构建成功;有 Monaco 动态 require 的既有 warning。
  • 本地真实 Chrome E2E — 两个隔离 profile、10 个脚本、实际 Service Worker 消息、真实 MinIO、实际鼠标拖拽、快速连续排序、A/B 双向覆盖和浏览器重启均通过;同时确认排序不修改脚本 updatetime
  • git diff --check — passed。

Copy link
Copy Markdown
Collaborator

本次基于原 PR head 8f17ada7baccd3ac686b6a67d91998a31b03dca7 完成 rework;PR 标题和 body 未修改,当前发布 head 为 6d5bb976f87c6640a68baee89be1510019afd4ca

追加修正 commit:

  • 🐛 修正排序同步的时序与 pending 清理:将本地排序 mutation(拖动、置顶、历史排序规范化)与全量同步放入同一个共享队列,避免同步进行 provider I/O 时云端顺序覆盖刚发生的本地排序;同时在排序时钟相等但排序值不同的失败路径保留 pending,并在脚本已不存在时释放无主 pending,防止 stale sort intent 永久残留。

验证结果:

  • pnpm exec vitest run src/app/service/service_worker/synchronize.test.ts src/app/service/service_worker/script.test.ts:2 files / 164 tests passed。
  • pnpm run lint:Prettier、TypeScript、i18n、issue templates、ESLint passed。
  • pnpm run build:MV3 生产构建通过;仅有既有 bundle size 与 Monaco 动态 require warnings。
  • 全量 Vitest:4214 passed,1 个既有基础设施测试因沙箱禁止监听 127.0.0.1listen EPERM)失败;不是本次改动的断言失败。
  • 本次未重新执行真实 provider/Chrome E2E;原 PR body 中已有的 MinIO/浏览器证据未作为本次 rework 的新验证结论。

远端 GitHub Actions 的 test 当前 queued,License Compliance 当前 pending。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 脚本猫启用同步后,脚本排序会乱,似乎是bug?

2 participants