aboutsummaryrefslogtreecommitdiff
path: root/src/install/extract_tarball.zig
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2023-07-11 19:14:34 -0700
committerGravatar GitHub <noreply@github.com> 2023-07-11 19:14:34 -0700
commitcbb88672f217a90db1aa1eb29cd92d5d9035b22b (patch)
tree43a00501f3cde495967e116f0b660777051551f8 /src/install/extract_tarball.zig
parent1f900cff453700b19bca2acadfe26da4468c1282 (diff)
parent34b0e7a2bbd8bf8097341cdb0075d0908283e834 (diff)
downloadbun-cbb88672f217a90db1aa1eb29cd92d5d9035b22b.tar.gz
bun-cbb88672f217a90db1aa1eb29cd92d5d9035b22b.tar.zst
bun-cbb88672f217a90db1aa1eb29cd92d5d9035b22b.zip
Merge branch 'main' into jarred/esm-conditionsjarred/esm-conditions
Diffstat (limited to 'src/install/extract_tarball.zig')
-rw-r--r--src/install/extract_tarball.zig137
1 files changed, 57 insertions, 80 deletions
diff --git a/src/install/extract_tarball.zig b/src/install/extract_tarball.zig
index 0e5f8e188..3be00853f 100644
--- a/src/install/extract_tarball.zig
+++ b/src/install/extract_tarball.zig
@@ -157,13 +157,14 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
var tmpdir = this.temp_dir;
var tmpname_buf: [256]u8 = undefined;
const name = this.name.slice();
-
- var basename = this.name.slice();
- if (basename[0] == '@') {
- if (std.mem.indexOfScalar(u8, basename, '/')) |i| {
- basename = basename[i + 1 ..];
+ const basename = brk: {
+ if (name[0] == '@') {
+ if (strings.indexOfChar(name, '/')) |i| {
+ break :brk name[i + 1 ..];
+ }
}
- }
+ break :brk name;
+ };
var resolved: string = "";
var tmpname = try FileSystem.instance.tmpname(basename[0..@min(basename.len, 32)], &tmpname_buf, tgz_bytes.len);
@@ -216,8 +217,8 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
};
var dirname_reader = DirnameReader{ .outdirname = &resolved };
- _ = if (PackageManager.verbose_install)
- try Archive.extractToDir(
+ switch (PackageManager.verbose_install) {
+ inline else => |log| _ = try Archive.extractToDir(
zlib_pool.data.list.items,
extract_destination,
null,
@@ -226,20 +227,9 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
// for GitHub tarballs, the root dir is always <user>-<repo>-<commit_id>
1,
true,
- true,
- )
- else
- try Archive.extractToDir(
- zlib_pool.data.list.items,
- extract_destination,
- null,
- *DirnameReader,
- &dirname_reader,
- // for GitHub tarballs, the root dir is always <user>-<repo>-<commit_id>
- 1,
- true,
- false,
- );
+ log,
+ ),
+ }
// This tag is used to know which version of the package was
// installed from GitHub. package.json version becomes sort of
@@ -252,31 +242,18 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
};
}
},
- else => {
- _ = if (PackageManager.verbose_install)
- try Archive.extractToDir(
- zlib_pool.data.list.items,
- extract_destination,
- null,
- void,
- {},
- // for npm packages, the root dir is always "package"
- 1,
- true,
- true,
- )
- else
- try Archive.extractToDir(
- zlib_pool.data.list.items,
- extract_destination,
- null,
- void,
- {},
- // for npm packages, the root dir is always "package"
- 1,
- true,
- false,
- );
+ else => switch (PackageManager.verbose_install) {
+ inline else => |log| _ = try Archive.extractToDir(
+ zlib_pool.data.list.items,
+ extract_destination,
+ null,
+ void,
+ {},
+ // for npm packages, the root dir is always "package"
+ 1,
+ true,
+ log,
+ ),
},
}
@@ -343,7 +320,7 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
};
// create an index storing each version of a package installed
- if (std.mem.indexOfScalar(u8, basename, '/') == null) create_index: {
+ if (strings.indexOfChar(basename, '/') == null) create_index: {
var index_dir = cache_dir.makeOpenPathIterable(name, .{}) catch break :create_index;
defer index_dir.close();
index_dir.dir.symLink(
@@ -361,39 +338,39 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
var json_path: []u8 = "";
var json_buf: []u8 = "";
var json_len: usize = 0;
- switch (this.resolution.tag) {
- .github, .local_tarball, .remote_tarball => {
- const json_file = final_dir.openFileZ("package.json", .{ .mode = .read_only }) catch |err| {
- this.package_manager.log.addErrorFmt(
- null,
- logger.Loc.Empty,
- this.package_manager.allocator,
- "\"package.json\" for \"{s}\" failed to open: {s}",
- .{ name, @errorName(err) },
- ) catch unreachable;
- return error.InstallFailed;
- };
- defer json_file.close();
- const json_stat = try json_file.stat();
- json_buf = try this.package_manager.allocator.alloc(u8, json_stat.size + 64);
- json_len = try json_file.preadAll(json_buf, 0);
+ if (switch (this.resolution.tag) {
+ // TODO remove extracted files not matching any globs under "files"
+ .github, .local_tarball, .remote_tarball => true,
+ else => this.package_manager.lockfile.trusted_dependencies.contains(@truncate(u32, Semver.String.Builder.stringHash(name))),
+ }) {
+ const json_file = final_dir.openFileZ("package.json", .{ .mode = .read_only }) catch |err| {
+ this.package_manager.log.addErrorFmt(
+ null,
+ logger.Loc.Empty,
+ this.package_manager.allocator,
+ "\"package.json\" for \"{s}\" failed to open: {s}",
+ .{ name, @errorName(err) },
+ ) catch unreachable;
+ return error.InstallFailed;
+ };
+ defer json_file.close();
+ const json_stat = try json_file.stat();
+ json_buf = try this.package_manager.allocator.alloc(u8, json_stat.size + 64);
+ json_len = try json_file.preadAll(json_buf, 0);
- json_path = bun.getFdPath(
- json_file.handle,
- &json_path_buf,
- ) catch |err| {
- this.package_manager.log.addErrorFmt(
- null,
- logger.Loc.Empty,
- this.package_manager.allocator,
- "\"package.json\" for \"{s}\" failed to resolve: {s}",
- .{ name, @errorName(err) },
- ) catch unreachable;
- return error.InstallFailed;
- };
- // TODO remove extracted files not matching any globs under "files"
- },
- else => {},
+ json_path = bun.getFdPath(
+ json_file.handle,
+ &json_path_buf,
+ ) catch |err| {
+ this.package_manager.log.addErrorFmt(
+ null,
+ logger.Loc.Empty,
+ this.package_manager.allocator,
+ "\"package.json\" for \"{s}\" failed to resolve: {s}",
+ .{ name, @errorName(err) },
+ ) catch unreachable;
+ return error.InstallFailed;
+ };
}
const ret_json_path = try FileSystem.instance.dirname_store.append(@TypeOf(json_path), json_path);