diff options
author | 2023-01-25 02:21:40 -0800 | |
---|---|---|
committer | 2023-01-25 02:21:40 -0800 | |
commit | a8743f0a345e7dea171a474cdc666d5f3070cf23 (patch) | |
tree | 50f70939839bd8c8551893358de88a669c3e861b | |
parent | 468226fc902390bc5c57711fe4d9a3320599f0ab (diff) | |
download | bun-a8743f0a345e7dea171a474cdc666d5f3070cf23.tar.gz bun-a8743f0a345e7dea171a474cdc666d5f3070cf23.tar.zst bun-a8743f0a345e7dea171a474cdc666d5f3070cf23.zip |
Fix "failed to resolve"
-rw-r--r-- | src/install/extract_tarball.zig | 8 | ||||
-rw-r--r-- | src/install/install.zig | 99 |
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{}, |