44 * Copyright (C) 2020-2022 Posit Software, PBC
55 */
66
7- import { ensureDirSync , existsSync , safeMoveSync } from "../../deno_ral/fs.ts" ;
7+ import {
8+ ensureDirSync ,
9+ existsSync ,
10+ safeMoveSync ,
11+ safeRemoveDirSync ,
12+ safeRemoveSync ,
13+ UnsafeRemovalError ,
14+ } from "../../deno_ral/fs.ts" ;
815import { dirname , isAbsolute , join , relative } from "../../deno_ral/path.ts" ;
916import { info , warning } from "../../deno_ral/log.ts" ;
1017import { mergeProjectMetadata } from "../../config/metadata.ts" ;
@@ -481,7 +488,18 @@ export async function renderProject(
481488 return ;
482489 }
483490 if ( existsSync ( targetDir ) ) {
484- Deno . removeSync ( targetDir , { recursive : true } ) ;
491+ try {
492+ safeRemoveDirSync ( targetDir , context . dir ) ;
493+ } catch ( e ) {
494+ if ( e instanceof UnsafeRemovalError ) {
495+ warning (
496+ `Refusing to remove directory ${ targetDir } since it is not a subdirectory of the main project directory.` ,
497+ ) ;
498+ warning (
499+ `Quarto did not expect the path configuration being used in this project, and strange behavior may result.` ,
500+ ) ;
501+ }
502+ }
485503 }
486504 ensureDirSync ( dirname ( targetDir ) ) ;
487505 if ( copy ) {
@@ -494,7 +512,7 @@ export async function renderProject(
494512 // because src and target are in different file systems.
495513 // In that case, try to recursively copy from src
496514 copyTo ( srcDir , targetDir ) ;
497- Deno . removeSync ( srcDir , { recursive : true } ) ;
515+ safeRemoveDirSync ( targetDir , context . dir ) ;
498516 }
499517 }
500518 } ;
@@ -906,7 +924,7 @@ export async function renderProject(
906924 if ( projectRenderConfig . options . forceClean ) {
907925 const scratchDir = join ( projDir , kQuartoScratch ) ;
908926 if ( existsSync ( scratchDir ) ) {
909- Deno . removeSync ( scratchDir , { recursive : true } ) ;
927+ safeRemoveSync ( scratchDir , { recursive : true } ) ;
910928 }
911929 }
912930
0 commit comments