coze-studio/.codebase/scripts/checksum-by-change.js

54 lines
1.6 KiB
JavaScript

const fs = require('fs/promises');
const path = require('path');
const crypto = require('crypto');
// node scripts/checksum-by-change.js /usr/changed-path.json
// change-path 文件来自 ci
const changedPath = process.argv[2];
const readJson = async jsonFile => {
const content = await fs.readFile(jsonFile, 'utf-8');
let _val = null;
try {
eval(`_val = ${content}`);
return _val;
} catch (e) {
console.error(`json parse failure: `, e);
}
};
const readChangedPackages = async changedPath => {
const [changedFiles, { projects }] = await Promise.all([
readJson(changedPath),
readJson(path.resolve(__dirname, '../../rush.json')),
]);
const changedProjects = projects
.filter(project => {
const { projectFolder } = project;
const endsWithSlash = projectFolder.endsWith('/');
const compareFolder = `${projectFolder}${endsWithSlash ? '' : '/'}`;
if (!changedFiles) {
// changed-path.json 内容可能为null
return true;
}
const matched = changedFiles.find(file => file.startsWith(compareFolder));
return !!matched;
})
.map(({ packageName }) => packageName)
.sort((r1, r2) => r1.localeCompare(r2));
return changedProjects;
};
async function main() {
if (!changedPath || changedPath.length <= 0) {
throw new Error(`Please pass the correct "changedPath" path`);
}
const changedPackages = await readChangedPackages(changedPath);
const hash = crypto.createHash('md5');
changedPackages.forEach(r => hash.update(r));
const hashValue = hash.digest('hex');
console.log(`::set-output name=hash::${hashValue}`);
}
main();