You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1021 B
41 lines
1021 B
const { join, sep } = require('path') |
|
|
|
const getOptions = require('./common/get-options.js') |
|
const mkdir = require('./mkdir.js') |
|
const mkdtemp = require('./mkdtemp.js') |
|
const rm = require('./rm/index.js') |
|
|
|
// create a temp directory, ensure its permissions match its parent, then call |
|
// the supplied function passing it the path to the directory. clean up after |
|
// the function finishes, whether it throws or not |
|
const withTempDir = async (root, fn, opts) => { |
|
const options = getOptions(opts, { |
|
copy: ['tmpPrefix'], |
|
}) |
|
// create the directory, and fix its ownership |
|
await mkdir(root, { recursive: true, owner: 'inherit' }) |
|
|
|
const target = await mkdtemp(join(`${root}${sep}`, options.tmpPrefix || ''), { owner: 'inherit' }) |
|
let err |
|
let result |
|
|
|
try { |
|
result = await fn(target) |
|
} catch (_err) { |
|
err = _err |
|
} |
|
|
|
try { |
|
await rm(target, { force: true, recursive: true }) |
|
} catch { |
|
// ignore errors |
|
} |
|
|
|
if (err) { |
|
throw err |
|
} |
|
|
|
return result |
|
} |
|
|
|
module.exports = withTempDir
|
|
|