fix(installer): narrow error handling in copy() and fix test interdependency

- copy() overwrite:false catch now only ignores ENOENT/ENOTDIR,
  consistent with pathExists(); permission errors propagate correctly
- 'copy creates parent directories' test creates its own fixture
  instead of depending on state from a previous test
This commit is contained in:
Adam Biggs 2026-02-26 13:29:42 -08:00
parent a12d5d03b5
commit 2771dd76b8
2 changed files with 7 additions and 3 deletions

View File

@ -270,10 +270,11 @@ async function runTests() {
}); });
await asyncTest('copy creates parent directories for dest', async () => { await asyncTest('copy creates parent directories for dest', async () => {
const src = path.join(TMP, 'copy-file-src.txt'); const src = path.join(TMP, 'copy-mkdir-src.txt');
nativeFs.writeFileSync(src, 'copy mkdir');
const dest = path.join(TMP, 'copy-deep', 'nested', 'dest.txt'); const dest = path.join(TMP, 'copy-deep', 'nested', 'dest.txt');
await fs.copy(src, dest); await fs.copy(src, dest);
assertEqual(nativeFs.readFileSync(dest, 'utf8'), 'copy file', 'copy with mkdir content mismatch'); assertEqual(nativeFs.readFileSync(dest, 'utf8'), 'copy mkdir', 'copy with mkdir content mismatch');
}); });
await asyncTest('copy copies a directory recursively', async () => { await asyncTest('copy copies a directory recursively', async () => {

View File

@ -115,7 +115,10 @@ module.exports.copy = async function copy(src, dest, options = {}) {
try { try {
await fsp.access(dest); await fsp.access(dest);
return; // dest exists, skip return; // dest exists, skip
} catch { } catch (error) {
if (error && error.code !== 'ENOENT' && error.code !== 'ENOTDIR') {
throw error;
}
// dest doesn't exist, proceed // dest doesn't exist, proceed
} }
} }