54 lines
1.7 KiB
JavaScript
54 lines
1.7 KiB
JavaScript
/* 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(","));
|
|
}
|