From 1adacd41eeca3db57363225d7906b5d8d0f8a959 Mon Sep 17 00:00:00 2001 From: Yao Ding Date: Sat, 20 Jun 2020 17:38:48 -0400 Subject: [PATCH] fix: do not scan non-directories in store directory when pruning store close #2563 PR #2644 Co-authored-by: Zoltan Kochan Co-authored-by: Zoltan Kochan --- .changeset/orange-phones-press.md | 5 +++++ .../src/storeController/prune.ts | 4 +++- .../plugin-commands-store/test/storePrune.ts | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/orange-phones-press.md diff --git a/.changeset/orange-phones-press.md b/.changeset/orange-phones-press.md new file mode 100644 index 0000000000..b01d55f01d --- /dev/null +++ b/.changeset/orange-phones-press.md @@ -0,0 +1,5 @@ +--- +"@pnpm/package-store": patch +--- + +only scan diretories when doing store prune diff --git a/packages/package-store/src/storeController/prune.ts b/packages/package-store/src/storeController/prune.ts index 691c986058..ba404e106e 100644 --- a/packages/package-store/src/storeController/prune.ts +++ b/packages/package-store/src/storeController/prune.ts @@ -14,7 +14,9 @@ export default async function prune (storeDir: string) { globalInfo('Removed all cached metadata files') const pkgIndexFiles = [] as string[] const removedHashes = new Set() - const dirs = await fs.readdir(cafsDir) + const dirs = (await fs.readdir(cafsDir, { withFileTypes: true })) + .filter(entry => entry.isDirectory()) + .map(dir => dir.name) let fileCounter = 0 for (const dir of dirs) { const subdir = path.join(cafsDir, dir) diff --git a/packages/plugin-commands-store/test/storePrune.ts b/packages/plugin-commands-store/test/storePrune.ts index dc7208b113..2e6cabb4df 100644 --- a/packages/plugin-commands-store/test/storePrune.ts +++ b/packages/plugin-commands-store/test/storePrune.ts @@ -5,6 +5,7 @@ import prepare from '@pnpm/prepare' import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock' import rimraf = require('@zkochan/rimraf') import execa = require('execa') +import fs = require('fs') import path = require('path') import R = require('ramda') import sinon = require('sinon') @@ -145,3 +146,21 @@ test('keep dependency used by package', async (t) => { await project.storeHas('is-positive', '3.1.0') t.end() }) + +test('prune will skip scanning non-directory in storeDir', async (t) => { + const project = prepare(t) + const storeDir = path.resolve('store') + await execa('node', [pnpmBin, 'add', 'is-not-positive@1.0.0', 'is-positive@3.1.0', '--store-dir', storeDir, '--registry', REGISTRY]) + fs.writeFileSync(path.join(storeDir, STORE_VERSION, 'files/.DS_store'), 'foobar') + + await store.handler({ + dir: process.cwd(), + rawConfig: { + registry: REGISTRY, + }, + registries: { default: REGISTRY }, + storeDir, + }, ['prune']) + + t.end() +})