fix: prune should remove all cached metadata

This commit is contained in:
Zoltan Kochan
2022-08-29 02:43:45 +03:00
parent d904b83ec1
commit 17e69e18b7
7 changed files with 45 additions and 7 deletions

View File

@@ -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.

View File

@@ -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,
}

View File

@@ -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[]

View File

@@ -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'

View File

@@ -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 () => {

View File

@@ -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,
})

View File

@@ -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