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//@
37//@ Available options:
38//@
39//@ + `-n <num>`: Show the first `<num>` lines of the files
40//@
41//@ Examples:
42//@
43//@ ```javascript
44//@ var str = head({'-n': 1}, 'file*.txt');
45//@ var str = head('file1', 'file2');
46//@ var str = head(['file1', 'file2']); // same as above
47//@ ```
48//@
49//@ Read the start of a file.
50function _head(options, files) {
51 var head = [];
52 var pipe = common.readFromPipe();
53
54 if (!files && !pipe) common.error('no paths given');
55
56 var idx = 1;
57 if (options.numLines === true) {
58 idx = 2;
59 options.numLines = Number(arguments[1]);
60 } else if (options.numLines === false) {
61 options.numLines = 10;
62 }
63 files = [].slice.call(arguments, idx);
64
65 if (pipe) {
66 files.unshift('-');
67 }
68
69 var shouldAppendNewline = false;
70 files.forEach(function (file) {
71 if (file !== '-') {
72 if (!fs.existsSync(file)) {
73 common.error('no such file or directory: ' + file, { continue: true });
74 return;
75 } else if (common.statFollowLinks(file).isDirectory()) {
76 common.error("error reading '" + file + "': Is a directory", {
77 continue: true,
78 });
79 return;
80 }
81 }
82
83 var contents;
84 if (file === '-') {
85 contents = pipe;
86 } else if (options.numLines < 0) {
87 contents = fs.readFileSync(file, 'utf8');
88 } else {
89 contents = readSomeLines(file, options.numLines);
90 }
91
92 var lines = contents.split('\n');
93 var hasTrailingNewline = (lines[lines.length - 1] === '');
94 if (hasTrailingNewline) {
95 lines.pop();
96 }
97 shouldAppendNewline = (hasTrailingNewline || options.numLines < lines.length);
98
99 head = head.concat(lines.slice(0, options.numLines));
100 });
101
102 if (shouldAppendNewline) {
103 head.push(''); // to add a trailing newline once we join
104 }
105 return head.join('\n');
106}
107module.exports = _head;