From bceb08b36faaa357d7680d35a91991aa6b5c3975 Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 5 Jun 2018 20:30:07 -0400 Subject: [PATCH] build: add check for lib size --- Gulpfile.js | 10 +++++++++- scripts/build/get-dir-size.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 scripts/build/get-dir-size.js diff --git a/Gulpfile.js b/Gulpfile.js index 52744e12740..0c8b4e119cb 100644 --- a/Gulpfile.js +++ b/Gulpfile.js @@ -12,6 +12,7 @@ const clone = require("gulp-clone"); const newer = require("gulp-newer"); const tsc = require("gulp-typescript"); const tsc_oop = require("./scripts/build/gulp-typescript-oop"); +const { getDirSize } = require("./scripts/build/get-dir-size"); const insert = require("gulp-insert"); const sourcemaps = require("gulp-sourcemaps"); const Q = require("q"); @@ -588,7 +589,14 @@ gulp.task("VerifyLKG", /*help*/ false, [], () => { gulp.task("LKGInternal", /*help*/ false, ["lib", "local"]); gulp.task("LKG", "Makes a new LKG out of the built js files", ["clean", "dontUseDebugMode"], () => { - return runSequence("LKGInternal", "VerifyLKG"); + const lib = "./lib"; + const sizeBefore = getDirSize(lib); + const seq = runSequence("LKGInternal", "VerifyLKG"); + const sizeAfter = getDirSize(lib); + if (sizeAfter > (sizeBefore * 1.10)) { + throw new Error("The lib folder increased by 10% or more. This likely indicates a bug."); + } + return seq; }); diff --git a/scripts/build/get-dir-size.js b/scripts/build/get-dir-size.js new file mode 100644 index 00000000000..1b36e4cdb11 --- /dev/null +++ b/scripts/build/get-dir-size.js @@ -0,0 +1,32 @@ +// @ts-check +const { lstatSync, readdirSync } = require("fs"); +const { join } = require("path"); +const { promisify } = require("util"); +const execFile = promisify(require("child_process").execFile); + +/** + * Find the size of a directory recursively. + * Symbolic links are counted once (same inode). + * @param {string} root + * @param {Set} seen + * @returns {number} bytes + */ +function getDirSize(root, seen = new Set()) { + const stats = lstatSync(root); + + if (seen.has(stats.ino)) { + return 0; + } + + seen.add(stats.ino); + + if (!stats.isDirectory()) { + return stats.size; + } + + return readdirSync(root) + .map(file => getDirSize(join(root, file), seen)) + .reduce((acc, num) => acc + num, 0); +} + +exports.getDirSize = getDirSize;