tcorral/mystiquex

View on GitHub
lib/utils/createLink.js

Summary

Maintainability
A
1 hr
Test Coverage
var fs = require('graceful-fs');
var path = require('path');
var Q = require('q');
var mkdirp = require('mkdirp');
var createError = require('./createError');

var isWin = process.platform === 'win32';

function createLink(src, dst, type) {
    var dstDir = path.dirname(dst);
    // Create directory
    return Q.nfcall(mkdirp, dstDir)
        // Check if source exists
        .progress(function (data) {
            console.log(data);
        })
        .then(function () {
            return Q.nfcall(fs.stat, src)
                .progress(function (data) {
                    console.log(data);
                })
                .fail(function (error) {
                    if (error.code === 'ENOENT') {
                        throw createError('Failed to create link to ' + path.basename(src), 'ENOENT', {
                            details: src + ' does not exist or points to a non-existent file'
                        });
                    }

                    throw error;
                });
        })
        // Create symlink
        .then(function (stat) {
            type = type || (stat.isDirectory() ? 'dir' : 'file');
            return Q.nfcall(fs.symlink, src, dst, type)
                .progress(function (data) {
                    console.log(data);
                })
                .fail(function (err) {
                    if (!isWin || err.code !== 'EPERM') {
                        throw err;
                    }
                    // Try with type "junction" on Windows
                    // Junctions behave equally to true symlinks and can be created in
                    // non elevated terminal (well, not always..)
                    return Q.nfcall(fs.symlink, src, dst, 'junction')
                        .progress(function (data) {
                            console.log(data);
                        })
                        .fail(function (err) {
                            throw createError('Unable to create link to ' + path.basename(src), err.code, {
                                details: err.message.trim() + '\n\nTry running this command in an elevated terminal (run as root/administrator).'
                            });
                        });
                });
        });
}

module.exports = createLink;