12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 'use strict'
- const u = require('universalify').fromPromise
- const path = require('path')
- const fs = require('../fs')
- const { mkdirs, mkdirsSync } = require('../mkdirs')
- const { symlinkPaths, symlinkPathsSync } = require('./symlink-paths')
- const { symlinkType, symlinkTypeSync } = require('./symlink-type')
- const { pathExists } = require('../path-exists')
- const { areIdentical } = require('../util/stat')
- async function createSymlink (srcpath, dstpath, type) {
- let stats
- try {
- stats = await fs.lstat(dstpath)
- } catch { }
- if (stats && stats.isSymbolicLink()) {
- const [srcStat, dstStat] = await Promise.all([
- fs.stat(srcpath),
- fs.stat(dstpath)
- ])
- if (areIdentical(srcStat, dstStat)) return
- }
- const relative = await symlinkPaths(srcpath, dstpath)
- srcpath = relative.toDst
- const toType = await symlinkType(relative.toCwd, type)
- const dir = path.dirname(dstpath)
- if (!(await pathExists(dir))) {
- await mkdirs(dir)
- }
- return fs.symlink(srcpath, dstpath, toType)
- }
- function createSymlinkSync (srcpath, dstpath, type) {
- let stats
- try {
- stats = fs.lstatSync(dstpath)
- } catch { }
- if (stats && stats.isSymbolicLink()) {
- const srcStat = fs.statSync(srcpath)
- const dstStat = fs.statSync(dstpath)
- if (areIdentical(srcStat, dstStat)) return
- }
- const relative = symlinkPathsSync(srcpath, dstpath)
- srcpath = relative.toDst
- type = symlinkTypeSync(relative.toCwd, type)
- const dir = path.dirname(dstpath)
- const exists = fs.existsSync(dir)
- if (exists) return fs.symlinkSync(srcpath, dstpath, type)
- mkdirsSync(dir)
- return fs.symlinkSync(srcpath, dstpath, type)
- }
- module.exports = {
- createSymlink: u(createSymlink),
- createSymlinkSync
- }
|