mirror of
https://github.com/pnpm/pnpm.git
synced 2025-12-24 23:58:07 -05:00
fix: prune should remove all cached metadata
This commit is contained in:
8
.changeset/blue-monkeys-hear.md
Normal file
8
.changeset/blue-monkeys-hear.md
Normal 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.
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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[]
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user