'triton packages --human' for M/G/T units on sizes
This commit is contained in:
parent
233e8ee784
commit
5e3efa02a6
@ -179,20 +179,65 @@ function humanDurationFromMs(ms) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapted from <http://stackoverflow.com/a/18650828>
|
* Adapted from <http://stackoverflow.com/a/18650828>
|
||||||
|
*
|
||||||
|
* @param {Number} opts.precision The number of decimal places of precision to
|
||||||
|
* include. Note: This is just clipping (i.e. floor) instead of rounding.
|
||||||
|
* TODO: round
|
||||||
|
* @param {Boolean} opts.narrow Make it as narrow as possible: short units,
|
||||||
|
* no space between value and unit, drop precision if it is all zeros.
|
||||||
*/
|
*/
|
||||||
function humanSizeFromBytes(bytes) {
|
function humanSizeFromBytes(opts, bytes) {
|
||||||
|
if (bytes === undefined) {
|
||||||
|
opts = {};
|
||||||
|
bytes = opts;
|
||||||
|
}
|
||||||
assert.number(bytes, 'bytes');
|
assert.number(bytes, 'bytes');
|
||||||
var sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB'];
|
// The number of decimal places, default 1.
|
||||||
|
assert.optionalNumber(opts.precision, 'opts.precision');
|
||||||
|
var precision = opts.precision === undefined ? 1 : opts.precision;
|
||||||
|
assert.ok(precision >= 0);
|
||||||
|
assert.optionalBool(opts.narrow, 'opts.narrow');
|
||||||
|
|
||||||
|
var sizes = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'];
|
||||||
|
if (opts.narrow) {
|
||||||
|
sizes = ['B', 'K', 'M', 'G', 'T', 'P'];
|
||||||
|
}
|
||||||
|
var template = opts.narrow ? '%s%s' : '%s %s';
|
||||||
|
|
||||||
if (bytes === 0) {
|
if (bytes === 0) {
|
||||||
return '0 B';
|
return '0 B';
|
||||||
}
|
}
|
||||||
|
|
||||||
var i = Number(Math.floor(Math.log(bytes) / Math.log(1024)));
|
var i = Number(Math.floor(Math.log(bytes) / Math.log(1024)));
|
||||||
var s = String(bytes / Math.pow(1024, i));
|
var s = String(bytes / Math.pow(1024, i));
|
||||||
var precision1 = (s.indexOf('.') === -1
|
var hasDecimal = s.indexOf('.') !== -1;
|
||||||
? s + '.0' : s.slice(0, s.indexOf('.') + 2));
|
if (precision === 0) {
|
||||||
return format('%s %s', precision1, sizes[i]);
|
if (hasDecimal) {
|
||||||
|
s = s.slice(0, s.indexOf('.'));
|
||||||
|
}
|
||||||
|
} else if (opts.narrow && !hasDecimal) {
|
||||||
|
/* skip all-zero precision */
|
||||||
|
} else {
|
||||||
|
if (!hasDecimal) {
|
||||||
|
s += '.';
|
||||||
|
}
|
||||||
|
var places = s.length - s.indexOf('.') - 1;
|
||||||
|
while (places < precision) {
|
||||||
|
s += '0';
|
||||||
|
places++;
|
||||||
|
}
|
||||||
|
if (places > precision) {
|
||||||
|
s = s.slice(0, s.length - places + precision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//var precision1 = (s.indexOf('.') === -1
|
||||||
|
// ? s + '.0' : s.slice(0, s.indexOf('.') + 2));
|
||||||
|
|
||||||
|
return format(template, s, sizes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
humanSizeFromBytes({precision:1}, 1638400);
|
||||||
|
|
||||||
function capitalize(s) {
|
function capitalize(s) {
|
||||||
return s[0].toUpperCase() + s.substr(1);
|
return s[0].toUpperCase() + s.substr(1);
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ function do_packages (subcmd, opts, args, callback) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = 'shortid,name,default,memory,disk'.split(',');
|
var columns = 'shortid,name,default,memory,swap,disk'.split(',');
|
||||||
if (opts.o) {
|
if (opts.o) {
|
||||||
/* JSSTYLED */
|
/* JSSTYLED */
|
||||||
columns = opts.o.trim().split(/\s*,\s*/g);
|
columns = opts.o.trim().split(/\s*,\s*/g);
|
||||||
@ -46,6 +46,34 @@ function do_packages (subcmd, opts, args, callback) {
|
|||||||
for (var i = 0; i < pkgs.length; i++) {
|
for (var i = 0; i < pkgs.length; i++) {
|
||||||
var pkg = pkgs[i];
|
var pkg = pkgs[i];
|
||||||
pkg.shortid = pkg.id.split('-', 1)[0];
|
pkg.shortid = pkg.id.split('-', 1)[0];
|
||||||
|
if (opts.human) {
|
||||||
|
pkg.memoryHuman = common.humanSizeFromBytes({
|
||||||
|
precision: 1,
|
||||||
|
narrow: true
|
||||||
|
}, pkg.memory * 1024 * 1024);
|
||||||
|
pkg.swapHuman = common.humanSizeFromBytes({
|
||||||
|
precision: 1,
|
||||||
|
narrow: true
|
||||||
|
}, pkg.swap * 1024 * 1024);
|
||||||
|
pkg.diskHuman = common.humanSizeFromBytes({
|
||||||
|
precision: 1,
|
||||||
|
narrow: true
|
||||||
|
}, pkg.disk * 1024 * 1024);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opts.human) {
|
||||||
|
columns = columns.map(function (c) {
|
||||||
|
switch (c) {
|
||||||
|
case 'memory':
|
||||||
|
return {lookup: 'memoryHuman', name: 'MEMORY'};
|
||||||
|
case 'swap':
|
||||||
|
return {lookup: 'swapHuman', name: 'SWAP'};
|
||||||
|
case 'disk':
|
||||||
|
return {lookup: 'diskHuman', name: 'DISK'};
|
||||||
|
default:
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
tabula(pkgs, {
|
tabula(pkgs, {
|
||||||
skipHeader: opts.H,
|
skipHeader: opts.H,
|
||||||
@ -89,6 +117,11 @@ do_packages.options = [
|
|||||||
help: 'Sort on the given fields. Default is "name".',
|
help: 'Sort on the given fields. Default is "name".',
|
||||||
helpArg: 'field1,...'
|
helpArg: 'field1,...'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
names: ['human'],
|
||||||
|
type: 'bool',
|
||||||
|
help: '"Human-readable" output. Show MiB, GiB, etc units for sizes.'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
names: ['json', 'j'],
|
names: ['json', 'j'],
|
||||||
type: 'bool',
|
type: 'bool',
|
||||||
|
Reference in New Issue
Block a user