Skip to content

Commit 42754c1

Browse files
authored
Added support for -n +NUM in tail.js (with sign) (shelljs#1027)
1 parent 5af16d5 commit 42754c1

2 files changed

Lines changed: 40 additions & 4 deletions

File tree

src/tail.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,20 @@ function _tail(options, files) {
3232
if (!files && !pipe) common.error('no paths given');
3333

3434
var idx = 1;
35+
var plusOption = false;
3536
if (options.numLines === true) {
3637
idx = 2;
38+
if (arguments[1][0] === '+') {
39+
plusOption = true;
40+
}
3741
options.numLines = Number(arguments[1]);
3842
} else if (options.numLines === false) {
3943
options.numLines = 10;
4044
}
45+
// arguments[0] is a json object
46+
if (arguments[0].numLines[0] === '+') {
47+
plusOption = true;
48+
}
4149
options.numLines = -1 * Math.abs(options.numLines);
4250
files = [].slice.call(arguments, idx);
4351

@@ -69,12 +77,14 @@ function _tail(options, files) {
6977
shouldAppendNewline = false;
7078
}
7179

72-
tail = tail.concat(lines.slice(options.numLines));
80+
tail = tail.concat(plusOption ? lines.slice(-options.numLines - 1) : lines.slice(options.numLines));
7381
});
7482

7583
if (shouldAppendNewline) {
7684
tail.push(''); // to add a trailing newline once we join
7785
}
86+
7887
return tail.join('\n');
7988
}
89+
8090
module.exports = _tail;

test/tail.js

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ test('reading more lines than are in the file (with trailing newline)', t => {
9090
t.is(result.toString(), 'short2\nshort1\n'); // these files only have one line (with \n)
9191
});
9292

93-
test('Globbed file', t => {
93+
test('globbed file', t => {
9494
const result = shell.tail('test/resources/head/file?.txt');
9595
t.falsy(shell.error());
9696
t.is(result.code, 0);
@@ -102,7 +102,7 @@ test('Globbed file', t => {
102102
.join('\n') + '\n');
103103
});
104104

105-
test('With `\'-n\' <num>` option', t => {
105+
test('with `\'-n\' <num>` option', t => {
106106
const result = shell.tail('-n', 4, 'test/resources/head/file2.txt',
107107
'test/resources/head/file1.txt');
108108
t.falsy(shell.error());
@@ -115,7 +115,20 @@ test('With `\'-n\' <num>` option', t => {
115115
.join('\n') + '\n');
116116
});
117117

118-
test('With `{\'-n\': <num>}` option', t => {
118+
test('with `\'-n\' +<num>` option', t => {
119+
const result = shell.tail('-n', '+48', 'test/resources/head/file2.txt',
120+
'test/resources/head/file1.txt');
121+
t.falsy(shell.error());
122+
t.is(result.code, 0);
123+
t.is(result.toString(),
124+
bottomOfFile2
125+
.slice(0, 3)
126+
.reverse()
127+
.concat(bottomOfFile1.slice(0, 3).reverse())
128+
.join('\n') + '\n');
129+
});
130+
131+
test('with `{\'-n\': <num>}` option', t => {
119132
const result = shell.tail({ '-n': 4 }, 'test/resources/head/file2.txt',
120133
'test/resources/head/file1.txt');
121134
t.falsy(shell.error());
@@ -128,6 +141,19 @@ test('With `{\'-n\': <num>}` option', t => {
128141
.join('\n') + '\n');
129142
});
130143

144+
test('with `{\'-n\': +<num>}` option', t => {
145+
const result = shell.tail({ '-n': '+48' }, 'test/resources/head/file2.txt',
146+
'test/resources/head/file1.txt');
147+
t.falsy(shell.error());
148+
t.is(result.code, 0);
149+
t.is(result.toString(),
150+
bottomOfFile2
151+
.slice(0, 3)
152+
.reverse()
153+
.concat(bottomOfFile1.slice(0, 3).reverse())
154+
.join('\n') + '\n');
155+
});
156+
131157
test('negative values are the same as positive values', t => {
132158
const result = shell.tail('-n', -4, 'test/resources/head/file2.txt',
133159
'test/resources/head/file1.txt');

0 commit comments

Comments
 (0)