Skip to content

Commit c336666

Browse files
committed
address more comments, add total sizes stats at end
1 parent f8c64d5 commit c336666

File tree

1 file changed

+62
-23
lines changed

1 file changed

+62
-23
lines changed

utils/compress.mjs

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import commandLineUsage from 'command-line-usage';
33
import { globSync } from 'glob';
44
import zlib from 'zlib';
55
import fs from 'fs';
6+
import path from 'path';
67

78
function parseCommandLineArgs() {
89
const optionDefinitions = [
@@ -46,12 +47,20 @@ function parseCommandLineArgs() {
4647
return options;
4748
}
4849

50+
function calculateCompressionRatio(originalSize, compressedSize) {
51+
return (1 - compressedSize / originalSize) * 100;
52+
}
53+
54+
function calculateExpansionRatio(compressedSize, decompressedSize) {
55+
return (decompressedSize / compressedSize - 1) * 100;
56+
}
57+
4958
function compress(inputData) {
5059
const compressedData = zlib.deflateSync(inputData, { level: zlib.constants.Z_BEST_COMPRESSION });
5160

5261
const originalSize = inputData.length;
5362
const compressedSize = compressedData.length;
54-
const compressionRatio = (1 - compressedSize / originalSize) * 100;
63+
const compressionRatio = calculateCompressionRatio(originalSize, compressedSize);
5564
console.log(` Original size: ${String(originalSize).padStart(8)} bytes`);
5665
console.log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
5766
console.log(` Compression ratio: ${compressionRatio.toFixed(2).padStart(8)}%`);
@@ -64,52 +73,82 @@ function decompress(inputData) {
6473

6574
const compressedSize = inputData.length;
6675
const decompressedSize = decompressedData.length;
67-
const expansionRatio = (decompressedSize / compressedSize - 1) * 100;
76+
const expansionRatio = calculateExpansionRatio(compressedSize, decompressedSize);
6877
console.log(` Compressed size: ${String(compressedSize).padStart(8)} bytes`);
6978
console.log(` Decompressed size: ${String(decompressedSize).padStart(8)} bytes`);
7079
console.log(` Expansion ratio: ${expansionRatio.toFixed(2).padStart(8)}%`);
7180

7281
return decompressedData;
7382
}
7483

75-
function processFiles(options) {
84+
function globsToFiles(globs) {
7685
let files = [];
77-
console.assert(options.globs.length > 0);
78-
for (const glob of options.globs) {
86+
console.assert(globs.length > 0);
87+
for (const glob of globs) {
7988
const matches = globSync(glob, { nodir: true });
8089
files = files.concat(matches);
8190
}
8291
files = Array.from(new Set(files)).sort();
92+
return files;
93+
}
8394

84-
const verb = options.decompress ? 'decompress' : 'compress';
95+
function processFiles(files, isDecompress, keep) {
96+
const verb = isDecompress ? 'decompress' : 'compress';
8597
console.log(`Found ${files.length} files to ${verb}` + (files.length ? ':' : '.'));
8698

87-
for (const inputFile of files) {
88-
try {
89-
console.log(inputFile);
99+
// For printing overall statistics at the end.
100+
let totalInputSize = 0;
101+
let totalOutputSize = 0;
90102

91-
// Copy the mode over to avoid git status entries after a roundtrip.
92-
const { mode } = fs.statSync(inputFile);
93-
const inputData = fs.readFileSync(inputFile);
94-
const outputData = options.decompress ? decompress(inputData) : compress(inputData);
95-
let outputFile;
96-
if (options.decompress) {
97-
outputFile = inputFile.endsWith('.z') ? inputFile.slice(0, -2) : `${inputFile}.decompressed`;
103+
for (const inputFilename of files) {
104+
try {
105+
console.log(inputFilename);
106+
let outputFilename;
107+
if (isDecompress) {
108+
if (path.extname(inputFilename) !== '.z') {
109+
console.warn(` Warning: Input file does not have a .z extension.`);
110+
outputFilename = `${inputFilename}.decompressed`;
111+
} else {
112+
outputFilename = inputFilename.slice(0, -2);
113+
}
114+
console.log(` Decompressing to: ${outputFilename}`);
98115
} else {
99-
outputFile = `${inputFile}.z`;
116+
outputFilename = `${inputFilename}.z`;
100117
}
101-
fs.writeFileSync(outputFile, outputData, { mode });
102118

103-
if (!options.keep) {
104-
fs.unlinkSync(inputFile);
119+
// Copy the mode over to avoid git status entries after a roundtrip.
120+
const { mode } = fs.statSync(inputFilename);
121+
const inputData = fs.readFileSync(inputFilename);
122+
const outputData = isDecompress ? decompress(inputData) : compress(inputData);
123+
fs.writeFileSync(outputFilename, outputData, { mode });
124+
125+
totalInputSize += inputData.length;
126+
totalOutputSize += outputData.length;
127+
128+
if (!keep) {
129+
fs.unlinkSync(inputFilename);
105130
console.log(` Deleted input file.`);
106131
}
107132
} catch (err) {
108-
console.error(`Error ${verb}ing ${inputFile}:`, err);
133+
console.error(`Error ${verb}ing ${inputFilename}:`, err);
134+
}
135+
}
136+
137+
if (files.length > 1) {
138+
if (isDecompress) {
139+
const totalExpansionRatio = calculateExpansionRatio(totalInputSize, totalOutputSize);
140+
console.log(`Total compressed sizes: ${String(totalInputSize).padStart(9)} bytes`);
141+
console.log(`Total decompressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
142+
console.log(`Average expansion ratio: ${totalExpansionRatio.toFixed(2).padStart(9)}%`);
143+
} else {
144+
const totalCompressionRatio = calculateCompressionRatio(totalInputSize, totalOutputSize);
145+
console.log(`Total original sizes: ${String(totalInputSize).padStart(9)} bytes`);
146+
console.log(`Total compressed sizes: ${String(totalOutputSize).padStart(9)} bytes`);
147+
console.log(`Average compression ratio: ${totalCompressionRatio.toFixed(2).padStart(9)}%`);
109148
}
110149
}
111150
}
112151

113152
const options = parseCommandLineArgs();
114-
processFiles(options);
115-
153+
const files = globsToFiles(options.globs);
154+
processFiles(files, options.decompress, options.keep);

0 commit comments

Comments
 (0)