1 | var common = require('./common');
|
2 | var fs = require('fs');
|
3 |
|
4 | common.register('head', _head, {
|
5 | canReceivePipe: true,
|
6 | cmdOptions: {
|
7 | 'n': 'numLines',
|
8 | },
|
9 | });
|
10 |
|
11 |
|
12 | function 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 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | function _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('');
|
103 | }
|
104 | return head.join('\n');
|
105 | }
|
106 | module.exports = _head;
|