Skip to content

Commit ca045ea

Browse files
committed
feat(set): add new set() command
Add new set() command as a wrapper for `config` variables. This takes the `-e`, `-v`, `+e`, and `+v` flags.
1 parent 760c191 commit ca045ea

File tree

6 files changed

+163
-5
lines changed

6 files changed

+163
-5
lines changed

README.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,21 @@ A FILE argument that does not exist is created empty, unless -c is supplied.
563563
This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*.
564564

565565

566+
### set(options)
567+
Available options:
568+
569+
+ `+/-e`: exit upon error (`config.fatal`)
570+
+ `+/-v`: verbose: show all commands (`config.verbose`)
571+
572+
Examples:
573+
574+
```javascript
575+
set('-e'); // exit upon first error
576+
set('+e'); // this undoes a "set('-e')"
577+
```
578+
579+
Sets global configuration variables
580+
566581

567582
## Non-Unix commands
568583

@@ -606,10 +621,26 @@ Example:
606621

607622
```javascript
608623
require('shelljs/global');
609-
config.fatal = true;
624+
config.fatal = true; // or set('-e');
610625
cp('this_file_does_not_exist', '/dev/null'); // dies here
611626
/* more commands... */
612627
```
613628

614629
If `true` the script will die on errors. Default is `false`. This is
615630
analogous to Bash's `set -e`
631+
632+
### config.verbose
633+
Example:
634+
635+
```javascript
636+
config.verbose = true; // or set('-v');
637+
cd('dir/');
638+
ls('subdir/');
639+
```
640+
641+
Will print each command as follows:
642+
643+
```
644+
cd dir/
645+
ls subdir/
646+
```

shell.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ exports.chmod = common.wrap('chmod', _chmod);
111111
var _touch = require('./src/touch');
112112
exports.touch = common.wrap('touch', _touch);
113113

114+
//@include ./src/set
115+
var _set = require('./src/set');
116+
exports.set = common.wrap('set', _set);
117+
114118

115119
//@
116120
//@ ## Non-Unix commands
@@ -154,10 +158,27 @@ exports.config = common.config;
154158
//@
155159
//@ ```javascript
156160
//@ require('shelljs/global');
157-
//@ config.fatal = true;
161+
//@ config.fatal = true; // or set('-e');
158162
//@ cp('this_file_does_not_exist', '/dev/null'); // dies here
159163
//@ /* more commands... */
160164
//@ ```
161165
//@
162166
//@ If `true` the script will die on errors. Default is `false`. This is
163167
//@ analogous to Bash's `set -e`
168+
169+
//@
170+
//@ ### config.verbose
171+
//@ Example:
172+
//@
173+
//@ ```javascript
174+
//@ config.verbose = true; // or set('-v');
175+
//@ cd('dir/');
176+
//@ ls('subdir/');
177+
//@ ```
178+
//@
179+
//@ Will print each command as follows:
180+
//@
181+
//@ ```
182+
//@ cd dir/
183+
//@ ls subdir/
184+
//@ ```

src/common.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ var _ls = require('./ls');
55
// Module globals
66
var config = {
77
silent: false,
8-
fatal: false
8+
fatal: false,
9+
verbose: false,
910
};
1011
exports.config = config;
1112

@@ -195,6 +196,12 @@ function wrap(cmd, fn, options) {
195196
try {
196197
var args = [].slice.call(arguments, 0);
197198

199+
if (config.verbose) {
200+
args.unshift(cmd);
201+
console.log.apply(console, args);
202+
args.shift();
203+
}
204+
198205
if (options && options.notUnix) {
199206
retValue = fn.apply(this, args);
200207
} else {

src/set.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
var common = require('./common');
2+
3+
//@
4+
//@ ### set(options)
5+
//@ Available options:
6+
//@
7+
//@ + `+/-e`: exit upon error (`config.fatal`)
8+
//@ + `+/-v`: verbose: show all commands (`config.verbose`)
9+
//@
10+
//@ Examples:
11+
//@
12+
//@ ```javascript
13+
//@ set('-e'); // exit upon first error
14+
//@ set('+e'); // this undoes a "set('-e')"
15+
//@ ```
16+
//@
17+
//@ Sets global configuration variables
18+
function _set(options) {
19+
if (!options) {
20+
var args = [].slice.call(arguments, 0);
21+
if (args.length < 2)
22+
common.error('must provide an argument');
23+
options = args[1];
24+
}
25+
var negate = (options[0] === '+');
26+
if (negate) {
27+
options = '-' + options.slice(1); // parseOptions needs a '-' prefix
28+
}
29+
options = common.parseOptions(options, {
30+
'e': 'fatal',
31+
'v': 'verbose'
32+
});
33+
34+
var key;
35+
if (negate) {
36+
for (key in options)
37+
options[key] = !options[key];
38+
}
39+
40+
for (key in options) {
41+
// Only change the global config if `negate` is false and the option is true
42+
// or if `negate` is true and the option is false (aka negate !== option)
43+
if (negate !== options[key]) {
44+
common.config[key] = options[key];
45+
}
46+
}
47+
return;
48+
}
49+
module.exports = _set;

src/touch.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ var fs = require('fs');
2222
//@ Update the access and modification times of each FILE to the current time.
2323
//@ A FILE argument that does not exist is created empty, unless -c is supplied.
2424
//@ This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*.
25-
//@
26-
//
2725
function _touch(opts, files) {
2826
opts = common.parseOptions(opts, {
2927
'a': 'atime_only',

test/set.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
var shell = require('..');
2+
3+
var assert = require('assert');
4+
5+
var oldConfigSilent = shell.config.silent;
6+
shell.config.silent = true;
7+
8+
shell.rm('-rf', 'tmp');
9+
shell.mkdir('tmp');
10+
11+
//
12+
// Valids
13+
//
14+
15+
// initial values
16+
assert.strictEqual(oldConfigSilent, false);
17+
assert.strictEqual(shell.config.verbose, false);
18+
assert.strictEqual(shell.config.fatal, false);
19+
20+
// default behavior
21+
var result = shell.exec('node -e \"require(\'../global\'); ls(\'file_doesnt_exist\'); echo(1234);\"');
22+
assert.equal(result.code, 0);
23+
assert.equal(result.stdout, '1234\n');
24+
assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n');
25+
26+
// set -e
27+
var result = shell.exec('node -e \"require(\'../global\'); set(\'-e\'); ls(\'file_doesnt_exist\'); echo(1234);\"');
28+
assert.equal(result.code, 1);
29+
assert.equal(result.stdout, '');
30+
assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n');
31+
32+
// set -v
33+
var result = shell.exec('node -e \"require(\'../global\'); set(\'-v\'); ls(\'file_doesnt_exist\'); echo(1234);\"');
34+
assert.equal(result.code, 0);
35+
assert.equal(result.stdout, 'ls file_doesnt_exist\n1234\n');
36+
assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n');
37+
38+
// set -ev
39+
var result = shell.exec('node -e \"require(\'../global\'); set(\'-ev\'); ls(\'file_doesnt_exist\'); echo(1234);\"');
40+
assert.equal(result.code, 1);
41+
assert.equal(result.stdout, 'ls file_doesnt_exist\n');
42+
assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n');
43+
44+
// set -e, set +e
45+
var result = shell.exec('node -e \"require(\'../global\'); set(\'-e\'); set(\'+e\'); ls(\'file_doesnt_exist\'); echo(1234);\"');
46+
assert.equal(result.code, 0);
47+
assert.equal(result.stdout, '1234\n');
48+
assert.equal(result.stderr, 'ls: no such file or directory: file_doesnt_exist\n');
49+
50+
shell.exit(123);
51+
52+

0 commit comments

Comments
 (0)