/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import fs from "fs"; import path from "path"; import crypto from "crypto"; import flatmap from "flatmap"; // Compute the SHA-256 digest. function sha256(data) { let hash = crypto.createHash("sha256"); hash.update(data); return hash.digest("hex"); } // Recursively collect a list of all files of a given directory. function collectFilesInDirectory(dir) { return flatmap(fs.readdirSync(dir), entry => { let entry_path = path.join(dir, entry); if (fs.lstatSync(entry_path).isDirectory()) { return collectFilesInDirectory(entry_path); } return [entry_path]; }); } // A list of hashes for each file in the given path. function collectFileHashes(context_path) { let root = path.join(__dirname, "../../../.."); let dir = path.join(root, context_path); let files = collectFilesInDirectory(dir).sort(); return files.map(file => { return sha256(file + "|" + fs.readFileSync(file, "utf-8")); }); } // Compute a context hash for the given context path. export default function (context_path) { // Regenerate all images when the image_builder changes. let hashes = collectFileHashes("automation/taskcluster/image_builder"); // Regenerate images when the image itself changes. hashes = hashes.concat(collectFileHashes(context_path)); // Generate a new prefix every month to ensure the image stays buildable. let now = new Date(); let prefix = `${now.getUTCFullYear()}-${now.getUTCMonth() + 1}:`; return sha256(prefix + hashes.join(",")); }