Skip to content

Commit 0dffcbd

Browse files
committed
feat(codeguard): cobol 接入,57/57 全语言门禁闭合
cobol 穷尽检索后确认无可用格式化器(npm/PyPI/Maven Central/GitHub 全无, 商业方案为 Windows GUI 或商业产品),改用 GnuCOBOL 编译器 cobc 作为 排版规则执行器——COBOL-85 固定格式规定源码必须位于第 7-72 列 (1-6 列为序号区),该列区约定本身就是排版规范, 由编译器强制执行比自建格式化器更可信。 方言双探针解决退出码歧义: cobc 对「列区违规」与「语法错误」一律退 1, 直接使用会把损坏 COBOL 误报为「需重排」。 故分别以 -free(无列区约束)与 -fixed(有列区约束)各编译一次: 两者皆过 → 0 合规 free 过而 fixed 挂 → 1 列区排版违规 两者皆挂 → 2 语法错误,降级为未完成而非格式问题 实测三态正确,check 全程只读(-fsyntax-only 不产出目标文件)。 apply 模式如实拒绝自动修复: cobc 不提供源码重排,固定格式的列区重分配涉及序号区与代码区边界, 自动改写存在改坏语义的风险,故退 2 并给出人工修正或改用自由格式的指引。 口径升级 0.5.0:57/57 全部可执行,planned 排除与显式归口均清零, 新增 wrapper_entries 段落记录 7 条 wrapper 型档案。 矩阵补入 cobol 样本(26 种真实执行 + 31 种诚实降级 = 57 全覆盖), 并修正两处随全接入而失效的断言。 38 测试全绿;clippy 零错误。
1 parent 7e308c8 commit 0dffcbd

6 files changed

Lines changed: 119 additions & 33 deletions

File tree

‎crates/codeguard-cli/tests/format_command_acceptance.rs‎

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,18 @@ fn format_list_reports_integration_status() {
4646
);
4747
}
4848

49-
/// 未接入格式化的语言必须如实返回 not_integrated,不得静默通过。
49+
/// 选中的语言不在注册表内时必须如实拒绝,不得静默通过或伪造报告。
5050
#[test]
51-
fn unintegrated_language_is_disclosed_not_silently_passed() {
52-
let root = ensure_clean_dir("cg-format-unintegrated");
51+
fn unregistered_language_is_explicitly_rejected() {
52+
let root = ensure_clean_dir("cg-format-unregistered");
5353
let output = Command::new(env!("CARGO_BIN_EXE_codeguard"))
54-
.args(["format", "check", "cobol", root.to_str().unwrap(), "--format=json"])
54+
.args([
55+
"format",
56+
"check",
57+
"not-a-registered-language",
58+
root.to_str().unwrap(),
59+
"--format=json",
60+
])
5561
.output()
5662
.expect("无法运行 codeguard format check");
5763
let stdout = String::from_utf8_lossy(&output.stdout);
@@ -60,12 +66,11 @@ fn unintegrated_language_is_disclosed_not_silently_passed() {
6066
assert_eq!(report["status"], "not_integrated");
6167
assert_eq!(report["delivery_decision"], "not_evaluated");
6268
assert_eq!(report["exit_code"], 3);
63-
assert_eq!(output.status.code(), Some(3), "未接入语言应退出 3");
69+
assert_eq!(output.status.code(), Some(3), "未注册语言应退出 3");
70+
// 报告不得凭空出现语言明细(避免伪造「已检查」)
6471
assert!(
65-
report["not_integrated_languages"]
66-
.as_array()
67-
.is_some_and(|langs| langs.iter().any(|l| l == "cobol")),
68-
"应列出未接入语言"
72+
report["languages"].as_array().map(Vec::is_empty).unwrap_or(true),
73+
"未注册语言不得产生语言执行明细"
6974
);
7075
let _ = std::fs::remove_dir_all(&root);
7176
}

‎crates/codeguard-cli/tests/format_gate_full_matrix.rs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,18 @@ const SAMPLES: &[Sample] = &[
9090
file: "Index.ets",
9191
body: "@Entry\n@Component\nstruct Index {\n @State message:string='hi';\n build( ) { }\n}\n",
9292
},
93+
Sample {
94+
language: "cobol",
95+
file: "HELLO.cbl",
96+
body: concat!(
97+
" IDENTIFICATION DIVISION.\n",
98+
"PROGRAM-ID. UGLY.\n",
99+
" PROCEDURE DIVISION.\n",
100+
" MAIN-PARA.\n",
101+
" DISPLAY \"HI\".\n",
102+
" STOP RUN.\n",
103+
),
104+
},
93105
// 路由条目:ansible 无专属格式化器,归口 yaml 通道执行
94106
Sample { language: "ansible", file: "playbook.yml", body: "---\n- name: A\n hosts: all\n tasks: []\n" },
95107
];

0 commit comments

Comments
 (0)