diff options
author | 2021-12-17 23:06:56 -0800 | |
---|---|---|
committer | 2021-12-17 23:06:56 -0800 | |
commit | d4c55557c3e6de29b9676d9ea0e8eda0970cebfc (patch) | |
tree | 3699e79183e5f64c7c7d129b667520e65c3d7ef6 /misctools | |
parent | 0e39174c481adeeb000fe021fa49616906fd9cd8 (diff) | |
download | bun-d4c55557c3e6de29b9676d9ea0e8eda0970cebfc.tar.gz bun-d4c55557c3e6de29b9676d9ea0e8eda0970cebfc.tar.zst bun-d4c55557c3e6de29b9676d9ea0e8eda0970cebfc.zip |
Implement hop archive format
Diffstat (limited to 'misctools')
-rw-r--r-- | misctools/.gitignore | 5 | ||||
-rw-r--r-- | misctools/hop.zig | 105 |
2 files changed, 110 insertions, 0 deletions
diff --git a/misctools/.gitignore b/misctools/.gitignore index bb8850ab6..247e7e6e7 100644 --- a/misctools/.gitignore +++ b/misctools/.gitignore @@ -3,3 +3,8 @@ tgz readlink-getfd readlink-realpath http_bench +httpbench +fetch +tgz2hop +hop +bun.lockb diff --git a/misctools/hop.zig b/misctools/hop.zig new file mode 100644 index 000000000..e7ddf9918 --- /dev/null +++ b/misctools/hop.zig @@ -0,0 +1,105 @@ +const std = @import("std"); + +const path_handler = @import("../src/resolver/resolve_path.zig"); +usingnamespace @import("../src/global.zig"); + +const Archive = @import("../src/libarchive/libarchive.zig").Archive; +const Zlib = @import("../src/zlib.zig"); +const Hop = @import("../src/hop/hop.zig").Library; +const RecognizedExtensions = std.ComptimeStringMap(void, .{ + .{ ".tgz", void{} }, + .{ ".tar", void{} }, + .{ ".gz", void{} }, +}); + +var buf: [32 * 1024 * 1024]u8 = undefined; + +// zig build-exe -Drelease-fast --main-pkg-path ../ ./tgz.zig ../src/deps/zlib/libz.a ../src/deps/libarchive.a -lc -liconv +// zig build-exe -Drelease-fast --main-pkg-path ../ ./tgz.zig ../src/deps/zlib/libz.a ../src/deps/libarchive.a -lc -liconv +pub fn main() anyerror!void { + var stdout_ = std.io.getStdOut(); + var stderr_ = std.io.getStdErr(); + var output_source = Output.Source.init(stdout_, stderr_); + Output.Source.set(&output_source); + defer Output.flush(); + var args = try std.process.argsAlloc(std.heap.c_allocator); + if (args.len == 0) { + Output.prettyErrorln("<r><b>usage<r>: tgz ./tar.gz", .{}); + Output.flush(); + std.os.abort(); + } + + var tarball_path_buf: [std.fs.MAX_PATH_BYTES]u8 = undefined; + var input_file = std.mem.span(args[1]); + var basename = std.fs.path.basename(input_file); + var original_basename = basename; + while (RecognizedExtensions.has(std.fs.path.extension(basename))) { + basename = basename[0 .. basename.len - std.fs.path.extension(basename).len]; + } + + var parts = [_][]const u8{ + std.mem.span(args[args.len - 1]), + }; + + var tarball_path = path_handler.joinAbsStringBuf(try std.process.getCwdAlloc(std.heap.c_allocator), &tarball_path_buf, &parts, .auto); + Output.prettyErrorln("Tarball Path: {s}", .{tarball_path}); + + if (strings.endsWithComptime(original_basename, ".hop")) { + var hop_file = try std.fs.openFileAbsolute(tarball_path, .{ .read = true }); + var archive = try Hop.load(hop_file.handle, default_allocator); + var outpath = std.fs.path.basename(tarball_path); + outpath = outpath[0 .. outpath.len - std.fs.path.extension(outpath).len]; + var outdir = try std.fs.cwd().makeOpenPath(outpath, .{ .iterate = true }); + try archive.extract(outdir, Environment.isDebug); + } else { + var folder = try std.fmt.allocPrintZ(default_allocator, "{s}.hop", .{basename}); + + // var dir = try std.fs.cwd().makeOpenPath(folder, .{ .iterate = true }); + + var tarball = try std.fs.openFileAbsolute(tarball_path, .{ .read = true }); + + var tarball_buf_list = std.ArrayListUnmanaged(u8){}; + + var file_size = try tarball.getEndPos(); + var file_buf: []u8 = undefined; + var file_buf_cap: usize = 0; + + if (file_size < buf.len) { + file_buf = buf[0..try tarball.readAll(&buf)]; + file_buf_cap = buf.len; + } else { + file_buf = try tarball.readToEndAlloc( + std.heap.c_allocator, + file_size, + ); + file_buf_cap = file_buf.len; + } + + if (std.mem.eql(u8, std.fs.path.extension(tarball_path), ".gz") or std.mem.eql(u8, std.fs.path.extension(tarball_path), ".tgz")) { + tarball_buf_list = try std.ArrayListUnmanaged(u8).initCapacity(std.heap.c_allocator, 1024); + var gunzip = try Zlib.ZlibReaderArrayList.init(file_buf, &tarball_buf_list, std.heap.c_allocator); + try gunzip.readAll(); + gunzip.deinit(); + Output.prettyErrorln("Decompressed {d} -> {d}\n", .{ file_buf.len, tarball_buf_list.items.len }); + } else { + tarball_buf_list = std.ArrayListUnmanaged(u8){ .capacity = file_buf.len, .items = file_buf }; + } + + var hop = Hop.Builder.init(default_allocator); + var out = try std.fs.cwd().createFileZ(folder, .{ .truncate = true }); + defer out.close(); + errdefer std.fs.cwd().deleteFileZ(folder) catch {}; + try hop.start(out); + + _ = try Archive.convertToHop( + &hop, + file_buf, + null, + void, + void{}, + 1, + Environment.isDebug, + ); + _ = try hop.done(); + } +} |