UNPKG

2.68 kBJavaScriptView Raw
1var common = require('./common');
2var fs = require('fs');
3
4common.register('head', _head, {
5 canReceivePipe: true,
6 cmdOptions: {
7 'n': 'numLines',
8 },
9});
10
11// Reads |numLines| lines or the entire file, whichever is less.
12function readSomeLines(file, numLines) {
13 var buf = common.buffer();
14 var bufLength = buf.length;
15 var bytesRead = bufLength;
16 var pos = 0;
17
18 var fdr = fs.openSync(file, 'r');
19 var numLinesRead = 0;
20 var ret = '';
21 while (bytesRead === bufLength && numLinesRead < numLines) {
22 bytesRead = fs.readSync(fdr, buf, 0, bufLength, pos);
23 var bufStr = buf.toString('utf8', 0, bytesRead);
24 numLinesRead += bufStr.split('\n').length - 1;
25 ret += bufStr;
26 pos += bytesRead;
27 }
28
29 fs.closeSync(fdr);
30 return ret;
31}
32
33//@
34//@ ### head([{'-n': \<num\>},] file [, file ...])
35//@ ### head([{'-n': \<num\>},] file_array)
36//@ Available options:
37//@
38//@ + `-n <num>`: Show the first `<num>` lines of the files
39//@
40//@ Examples:
41//@
42//@ ```javascript
43//@ var str = head({'-n': 1}, 'file*.txt');
44//@ var str = head('file1', 'file2');
45//@ var str = head(['file1', 'file2']); // same as above
46//@ ```
47//@
48//@ Read the start of a file.
49function _head(options, files) {
50 var head = [];
51 var pipe = common.readFromPipe();
52
53 if (!files && !pipe) common.error('no paths given');
54
55 var idx = 1;
56 if (options.numLines === true) {
57 idx = 2;
58 options.numLines = Number(arguments[1]);
59 } else if (options.numLines === false) {
60 options.numLines = 10;
61 }
62 files = [].slice.call(arguments, idx);
63
64 if (pipe) {
65 files.unshift('-');
66 }
67
68 var shouldAppendNewline = false;
69 files.forEach(function (file) {
70 if (file !== '-') {
71 if (!fs.existsSync(file)) {
72 common.error('no such file or directory: ' + file, { continue: true });
73 return;
74 } else if (common.statFollowLinks(file).isDirectory()) {
75 common.error("error reading '" + file + "': Is a directory", {
76 continue: true,
77 });
78 return;
79 }
80 }
81
82 var contents;
83 if (file === '-') {
84 contents = pipe;
85 } else if (options.numLines < 0) {
86 contents = fs.readFileSync(file, 'utf8');
87 } else {
88 contents = readSomeLines(file, options.numLines);
89 }
90
91 var lines = contents.split('\n');
92 var hasTrailingNewline = (lines[lines.length - 1] === '');
93 if (hasTrailingNewline) {
94 lines.pop();
95 }
96 shouldAppendNewline = (hasTrailingNewline || options.numLines < lines.length);
97
98 head = head.concat(lines.slice(0, options.numLines));
99 });
100
101 if (shouldAppendNewline) {
102 head.push(''); // to add a trailing newline once we join
103 }
104 return head.join('\n');
105}
106module.exports = _head;