|
1 | 1 | 'use strict'
|
2 | 2 |
|
3 |
| -const fs = require('graceful-fs') |
| 3 | +const fs = require('../fs') |
4 | 4 | const path = require('path')
|
5 |
| -const copy = require('../copy').copy |
6 |
| -const remove = require('../remove').remove |
7 |
| -const mkdirp = require('../mkdirs').mkdirp |
8 |
| -const pathExists = require('../path-exists').pathExists |
| 5 | +const { copy } = require('../copy') |
| 6 | +const { remove } = require('../remove') |
| 7 | +const { mkdirp } = require('../mkdirs') |
| 8 | +const { pathExists } = require('../path-exists') |
9 | 9 | const stat = require('../util/stat')
|
10 | 10 |
|
11 |
| -function move (src, dest, opts, cb) { |
12 |
| - if (typeof opts === 'function') { |
13 |
| - cb = opts |
14 |
| - opts = {} |
15 |
| - } |
| 11 | +async function move (src, dest, opts = {}) { |
| 12 | + const overwrite = opts.overwrite || opts.clobber || false |
16 | 13 |
|
17 |
| - opts = opts || {} |
| 14 | + const { srcStat, isChangingCase = false } = await stat.checkPaths(src, dest, 'move', opts) |
18 | 15 |
|
19 |
| - const overwrite = opts.overwrite || opts.clobber || false |
| 16 | + await stat.checkParentPaths(src, srcStat, dest, 'move') |
20 | 17 |
|
21 |
| - stat.checkPaths(src, dest, 'move', opts, (err, stats) => { |
22 |
| - if (err) return cb(err) |
23 |
| - const { srcStat, isChangingCase = false } = stats |
24 |
| - stat.checkParentPaths(src, srcStat, dest, 'move', err => { |
25 |
| - if (err) return cb(err) |
26 |
| - if (isParentRoot(dest)) return doRename(src, dest, overwrite, isChangingCase, cb) |
27 |
| - mkdirp(path.dirname(dest), err => { |
28 |
| - if (err) return cb(err) |
29 |
| - return doRename(src, dest, overwrite, isChangingCase, cb) |
30 |
| - }) |
31 |
| - }) |
32 |
| - }) |
33 |
| -} |
| 18 | + // If the parent of dest is not root, make sure it exists before proceeding |
| 19 | + const destParent = path.dirname(dest) |
| 20 | + const parsedParentPath = path.parse(destParent) |
| 21 | + if (parsedParentPath.root !== destParent) { |
| 22 | + await mkdirp(destParent) |
| 23 | + } |
34 | 24 |
|
35 |
| -function isParentRoot (dest) { |
36 |
| - const parent = path.dirname(dest) |
37 |
| - const parsedPath = path.parse(parent) |
38 |
| - return parsedPath.root === parent |
| 25 | + return doRename(src, dest, overwrite, isChangingCase) |
39 | 26 | }
|
40 | 27 |
|
41 |
| -function doRename (src, dest, overwrite, isChangingCase, cb) { |
42 |
| - if (isChangingCase) return rename(src, dest, overwrite, cb) |
43 |
| - if (overwrite) { |
44 |
| - return remove(dest, err => { |
45 |
| - if (err) return cb(err) |
46 |
| - return rename(src, dest, overwrite, cb) |
47 |
| - }) |
| 28 | +async function doRename (src, dest, overwrite, isChangingCase) { |
| 29 | + if (!isChangingCase) { |
| 30 | + if (overwrite) { |
| 31 | + await remove(dest) |
| 32 | + } else if (await pathExists(dest)) { |
| 33 | + throw new Error('dest already exists.') |
| 34 | + } |
48 | 35 | }
|
49 |
| - pathExists(dest, (err, destExists) => { |
50 |
| - if (err) return cb(err) |
51 |
| - if (destExists) return cb(new Error('dest already exists.')) |
52 |
| - return rename(src, dest, overwrite, cb) |
53 |
| - }) |
54 |
| -} |
55 | 36 |
|
56 |
| -function rename (src, dest, overwrite, cb) { |
57 |
| - fs.rename(src, dest, err => { |
58 |
| - if (!err) return cb() |
59 |
| - if (err.code !== 'EXDEV') return cb(err) |
60 |
| - return moveAcrossDevice(src, dest, overwrite, cb) |
61 |
| - }) |
| 37 | + try { |
| 38 | + // Try w/ rename first, and try copy + remove if EXDEV |
| 39 | + await fs.rename(src, dest) |
| 40 | + } catch (err) { |
| 41 | + if (err.code !== 'EXDEV') { |
| 42 | + throw err |
| 43 | + } |
| 44 | + await moveAcrossDevice(src, dest, overwrite) |
| 45 | + } |
62 | 46 | }
|
63 | 47 |
|
64 |
| -function moveAcrossDevice (src, dest, overwrite, cb) { |
| 48 | +async function moveAcrossDevice (src, dest, overwrite) { |
65 | 49 | const opts = {
|
66 | 50 | overwrite,
|
67 | 51 | errorOnExist: true,
|
68 | 52 | preserveTimestamps: true
|
69 | 53 | }
|
70 |
| - copy(src, dest, opts, err => { |
71 |
| - if (err) return cb(err) |
72 |
| - return remove(src, cb) |
73 |
| - }) |
| 54 | + |
| 55 | + await copy(src, dest, opts) |
| 56 | + return remove(src) |
74 | 57 | }
|
75 | 58 |
|
76 | 59 | module.exports = move
|
0 commit comments