13a5e8ab4d90477d92624cdd80169541a69d01b38c6499fadca165fef43a33a5125953b2493a10bcscripts/verify-commit-attribution.py,归属验收脚本),其余为文档与 hub 子模块指针。质检层面:"修复 2 条 / 新增 2 条"均为同一函数因行号漂移产生的位移,净效果为复杂度小幅上升(13→16)而非改善;无 Critical/High 级新增缺陷。git diff 显示 4 个变更单元,其中仅 1 个为可分析代码:
| 文件 | 类型 | 变更说明 |
|---|---|---|
CHANGELOG.md | 文档 | 新增 2026-10-16 条目:重扫验收(9/1–10/15)+ 身份归属治理结论 |
docs/验证记录/2026-10-15-归属与时间口径修复.md | 文档 | 追加「重扫执行与验收结果(2026-10-16)」章节 |
hub | 子模块指针 | 3d6d46e → f3f1276(承载 hub 侧 v1.0.43–v1.0.46 功能,见下方说明) |
scripts/verify-commit-attribution.py | 代码 | 新增 identity_audit() 身份归属巡检 + BOT_EMAILS 机器人名单 + --identity / --alert 模式;调整 main() 分发顺序 |
功能摘要(依据 CHANGELOG,非本次可 diff 代码)
owner/owner/repo 项目命名、从 push.ref 解析分支、无 base 推导改用最早 commit 的 parent、非 refs/heads/* 取默认分支、派发重试 attempts 6→4/退避 8s→5s 软失败止血。--alert cron 退出码)。可分析范围说明:
hub为子模块,父仓库快照中不暴露其内部文件(projects_files返回 0 文件,对子模块git_diff返回 HTTP 500Invalid revision range),因此 hub 内部 3 个版本的代码变更无法在本快照做逐行质量分析,仅能依据 CHANGELOG 描述;建议对 hub 子模块单独做一次扫描。
issues_diff 真实数据)| 严重度 | 规则 | 位置 | 建议 |
|---|---|---|---|
| Medium | 圈复杂度过高 | scripts/verify-commit-attribution.py:105 | consider splitting into smaller functions |
| Medium | 函数过长 | scripts/verify-commit-attribution.py:105 | split into smaller functions, each with single responsibility |
⚠ 重要澄清(请勿误读为净改善):上述 2 条"修复"是行号漂移假象。base 中 main() 位于第 105 行(84 行、复杂度 13);本次在 main() 之前插入了约 63 行的 identity_audit(),把 main() 推到第 181 行。diff 工具按「位置 + 度量」比对,旧的 105 行实例消失被记为"修复",同时 181 行同名同度量实例被记为"新增"(见下节)。同一函数、同一问题,并未真正修复,反而更严重。
本次真实的行为改进(非质量规则捕获,需人工确认)
main() 中 --alert / --identity / --metrics 的分发改到 Gitea token 校验之前。base 里 --metrics 模式也会因缺少 GITEA_TOKEN 而直接 return 2,属真实缺陷;head 已修正(纯指标/巡检模式不再强依赖 Gitea token)。这是一处值得记录的正确性修复。issues_diff 真实数据)| 严重度 | 规则 | 位置 | 度量 | 建议 |
|---|---|---|---|---|
| Medium | 圈复杂度过高 | scripts/verify-commit-attribution.py:181 | count=16(base 为 13) | consider splitting into smaller functions |
| Medium | 函数过长 | scripts/verify-commit-attribution.py:181 | main 93 行(base 为 84 行) | split into smaller functions, each with single responsibility |
补充:head 全量 quality_list 该文件另有一条既有(base 也在、仅行号 78→89 漂移,故不计入 diff 的新增/修复):
[Low/Maintainability] 行过长 @ scripts/verify-commit-attribution.py:89(超过 120 字符)根因:main() 现同时承担「参数定义 + --alert/--identity/--metrics 三种模式分发 + 抽样 SQL 构造 + Gitea 逐 commit 比对 + 结果汇总」五类职责,分支数随新模式增加而上升(16 个分支点、93 行),是本文件唯一实质性的可维护性问题。
identity_audit() 与 SQL 拼接)identity_audit()(约 63 行)本次未触发长度/复杂度阈值(未出现在质量地图),函数内聚度尚可(三块校验:未映射占比 / 机器人名单 / 按人覆盖率),结构清晰。identity_audit() 与既有 metrics() 一致,使用 Python f-string 拼 SQL(BOT_EMAILS 常量、--repo/--employee 等入参)。这是本文件的既有风格,入参均来自可信来源(代码内常量集合 / 运维 CLI 参数),非外部不可信输入,实际注入风险低。
sql_injection 规则存在已登记误报(known_false_positives,共 1 例,对应生产代码 codescan-cli/.../sqlite/query.go,不在本次 diff 内)。本脚本的 f-string 拼接不建议按 Critical 处理;若后续要接入外部输入,应改为参数化查询。main():把「模式分发(--alert/--identity/--metrics)」「抽样 SQL 构造」「逐 commit 比对循环」「结果汇总」抽为独立函数,将复杂度 16 与 93 行降回阈值内,同时消除"位移式修复/新增"的反复。hub 子模块按相同 base→head 单独出增量报告。| 维度 | 结论 |
|---|---|
| 变更面 | 极小(1 个代码文件 + 文档 + 子模块指针) |
| 新增 Critical/High | 无 |
| 新增 Medium | 2 条(均为 main() 复杂度/长度,且是行号位移后重新计入) |
| 真实质量趋势 | 轻微下降:main 复杂度 13→16、行数 84→93;--metrics 免 token 属正确性改进 |
| 建议 | 合并前完成 main() 拆分(1 次重构即可同时消除 2 条 Medium + 1 条 Low);hub 子模块另行补扫 |