Qiu Yuzhou 67d0afcda1 fix(hooks): 区分 SwiftLint 工具失败与 error 级违规
pre-commit 第 2 关只看 swiftlint 是否非零,把任何非零都报成「SwiftLint
发现 error 级违规」。而 SwiftLint 默认要把缓存 plist 写进
~/Library/Caches,写不进去时它自己以退出码 1 失败,于是受限环境下每次
提交都被拒绝、并被指向代码,实际原因在工具环境。

两处改动:

- 加 --no-cache,直接消灭缓存写入这一失败模式(本关只查几十个暂存文件,
  代价可忽略;task lint 本来就是这么调的)。
- 按退出码分派:0 放行(有 warning 则提示后放行)、2 报「发现 error 级
  违规」、其余报「执行失败(退出码 N)」并点明是工具错误而非代码违规。

不能改用解析输出文本判断:工具错误信息里同样含 "error:"(配置读不了时
输出 error: Could not read file at path ...),只有退出码可靠。退出码映射
(0 = 干净或仅 warning,2 = error 级违规,1 = 内部错误,134 = 配置读不了)
为 swiftlint 0.65.x 实测。

验证:在 /tmp 最小仓库(真钩子 + 真配置 + core.hooksPath)中不解沙箱跑
五个场景——旧钩子对只含 warning 的文件误报为 error 级违规(复现);新钩子
对同一文件放行并提示 warning;error 级违规正确拒绝且 HEAD 未动;配置读不了
时报「执行失败(退出码 134)」而非违规;复原后放行。

根 README 开发钩子一节同步这一区分。钩子只改第 2 关与头部注释。
2026-10-05 20:18:37 +08:00
2017-01-13 13:08:32 +08:00

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。

领域文档语言

本项目的 术语表 和新建 架构决策记录(ADR) 使用简体中文,代码标识符与必要的英文术语保留原文;已有 ADR 保留原文,不作语言迁移。

AI 生成大量文档后,人与机器之间的沟通成为协作瓶颈:人的阅读、理解和审阅速度决定了文档能否有效推动开发。使用简体中文可以降低维护者的认知负荷,提高沟通与审阅效率。

S
Description
No description provided
Readme GPL-3.0
84 MiB
Languages
Swift 95.8%
Python 2.5%
Shell 1.4%
C 0.3%