diff --git a/utility/create-sha-file.js b/utility/create-sha-file.js new file mode 100644 index 000000000..11336e960 --- /dev/null +++ b/utility/create-sha-file.js @@ -0,0 +1,31 @@ +const fs = require("fs"); +const crypto = require("crypto"); + +module.exports = async function (out, archiveFiles) { + let s = ""; + for (const file of archiveFiles) { + s += `${file.base}\t${await hashFile(file.full)}\n`; + } + await fs.promises.writeFile(out, s); +}; + +function hashFile(path) { + return new Promise((resolve, reject) => { + let sum = crypto.createHash("sha256"); + + let fileStream = fs.createReadStream(path); + fileStream.on("error", err => { + return reject(err); + }); + fileStream.on("data", chunk => { + try { + sum.update(chunk); + } catch (ex) { + return reject(ex); + } + }); + fileStream.on("end", () => { + return resolve(sum.digest("hex")); + }); + }); +} diff --git a/verdafile.js b/verdafile.js index 5c5ff9702..b6c4d6535 100644 --- a/verdafile.js +++ b/verdafile.js @@ -889,28 +889,26 @@ phony(`clean`, async () => { build.deleteJournal(); }); phony(`release`, async target => { - const [collectPlans] = await target.need(CollectPlans); + const [version, collectPlans] = await target.need(Version, CollectPlans); let goals = []; for (const [cgr, plan] of Object.entries(collectPlans)) { if (!plan.inRelease) continue; - goals.push(ReleaseGroup(cgr)); + const subGroups = collectPlans[cgr].groupDecomposition; + goals.push(TtcArchiveFile(cgr, version)); + goals.push(SuperTtcArchiveFile(cgr, version)); + for (const gr of subGroups) { + goals.push(GroupTtfArchiveFile(gr, version)); + goals.push(GroupTtfUnhintedArchiveFile(gr, version)); + goals.push(GroupWebArchiveFile(gr, version)); + } } - await target.need(goals); + const [archiveFiles] = await target.need(goals); + // Create hash of packages + await target.need(fu`utility/create-sha-file.js`); + await node("utility/create-sha-file.js", "doc/packages-sha.txt", archiveFiles); + // Images and release notes await target.need(SampleImages, Pages, AmendReadme, ReleaseNotes, ChangeLog); }); -const ReleaseGroup = phony.group("release-group", async (target, cgr) => { - const [version, collectPlans] = await target.need(Version, CollectPlans); - const subGroups = collectPlans[cgr].groupDecomposition; - - let goals = [TtcArchiveFile(cgr, version), SuperTtcArchiveFile(cgr, version)]; - for (const gr of subGroups) { - goals.push(GroupTtfArchiveFile(gr, version)); - goals.push(GroupTtfUnhintedArchiveFile(gr, version)); - goals.push(GroupWebArchiveFile(gr, version)); - } - - await target.need(goals); -}); /////////////////////////////////////////////////////////// ////// Script Building //////