| ... | @@ -265,6 +265,7 @@ const SeeAlsoItem = struct { | ... | @@ -265,6 +265,7 @@ const SeeAlsoItem = struct { |
| 265 | const ExpectedOutcome = enum { | 265 | const ExpectedOutcome = enum { |
| 266 | Succeed, | 266 | Succeed, |
| 267 | Fail, | 267 | Fail, |
| | 268 | BuildFail, |
| 268 | }; | 269 | }; |
| 269 | | 270 | |
| 270 | const Code = struct { | 271 | const Code = struct { |
| ... | @@ -468,6 +469,8 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc { | ... | @@ -468,6 +469,8 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc { |
| 468 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Succeed }; | 469 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Succeed }; |
| 469 | } else if (mem.eql(u8, code_kind_str, "exe_err")) { | 470 | } else if (mem.eql(u8, code_kind_str, "exe_err")) { |
| 470 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Fail }; | 471 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.Fail }; |
| | 472 | } else if (mem.eql(u8, code_kind_str, "exe_build_err")) { |
| | 473 | code_kind_id = Code.Id{ .Exe = ExpectedOutcome.BuildFail }; |
| 471 | } else if (mem.eql(u8, code_kind_str, "test")) { | 474 | } else if (mem.eql(u8, code_kind_str, "test")) { |
| 472 | code_kind_id = Code.Id.Test; | 475 | code_kind_id = Code.Id.Test; |
| 473 | } else if (mem.eql(u8, code_kind_str, "test_err")) { | 476 | } else if (mem.eql(u8, code_kind_str, "test_err")) { |
| ... | @@ -1025,6 +1028,8 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -1025,6 +1028,8 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1025 | tmp_dir_name, | 1028 | tmp_dir_name, |
| 1026 | "--name", | 1029 | "--name", |
| 1027 | code.name, | 1030 | code.name, |
| | 1031 | "--color", |
| | 1032 | "on", |
| 1028 | }); | 1033 | }); |
| 1029 | try out.print("<pre><code class=\"shell\">$ zig build-exe {}.zig", code.name); | 1034 | try out.print("<pre><code class=\"shell\">$ zig build-exe {}.zig", code.name); |
| 1030 | switch (code.mode) { | 1035 | switch (code.mode) { |
| ... | @@ -1060,6 +1065,39 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -1060,6 +1065,39 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1060 | if (code.target_str) |triple| { | 1065 | if (code.target_str) |triple| { |
| 1061 | try build_args.appendSlice([][]const u8{ "-target", triple }); | 1066 | try build_args.appendSlice([][]const u8{ "-target", triple }); |
| 1062 | } | 1067 | } |
| | 1068 | if (expected_outcome == .BuildFail) { |
| | 1069 | const result = try os.ChildProcess.exec( |
| | 1070 | allocator, |
| | 1071 | build_args.toSliceConst(), |
| | 1072 | null, |
| | 1073 | &env_map, |
| | 1074 | max_doc_file_size, |
| | 1075 | ); |
| | 1076 | switch (result.term) { |
| | 1077 | os.ChildProcess.Term.Exited => |exit_code| { |
| | 1078 | if (exit_code == 0) { |
| | 1079 | warn("{}\nThe following command incorrectly succeeded:\n", result.stderr); |
| | 1080 | for (build_args.toSliceConst()) |arg| |
| | 1081 | warn("{} ", arg) |
| | 1082 | else |
| | 1083 | warn("\n"); |
| | 1084 | return parseError(tokenizer, code.source_token, "example incorrectly compiled"); |
| | 1085 | } |
| | 1086 | }, |
| | 1087 | else => { |
| | 1088 | warn("{}\nThe following command crashed:\n", result.stderr); |
| | 1089 | for (build_args.toSliceConst()) |arg| |
| | 1090 | warn("{} ", arg) |
| | 1091 | else |
| | 1092 | warn("\n"); |
| | 1093 | return parseError(tokenizer, code.source_token, "example compile crashed"); |
| | 1094 | }, |
| | 1095 | } |
| | 1096 | const escaped_stderr = try escapeHtml(allocator, result.stderr); |
| | 1097 | const colored_stderr = try termColor(allocator, escaped_stderr); |
| | 1098 | try out.print("\n{}</code></pre>\n", colored_stderr); |
| | 1099 | break :code_block; |
| | 1100 | } |
| 1063 | _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); | 1101 | _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); |
| 1064 | | 1102 | |
| 1065 | if (code.target_str) |triple| { | 1103 | if (code.target_str) |triple| { |