| ... | @@ -689,7 +689,10 @@ fn termColor(allocator: *mem.Allocator, input: []const u8) ![]u8 { | ... | @@ -689,7 +689,10 @@ fn termColor(allocator: *mem.Allocator, input: []const u8) ![]u8 { |
| 689 | fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var, zig_exe: []const u8) !void { | 689 | fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var, zig_exe: []const u8) !void { |
| 690 | var code_progress_index: usize = 0; | 690 | var code_progress_index: usize = 0; |
| 691 | | 691 | |
| 692 | const builtin_code = try escapeHtml(allocator, try getBuiltinCode(allocator, zig_exe)); | 692 | var env_map = try os.getEnvMap(allocator); |
| | 693 | try env_map.set("ZIG_DEBUG_COLOR", "1"); |
| | 694 | |
| | 695 | const builtin_code = try escapeHtml(allocator, try getBuiltinCode(allocator, &env_map, zig_exe)); |
| 693 | | 696 | |
| 694 | for (toc.nodes) |node| { | 697 | for (toc.nodes) |node| { |
| 695 | switch (node) { | 698 | switch (node) { |
| ... | @@ -778,12 +781,12 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -778,12 +781,12 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 778 | try build_args.append("c"); | 781 | try build_args.append("c"); |
| 779 | try out.print(" --library c"); | 782 | try out.print(" --library c"); |
| 780 | } | 783 | } |
| 781 | _ = exec(allocator, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); | 784 | _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); |
| 782 | | 785 | |
| 783 | const run_args = [][]const u8{tmp_bin_file_name}; | 786 | const run_args = [][]const u8{tmp_bin_file_name}; |
| 784 | | 787 | |
| 785 | const result = if (expected_outcome == ExpectedOutcome.Fail) blk: { | 788 | const result = if (expected_outcome == ExpectedOutcome.Fail) blk: { |
| 786 | const result = try os.ChildProcess.exec(allocator, run_args, null, null, max_doc_file_size); | 789 | const result = try os.ChildProcess.exec(allocator, run_args, null, &env_map, max_doc_file_size); |
| 787 | switch (result.term) { | 790 | switch (result.term) { |
| 788 | os.ChildProcess.Term.Exited => |exit_code| { | 791 | os.ChildProcess.Term.Exited => |exit_code| { |
| 789 | if (exit_code == 0) { | 792 | if (exit_code == 0) { |
| ... | @@ -799,7 +802,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -799,7 +802,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 799 | } | 802 | } |
| 800 | break :blk result; | 803 | break :blk result; |
| 801 | } else blk: { | 804 | } else blk: { |
| 802 | break :blk exec(allocator, run_args) catch return parseError(tokenizer, code.source_token, "example crashed"); | 805 | break :blk exec(allocator, &env_map, run_args) catch return parseError(tokenizer, code.source_token, "example crashed"); |
| 803 | }; | 806 | }; |
| 804 | | 807 | |
| 805 | const escaped_stderr = try escapeHtml(allocator, result.stderr); | 808 | const escaped_stderr = try escapeHtml(allocator, result.stderr); |
| ... | @@ -845,7 +848,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -845,7 +848,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 845 | "msvc", | 848 | "msvc", |
| 846 | }); | 849 | }); |
| 847 | } | 850 | } |
| 848 | const result = exec(allocator, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed"); | 851 | const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed"); |
| 849 | const escaped_stderr = try escapeHtml(allocator, result.stderr); | 852 | const escaped_stderr = try escapeHtml(allocator, result.stderr); |
| 850 | const escaped_stdout = try escapeHtml(allocator, result.stdout); | 853 | const escaped_stdout = try escapeHtml(allocator, result.stdout); |
| 851 | try out.print("\n{}{}</code></pre>\n", escaped_stderr, escaped_stdout); | 854 | try out.print("\n{}{}</code></pre>\n", escaped_stderr, escaped_stdout); |
| ... | @@ -877,7 +880,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -877,7 +880,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 877 | try out.print(" --release-small"); | 880 | try out.print(" --release-small"); |
| 878 | }, | 881 | }, |
| 879 | } | 882 | } |
| 880 | const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size); | 883 | const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size); |
| 881 | switch (result.term) { | 884 | switch (result.term) { |
| 882 | os.ChildProcess.Term.Exited => |exit_code| { | 885 | os.ChildProcess.Term.Exited => |exit_code| { |
| 883 | if (exit_code == 0) { | 886 | if (exit_code == 0) { |
| ... | @@ -923,7 +926,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -923,7 +926,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 923 | builtin.Mode.ReleaseSmall => try test_args.append("--release-small"), | 926 | builtin.Mode.ReleaseSmall => try test_args.append("--release-small"), |
| 924 | } | 927 | } |
| 925 | | 928 | |
| 926 | const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, null, max_doc_file_size); | 929 | const result = try os.ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size); |
| 927 | switch (result.term) { | 930 | switch (result.term) { |
| 928 | os.ChildProcess.Term.Exited => |exit_code| { | 931 | os.ChildProcess.Term.Exited => |exit_code| { |
| 929 | if (exit_code == 0) { | 932 | if (exit_code == 0) { |
| ... | @@ -1000,7 +1003,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -1000,7 +1003,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1000 | } | 1003 | } |
| 1001 | | 1004 | |
| 1002 | if (maybe_error_match) |error_match| { | 1005 | if (maybe_error_match) |error_match| { |
| 1003 | const result = try os.ChildProcess.exec(allocator, build_args.toSliceConst(), null, null, max_doc_file_size); | 1006 | const result = try os.ChildProcess.exec(allocator, build_args.toSliceConst(), null, &env_map, max_doc_file_size); |
| 1004 | switch (result.term) { | 1007 | switch (result.term) { |
| 1005 | os.ChildProcess.Term.Exited => |exit_code| { | 1008 | os.ChildProcess.Term.Exited => |exit_code| { |
| 1006 | if (exit_code == 0) { | 1009 | if (exit_code == 0) { |
| ... | @@ -1032,7 +1035,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -1032,7 +1035,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1032 | try out.print("</code></pre>\n"); | 1035 | try out.print("</code></pre>\n"); |
| 1033 | } | 1036 | } |
| 1034 | } else { | 1037 | } else { |
| 1035 | _ = exec(allocator, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); | 1038 | _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile"); |
| 1036 | } | 1039 | } |
| 1037 | if (!code.is_inline) { | 1040 | if (!code.is_inline) { |
| 1038 | try out.print("</code></pre>\n"); | 1041 | try out.print("</code></pre>\n"); |
| ... | @@ -1045,8 +1048,8 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var | ... | @@ -1045,8 +1048,8 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var |
| 1045 | } | 1048 | } |
| 1046 | } | 1049 | } |
| 1047 | | 1050 | |
| 1048 | fn exec(allocator: *mem.Allocator, args: []const []const u8) !os.ChildProcess.ExecResult { | 1051 | fn exec(allocator: *mem.Allocator, env_map: *std.BufMap, args: []const []const u8) !os.ChildProcess.ExecResult { |
| 1049 | const result = try os.ChildProcess.exec(allocator, args, null, null, max_doc_file_size); | 1052 | const result = try os.ChildProcess.exec(allocator, args, null, env_map, max_doc_file_size); |
| 1050 | switch (result.term) { | 1053 | switch (result.term) { |
| 1051 | os.ChildProcess.Term.Exited => |exit_code| { | 1054 | os.ChildProcess.Term.Exited => |exit_code| { |
| 1052 | if (exit_code != 0) { | 1055 | if (exit_code != 0) { |
| ... | @@ -1070,8 +1073,8 @@ fn exec(allocator: *mem.Allocator, args: []const []const u8) !os.ChildProcess.Ex | ... | @@ -1070,8 +1073,8 @@ fn exec(allocator: *mem.Allocator, args: []const []const u8) !os.ChildProcess.Ex |
| 1070 | return result; | 1073 | return result; |
| 1071 | } | 1074 | } |
| 1072 | | 1075 | |
| 1073 | fn getBuiltinCode(allocator: *mem.Allocator, zig_exe: []const u8) ![]const u8 { | 1076 | fn getBuiltinCode(allocator: *mem.Allocator, env_map: *std.BufMap, zig_exe: []const u8) ![]const u8 { |
| 1074 | const result = try exec(allocator, []const []const u8{ | 1077 | const result = try exec(allocator, env_map, []const []const u8{ |
| 1075 | zig_exe, | 1078 | zig_exe, |
| 1076 | "builtin", | 1079 | "builtin", |
| 1077 | }); | 1080 | }); |