|
| 1 | +#!/usr/bin/env node |
| 2 | +const mkdirp = require('mkdirp') |
| 3 | +const { readFileSync } = require('fs') |
| 4 | +const { writeFile } = require('fs/promises') |
| 5 | +const rimraf = require('rimraf') |
| 6 | +const filesPerDir = 10 |
| 7 | +const dirsPerDir = 5 |
| 8 | +const max = (module === require.main && +process.argv[2]) || 1_000_000 |
| 9 | +const { now } = performance |
| 10 | +let lastReported = now() |
| 11 | + |
| 12 | +const report = s => { |
| 13 | + if (!process.stderr.isTTY) return |
| 14 | + process.stderr.write('\r' + s.padEnd(40)) |
| 15 | +} |
| 16 | + |
| 17 | +let made = 0 |
| 18 | +const makeStep = async dir => { |
| 19 | + if (now() - lastReported > 250) report('growing: ' + made) |
| 20 | + const promises = [] |
| 21 | + for (let i = 0; i < filesPerDir && made < max; i++) { |
| 22 | + made++ |
| 23 | + promises.push(writeFile(`${dir}/${i}.txt`, '')) |
| 24 | + } |
| 25 | + await Promise.all(promises) |
| 26 | + |
| 27 | + const childDirs = [] |
| 28 | + for (let i = 0; i < dirsPerDir && made < max; i++) { |
| 29 | + made++ |
| 30 | + await mkdirp(`${dir}/${i}`) |
| 31 | + childDirs.push(makeStep(`${dir}/${i}`)) |
| 32 | + } |
| 33 | + await Promise.all(childDirs) |
| 34 | +} |
| 35 | + |
| 36 | +const make = async root => { |
| 37 | + try { |
| 38 | + const already = +readFileSync(`${root}/bigtree.txt`) |
| 39 | + if (already === max) { |
| 40 | + console.log('already done!') |
| 41 | + return |
| 42 | + } |
| 43 | + } catch (_) {} |
| 44 | + report('chop down previous bigtree...') |
| 45 | + await rimraf(root + '/bigtree') |
| 46 | + report('creating bigtree...') |
| 47 | + report('\n') |
| 48 | + await mkdirp(root + '/bigtree') |
| 49 | + await makeStep(root + '/bigtree') |
| 50 | + await writeFile(`${root}/bigtree.txt`, `${max}`) |
| 51 | +} |
| 52 | + |
| 53 | +make(__dirname + '/fixture').then(() => { |
| 54 | + if (process.stderr.isTTY) process.stderr.write('\r'.padEnd(40) + '\r') |
| 55 | + console.log('done') |
| 56 | +}) |
0 commit comments