1
1
'use strict'
2
2
3
- var fs = require ( 'graceful-fs' )
3
+ const fs = require ( 'graceful-fs' )
4
+ const Promise = require ( 'bluebird' )
5
+ let move
6
+ let pinflight
4
7
5
8
module . exports = moveFile
6
- function moveFile ( src , dest , cb ) {
9
+ function moveFile ( src , dest ) {
7
10
// This isn't quite an fs.rename -- the assumption is that
8
11
// if `dest` already exists, and we get certain errors while
9
12
// trying to move it, we should just not bother.
@@ -13,16 +16,35 @@ function moveFile (src, dest, cb) {
13
16
// content their own way.
14
17
//
15
18
// Note that, as the name suggests, this strictly only supports file moves.
16
- fs . link ( src , dest , function ( err ) {
17
- if ( err ) {
18
- if ( err . code === 'EEXIST' || err . code === 'EBUSY' ) {
19
- // file already exists, so whatever
20
- } else if ( err . code === 'EPERM' && process . platform === 'win32' ) {
21
- // file handle stayed open even past graceful-fs limits
22
- } else {
23
- return cb ( err )
19
+ return Promise . fromNode ( cb => {
20
+ fs . link ( src , dest , err => {
21
+ if ( err ) {
22
+ if ( err . code === 'EEXIST' || err . code === 'EBUSY' ) {
23
+ // file already exists, so whatever
24
+ } else if ( err . code === 'EPERM' && process . platform === 'win32' ) {
25
+ // file handle stayed open even past graceful-fs limits
26
+ } else {
27
+ return cb ( err )
28
+ }
24
29
}
30
+ return fs . unlink ( src , cb )
31
+ } )
32
+ } ) . catch ( err => {
33
+ if ( process . platform !== 'win32' ) {
34
+ throw err
35
+ } else {
36
+ if ( ! pinflight ) { pinflight = require ( 'promise-inflight' ) }
37
+ return pinflight ( 'cacache-move-file:' + dest , ( ) => {
38
+ return Promise . promisify ( fs . stat ) ( dest ) . catch ( err => {
39
+ if ( err !== 'ENOENT' ) {
40
+ // Something else is wrong here. Bail bail bail
41
+ throw err
42
+ }
43
+ // file doesn't already exist! let's try a rename -> copy fallback
44
+ if ( ! move ) { move = require ( '@npmcorp/move' ) }
45
+ return move ( src , dest , { Promise, fs } )
46
+ } )
47
+ } )
25
48
}
26
- fs . unlink ( src , cb )
27
49
} )
28
50
}
0 commit comments