#!/usr/bin/node const cmp = require('../lib/www/server/lib/comparisons'); async function purgeComparisons () { const groups = await cmp.groups(); const comparisons = await cmp.getGroup(); const pids = new Set(Object.values(groups).flat().map( p => p.pid )); const comparison_pids = new Set(comparisons.map( c => [ c.baseline_pid, c.monitor_pid ] ).flat()); for (const pid of comparison_pids) { if (!pids.has(pid)) { console.log(`${pid} no longer par of a group. Deleting comparisons`); staleComps = comparisons.filter( c => c.baseline_pid == pid || c.monitor_pid == pid ); for (c of staleComps) { console.log(`Deleting comparison ${c.baseline_pid} → ${c.monitor_pid}`); await cmp.remove(c.baseline_pid, c.monitor_pid); } } } } async function main () { console.log("Looking for unreferenced comparisons to purge"); await purgeComparisons(); console.log("Retrieving project groups"); const groups = await cmp.groups(); if (!Object.keys(groups??{})?.length) { console.log("No groups found"); return 0; } console.log(`Found ${Object.keys(groups)?.length} groups: ${Object.keys(groups).join(", ")}`); for (const groupName of Object.keys(groups)) { const projects = groups[groupName]; console.log(`Fetching saved comparisons for ${groupName}`); const comparisons = await cmp.getGroup(groupName); if (!comparisons || !comparisons.length) { console.log(`No comparisons found for ${groupName}`); continue; } // Check if there are any projects that have been modified since last comparison // or if there are any pairs that are no longer part of the group const outdated = comparisons.filter( c => { const baseline_tstamp = projects.find( p => p.pid === c.baseline_pid )?.tstamp; const monitor_tstamp = projects.find( p => p.pid === c.monitor_pid )?.tstamp; return (c.tstamp < baseline_tstamp) || (c.tstamp < monitor_tstamp) || baseline_tstamp == null || monitor_tstamp == null; }); for (const comparison of outdated) { console.log(`Removing stale comparison: ${comparison.baseline_pid} → ${comparison.monitor_pid}`); await cmp.remove(comparison.baseline_pid, comparison.monitor_pid); } if (projects?.length < 2) { console.log(`Group ${groupName} has less than two projects. No comparisons are possible`); continue; } // Re-run the comparisons that are not in the database. They may // be missing either beacause they were not there to start with // or because we just removed them due to being stale console.log(`Recalculating group ${groupName}`); await cmp.saveGroup(groupName); } console.log("Comparisons update done"); return 0; } if (require.main === module) { main(); } else { module.exports = main; }