From 17e69e18b7fd4d260ef0e7b3698cd08d1fcdfb95 Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Mon, 29 Aug 2022 02:43:45 +0300 Subject: [PATCH] fix: prune should remove all cached metadata --- .changeset/blue-monkeys-hear.md | 8 ++++++++ .../package-store/src/storeController/index.ts | 3 ++- .../package-store/src/storeController/prune.ts | 14 +++++++++++--- packages/package-store/test/index.ts | 4 ++++ .../plugin-commands-store/test/storePrune.ts | 18 ++++++++++++++++-- packages/server/test/index.ts | 4 +++- .../src/createNewStoreController.ts | 1 + 7 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 .changeset/blue-monkeys-hear.md diff --git a/.changeset/blue-monkeys-hear.md b/.changeset/blue-monkeys-hear.md new file mode 100644 index 0000000000..2970f75d1a --- /dev/null +++ b/.changeset/blue-monkeys-hear.md @@ -0,0 +1,8 @@ +--- +"@pnpm/package-store": patch +"@pnpm/plugin-commands-store": patch +"@pnpm/store-connection-manager": patch +"pnpm": patch +--- + +`pnpm store prune` should remove all cached metadata. diff --git a/packages/package-store/src/storeController/index.ts b/packages/package-store/src/storeController/index.ts index f996314350..6400a97082 100644 --- a/packages/package-store/src/storeController/index.ts +++ b/packages/package-store/src/storeController/index.ts @@ -24,6 +24,7 @@ export default async function ( importPackage?: ImportIndexedPackage pnpmVersion?: string ignoreFile?: (filename: string) => boolean + cacheDir: string storeDir: string networkConcurrency?: number packageImportMethod?: 'auto' | 'hardlink' | 'copy' | 'clone' | 'clone-or-copy' @@ -50,7 +51,7 @@ export default async function ( close: async () => {}, // eslint-disable-line:no-empty fetchPackage: packageRequester.fetchPackageToStore, importPackage: cafs.importPackage, - prune: prune.bind(null, storeDir), + prune: prune.bind(null, { storeDir, cacheDir: initOpts.cacheDir }), requestPackage: packageRequester.requestPackage, upload, } diff --git a/packages/package-store/src/storeController/prune.ts b/packages/package-store/src/storeController/prune.ts index 7b0daa30d4..dc4f0353f2 100644 --- a/packages/package-store/src/storeController/prune.ts +++ b/packages/package-store/src/storeController/prune.ts @@ -8,10 +8,18 @@ import ssri from 'ssri' const BIG_ONE = BigInt(1) as unknown -export default async function prune (storeDir: string) { +export interface PruneOptions { + cacheDir: string + storeDir: string +} + +export default async function prune ({ cacheDir, storeDir }: PruneOptions) { const cafsDir = path.join(storeDir, 'files') - await rimraf(path.join(storeDir, 'metadata')) - await rimraf(path.join(storeDir, 'metadata-full')) + await Promise.all([ + rimraf(path.join(cacheDir, 'metadata')), + rimraf(path.join(cacheDir, 'metadata-full')), + rimraf(path.join(cacheDir, 'metadata-full-filtered')), + ]) await rimraf(path.join(storeDir, 'tmp')) globalInfo('Removed all cached metadata files') const pkgIndexFiles = [] as string[] diff --git a/packages/package-store/test/index.ts b/packages/package-store/test/index.ts index 372c66f2c1..d17e1c709e 100644 --- a/packages/package-store/test/index.ts +++ b/packages/package-store/test/index.ts @@ -8,6 +8,7 @@ describe('store.importPackage()', () => { it('selects import method automatically', async () => { const tmp = tempy.directory() const storeDir = path.join(tmp, 'store') + const cacheDir = path.join(tmp, 'cache') const registry = 'https://registry.npmjs.org/' const authConfig = { registry } const { resolve, fetchers } = createClient({ @@ -16,6 +17,7 @@ describe('store.importPackage()', () => { }) const storeController = await createStore(resolve, fetchers, { storeDir, + cacheDir, verifyStoreIntegrity: true, }) const pkgId = 'registry.npmjs.org/is-positive/1.0.0' @@ -43,6 +45,7 @@ describe('store.importPackage()', () => { it('uses copying', async () => { const tmp = tempy.directory() const storeDir = path.join(tmp, 'store') + const cacheDir = path.join(tmp, 'cache') const registry = 'https://registry.npmjs.org/' const authConfig = { registry } const { resolve, fetchers } = createClient({ @@ -52,6 +55,7 @@ describe('store.importPackage()', () => { const storeController = await createStore(resolve, fetchers, { packageImportMethod: 'copy', storeDir, + cacheDir, verifyStoreIntegrity: true, }) const pkgId = 'registry.npmjs.org/is-positive/1.0.0' diff --git a/packages/plugin-commands-store/test/storePrune.ts b/packages/plugin-commands-store/test/storePrune.ts index 47cf7ee7e4..972a275e86 100644 --- a/packages/plugin-commands-store/test/storePrune.ts +++ b/packages/plugin-commands-store/test/storePrune.ts @@ -19,8 +19,21 @@ test('remove unreferenced packages', async () => { const cacheDir = path.resolve('cache') const storeDir = path.resolve('store') - await execa('node', [pnpmBin, 'add', 'is-negative@2.1.0', '--store-dir', storeDir, '--registry', REGISTRY]) - await execa('node', [pnpmBin, 'remove', 'is-negative', '--store-dir', storeDir, '--config.modules-cache-max-age=0'], { env: { npm_config_registry: REGISTRY } }) + await execa('node', [ + pnpmBin, + 'add', + 'is-negative@^2.1.0', + `--store-dir=${storeDir}`, + `--cache-dir=${cacheDir}`, + `--registry=${REGISTRY}`]) + await execa('node', [ + pnpmBin, + 'remove', + 'is-negative', + `--store-dir=${storeDir}`, + `--cache-dir=${cacheDir}`, + '--config.modules-cache-max-age=0', + ], { env: { npm_config_registry: REGISTRY } }) await project.storeHas('is-negative', '2.1.0') @@ -67,6 +80,7 @@ test('remove unreferenced packages', async () => { message: 'Removed 1 package', }) ) + expect(fs.readdirSync(cacheDir).length).toEqual(0) }) test.skip('remove packages that are used by project that no longer exist', async () => { diff --git a/packages/server/test/index.ts b/packages/server/test/index.ts index deb0a7c4d1..5161134135 100644 --- a/packages/server/test/index.ts +++ b/packages/server/test/index.ts @@ -19,12 +19,14 @@ async function createStoreController (storeDir?: string) { storeDir = path.join(tmp, 'store') } const authConfig = { registry } + const cacheDir = path.join(tmp, 'cache') const { resolve, fetchers } = createClient({ authConfig, - cacheDir: path.join(tmp, 'cache'), + cacheDir, }) return createStore(resolve, fetchers, { networkConcurrency: 1, + cacheDir, storeDir, verifyStoreIntegrity: true, }) diff --git a/packages/store-connection-manager/src/createNewStoreController.ts b/packages/store-connection-manager/src/createNewStoreController.ts index adb649ad35..b93a0a7fe9 100644 --- a/packages/store-connection-manager/src/createNewStoreController.ts +++ b/packages/store-connection-manager/src/createNewStoreController.ts @@ -86,6 +86,7 @@ export default async ( importPackage: opts.hooks?.importPackage, networkConcurrency: opts.networkConcurrency, packageImportMethod: opts.packageImportMethod, + cacheDir: opts.cacheDir, storeDir: opts.storeDir, verifyStoreIntegrity: typeof opts.verifyStoreIntegrity === 'boolean' ? opts.verifyStoreIntegrity