mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-10-31 14:53:49 +00:00
b8e5919bcd8a47baa5ec1f5b40bd9ee3b15ee1b7
Every catalog commit re-expanded the active target and ran the full deploy cycle unconditionally: the status face flashed back to starting, the launch health gate re-probed both local inbounds, and system proxy converged again — even when the derived contract was byte-identical to what was already deployed. Remark edits went further: remarks were part of SslocalServerDocument, so renaming the active server rewrote the contract and signalled sslocal for a change with no runtime effect. The reload predicate is now contract byte equality, shared by both layers (CONTEXT.md: a committed edit that leaves the runtime configuration file's bytes unchanged triggers no runtime convergence work). remarks leave the contract — upstream treats them as optional metadata and the GUI resolves display names from the catalog — so remark-only edits and no-op re-saves derive byte-identical documents. The catalogDidCommit deploy path skips write, signal, health gate and system proxy converge when ProxyRuntimePlan.actions returns empty (registered agent, live wrapper, on-disk contract equals the derived document); disk drift or a dead wrapper keeps the self-healing deploy. Catalog revalidation (candidate skips, target invalidation) still runs on every commit, and explicit intents (activation, switches, settings, launch resync) are untouched. The remark-edit runtime test — which encoded the old behavior as the example of a value change — is replaced by four catalog-convergence cases: remark-only edit and outside-subtree edit stay untouched, group member and active server value edits rewrite and signal. Also repairs the smoke suite, which failed on HEAD before this change: its ACL documents used a sslocal-active.acl path while RuntimeFileStore.write validates against acl-active.ini, so every ACL-bearing case threw before spawning the wrapper. Smoke ACL paths now bind to the store-validated location, and the suite passes 11/11 against real sslocal, confirming upstream accepts the contract without remarks.
ShadowsocksX-NG
🚧 重新实现进行中 —— 本仓库正在使用现代技术栈重写 ShadowsocksX-NG macOS 客户端。
新工程不再通过 git 子模块在仓库内构建依赖,而是直接复制上游项目发布好的可执行文件,以简化构建流程。
目录结构
.
├── ShadowsocksX-NG2/ # 新工程:现代化重写版本(开发中)
└── Legacy/ # 旧版工程完整源码,仅供参考,不保证可构建
旧版工程的功能说明与使用文档见 Legacy/README.md。
开发钩子
新 clone 后,在仓库根目录启用 Git hooks:
git config core.hooksPath .githooks
启用后,pre-commit 只检查暂存区中 ShadowsocksX-NG2/ 下的 .swift 文件:swift format 的结果写回暂存区、不修改工作区;SwiftLint 的 error 级违规拒绝提交,warning 仅提示。Legacy/ 和其他文件跳过;没有 NG2 Swift 文件时直接放行。含有 NG2 Swift 文件但缺少工具时,提交检查失败。工具安装与版本见 ShadowsocksX-NG2/README.md。
Languages
Swift
95.8%
Python
2.5%
Shell
1.4%
C
0.3%