diff options
Diffstat (limited to 'src/install')
-rw-r--r-- | src/install/extract_tarball.zig | 2 | ||||
-rw-r--r-- | src/install/install.zig | 26 | ||||
-rw-r--r-- | src/install/npm.zig | 21 |
3 files changed, 29 insertions, 20 deletions
diff --git a/src/install/extract_tarball.zig b/src/install/extract_tarball.zig index 5594ff0b1..22b4d7592 100644 --- a/src/install/extract_tarball.zig +++ b/src/install/extract_tarball.zig @@ -250,7 +250,7 @@ fn extract(this: *const ExtractTarball, tgz_bytes: []const u8) !string { // We return a resolved absolute absolute file path to the cache dir. // To get that directory, we open the directory again. - var final_dir = cache_dir.openDirZ(folder_name, .{ .iterate = true }) catch |err| { + var final_dir = cache_dir.openDirZ(folder_name, .{ .iterate = false }) catch |err| { Output.prettyErrorln( "<r><red>Error {s}<r> failed to verify cache dir for {s}", .{ diff --git a/src/install/install.zig b/src/install/install.zig index a8446efd0..051eec1f4 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -179,9 +179,8 @@ const NetworkTask = struct { binlink: void, }, - pub fn notify(http: *AsyncHTTP, sender: *AsyncHTTP.HTTPSender) void { + pub fn notify(http: *AsyncHTTP) void { PackageManager.instance.network_channel.writeItem(@fieldParentPtr(NetworkTask, "http", http)) catch {}; - sender.onFinish(); } const default_headers_buf: string = "Acceptapplication/vnd.npm.install-v1+json"; @@ -3884,7 +3883,7 @@ pub const PackageManager = struct { pub fn isFolderInCache(this: *PackageManager, folder_path: stringZ) bool { // TODO: is this slow? - var dir = this.getCacheDirectory().openDirZ(folder_path, .{ .iterate = true }) catch return false; + var dir = this.getCacheDirectory().openDirZ(folder_path, .{ .iterate = false }) catch return false; dir.close(); return true; } @@ -4356,11 +4355,6 @@ pub const PackageManager = struct { _ = this.network_dedupe_map.remove(task_id); continue :retry_from_manifests_ptr; } - - // We want to make sure the temporary directory & cache directory are loaded on the main thread - // so that we don't run into weird threading issues - // the call to getCacheDirectory() above handles the cache dir - _ = this.getTemporaryDirectory(); } } @@ -5299,7 +5293,7 @@ pub const PackageManager = struct { comptime params: []const ParamType, ) !*PackageManager { // assume that spawning a thread will take a lil so we do that asap - try NetworkThread.init(); + try NetworkThread.warmup(); var cli = try CommandLineArguments.parse(ctx.allocator, params); @@ -6092,6 +6086,7 @@ pub const PackageManager = struct { std.mem.copy(u8, &node_modules_buf, entry.name); node_modules_buf[entry.name.len] = 0; var buf: [:0]u8 = node_modules_buf[0..entry.name.len :0]; + var file = node_modules_bin.openFileZ(buf, .{ .read = true }) catch { node_modules_bin.deleteFileZ(buf) catch {}; continue :iterator; @@ -6793,6 +6788,9 @@ pub const PackageManager = struct { var deps = &manager.lockfile.buffers.dependencies; var res = &manager.lockfile.buffers.resolutions; + _ = manager.getCacheDirectory(); + _ = manager.getTemporaryDirectory(); + while (std.mem.indexOfScalar(PackageID, remaining, invalid_package_id)) |next_i_| { remaining = remaining[next_i_ + 1 ..]; @@ -6834,6 +6832,11 @@ pub const PackageManager = struct { root = try manager.lockfile.appendPackage(root); manager.root_dependency_list = root.dependencies; + + if (root.dependencies.len > 0) { + _ = manager.getCacheDirectory(); + _ = manager.getTemporaryDirectory(); + } manager.enqueueDependencyList( root.dependencies, true, @@ -6846,6 +6849,11 @@ pub const PackageManager = struct { _ = manager.scheduleNetworkTasks(); if (manager.pending_tasks > 0) { + if (root.dependencies.len > 0) { + _ = manager.getCacheDirectory(); + _ = manager.getTemporaryDirectory(); + } + if (comptime log_level.showProgress()) { manager.downloads_node = try manager.progress.start(ProgressStrings.download(), 0); manager.progress.supports_ansi_escape_codes = Output.enable_ansi_colors_stderr; diff --git a/src/install/npm.zig b/src/install/npm.zig index 61e2b064c..65bf61602 100644 --- a/src/install/npm.zig +++ b/src/install/npm.zig @@ -457,6 +457,16 @@ pub const PackageManifest = struct { } } + fn writeFile(this: *const PackageManifest, tmp_path: [:0]const u8, tmpdir: std.fs.Dir) !void { + var tmpfile = try tmpdir.createFileZ(tmp_path, .{ + .truncate = true, + }); + defer tmpfile.close(); + var writer = tmpfile.writer(); + try Serializer.write(this, @TypeOf(writer), writer); + std.os.fdatasync(tmpfile.handle) catch {}; + } + pub fn save(this: *const PackageManifest, tmpdir: std.fs.Dir, cache_dir: std.fs.Dir) !void { const file_id = std.hash.Wyhash.hash(0, this.name()); var dest_path_buf: [512 + 64]u8 = undefined; @@ -466,16 +476,7 @@ pub const PackageManifest = struct { try dest_path_stream_writer.print("{x}.npm-{x}", .{ file_id, @maximum(std.time.milliTimestamp(), 0) }); try dest_path_stream_writer.writeByte(0); var tmp_path: [:0]u8 = dest_path_buf[0 .. dest_path_stream.pos - 1 :0]; - { - var tmpfile = try tmpdir.createFileZ(tmp_path, .{ - .truncate = true, - }); - var writer = tmpfile.writer(); - try Serializer.write(this, @TypeOf(writer), writer); - std.os.fdatasync(tmpfile.handle) catch {}; - tmpfile.close(); - } - + try writeFile(this, tmp_path, tmpdir); var out_path = std.fmt.bufPrintZ(&out_path_buf, "{x}.npm", .{file_id}) catch unreachable; try std.os.renameatZ(tmpdir.fd, tmp_path, cache_dir.fd, out_path); } |