-
Notifications
You must be signed in to change notification settings - Fork 722
/
ln.js
94 lines (83 loc) · 2.27 KB
/
ln.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
var fs = require('fs');
var path = require('path');
var common = require('./common');
common.register('ln', _ln, {
cmdOptions: {
's': 'symlink',
'f': 'force',
},
});
//@
//@ ### ln([options,] source, dest)
//@
//@ Available options:
//@
//@ + `-s`: symlink
//@ + `-f`: force
//@
//@ Examples:
//@
//@ ```javascript
//@ ln('file', 'newlink');
//@ ln('-sf', 'file', 'existing');
//@ ```
//@
//@ Links `source` to `dest`. Use `-f` to force the link, should `dest` already exist.
function _ln(options, source, dest) {
if (!source || !dest) {
common.error('Missing <source> and/or <dest>');
}
source = String(source);
var sourcePath = path.normalize(source).replace(RegExp(path.sep + '$'), '');
var isAbsolute = (path.resolve(source) === sourcePath);
dest = path.resolve(process.cwd(), String(dest));
if (fs.existsSync(dest) && common.statFollowLinks(dest).isDirectory()) {
dest = path.join(dest, path.basename(sourcePath));
}
var destinationExists;
try {
fs.lstatSync(dest);
destinationExists = true;
} catch (err) {
destinationExists = false;
}
if (destinationExists) {
if (!options.force) {
common.error('Destination file exists', { continue: true });
}
fs.unlinkSync(dest);
}
if (options.symlink) {
var isWindows = process.platform === 'win32';
var linkType = isWindows ? 'file' : null;
var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source);
var resolvedSourceExists;
try {
fs.lstatSync(resolvedSourcePath);
resolvedSourceExists = true;
} catch (err) {
resolvedSourceExists = false;
}
if (!resolvedSourceExists) {
common.error('Source file does not exist', { continue: true });
} else if (isWindows && common.statFollowLinks(resolvedSourcePath).isDirectory()) {
linkType = 'junction';
}
try {
fs.symlinkSync(linkType === 'junction' ? resolvedSourcePath : source, dest, linkType);
} catch (err) {
common.error(err.message);
}
} else {
if (!fs.existsSync(source)) {
common.error('Source file does not exist', { continue: true });
}
try {
fs.linkSync(source, dest);
} catch (err) {
common.error(err.message);
}
}
return '';
}
module.exports = _ln;