diff options
m--------- | src/bun.js/WebKit | 0 | ||||
-rw-r--r-- | src/install/install.zig | 22 | ||||
-rw-r--r-- | test/cli/install/overrides.test.ts | 26 |
3 files changed, 45 insertions, 3 deletions
diff --git a/src/bun.js/WebKit b/src/bun.js/WebKit -Subproject acc1e092b4758a712998d462ee54c52e75e7178 +Subproject e1aa0a58e282b53fc20503d6e7ec93c621bc557 diff --git a/src/install/install.zig b/src/install/install.zig index 465bb5659..67fbf6b6b 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 60e300c36..bd4ee5cf7 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); +}); |