diff options
author | 2023-06-25 04:52:43 -0700 | |
---|---|---|
committer | 2023-06-25 04:52:43 -0700 | |
commit | c4c714f10b033d1317cc609ded7310d3b0e2a8cc (patch) | |
tree | 475be8a6ccf9a18ef3eff1015a406c8a6b003080 /src | |
parent | f8abd167d86b94da817d91631ef0137b019a9999 (diff) | |
download | bun-c4c714f10b033d1317cc609ded7310d3b0e2a8cc.tar.gz bun-c4c714f10b033d1317cc609ded7310d3b0e2a8cc.tar.zst bun-c4c714f10b033d1317cc609ded7310d3b0e2a8cc.zip |
Speculative fix for regression causing a hang with `install --production` (#3400)
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/install/lockfile.zig | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/src/install/lockfile.zig b/src/install/lockfile.zig index 04c6ccec1..ce9199ab3 100644 --- a/src/install/lockfile.zig +++ b/src/install/lockfile.zig @@ -343,31 +343,23 @@ pub const Tree = struct { dependencies: []const Dependency, resolution_lists: []const Lockfile.DependencyIDSlice, queue: Lockfile.TreeFiller, - log: ?*logger.Log = null, - old_lockfile: ?*Lockfile = null, + log: *logger.Log, + old_lockfile: *Lockfile, pub fn maybeReportError(this: *Builder, comptime fmt: string, args: anytype) void { - var log = this.log orelse return; - if (this.old_lockfile == null) return; - - log.addErrorFmt(null, logger.Loc.Empty, this.allocator, fmt, args) catch {}; + this.log.addErrorFmt(null, logger.Loc.Empty, this.allocator, fmt, args) catch {}; } pub fn buf(this: *const Builder) []const u8 { - var lockfile = this.old_lockfile orelse return ""; - return lockfile.buffers.string_bytes.items; + return this.old_lockfile.buffers.string_bytes.items; } pub fn packageName(this: *Builder, id: PackageID) String.Formatter { - var lockfile = this.old_lockfile orelse return undefined; - - return lockfile.packages.items(.name)[id].fmt(lockfile.buffers.string_bytes.items); + return this.old_lockfile.packages.items(.name)[id].fmt(this.old_lockfile.buffers.string_bytes.items); } pub fn packageVersion(this: *Builder, id: PackageID) Resolution.Formatter { - var lockfile = this.old_lockfile orelse return undefined; - - return lockfile.packages.items(.resolution)[id].fmt(lockfile.buffers.string_bytes.items); + return this.old_lockfile.packages.items(.resolution)[id].fmt(this.old_lockfile.buffers.string_bytes.items); } pub const Entry = struct { @@ -499,15 +491,14 @@ pub const Tree = struct { if (dep.name_hash != dependency.name_hash) continue; if (builder.resolutions[dep_id] != package_id) { if (as_defined and !dep.behavior.isPeer()) { - if (builder.log != null) - builder.maybeReportError("Package \"{}@{}\" has a dependency loop\n Resolution: \"{}@{}\"\n Dependency: \"{}@{}\"", .{ - builder.packageName(package_id), - builder.packageVersion(package_id), - builder.packageName(builder.resolutions[dep_id]), - builder.packageVersion(builder.resolutions[dep_id]), - dependency.name.fmt(builder.buf()), - dependency.version.literal.fmt(builder.buf()), - }); + builder.maybeReportError("Package \"{}@{}\" has a dependency loop\n Resolution: \"{}@{}\"\n Dependency: \"{}@{}\"", .{ + builder.packageName(package_id), + builder.packageVersion(package_id), + builder.packageName(builder.resolutions[dep_id]), + builder.packageVersion(builder.resolutions[dep_id]), + dependency.name.fmt(builder.buf()), + dependency.version.literal.fmt(builder.buf()), + }); return error.DependencyLoop; } // ignore versioning conflicts caused by peer dependencies @@ -629,10 +620,19 @@ fn preprocessUpdateRequests(old: *Lockfile, updates: []PackageManager.UpdateRequ } } pub fn clean(old: *Lockfile, updates: []PackageManager.UpdateRequest) !*Lockfile { - return old.cleanWithLogger(updates, null); + // This is wasteful, but we rarely log anything so it's fine. + var log = logger.Log.init(bun.default_allocator); + defer { + for (log.msgs.items) |*item| { + item.deinit(bun.default_allocator); + } + log.deinit(); + } + + return old.cleanWithLogger(updates, &log); } -pub fn cleanWithLogger(old: *Lockfile, updates: []PackageManager.UpdateRequest, log: ?*logger.Log) !*Lockfile { +pub fn cleanWithLogger(old: *Lockfile, updates: []PackageManager.UpdateRequest, log: *logger.Log) !*Lockfile { const old_scripts = old.scripts; // We will only shrink the number of packages here. // never grow @@ -780,7 +780,7 @@ const Cloner = struct { mapping: []PackageID, trees: Tree.List = Tree.List{}, trees_count: u32 = 1, - log: ?*logger.Log = null, + log: *logger.Log, pub fn flush(this: *Cloner) anyerror!void { const max_package_id = this.old.packages.len; |