Skip to content

Commit 74ecbbb

Browse files
committed
fix(plugins): preserve install policy on retained reactivation
1 parent cd731fb commit 74ecbbb

2 files changed

Lines changed: 37 additions & 6 deletions

File tree

src/plugins/install.test.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2880,21 +2880,28 @@ describe("installPluginFromNpmSpec", () => {
28802880
expect(requests[0]?.request.kind).toBe("plugin-npm");
28812881
});
28822882

2883-
it("reports install mode to policy when update-mode reactivates retained-only generations", async () => {
2883+
it("reports install mode to policy when update-mode reactivates retained generations", async () => {
28842884
const root = suiteTempRootTracker.makeTempDir();
28852885
const npmDir = path.join(root, "npm");
28862886
const extensionsDir = path.join(root, "extensions");
28872887
const packageName = "@acme/policy-generation-plugin";
28882888
const legacyProjectRoot = resolvePluginNpmProjectDir({ npmDir, packageName });
28892889
const generationProjectRoot = resolvePluginNpmGenerationProjectDir({
2890+
npmDir,
2891+
packageName,
2892+
generationKey: [packageName, "1.2.3", `${packageName}@1.2.3`, "sha512-test", "abc123"].join(
2893+
"\n",
2894+
),
2895+
});
2896+
const activeGenerationProjectRoot = resolvePluginNpmGenerationProjectDir({
28902897
npmDir,
28912898
packageName,
28922899
generationKey: [
28932900
packageName,
2894-
"1.2.3",
2895-
`${packageName}@1.2.3`,
2896-
"sha512-plugin-test",
2897-
"pluginshasum",
2901+
"2.0.0",
2902+
`${packageName}@2.0.0`,
2903+
"sha512-active",
2904+
"active123",
28982905
].join("\n"),
28992906
});
29002907
const legacyPackageDir = path.join(
@@ -2907,6 +2914,11 @@ describe("installPluginFromNpmSpec", () => {
29072914
"node_modules",
29082915
...packageName.split("/"),
29092916
);
2917+
const activeGenerationPackageDir = path.join(
2918+
activeGenerationProjectRoot,
2919+
"node_modules",
2920+
...packageName.split("/"),
2921+
);
29102922
for (const packageDir of [legacyPackageDir, generationPackageDir]) {
29112923
fs.mkdirSync(packageDir, { recursive: true });
29122924
await markRetainedManagedNpmInstall({
@@ -2916,6 +2928,7 @@ describe("installPluginFromNpmSpec", () => {
29162928
reason: "test-retained-generation",
29172929
});
29182930
}
2931+
fs.mkdirSync(activeGenerationPackageDir, { recursive: true });
29192932
const { scriptPath, logPath } = writeInstallOnlyBlockingPolicyScript(root);
29202933
mockNpmViewMetadata({
29212934
name: packageName,

src/plugins/install.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ function resolveManagedNpmInstallRoot(params: {
11491149
});
11501150
const npmRoot = resolveManagedNpmRootForInstall(params);
11511151
const installRoot = resolveManagedNpmRootPackageDir(npmRoot, params.packageName);
1152-
if (!params.useGeneration || !hasRetainedManagedNpmInstallMarker(installRoot)) {
1152+
if (!hasRetainedManagedNpmInstallMarker(installRoot)) {
11531153
return npmRoot;
11541154
}
11551155
// Never mutate a retained tree: an older process may still hold lazy imports
@@ -1206,6 +1206,7 @@ async function resolveManagedNpmGenerationUseForInstall(params: {
12061206
npmBaseDir: string;
12071207
packageName: string;
12081208
requestedMode: "install" | "update";
1209+
npmResolution?: NpmSpecResolution;
12091210
}): Promise<"none" | "update" | "retained-install"> {
12101211
const packageDirs = await listManagedNpmPackageDirsForPackage({
12111212
runtime: params.runtime,
@@ -1218,6 +1219,20 @@ async function resolveManagedNpmGenerationUseForInstall(params: {
12181219
if (packageDirs.length > 0 && !hasNonRetainedPackageDir) {
12191220
return "retained-install";
12201221
}
1222+
const generationUse =
1223+
params.requestedMode === "update" && hasNonRetainedPackageDir ? "update" : "none";
1224+
if (params.npmResolution) {
1225+
const candidateRoot = resolveManagedNpmRootForInstall({
1226+
npmBaseDir: params.npmBaseDir,
1227+
packageName: params.packageName,
1228+
npmResolution: params.npmResolution,
1229+
useGeneration: generationUse !== "none",
1230+
});
1231+
const candidatePackageDir = resolveManagedNpmRootPackageDir(candidateRoot, params.packageName);
1232+
if (hasRetainedManagedNpmInstallMarker(candidatePackageDir)) {
1233+
return "retained-install";
1234+
}
1235+
}
12211236
if (params.requestedMode === "update") {
12221237
return hasNonRetainedPackageDir ? "update" : "none";
12231238
}
@@ -1332,6 +1347,7 @@ async function installPluginFromManagedNpmRoot(
13321347
npmBaseDir,
13331348
packageName: params.packageName,
13341349
requestedMode: mode,
1350+
npmResolution: params.npmResolution,
13351351
});
13361352
const npmRoot = resolveManagedNpmInstallRoot({
13371353
npmBaseDir,
@@ -3093,6 +3109,7 @@ export async function installPluginFromNpmSpec(
30933109
npmBaseDir,
30943110
packageName: parsedSpec.name,
30953111
requestedMode: mode,
3112+
npmResolution,
30963113
});
30973114
const npmRoot = resolveManagedNpmRootForInstall({
30983115
npmBaseDir,
@@ -3243,6 +3260,7 @@ export async function installPluginFromNpmPackArchive(
32433260
npmBaseDir,
32443261
packageName,
32453262
requestedMode: mode,
3263+
npmResolution,
32463264
});
32473265
const npmProjectRoot = resolveManagedNpmRootForInstall({
32483266
npmBaseDir,

0 commit comments

Comments
 (0)