mirror of
https://github.com/shelljs/shelljs.git
synced 2026-01-18 16:03:37 +00:00
This swaps out quote characters to limit how often we need to escape strings. This is just to improve code readability. Almost all of the changes could be done without changes to .eslintrc, however this amends the lint rule to also permit backtick strings which can be useful to eliminate a few extra instances of quote escaping. Fixes issue #788 Test: npm run lint
204 lines
6.8 KiB
JavaScript
204 lines
6.8 KiB
JavaScript
import fs from 'fs';
|
|
|
|
import test from 'ava';
|
|
|
|
import shell from '..';
|
|
import common from '../src/common';
|
|
import utils from './utils/utils';
|
|
|
|
test.beforeEach(t => {
|
|
t.context.tmp = utils.getTempDir();
|
|
shell.config.resetForTesting();
|
|
shell.mkdir(t.context.tmp);
|
|
});
|
|
|
|
test.afterEach.always(t => {
|
|
shell.rm('-rf', t.context.tmp);
|
|
});
|
|
|
|
|
|
//
|
|
// Invalids
|
|
//
|
|
|
|
test('no args', t => {
|
|
const result = shell.mkdir();
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: no paths given');
|
|
});
|
|
|
|
test('dir already exists', t => {
|
|
const mtime = common.statFollowLinks(t.context.tmp).mtime.toString();
|
|
const result = shell.mkdir(t.context.tmp); // dir already exists
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, `mkdir: path already exists: ${t.context.tmp}`);
|
|
t.is(common.statFollowLinks(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir
|
|
});
|
|
|
|
test("Can't overwrite a broken link", t => {
|
|
const mtime = common.statNoFollowLinks('test/resources/badlink').mtime.toString();
|
|
const result = shell.mkdir('test/resources/badlink');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: path already exists: test/resources/badlink');
|
|
t.is(common.statNoFollowLinks('test/resources/badlink').mtime.toString(), mtime); // didn't mess with file
|
|
});
|
|
|
|
test('root path does not exist', t => {
|
|
t.falsy(fs.existsSync('/asdfasdf')); // sanity check
|
|
const result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: no such file or directory: /asdfasdf');
|
|
t.falsy(fs.existsSync('/asdfasdf'));
|
|
t.falsy(fs.existsSync('/asdfasdf/foobar'));
|
|
});
|
|
|
|
test('try to overwrite file', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('test/resources/file1');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: path already exists: test/resources/file1');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
});
|
|
|
|
test('try to overwrite file, with -p', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('-p', 'test/resources/file1');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1: File exists');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
});
|
|
|
|
test('try to make a subdirectory of a file', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('test/resources/file1/subdir');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1/subdir: Not a directory');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
t.falsy(fs.existsSync('test/resources/file1/subdir'));
|
|
});
|
|
|
|
test('Check for invalid permissions', t => {
|
|
utils.skipOnWin(t, () => {
|
|
// This test case only works on unix, but should work on Windows as well
|
|
const dirName = `${t.context.tmp}/nowritedir`;
|
|
shell.mkdir(dirName);
|
|
t.falsy(shell.error());
|
|
shell.chmod('-w', dirName);
|
|
const result = shell.mkdir(dirName + '/foo');
|
|
t.is(result.code, 1);
|
|
t.is(
|
|
result.stderr,
|
|
`mkdir: cannot create directory ${t.context.tmp}/nowritedir/foo: Permission denied`
|
|
);
|
|
t.truthy(shell.error());
|
|
t.falsy(fs.existsSync(dirName + '/foo'));
|
|
});
|
|
});
|
|
|
|
//
|
|
// Valids
|
|
//
|
|
|
|
test('basic usage', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t1`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
});
|
|
|
|
test('multiple dirs', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t2`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t3`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t2`, `${t.context.tmp}/t3`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t2`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t3`));
|
|
});
|
|
|
|
test('one dir exists, the other does not', t => {
|
|
shell.mkdir(`${t.context.tmp}/t1`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t4`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t1`, `${t.context.tmp}/t4`);
|
|
t.is(result.code, 1);
|
|
t.is(utils.numLines(shell.error()), 1);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t4`));
|
|
});
|
|
|
|
test('-p flag', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/a`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/a/b/c`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`));
|
|
});
|
|
|
|
test('-p flag: multiple dirs', t => {
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/zzza`,
|
|
`${t.context.tmp}/zzzb`, `${t.context.tmp}/zzzc`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzza`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzzb`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzzc`));
|
|
});
|
|
|
|
test('-p flag: multiple dirs, array syntax', t => {
|
|
const result = shell.mkdir('-p', [`${t.context.tmp}/yyya`,
|
|
`${t.context.tmp}/yyyb`, `${t.context.tmp}/yyyc`]);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyya`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyyb`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyyc`));
|
|
});
|
|
|
|
test('-p flag: subdirectory already exists', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/d1`));
|
|
shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
});
|
|
|
|
test('-p flag: create directory in subdirectory', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/d1`));
|
|
shell.mkdir('-p', `${t.context.tmp}/d1/d2`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
});
|
|
|
|
test('globbed dir', t => {
|
|
let result = shell.mkdir('-p', `${t.context.tmp}/mydir`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/mydir`));
|
|
result = shell.mkdir('-p', `${t.context.tmp}/m*ir`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/mydir`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/m*ir`)); // doesn't create literal name
|
|
});
|
|
|
|
test('non-normalized paths are still ok with -p', t => {
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/asdf/../asdf/./`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/asdf`));
|
|
});
|