mirror of
https://git.mirrors.martin98.com/https://github.com/actions/toolkit
synced 2026-04-08 00:23:16 +08:00
Removing childprocess for rmRF (#1373)
* try awaiting spawn on windows * formatting * updating package-lock * . * . * updating packages * adding sync rm * test with sync * pointing to rmsync * adding error handling * testing rmsync * adding try/catch * adding windows conditional for locked file * switch to contians * fixing formatting * fixing formatting * fixing formatting * adding enonet catch for windows files * adding enonet catch for windows files * adding catch for file not found * updating stat call * updating stat call * adding conditonal for symlink * removing symlink test * adding ebusy check * changing error check * changing error check * changing error check * changing error check * cleanup and comments * Update packages/io/__tests__/io.test.ts Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com> * Update packages/io/src/io-util.ts Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com> * moving comment placement * updating eperm * change back to ebusy * Update packages/io/__tests__/io.test.ts Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com> * Formatting * converting to async --------- Co-authored-by: Cory Miller <13227161+cory-miller@users.noreply.github.com>
This commit is contained in:
@@ -6,16 +6,21 @@ export const {
|
||||
copyFile,
|
||||
lstat,
|
||||
mkdir,
|
||||
open,
|
||||
readdir,
|
||||
readlink,
|
||||
rename,
|
||||
rm,
|
||||
rmdir,
|
||||
stat,
|
||||
symlink,
|
||||
unlink
|
||||
} = fs.promises
|
||||
|
||||
// export const {open} = 'fs'
|
||||
export const IS_WINDOWS = process.platform === 'win32'
|
||||
// See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691
|
||||
export const UV_FS_O_EXLOCK = 0x10000000
|
||||
export const READONLY = fs.constants.O_RDONLY
|
||||
|
||||
export async function exists(fsPath: string): Promise<boolean> {
|
||||
try {
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import {ok} from 'assert'
|
||||
import * as childProcess from 'child_process'
|
||||
import * as path from 'path'
|
||||
import {promisify} from 'util'
|
||||
import * as ioUtil from './io-util'
|
||||
|
||||
const exec = promisify(childProcess.exec)
|
||||
const execFile = promisify(childProcess.execFile)
|
||||
|
||||
/**
|
||||
* Interface for cp/mv options
|
||||
*/
|
||||
@@ -116,9 +111,6 @@ export async function mv(
|
||||
*/
|
||||
export async function rmRF(inputPath: string): Promise<void> {
|
||||
if (ioUtil.IS_WINDOWS) {
|
||||
// Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
|
||||
// program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
|
||||
|
||||
// Check for invalid characters
|
||||
// https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file
|
||||
if (/[*"<>|]/.test(inputPath)) {
|
||||
@@ -126,47 +118,17 @@ export async function rmRF(inputPath: string): Promise<void> {
|
||||
'File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'
|
||||
)
|
||||
}
|
||||
try {
|
||||
const cmdPath = ioUtil.getCmdPath()
|
||||
if (await ioUtil.isDirectory(inputPath, true)) {
|
||||
await exec(`${cmdPath} /s /c "rd /s /q "%inputPath%""`, {
|
||||
env: {inputPath}
|
||||
})
|
||||
} else {
|
||||
await exec(`${cmdPath} /s /c "del /f /a "%inputPath%""`, {
|
||||
env: {inputPath}
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||
// other errors are valid
|
||||
if (err.code !== 'ENOENT') throw err
|
||||
}
|
||||
|
||||
// Shelling out fails to remove a symlink folder with missing source, this unlink catches that
|
||||
try {
|
||||
await ioUtil.unlink(inputPath)
|
||||
} catch (err) {
|
||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||
// other errors are valid
|
||||
if (err.code !== 'ENOENT') throw err
|
||||
}
|
||||
} else {
|
||||
let isDir = false
|
||||
try {
|
||||
isDir = await ioUtil.isDirectory(inputPath)
|
||||
} catch (err) {
|
||||
// if you try to delete a file that doesn't exist, desired result is achieved
|
||||
// other errors are valid
|
||||
if (err.code !== 'ENOENT') throw err
|
||||
return
|
||||
}
|
||||
|
||||
if (isDir) {
|
||||
await execFile(`rm`, [`-rf`, `${inputPath}`])
|
||||
} else {
|
||||
await ioUtil.unlink(inputPath)
|
||||
}
|
||||
}
|
||||
try {
|
||||
// note if path does not exist, error is silent
|
||||
await ioUtil.rm(inputPath, {
|
||||
force: true,
|
||||
maxRetries: 3,
|
||||
recursive: true,
|
||||
retryDelay: 300
|
||||
})
|
||||
} catch (err) {
|
||||
throw new Error(`File was unable to be removed ${err}`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user