From 969da088f5db3258a803ec186012e30f992829b4 Mon Sep 17 00:00:00 2001 From: dave caruso Date: Thu, 12 Oct 2023 02:03:02 -0700 Subject: [PATCH] fix(install): re-evaluate overrides when removed --- src/bun.js/WebKit | 2 +- src/install/install.zig | 22 ++++++++++++++++++++-- test/cli/install/overrides.test.ts | 26 +++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/bun.js/WebKit b/src/bun.js/WebKit index acc1e092b4..e1aa0a58e2 160000 --- a/src/bun.js/WebKit +++ b/src/bun.js/WebKit @@ -1 +1 @@ -Subproject commit acc1e092b4758a712998d462ee54c52e75e71780 +Subproject commit e1aa0a58e282b53fc20503d6e7ec93c621bc5570 diff --git a/src/install/install.zig b/src/install/install.zig index 465bb5659f..67fbf6b6b7 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -7885,6 +7885,25 @@ pub const PackageManager = struct { manager.root_dependency_list = dep_lists[0]; try builder.allocate(); + var all_name_hashes = brk: { + if (!manager.summary.overrides_changed) break :brk &.{}; + const hashes_len = manager.lockfile.overrides.map.entries.len + lockfile.overrides.map.entries.len; + if (hashes_len == 0) break :brk &.{}; + var all_name_hashes = try bun.default_allocator.alloc(PackageNameHash, hashes_len); + @memcpy(all_name_hashes[0..manager.lockfile.overrides.map.entries.len], manager.lockfile.overrides.map.keys()); + @memcpy(all_name_hashes[manager.lockfile.overrides.map.entries.len..], lockfile.overrides.map.keys()); + var i = manager.lockfile.overrides.map.entries.len; + while (i < all_name_hashes.len) { + if (std.mem.indexOfScalar(PackageNameHash, all_name_hashes[0..i], all_name_hashes[i]) != null) { + all_name_hashes[i] = all_name_hashes[all_name_hashes.len - 1]; + all_name_hashes.len -= 1; + } else { + i += 1; + } + } + break :brk all_name_hashes; + }; + manager.lockfile.overrides = try lockfile.overrides.clone(&lockfile, manager.lockfile, builder); try manager.lockfile.buffers.dependencies.ensureUnusedCapacity(manager.lockfile.allocator, len); @@ -7910,9 +7929,8 @@ pub const PackageManager = struct { } if (manager.summary.overrides_changed) { - const dependency_name_hashes_to_check = manager.lockfile.overrides.map.keys(); for (manager.lockfile.buffers.dependencies.items, 0..) |*dependency, dependency_i| { - if (std.mem.indexOfScalar(PackageNameHash, dependency_name_hashes_to_check, dependency.name_hash)) |_| { + if (std.mem.indexOfScalar(PackageNameHash, all_name_hashes, dependency.name_hash)) |_| { manager.lockfile.buffers.resolutions.items[dependency_i] = invalid_package_id; try manager.enqueueDependencyWithMain( @truncate(dependency_i), diff --git a/test/cli/install/overrides.test.ts b/test/cli/install/overrides.test.ts index 60e300c361..bd4ee5cf72 100644 --- a/test/cli/install/overrides.test.ts +++ b/test/cli/install/overrides.test.ts @@ -162,4 +162,28 @@ test("changing overrides makes the lockfile changed, prevent frozen install", as installExpectFail(tmp, ["install", "--frozen-lockfile"]); }); -// frozen lockfile +test("overrides reset when removed", async () => { + const tmp = mkdtempSync(join(tmpdir(), "bun-pm-test")); + writeFileSync( + join(tmp, "package.json"), + JSON.stringify({ + overrides: { + bytes: "1.0.0", + }, + }), + ); + install(tmp, ["install", "express@4.18.2"]); + expect(versionOf(tmp, "node_modules/bytes/package.json")).toBe("1.0.0"); + + writeFileSync( + join(tmp, "package.json"), + JSON.stringify({ + ...JSON.parse(readFileSync(join(tmp, "package.json")).toString()), + overrides: undefined, + }), + ); + install(tmp, ["install"]); + expect(versionOf(tmp, "node_modules/bytes/package.json")).not.toBe("1.0.0"); + + ensureLockfileDoesntChangeOnBunI(tmp); +});