aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-25 02:21:40 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-25 02:21:40 -0800
commita8743f0a345e7dea171a474cdc666d5f3070cf23 (patch)
tree50f70939839bd8c8551893358de88a669c3e861b
parent468226fc902390bc5c57711fe4d9a3320599f0ab (diff)
downloadbun-a8743f0a345e7dea171a474cdc666d5f3070cf23.tar.gz
bun-a8743f0a345e7dea171a474cdc666d5f3070cf23.tar.zst
bun-a8743f0a345e7dea171a474cdc666d5f3070cf23.zip
Fix "failed to resolve"
-rw-r--r--src/install/extract_tarball.zig8
-rw-r--r--src/install/install.zig99
2 files changed, 77 insertions, 30 deletions
diff --git a/src/install/extract_tarball.zig b/src/install/extract_tarball.zig
index 3447394a9..46695e9bf 100644
--- a/src/install/extract_tarball.zig
+++ b/src/install/extract_tarball.zig
@@ -31,7 +31,7 @@ integrity: Integrity = Integrity{},
url: string = "",
package_manager: *PackageManager,
-pub inline fn run(this: ExtractTarball, bytes: []const u8) !Install.ExtractData {
+pub inline fn run(this: ExtractTarball, task_id: u64, bytes: []const u8) !Install.ExtractData {
if (!this.skip_verify and this.integrity.tag.isSupported()) {
if (!this.integrity.verify(bytes)) {
Output.prettyErrorln("<r><red>Integrity check failed<r> for tarball: {s}", .{this.name.slice()});
@@ -39,7 +39,7 @@ pub inline fn run(this: ExtractTarball, bytes: []const u8) !Install.ExtractData
return error.IntegrityCheckFailed;
}
}
- return this.extract(bytes);
+ return this.extract(bytes, task_id);
}
pub fn buildURL(
@@ -152,7 +152,7 @@ threadlocal var final_path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
threadlocal var folder_name_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
threadlocal var json_path_buf: [bun.MAX_PATH_BYTES]u8 = undefined;
-fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractData {
+fn extract(this: *const ExtractTarball, tgz_bytes: []const u8, task_id: u64) !Install.ExtractData {
var tmpdir = this.temp_dir;
var tmpname_buf: [256]u8 = undefined;
const name = this.name.slice();
@@ -393,6 +393,6 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !Install.ExtractD
.json_path = ret_json_path,
.json_buf = json_buf,
.json_len = json_len,
- .dependency_id = this.dependency_id,
+ .task_id = task_id,
};
}
diff --git a/src/install/install.zig b/src/install/install.zig
index f938b66c4..e92557893 100644
--- a/src/install/install.zig
+++ b/src/install/install.zig
@@ -560,6 +560,7 @@ const Task = struct {
},
.extract => {
const result = this.request.extract.tarball.run(
+ this.id,
this.request.extract.network.response_buffer.toOwnedSliceLeaky(),
) catch |err| {
if (comptime Environment.isDebug) {
@@ -625,7 +626,7 @@ pub const ExtractData = struct {
json_path: string = "",
json_buf: []u8 = "",
json_len: usize = 0,
- dependency_id: PackageID = invalid_package_id,
+ task_id: u64 = 0,
};
const PackageInstall = struct {
@@ -2718,9 +2719,15 @@ pub const PackageManager = struct {
const url = this.allocGitHubURL(&package.resolution.value.github) catch unreachable;
const task_id = Task.Id.forTarball(url);
- if (try this.generateNetworkTaskForTarball(task_id, url, package)) |network_task| {
- network_task.callback.extract.dependency_id = id;
+ var entry = this.task_queue.getOrPutContext(this.allocator, task_id, .{}) catch unreachable;
+ if (!entry.found_existing) {
+ entry.value_ptr.* = TaskCallbackList{};
+ }
+
+ const callback_tag = comptime if (successFn == assignRootResolution) "root_dependency" else "dependency";
+ try entry.value_ptr.append(this.allocator, @unionInit(TaskCallbackContext, callback_tag, id));
+ if (try this.generateNetworkTaskForTarball(task_id, url, package)) |network_task| {
this.setPreinstallState(package.meta.id, this.lockfile, .extracting);
this.enqueueNetworkTask(network_task);
}
@@ -2952,12 +2959,51 @@ pub const PackageManager = struct {
}
}
- fn enqueueDependenciesFromJSON(
+ fn enqueueDependenciesFromJSONForInstall(
+ manager: *PackageManager,
+ package_id: PackageID,
+ data: ExtractData,
+ comptime log_level: Options.LogLevel,
+ ) void {
+ enqueueDependenciesFromJSONInternal(manager, package_id, data, log_level, true);
+ }
+
+ fn enqueueDependenciesFromJSONForResolve(
manager: *PackageManager,
package_id: PackageID,
data: ExtractData,
comptime log_level: Options.LogLevel,
) void {
+ enqueueDependenciesFromJSONInternal(manager, package_id, data, log_level, false);
+ }
+
+ const GitHubResolver = struct {
+ data_: ExtractData,
+ package_name: String,
+ package_name_hash: u64,
+
+ pub fn count(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, _: JSAst.Expr) void {
+ builder.count(this.data_.resolved);
+ }
+
+ pub fn resolveWithPackage(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, pkg: *Package) anyerror!Resolution {
+ pkg.name = this.package_name;
+ pkg.name_hash = this.package_name_hash;
+ var resolution = pkg.resolution;
+ resolution.value.github.resolved = builder.append(String, this.data_.resolved);
+
+ return resolution;
+ }
+ };
+
+ fn enqueueDependenciesFromJSONInternal(
+ manager: *PackageManager,
+ package_id: PackageID,
+ data: ExtractData,
+ comptime log_level: Options.LogLevel,
+ // TODO: turn this into a struct?
+ comptime is_install: bool,
+ ) void {
var package = manager.lockfile.packages.get(package_id);
switch (package.resolution.tag) {
.github => {
@@ -2973,25 +3019,6 @@ pub const PackageManager = struct {
);
package.resolution.value.github.resolved = String{};
- const GitHubResolver = struct {
- data_: ExtractData,
- package_name: String,
- package_name_hash: u64,
-
- pub fn count(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, _: JSAst.Expr) void {
- builder.count(this.data_.resolved);
- }
-
- pub fn resolveWithPackage(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, pkg: *Package) anyerror!Resolution {
- pkg.name = this.package_name;
- pkg.name_hash = this.package_name_hash;
- var resolution = pkg.resolution;
- resolution.value.github.resolved = builder.append(String, this.data_.resolved);
-
- return resolution;
- }
- };
-
var github = GitHubResolver{
.data_ = data,
.package_name = package_name,
@@ -3021,8 +3048,28 @@ pub const PackageManager = struct {
if (package.dependencies.len > 0) {
manager.lockfile.scratch.dependency_list_queue.writeItem(package.dependencies) catch unreachable;
}
- if (data.dependency_id < manager.lockfile.buffers.resolutions.items.len) {
- assignResolution(manager, data.dependency_id, package_id);
+
+ var dependency_list_entry = manager.task_queue.getEntry(data.task_id).?;
+
+ var dependency_list = dependency_list_entry.value_ptr.*;
+ dependency_list_entry.value_ptr.* = .{};
+
+ if (comptime is_install) {
+ manager.processDependencyList(dependency_list, *PackageManager, manager, .{
+ .onExtract = PackageManager.installEnqueuedPackages,
+ .onResolve = void{},
+ .onPackageManifestError = void{},
+ .onPackageDownloadError = void{},
+ .progress_bar = true,
+ }) catch unreachable;
+ } else {
+ manager.processDependencyList(dependency_list, *PackageManager, manager, .{
+ .onExtract = PackageManager.enqueueDependenciesFromJSONForResolve,
+ .onResolve = void{},
+ .onPackageManifestError = void{},
+ .onPackageDownloadError = void{},
+ .progress_bar = true,
+ }) catch unreachable;
}
},
else => {},
@@ -6610,7 +6657,7 @@ pub const PackageManager = struct {
*PackageManager,
manager,
.{
- .onExtract = PackageManager.enqueueDependenciesFromJSON,
+ .onExtract = PackageManager.enqueueDependenciesFromJSONForResolve,
.onResolve = void{},
.onPackageManifestError = void{},
.onPackageDownloadError = void{},