diff options
| author | Igor Anić <igor.anic@gmail.com> | 2024-08-16 07:05:53 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-15 22:05:53 -0700 |
| commit | 72bcc3b7a52a8ce7a582ed205325f761da72a6a5 (patch) | |
| tree | c28796fb8db1093c10f3b27ca8b0980c6103308b /lib/compiler/std-docs.zig | |
| parent | 708414aaf4d88157153cf413137d2cb3c106c3b4 (diff) | |
| download | zig-72bcc3b7a52a8ce7a582ed205325f761da72a6a5.tar.gz zig-72bcc3b7a52a8ce7a582ed205325f761da72a6a5.zip | |
std.tar: add writer (#19603)
Simplifies code in docs creation where we used `std.tar.output.Header`.
Writer uses that Header internally and provides higher level interface.
Updates checksum on write, handles long file names, allows setting mtime and file permission mode. Provides handy interface for passing `Dir.WalkerEntry`.
Diffstat (limited to 'lib/compiler/std-docs.zig')
| -rw-r--r-- | lib/compiler/std-docs.zig | 40 |
1 files changed, 8 insertions, 32 deletions
diff --git a/lib/compiler/std-docs.zig b/lib/compiler/std-docs.zig index c11665101c..4cfdf9b1e3 100644 --- a/lib/compiler/std-docs.zig +++ b/lib/compiler/std-docs.zig @@ -181,7 +181,6 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { }, }, }); - const w = response.writer(); var std_dir = try context.lib_dir.openDir("std", .{ .iterate = true }); defer std_dir.close(); @@ -189,6 +188,9 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { var walker = try std_dir.walk(gpa); defer walker.deinit(); + var archiver = std.tar.writer(response.writer()); + archiver.prefix = "std"; + while (try walker.next()) |entry| { switch (entry.kind) { .file => { @@ -199,47 +201,21 @@ fn serveSourcesTar(request: *std.http.Server.Request, context: *Context) !void { }, else => continue, } - - var file = try std_dir.openFile(entry.path, .{}); + var file = try entry.dir.openFile(entry.basename, .{}); defer file.close(); - - const stat = try file.stat(); - const padding = p: { - const remainder = stat.size % 512; - break :p if (remainder > 0) 512 - remainder else 0; - }; - - var file_header = std.tar.output.Header.init(); - file_header.typeflag = .regular; - try file_header.setPath("std", entry.path); - try file_header.setSize(stat.size); - try file_header.updateChecksum(); - try w.writeAll(std.mem.asBytes(&file_header)); - try w.writeFile(file); - try w.writeByteNTimes(0, padding); + try archiver.writeFile(entry.path, file); } { // Since this command is JIT compiled, the builtin module available in // this source file corresponds to the user's host system. const builtin_zig = @embedFile("builtin"); - - var file_header = std.tar.output.Header.init(); - file_header.typeflag = .regular; - try file_header.setPath("builtin", "builtin.zig"); - try file_header.setSize(builtin_zig.len); - try file_header.updateChecksum(); - try w.writeAll(std.mem.asBytes(&file_header)); - try w.writeAll(builtin_zig); - const padding = p: { - const remainder = builtin_zig.len % 512; - break :p if (remainder > 0) 512 - remainder else 0; - }; - try w.writeByteNTimes(0, padding); + archiver.prefix = "builtin"; + try archiver.writeFileBytes("builtin.zig", builtin_zig, .{}); } // intentionally omitting the pointless trailer - //try w.writeByteNTimes(0, 512 * 2); + //try archiver.finish(); try response.end(); } |
