From c427685a13a2bb98ccc6944d18bb3e6ee17dcdff Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 6 Mar 2024 18:35:32 -0700 Subject: [PATCH] zig std: implement sources.tar endpoint except for the tar format being correct --- lib/compiler/std-docs.zig | 47 ++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/lib/compiler/std-docs.zig b/lib/compiler/std-docs.zig index f1d0f87add..b14d900901 100644 --- a/lib/compiler/std-docs.zig +++ b/lib/compiler/std-docs.zig @@ -119,7 +119,6 @@ fn serveDocsFile( const file_contents = try context.lib_dir.readFileAlloc(gpa, name, 10 * 1024 * 1024); defer gpa.free(file_contents); try request.respond(file_contents, .{ - .status = .ok, .extra_headers = &.{ .{ .name = "content-type", .value = content_type }, cache_control_header, @@ -128,9 +127,46 @@ fn serveDocsFile( } fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { - _ = request; - _ = context; - @panic("TODO"); + const gpa = context.gpa; + + var send_buffer: [0x4000]u8 = undefined; + var response = request.respondStreaming(.{ + .send_buffer = &send_buffer, + .respond_options = .{ + .extra_headers = &.{ + .{ .name = "content-type", .value = "application/x-tar" }, + cache_control_header, + }, + }, + }); + const w = response.writer(); + try w.writeAll("tar header"); + + var std_dir = try context.lib_dir.openDir("std", .{ .iterate = true }); + defer std_dir.close(); + + var walker = try std_dir.walk(gpa); + defer walker.deinit(); + + while (try walker.next()) |entry| { + switch (entry.kind) { + .file => { + if (!std.mem.endsWith(u8, entry.basename, ".zig")) + continue; + if (std.mem.endsWith(u8, entry.basename, "test.zig")) + continue; + }, + else => continue, + } + + try w.writeAll(entry.path); + + var file = try std_dir.openFile(entry.path, .{}); + defer file.close(); + + try w.writeFile(file); + } + try response.end(); } fn serveWasm( @@ -151,7 +187,6 @@ fn serveWasm( const file_contents = try std.fs.cwd().readFileAlloc(gpa, wasm_binary_path, 10 * 1024 * 1024); defer gpa.free(file_contents); try request.respond(file_contents, .{ - .status = .ok, .extra_headers = &.{ .{ .name = "content-type", .value = "application/wasm" }, cache_control_header, @@ -250,7 +285,7 @@ fn buildWasmBinary( const EbpHdr = std.zig.Server.Message.EmitBinPath; const ebp_hdr = @as(*align(1) const EbpHdr, @ptrCast(body)); if (!ebp_hdr.flags.cache_hit) { - std.log.info("source changes detected; rebuilding wasm component", .{}); + std.log.info("source changes detected; rebuilt wasm component", .{}); } result = try arena.dupe(u8, body[@sizeOf(EbpHdr)..]); },