diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:01:11 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-08-14 05:02:09 +0200 |
commit | 363723fc84f7b8477592e0105aeb331ec9a017af (patch) | |
tree | 29f92724f34131bac64d6a318dd7e30612e631c7 /node_modules/shelljs | |
parent | 5634e77ad96bfe1818f6b6ee70b7379652e5487f (diff) |
node_modules
Diffstat (limited to 'node_modules/shelljs')
-rw-r--r-- | node_modules/shelljs/CHANGELOG.md | 97 | ||||
-rw-r--r-- | node_modules/shelljs/README.md | 6 | ||||
-rw-r--r-- | node_modules/shelljs/README.md~ | 817 | ||||
-rw-r--r-- | node_modules/shelljs/package.json | 2 | ||||
-rw-r--r-- | node_modules/shelljs/shell.js | 6 | ||||
-rw-r--r-- | node_modules/shelljs/src/cat.js | 2 | ||||
-rw-r--r-- | node_modules/shelljs/src/common.js | 28 | ||||
-rw-r--r-- | node_modules/shelljs/src/cp.js | 43 | ||||
-rw-r--r-- | node_modules/shelljs/src/find.js | 2 | ||||
-rw-r--r-- | node_modules/shelljs/src/head.js | 23 | ||||
-rw-r--r-- | node_modules/shelljs/src/ln.js | 2 | ||||
-rw-r--r-- | node_modules/shelljs/src/mkdir.js | 10 | ||||
-rw-r--r-- | node_modules/shelljs/src/mv.js | 20 | ||||
-rw-r--r-- | node_modules/shelljs/src/rm.js | 88 | ||||
-rw-r--r-- | node_modules/shelljs/src/sort.js | 13 | ||||
-rw-r--r-- | node_modules/shelljs/src/tail.js | 13 | ||||
-rw-r--r-- | node_modules/shelljs/src/uniq.js | 13 | ||||
-rw-r--r-- | node_modules/shelljs/src/which.js | 5 |
18 files changed, 308 insertions, 882 deletions
diff --git a/node_modules/shelljs/CHANGELOG.md b/node_modules/shelljs/CHANGELOG.md index e66d72cf9..5e0355bf6 100644 --- a/node_modules/shelljs/CHANGELOG.md +++ b/node_modules/shelljs/CHANGELOG.md @@ -1,5 +1,98 @@ # Change Log +## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) + +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.7...HEAD) + +**Closed issues:** + +- Add node v8 to CI [\#729](https://github.com/shelljs/shelljs/issues/729) +- Exec not working in Electron ! [\#726](https://github.com/shelljs/shelljs/issues/726) +- is rechoir used anywhere? [\#723](https://github.com/shelljs/shelljs/issues/723) +- ShellJS: internal error on shelljs.mkdir\('myFile/myDir'\) [\#720](https://github.com/shelljs/shelljs/issues/720) +- Can't make sed perform global replace [\#719](https://github.com/shelljs/shelljs/issues/719) +- grep: option not recognized: l [\#717](https://github.com/shelljs/shelljs/issues/717) +- Problems getting code, stdout, stderr [\#715](https://github.com/shelljs/shelljs/issues/715) +- Copying hidden files fails on Windows 10 [\#711](https://github.com/shelljs/shelljs/issues/711) +- How am I suppose to handle errors with ShellJS? [\#707](https://github.com/shelljs/shelljs/issues/707) +- use cp\('-r', './src', './dist'\) bug [\#705](https://github.com/shelljs/shelljs/issues/705) +- Way to ignore files in globs. [\#699](https://github.com/shelljs/shelljs/issues/699) +- Buffer constructor is deprecated [\#694](https://github.com/shelljs/shelljs/issues/694) +- source command not working via exec method. [\#693](https://github.com/shelljs/shelljs/issues/693) +- Would you be interested in a PR for `open`? [\#692](https://github.com/shelljs/shelljs/issues/692) +- Get rid of common.platform in favor of process.platform [\#670](https://github.com/shelljs/shelljs/issues/670) +- Passing empty string to cp throws internal error [\#664](https://github.com/shelljs/shelljs/issues/664) +- Why does sed split files into an array, call replace on each line and rejoin? [\#645](https://github.com/shelljs/shelljs/issues/645) +- feat: cp & mv should not overwrite recently created files [\#631](https://github.com/shelljs/shelljs/issues/631) +- Echo tests unnecessarily run tests in own process [\#622](https://github.com/shelljs/shelljs/issues/622) +- rm -rf on a symbolic link to a dir deletes its contents [\#587](https://github.com/shelljs/shelljs/issues/587) +- "Cannot extract package" with node-webkit [\#181](https://github.com/shelljs/shelljs/issues/181) +- EBADF, bad file descriptor [\#180](https://github.com/shelljs/shelljs/issues/180) + +**Merged pull requests:** + +- Add node 8 to CI [\#730](https://github.com/shelljs/shelljs/pull/730) ([freitagbr](https://github.com/freitagbr)) +- Deprecate common.getUserHome, advise using os.homedir instead [\#725](https://github.com/shelljs/shelljs/pull/725) ([freitagbr](https://github.com/freitagbr)) +- fix\(mkdir\): improve error handling around files [\#721](https://github.com/shelljs/shelljs/pull/721) ([nfischer](https://github.com/nfischer)) +- Properly handle directories as arguments [\#713](https://github.com/shelljs/shelljs/pull/713) ([nfischer](https://github.com/nfischer)) +- Add common.buffer [\#710](https://github.com/shelljs/shelljs/pull/710) ([freitagbr](https://github.com/freitagbr)) +- Fix common.expand error [\#709](https://github.com/shelljs/shelljs/pull/709) ([freitagbr](https://github.com/freitagbr)) +- Echo test mocks [\#708](https://github.com/shelljs/shelljs/pull/708) ([freitagbr](https://github.com/freitagbr)) +- refactor: remove unnecessary common.js imports [\#703](https://github.com/shelljs/shelljs/pull/703) ([nfischer](https://github.com/nfischer)) +- Fix \#631 throw error when overwriting recently created file [\#702](https://github.com/shelljs/shelljs/pull/702) ([uttpal](https://github.com/uttpal)) +- Small clarification of verbose flag [\#691](https://github.com/shelljs/shelljs/pull/691) ([zommerfelds](https://github.com/zommerfelds)) +- fix\(grep, sed, sort, uniq\): Split only on newline characters [\#690](https://github.com/shelljs/shelljs/pull/690) ([freitagbr](https://github.com/freitagbr)) +- Refactor: Use process.platform across codebase [\#689](https://github.com/shelljs/shelljs/pull/689) ([freitagbr](https://github.com/freitagbr)) +- Remove contents of symlink to dir with rm -rf [\#688](https://github.com/shelljs/shelljs/pull/688) ([freitagbr](https://github.com/freitagbr)) +- Echo stdout [\#677](https://github.com/shelljs/shelljs/pull/677) ([nfischer](https://github.com/nfischer)) + +## [v0.7.7](https://github.com/shelljs/shelljs/tree/v0.7.7) (2017-03-09) +[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.6...v0.7.7) + +**Closed issues:** + +- Error output should be consistent across all platforms. [\#681](https://github.com/shelljs/shelljs/issues/681) +- \*CRITICAL data loss\* shell.cp\(\) Content of file is erased when trying to copy it to the folder it already belongs to [\#678](https://github.com/shelljs/shelljs/issues/678) +- Use with webpack broken in 0.7.6 [\#667](https://github.com/shelljs/shelljs/issues/667) +- Difference between bash ls -R and ShellJS ls -R with symlinks [\#666](https://github.com/shelljs/shelljs/issues/666) +- Refactor which\(\) \(too many repeated code blocks\) [\#656](https://github.com/shelljs/shelljs/issues/656) +- find\(\) raises error when unable to find any files matching, expected to return empty array. [\#653](https://github.com/shelljs/shelljs/issues/653) +- Drop support for v0.12 [\#647](https://github.com/shelljs/shelljs/issues/647) +- Reformat the markdown in RELEASE.md [\#642](https://github.com/shelljs/shelljs/issues/642) +- rm -rf doesn't work if the directory contains an asar archive in Electron [\#618](https://github.com/shelljs/shelljs/issues/618) +- Add support for other file types in rm [\#617](https://github.com/shelljs/shelljs/issues/617) +- Feature request: ls -L option [\#563](https://github.com/shelljs/shelljs/issues/563) +- How to send SIGINT signal to child process launched with exec [\#518](https://github.com/shelljs/shelljs/issues/518) +- exec doesnt seem to be working [\#480](https://github.com/shelljs/shelljs/issues/480) +- feature request: option to add node\_modules to the path for shelljs scripts [\#469](https://github.com/shelljs/shelljs/issues/469) +- high cpu usage during synchronous exec [\#167](https://github.com/shelljs/shelljs/issues/167) + +**Merged pull requests:** + +- Add support for removing fifos [\#687](https://github.com/shelljs/shelljs/pull/687) ([freitagbr](https://github.com/freitagbr)) +- chore: add codecov script to appveyor CI [\#686](https://github.com/shelljs/shelljs/pull/686) ([nfischer](https://github.com/nfischer)) +- Refactor tests to improve readability [\#685](https://github.com/shelljs/shelljs/pull/685) ([nfischer](https://github.com/nfischer)) +- fix: convert error output to be consistent cross-platform [\#684](https://github.com/shelljs/shelljs/pull/684) ([nfischer](https://github.com/nfischer)) +- chore: add codecov [\#682](https://github.com/shelljs/shelljs/pull/682) ([nfischer](https://github.com/nfischer)) +- Fix cp overwriting identical files [\#679](https://github.com/shelljs/shelljs/pull/679) ([freitagbr](https://github.com/freitagbr)) +- Modified glob pattern. Fixes \#666 [\#676](https://github.com/shelljs/shelljs/pull/676) ([frandiox](https://github.com/frandiox)) +- refactor\(parseOptions\): better handle errors [\#674](https://github.com/shelljs/shelljs/pull/674) ([nfischer](https://github.com/nfischer)) +- test: add misc. tests to improve coverage [\#673](https://github.com/shelljs/shelljs/pull/673) ([nfischer](https://github.com/nfischer)) +- test: don't count hard-to-test lines for coverage [\#672](https://github.com/shelljs/shelljs/pull/672) ([nfischer](https://github.com/nfischer)) +- fix: switch commands.json -\> commands.js [\#668](https://github.com/shelljs/shelljs/pull/668) ([nfischer](https://github.com/nfischer)) +- ls -L \(follow symlinks\) [\#665](https://github.com/shelljs/shelljs/pull/665) ([frandiox](https://github.com/frandiox)) +- docs\(chmod\): document `options` argument [\#663](https://github.com/shelljs/shelljs/pull/663) ([gkalpak](https://github.com/gkalpak)) +- docs: clean up RELEASE.md [\#662](https://github.com/shelljs/shelljs/pull/662) ([nfischer](https://github.com/nfischer)) +- docs: miscellaneous README changes [\#661](https://github.com/shelljs/shelljs/pull/661) ([nfischer](https://github.com/nfischer)) +- Fix typo in README [\#660](https://github.com/shelljs/shelljs/pull/660) ([faheel](https://github.com/faheel)) +- refactor: reduce repeated code in which\(\) [\#659](https://github.com/shelljs/shelljs/pull/659) ([nfischer](https://github.com/nfischer)) +- feature: add -a option for which command [\#655](https://github.com/shelljs/shelljs/pull/655) ([termosa](https://github.com/termosa)) +- Fix find ENOENT [\#654](https://github.com/shelljs/shelljs/pull/654) ([freitagbr](https://github.com/freitagbr)) +- Safely exit by throwing an error [\#649](https://github.com/shelljs/shelljs/pull/649) ([freitagbr](https://github.com/freitagbr)) +- Chore drop 0.12 [\#648](https://github.com/shelljs/shelljs/pull/648) ([nfischer](https://github.com/nfischer)) +- chore\(lint\): Enforce a trailing comma for multi-line [\#646](https://github.com/shelljs/shelljs/pull/646) ([nfischer](https://github.com/nfischer)) +- docs\(release\): use bulleted list [\#643](https://github.com/shelljs/shelljs/pull/643) ([freitagbr](https://github.com/freitagbr)) + ## [v0.7.6](https://github.com/shelljs/shelljs/tree/v0.7.6) (2017-01-08) [Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.5...v0.7.6) @@ -553,8 +646,8 @@ **Merged pull requests:** -- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([andreweduffy](https://github.com/andreweduffy)) -- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([andreweduffy](https://github.com/andreweduffy)) +- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([a10y](https://github.com/a10y)) +- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([a10y](https://github.com/a10y)) - Fix a small typo in README.md [\#71](https://github.com/shelljs/shelljs/pull/71) ([asmblah](https://github.com/asmblah)) - adding an `.npmignore` file [\#70](https://github.com/shelljs/shelljs/pull/70) ([stephenmathieson](https://github.com/stephenmathieson)) - tempdir: use `os.tmpDir` when possible [\#67](https://github.com/shelljs/shelljs/pull/67) ([stephenmathieson](https://github.com/stephenmathieson)) diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md index 91f110ff4..1f3e6ec0f 100644 --- a/node_modules/shelljs/README.md +++ b/node_modules/shelljs/README.md @@ -732,14 +732,16 @@ Example: ```javascript config.verbose = true; // or set('-v'); cd('dir/'); -ls('subdir/'); +rm('-rf', 'foo.txt', 'bar.txt'); +exec('echo hello'); ``` Will print each command as follows: ``` cd dir/ -ls subdir/ +rm -rf foo.txt bar.txt +exec echo hello ``` ### config.globOptions diff --git a/node_modules/shelljs/README.md~ b/node_modules/shelljs/README.md~ deleted file mode 100644 index cf5a0dd77..000000000 --- a/node_modules/shelljs/README.md~ +++ /dev/null @@ -1,817 +0,0 @@ -# ShellJS - Unix shell commands for Node.js - -[](https://gitter.im/shelljs/shelljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[](https://travis-ci.org/shelljs/shelljs) -[](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) -[](https://www.npmjs.com/package/shelljs) -[](https://www.npmjs.com/package/shelljs) - -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the -Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping -its familiar and powerful commands. You can also install it globally so you can run it from outside -Node projects - say goodbye to those gnarly Bash scripts! - -ShellJS is proudly tested on every node release since `v0.11`! - -The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battled-tested in projects like: - -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader -+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter -+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers -+ [Yeoman](http://yeoman.io/) - Web application stack and development tool -+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation -+ And [many more](https://npmjs.org/browse/depended/shelljs). - -If you have feedback, suggestions, or need help, feel free to post in our [issue tracker](https://github.com/shelljs/shelljs/issues). - -Think ShellJS is cool? Check out some related projects (like -[cash](https://github.com/dthree/cash)--a javascript-based POSIX shell) -in our [Wiki page](https://github.com/shelljs/shelljs/wiki)! - -Upgrading from an older version? Check out our [breaking -changes](https://github.com/shelljs/shelljs/wiki/Breaking-Changes) page to see -what changes to watch out for while upgrading. - -## Command line use - -If you just want cross platform UNIX commands, checkout our new project -[shelljs/shx](https://github.com/shelljs/shx), a utility to expose `shelljs` to -the command line. - -For example: - -``` -$ shx mkdir -p foo -$ shx touch foo/bar.txt -$ shx rm -rf foo -``` - -## A quick note about the docs - -For documentation on all the latest features, check out our -[README](https://github.com/shelljs/shelljs). To read docs that are consistent -with the latest release, check out [the npm -page](https://www.npmjs.com/package/shelljs) or -[shelljs.org](http://documentup.com/shelljs/shelljs). - -## Installing - -Via npm: - -```bash -$ npm install [-g] shelljs -``` - -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - -## Examples - -### JavaScript - -```javascript -require('shelljs/global'); - -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); -} - -// Copy files to release dir -rm('-rf', 'out/Release'); -cp('-R', 'stuff/', 'out/Release'); - -// Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); -}); -cd('..'); - -// Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); -} -``` - -### CoffeeScript - -CoffeeScript is also supported automatically: - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -rm '-rf', 'out/Release' -cp '-R', 'stuff/', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /^.*REMOVE_THIS_LINE.*$/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - -## Global vs. Local - -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. - -Example: - -```javascript -var shell = require('shelljs'); -shell.echo('hello world'); -``` - -<!-- DO NOT MODIFY BEYOND THIS POINT - IT'S AUTOMATICALLY GENERATED --> - - -## Command reference - - -All commands run synchronously, unless otherwise stated. -All commands accept standard bash globbing characters (`*`, `?`, etc.), -compatible with the [node glob module](https://github.com/isaacs/node-glob). - -For less-commonly used commands and features, please check out our [wiki -page](https://github.com/shelljs/shelljs/wiki). - - -### cat(file [, file ...]) -### cat(file_array) - -Examples: - -```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above -``` - -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). - - -### cd([dir]) -Changes to directory `dir` for the duration of the script. Changes to home -directory if no argument is supplied. - - -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) - -Available options: - -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively - -Examples: - -```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); -``` - -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. - - -### cp([options,] source [, source ...], dest) -### cp([options,] source_array, dest) -Available options: - -+ `-f`: force (default behavior) -+ `-n`: no-clobber -+ `-u`: only copy if source is newer than dest -+ `-r`, `-R`: recursive -+ `-L`: follow symlinks -+ `-P`: don't follow symlinks - -Examples: - -```javascript -cp('file1', 'dir1'); -cp('-R', 'path/to/dir/', '~/newCopy/'); -cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -``` - -Copies files. - - -### pushd([options,] [dir | '-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. - -Arguments: - -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. - -Examples: - -```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc -``` - -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. - -### popd([options,] ['-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. - -Examples: - -```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' -``` - -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. - -### dirs([options | '+N' | '-N']) - -Available options: - -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. - -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. - -See also: pushd, popd - - -### echo([options,] string [, string ...]) -Available options: - -+ `-e`: interpret backslash escapes (default) - -Examples: - -```javascript -echo('hello world'); -var str = echo('hello world'); -``` - -Prints string to stdout, and returns string with additional utility methods -like `.to()`. - - -### exec(command [, options] [, callback]) -Available options (all `false` by default): - -+ `async`: Asynchronous execution. If a callback is provided, it will be set to - `true`, regardless of the passed value. -+ `silent`: Do not echo program output to console. -+ and any option available to NodeJS's - [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) - -Examples: - -```javascript -var version = exec('node --version', {silent:true}).stdout; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, stdout, stderr) { - console.log('Exit code:', code); - console.log('Program output:', stdout); - console.log('Program stderr:', stderr); -}); -``` - -Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object -of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -object, and the `callback` gets the arguments `(code, stdout, stderr)`. - -Not seeing the behavior you want? `exec()` runs everything through `sh` -by default (or `cmd.exe` on Windows), which differs from `bash`. If you -need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. - -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - - -### find(path [, path ...]) -### find(path_array) -Examples: - -```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); -``` - -Returns array of all files (however deep) in the given paths. - -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. - - -### grep([options,] regex_filter, file [, file ...]) -### grep([options,] regex_filter, file_array) -Available options: - -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -+ `-l`: Print only filenames of matching files - -Examples: - -```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); -``` - -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. - - -### head([{'-n': \<num\>},] file [, file ...]) -### head([{'-n': \<num\>},] file_array) -Available options: - -+ `-n <num>`: Show the first `<num>` lines of the files - -Examples: - -```javascript -var str = head({'-n': 1}, 'file*.txt'); -var str = head('file1', 'file2'); -var str = head(['file1', 'file2']); // same as above -``` - -Read the start of a file. - - -### 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. - - -### ls([options,] [path, ...]) -### ls([options,] path_array) -Available options: - -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) -+ `-d`: list directories themselves, not their contents -+ `-l`: list objects representing each file, each with fields containing `ls - -l` output fields. See - [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) - for more info - -Examples: - -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} -``` - -Returns array of files in the given path, or in current directory if no path provided. - - -### mkdir([options,] dir [, dir ...]) -### mkdir([options,] dir_array) -Available options: - -+ `-p`: full path (will create intermediate dirs if necessary) - -Examples: - -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` - -Creates directories. - - -### mv([options ,] source [, source ...], dest') -### mv([options ,] source_array, dest') -Available options: - -+ `-f`: force (default behavior) -+ `-n`: no-clobber - -Examples: - -```javascript -mv('-n', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above -``` - -Moves files. - - -### pwd() -Returns the current directory. - - -### rm([options,] file [, file ...]) -### rm([options,] file_array) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above -``` - -Removes files. - - -### sed([options,] search_regex, replacement, file [, file ...]) -### sed([options,] search_regex, replacement, file_array) -Available options: - -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ - -Examples: - -```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -``` - -Reads an input string from `files` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. - -Note: - -Like unix `sed`, ShellJS `sed` supports capture groups. Capture groups are specified -using the `$n` syntax: - -```javascript -sed(/(\w+)\s(\w+)/, '$2, $1', 'file.txt'); -``` - - -### set(options) -Available options: - -+ `+/-e`: exit upon error (`config.fatal`) -+ `+/-v`: verbose: show all commands (`config.verbose`) -+ `+/-f`: disable filename expansion (globbing) - -Examples: - -```javascript -set('-e'); // exit upon first error -set('+e'); // this undoes a "set('-e')" -``` - -Sets global configuration variables - - -### sort([options,] file [, file ...]) -### sort([options,] file_array) -Available options: - -+ `-r`: Reverse the result of comparisons -+ `-n`: Compare according to numerical value - -Examples: - -```javascript -sort('foo.txt', 'bar.txt'); -sort('-r', 'foo.txt'); -``` - -Return the contents of the files, sorted line-by-line. Sorting multiple -files mixes their content, just like unix sort does. - - -### tail([{'-n': \<num\>},] file [, file ...]) -### tail([{'-n': \<num\>},] file_array) -Available options: - -+ `-n <num>`: Show the last `<num>` lines of the files - -Examples: - -```javascript -var str = tail({'-n': 1}, 'file*.txt'); -var str = tail('file1', 'file2'); -var str = tail(['file1', 'file2']); // same as above -``` - -Read the end of a file. - - -### tempdir() - -Examples: - -```javascript -var tmp = tempdir(); // "/tmp" for most *nix platforms -``` - -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). - - -### test(expression) -Available expression primaries: - -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symbolic link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket - -Examples: - -```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file -``` - -Evaluates expression using the available primaries and returns corresponding value. - - -### ShellString.prototype.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` - -Analogous to the redirection operator `>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix -redirections, `to()` will overwrite any existing file!_ - - -### ShellString.prototype.toEnd(file) - -Examples: - -```javascript -cat('input.txt').toEnd('output.txt'); -``` - -Analogous to the redirect-and-append operator `>>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). - - -### touch([options,] file [, file ...]) -### touch([options,] file_array) -Available options: - -+ `-a`: Change only the access time -+ `-c`: Do not create any files -+ `-m`: Change only the modification time -+ `-d DATE`: Parse DATE and use it instead of current time -+ `-r FILE`: Use FILE's times instead of current time - -Examples: - -```javascript -touch('source.js'); -touch('-c', '/path/to/some/dir/source.js'); -touch({ '-r': FILE }, '/path/to/some/dir/source.js'); -``` - -Update the access and modification times of each FILE to the current time. -A FILE argument that does not exist is created empty, unless -c is supplied. -This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. - - -### uniq([options,] [input, [output]]) -Available options: - -+ `-i`: Ignore case while comparing -+ `-c`: Prefix lines by the number of occurrences -+ `-d`: Only print duplicate lines, one for each group of identical lines - -Examples: - -```javascript -uniq('foo.txt'); -uniq('-i', 'foo.txt'); -uniq('-cd', 'foo.txt', 'bar.txt'); -``` - -Filter adjacent matching lines from input - - -### which(command) - -Examples: - -```javascript -var nodeExec = which('node'); -``` - -Searches for `command` in the system's PATH. On Windows, this uses the -`PATHEXT` variable to append the extension if it's not already executable. -Returns string containing the absolute path to the command. - - -### exit(code) -Exits the current process with the given exit code. - -### error() -Tests if error occurred in the last command. Returns a truthy value if an -error returned and a falsy value otherwise. - -**Note**: do not rely on the -return value to be an error message. If you need the last error message, use -the `.stderr` attribute from the last command's return value instead. - - -### ShellString(str) - -Examples: - -```javascript -var foo = ShellString('hello world'); -``` - -Turns a regular string into a string-like object similar to what each -command returns. This has special methods, like `.to()` and `.toEnd()` - - -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut -to process.env. - -### Pipes - -Examples: - -```javascript -grep('foo', 'file1.txt', 'file2.txt').sed(/o/g, 'a').to('output.txt'); -echo('files with o\'s in the name:\n' + ls().grep('o')); -cat('test.js').exec('node'); // pipe to exec() call -``` - -Commands can send their output to another command in a pipe-like fashion. -`sed`, `grep`, `cat`, `exec`, `to`, and `toEnd` can appear on the right-hand -side of a pipe. Pipes can be chained. - -## Configuration - - -### config.silent - -Example: - -```javascript -var sh = require('shelljs'); -var silentState = sh.config.silent; // save old silent state -sh.config.silent = true; -/* ... */ -sh.config.silent = silentState; // restore old silent state -``` - -Suppresses all command output if `true`, except for `echo()` calls. -Default is `false`. - -### config.fatal - -Example: - -```javascript -require('shelljs/global'); -config.fatal = true; // or set('-e'); -cp('this_file_does_not_exist', '/dev/null'); // throws Error here -/* more commands... */ -``` - -If `true` the script will throw a Javascript error when any shell.js -command encounters an error. Default is `false`. This is analogous to -Bash's `set -e` - -### config.verbose - -Example: - -```javascript -config.verbose = true; // or set('-v'); -cd('dir/'); -ls('subdir/'); -``` - -Will print each command as follows: - -``` -cd dir/ -ls subdir/ -``` - -### config.globOptions - -Example: - -```javascript -config.globOptions = {nodir: true}; -``` - -Use this value for calls to `glob.sync()` instead of the default options. - -### config.reset() - -Example: - -```javascript -var shell = require('shelljs'); -// Make changes to shell.config, and do stuff... -/* ... */ -shell.config.reset(); // reset to original state -// Do more stuff, but with original settings -/* ... */ -``` - -Reset shell.config to the defaults: - -```javascript -{ - fatal: false, - globOptions: {}, - maxdepth: 255, - noglob: false, - silent: false, - verbose: false, -} -``` - -## Team - -| [](https://github.com/nfischer) | [](http://github.com/ariporad) | -|:---:|:---:| -| [Nate Fischer](https://github.com/nfischer) | [Ari Porad](http://github.com/ariporad) | diff --git a/node_modules/shelljs/package.json b/node_modules/shelljs/package.json index fb1c75428..c93e33420 100644 --- a/node_modules/shelljs/package.json +++ b/node_modules/shelljs/package.json @@ -1,6 +1,6 @@ { "name": "shelljs", - "version": "0.7.7", + "version": "0.7.8", "description": "Portable Unix shell commands for Node.js", "keywords": [ "shelljs", diff --git a/node_modules/shelljs/shell.js b/node_modules/shelljs/shell.js index f155f3d3a..2541a2036 100644 --- a/node_modules/shelljs/shell.js +++ b/node_modules/shelljs/shell.js @@ -103,14 +103,16 @@ exports.config = common.config; //@ ```javascript //@ config.verbose = true; // or set('-v'); //@ cd('dir/'); -//@ ls('subdir/'); +//@ rm('-rf', 'foo.txt', 'bar.txt'); +//@ exec('echo hello'); //@ ``` //@ //@ Will print each command as follows: //@ //@ ``` //@ cd dir/ -//@ ls subdir/ +//@ rm -rf foo.txt bar.txt +//@ exec echo hello //@ ``` //@ diff --git a/node_modules/shelljs/src/cat.js b/node_modules/shelljs/src/cat.js index a74a25c84..af1ad1d4d 100644 --- a/node_modules/shelljs/src/cat.js +++ b/node_modules/shelljs/src/cat.js @@ -30,6 +30,8 @@ function _cat(options, files) { files.forEach(function (file) { if (!fs.existsSync(file)) { common.error('no such file or directory: ' + file); + } else if (fs.statSync(file).isDirectory()) { + common.error(file + ': Is a directory'); } cat += fs.readFileSync(file, 'utf8'); diff --git a/node_modules/shelljs/src/common.js b/node_modules/shelljs/src/common.js index f5197d8ec..4a1f43456 100644 --- a/node_modules/shelljs/src/common.js +++ b/node_modules/shelljs/src/common.js @@ -38,6 +38,7 @@ var DEFAULT_CONFIG = { silent: false, verbose: false, execPath: null, + bufLength: 64 * 1024, // 64KB }; var config = { @@ -66,9 +67,6 @@ exports.state = state; delete process.env.OLDPWD; // initially, there's no previous directory -var platform = os.type().match(/^Win/) ? 'win' : 'unix'; -exports.platform = platform; - // This is populated by calls to commonl.wrap() var pipeMethods = []; @@ -260,15 +258,33 @@ function expand(list) { if (typeof listEl !== 'string') { expanded.push(listEl); } else { - var ret = glob.sync(listEl, config.globOptions); - // if glob fails, interpret the string literally - expanded = expanded.concat(ret.length > 0 ? ret : [listEl]); + var ret; + try { + ret = glob.sync(listEl, config.globOptions); + // if nothing matched, interpret the string literally + ret = ret.length > 0 ? ret : [listEl]; + } catch (e) { + // if glob fails, interpret the string literally + ret = [listEl]; + } + expanded = expanded.concat(ret); } }); return expanded; } exports.expand = expand; +// Normalizes Buffer creation, using Buffer.alloc if possible. +// Also provides a good default buffer length for most use cases. +var buffer = typeof Buffer.alloc === 'function' ? + function (len) { + return Buffer.alloc(len || config.bufLength); + } : + function (len) { + return new Buffer(len || config.bufLength); + }; +exports.buffer = buffer; + // Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. // file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 function unlinkSync(file) { diff --git a/node_modules/shelljs/src/cp.js b/node_modules/shelljs/src/cp.js index 04c4e57ef..99c97b2eb 100644 --- a/node_modules/shelljs/src/cp.js +++ b/node_modules/shelljs/src/cp.js @@ -1,7 +1,6 @@ var fs = require('fs'); var path = require('path'); var common = require('./common'); -var os = require('os'); common.register('cp', _cp, { cmdOptions: { @@ -24,6 +23,8 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: no such file or directory: ' + srcFile); } + var isWindows = process.platform === 'win32'; + // Check the mtimes of the files if the '-u' flag is provided try { if (options.update && fs.statSync(srcFile).mtime < fs.statSync(destFile).mtime) { @@ -42,11 +43,11 @@ function copyFileSync(srcFile, destFile, options) { } var symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; + var buf = common.buffer(); + var bufLength = buf.length; + var bytesRead = bufLength; var pos = 0; var fdr = null; var fdw = null; @@ -65,8 +66,8 @@ function copyFileSync(srcFile, destFile, options) { common.error('copyFileSync: could not write to dest file (code=' + e.code + '):' + destFile); } - while (bytesRead === BUF_LENGTH) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); + while (bytesRead === bufLength) { + bytesRead = fs.readSync(fdr, buf, 0, bufLength, pos); fs.writeSync(fdw, buf, 0, bytesRead); pos += bytesRead; } @@ -93,6 +94,8 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { if (currentDepth >= common.config.maxdepth) return; currentDepth++; + var isWindows = process.platform === 'win32'; + // Create the directory where all our junk is moving to; read the mode of the // source directory and mirror it try { @@ -116,7 +119,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { // Cycle link found. console.error('Cycle link found.'); symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); continue; } } @@ -131,7 +134,7 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } catch (e) { // it doesn't exist, so no work needs to be done } - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); + fs.symlinkSync(symlinkFull, destFile, isWindows ? 'junction' : null); } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { srcFileStat = fs.statSync(srcFile); if (srcFileStat.isDirectory()) { @@ -150,6 +153,14 @@ function cpdirSyncRecursive(sourceDir, destDir, currentDepth, opts) { } // for files } // cpdirSyncRecursive +// Checks if cureent file was created recently +function checkRecentCreated(sources, index) { + var lookedSource = sources[index]; + return sources.slice(0, index).some(function (src) { + return path.basename(src) === path.basename(lookedSource); + }); +} + function cpcheckcycle(sourceDir, srcFile) { var srcFileStat = fs.lstatSync(srcFile); if (srcFileStat.isSymbolicLink()) { @@ -224,8 +235,9 @@ function _cp(options, sources, dest) { return new common.ShellString('', '', 0); } - sources.forEach(function (src) { + sources.forEach(function (src, srcIndex) { if (!fs.existsSync(src)) { + if (src === '') src = "''"; // if src was empty string, display empty string common.error('no such file or directory: ' + src, { continue: true }); return; // skip file } @@ -259,7 +271,16 @@ function _cp(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } - if (fs.existsSync(thisDest) && options.no_force) { + var thisDestExists = fs.existsSync(thisDest); + if (thisDestExists && checkRecentCreated(sources, srcIndex)) { + // cannot overwrite file created recently in current execution, but we want to continue copying other files + if (!options.no_force) { + common.error("will not overwrite just-created '" + thisDest + "' with '" + src + "'", { continue: true }); + } + return; + } + + if (thisDestExists && options.no_force) { return; // skip file } diff --git a/node_modules/shelljs/src/find.js b/node_modules/shelljs/src/find.js index 625aa2972..76a16c4ee 100644 --- a/node_modules/shelljs/src/find.js +++ b/node_modules/shelljs/src/find.js @@ -30,7 +30,7 @@ function _find(options, paths) { var list = []; function pushFile(file) { - if (common.platform === 'win') { + if (process.platform === 'win32') { file = file.replace(/\\/g, '/'); } list.push(file); diff --git a/node_modules/shelljs/src/head.js b/node_modules/shelljs/src/head.js index 13d582977..e112e49e1 100644 --- a/node_modules/shelljs/src/head.js +++ b/node_modules/shelljs/src/head.js @@ -10,9 +10,9 @@ common.register('head', _head, { // This reads n or more lines, or the entire file, whichever is less. function readSomeLines(file, numLines) { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; + var buf = common.buffer(); + var bufLength = buf.length; + var bytesRead = bufLength; var pos = 0; var fdr = null; @@ -24,8 +24,8 @@ function readSomeLines(file, numLines) { var numLinesRead = 0; var ret = ''; - while (bytesRead === BUF_LENGTH && numLinesRead < numLines) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); + while (bytesRead === bufLength && numLinesRead < numLines) { + bytesRead = fs.readSync(fdr, buf, 0, bufLength, pos); var bufStr = buf.toString('utf8', 0, bytesRead); numLinesRead += bufStr.split('\n').length - 1; ret += bufStr; @@ -72,9 +72,16 @@ function _head(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error("error reading '" + file + "': Is a directory", { + continue: true, + }); + return; + } } var contents; diff --git a/node_modules/shelljs/src/ln.js b/node_modules/shelljs/src/ln.js index 7393d9fcd..9b8beb9ec 100644 --- a/node_modules/shelljs/src/ln.js +++ b/node_modules/shelljs/src/ln.js @@ -43,7 +43,7 @@ function _ln(options, source, dest) { } if (options.symlink) { - var isWindows = common.platform === 'win'; + var isWindows = process.platform === 'win32'; var linkType = isWindows ? 'file' : null; var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); if (!fs.existsSync(resolvedSourcePath)) { diff --git a/node_modules/shelljs/src/mkdir.js b/node_modules/shelljs/src/mkdir.js index 115f75ca4..44b1b2162 100644 --- a/node_modules/shelljs/src/mkdir.js +++ b/node_modules/shelljs/src/mkdir.js @@ -57,9 +57,11 @@ function _mkdir(options, dirs) { dirs.forEach(function (dir) { try { - fs.lstatSync(dir); + var stat = fs.lstatSync(dir); if (!options.fullpath) { common.error('path already exists: ' + dir, { continue: true }); + } else if (stat.isFile()) { + common.error('cannot create directory ' + dir + ': File exists', { continue: true }); } return; // skip dir } catch (e) { @@ -80,12 +82,16 @@ function _mkdir(options, dirs) { fs.mkdirSync(dir, parseInt('0777', 8)); } } catch (e) { + var reason; if (e.code === 'EACCES') { - common.error('cannot create directory ' + dir + ': Permission denied'); + reason = 'Permission denied'; + } else if (e.code === 'ENOTDIR' || e.code === 'ENOENT') { + reason = 'Not a directory'; } else { /* istanbul ignore next */ throw e; } + common.error('cannot create directory ' + dir + ': ' + reason, { continue: true }); } }); return ''; diff --git a/node_modules/shelljs/src/mv.js b/node_modules/shelljs/src/mv.js index 7fc7cf04c..6ebaa8a03 100644 --- a/node_modules/shelljs/src/mv.js +++ b/node_modules/shelljs/src/mv.js @@ -11,6 +11,14 @@ common.register('mv', _mv, { }, }); +// Checks if cureent file was created recently +function checkRecentCreated(sources, index) { + var lookedSource = sources[index]; + return sources.slice(0, index).some(function (src) { + return path.basename(src) === path.basename(lookedSource); + }); +} + //@ //@ ### mv([options ,] source [, source ...], dest') //@ ### mv([options ,] source_array, dest') @@ -55,7 +63,7 @@ function _mv(options, sources, dest) { common.error('dest file already exists: ' + dest); } - sources.forEach(function (src) { + sources.forEach(function (src, srcIndex) { if (!fs.existsSync(src)) { common.error('no such file or directory: ' + src, { continue: true }); return; // skip file @@ -70,6 +78,16 @@ function _mv(options, sources, dest) { thisDest = path.normalize(dest + '/' + path.basename(src)); } + var thisDestExists = fs.existsSync(thisDest); + + if (thisDestExists && checkRecentCreated(sources, srcIndex)) { + // cannot overwrite file created recently in current execution, but we want to continue copying other files + if (!options.no_force) { + common.error("will not overwrite just-created '" + thisDest + "' with '" + src + "'", { continue: true }); + } + return; + } + if (fs.existsSync(thisDest) && options.no_force) { common.error('dest file already exists: ' + thisDest, { continue: true }); return; // skip file diff --git a/node_modules/shelljs/src/rm.js b/node_modules/shelljs/src/rm.js index 595368114..2ad6914b4 100644 --- a/node_modules/shelljs/src/rm.js +++ b/node_modules/shelljs/src/rm.js @@ -17,7 +17,7 @@ common.register('rm', _rm, { // // Licensed under the MIT License // http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { +function rmdirSyncRecursive(dir, force, fromSymlink) { var files; files = fs.readdirSync(dir); @@ -43,6 +43,10 @@ function rmdirSyncRecursive(dir, force) { } } + // if was directory was referenced through a symbolic link, + // the contents should be removed, but not the directory itself + if (fromSymlink) return; + // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. // Huzzah for the shopkeep. @@ -91,6 +95,57 @@ function isWriteable(file) { return writePermission; } +function handleFile(file, options) { + if (options.force || isWriteable(file)) { + // -f was passed, or file is writable, so it can be removed + common.unlinkSync(file); + } else { + common.error('permission denied: ' + file, { continue: true }); + } +} + +function handleDirectory(file, options) { + if (options.recursive) { + // -r was passed, so directory can be removed + rmdirSyncRecursive(file, options.force); + } else { + common.error('path is a directory', { continue: true }); + } +} + +function handleSymbolicLink(file, options) { + var stats; + try { + stats = fs.statSync(file); + } catch (e) { + // symlink is broken, so remove the symlink itself + common.unlinkSync(file); + return; + } + + if (stats.isFile()) { + common.unlinkSync(file); + } else if (stats.isDirectory()) { + if (file[file.length - 1] === '/') { + // trailing separator, so remove the contents, not the link + if (options.recursive) { + // -r was passed, so directory can be removed + var fromSymlink = true; + rmdirSyncRecursive(file, options.force, fromSymlink); + } else { + common.error('path is a directory', { continue: true }); + } + } else { + // no trailing separator, so remove the link + common.unlinkSync(file); + } + } +} + +function handleFIFO(file) { + common.unlinkSync(file); +} + //@ //@ ### rm([options,] file [, file ...]) //@ ### rm([options,] file_array) @@ -115,9 +170,12 @@ function _rm(options, files) { files = [].slice.call(arguments, 1); files.forEach(function (file) { - var stats; + var lstats; try { - stats = fs.lstatSync(file); // test for existence + var filepath = (file[file.length - 1] === '/') + ? file.slice(0, -1) // remove the '/' so lstatSync can detect symlinks + : file; + lstats = fs.lstatSync(filepath); // test for existence } catch (e) { // Path does not exist, no force flag given if (!options.force) { @@ -127,22 +185,14 @@ function _rm(options, files) { } // If here, path exists - if (stats.isFile()) { - if (options.force || isWriteable(file)) { - // -f was passed, or file is writable, so it can be removed - common.unlinkSync(file); - } else { - common.error('permission denied: ' + file, { continue: true }); - } - } else if (stats.isDirectory()) { - if (options.recursive) { - // -r was passed, so directory can be removed - rmdirSyncRecursive(file, options.force); - } else { - common.error('path is a directory', { continue: true }); - } - } else if (stats.isSymbolicLink() || stats.isFIFO()) { - common.unlinkSync(file); + if (lstats.isFile()) { + handleFile(file, options); + } else if (lstats.isDirectory()) { + handleDirectory(file, options); + } else if (lstats.isSymbolicLink()) { + handleSymbolicLink(file, options); + } else if (lstats.isFIFO()) { + handleFIFO(file); } }); // forEach(file) return ''; diff --git a/node_modules/shelljs/src/sort.js b/node_modules/shelljs/src/sort.js index 041b03772..2ebccd7f4 100644 --- a/node_modules/shelljs/src/sort.js +++ b/node_modules/shelljs/src/sort.js @@ -69,9 +69,16 @@ function _sort(options, files) { var lines = []; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - // exit upon any sort of error - common.error('no such file or directory: ' + file); + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error('read failed: ' + file + ': Is a directory', { + continue: true, + }); + return; + } } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); diff --git a/node_modules/shelljs/src/tail.js b/node_modules/shelljs/src/tail.js index 7ece654b1..e5a88055c 100644 --- a/node_modules/shelljs/src/tail.js +++ b/node_modules/shelljs/src/tail.js @@ -46,9 +46,16 @@ function _tail(options, files) { var shouldAppendNewline = false; files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; + if (file !== '-') { + if (!fs.existsSync(file)) { + common.error('no such file or directory: ' + file, { continue: true }); + return; + } else if (fs.statSync(file).isDirectory()) { + common.error("error reading '" + file + "': Is a directory", { + continue: true, + }); + return; + } } var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); diff --git a/node_modules/shelljs/src/uniq.js b/node_modules/shelljs/src/uniq.js index 8f5da0028..30121616a 100644 --- a/node_modules/shelljs/src/uniq.js +++ b/node_modules/shelljs/src/uniq.js @@ -40,7 +40,18 @@ function _uniq(options, input, output) { // Check if this is coming from a pipe var pipe = common.readFromPipe(); - if (!input && !pipe) common.error('no input given'); + if (!pipe) { + if (!input) common.error('no input given'); + + if (!fs.existsSync(input)) { + common.error(input + ': No such file or directory'); + } else if (fs.statSync(input).isDirectory()) { + common.error("error reading '" + input + "'"); + } + } + if (output && fs.existsSync(output) && fs.statSync(output).isDirectory()) { + common.error(output + ': Is a directory'); + } var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). trimRight(). diff --git a/node_modules/shelljs/src/which.js b/node_modules/shelljs/src/which.js index 03db57bcd..a5f9e15eb 100644 --- a/node_modules/shelljs/src/which.js +++ b/node_modules/shelljs/src/which.js @@ -37,6 +37,7 @@ function checkPath(pathName) { function _which(options, cmd) { if (!cmd) common.error('must specify command'); + var isWindows = process.platform === 'win32'; var pathEnv = process.env.path || process.env.Path || process.env.PATH; var pathArray = splitPath(pathEnv); @@ -47,7 +48,7 @@ function _which(options, cmd) { // Assume that there are no extensions to append to queries (this is the // case for unix) var pathExtArray = ['']; - if (common.platform === 'win') { + if (isWindows) { // In case the PATHEXT variable is somehow not set (e.g. // child_process.spawn with an empty environment), use the XP default. var pathExtEnv = process.env.PATHEXT || XP_DEFAULT_PATHEXT; @@ -61,7 +62,7 @@ function _which(options, cmd) { var attempt = path.resolve(pathArray[k], cmd); - if (common.platform === 'win') { + if (isWindows) { attempt = attempt.toUpperCase(); } |