From 9f078e9d05b0ac591ab38de4235ad2f633e335a0 Mon Sep 17 00:00:00 2001 From: "Brennan Wilkes (Text Groove)" Date: Sat, 31 Jan 2026 15:01:22 -0800 Subject: [PATCH] feat: Dont abort commits on sku change --- src/main.js | 3 ++- src/tracker/category_scan.js | 5 ++++- src/tracker/merge.js | 10 +++++++++- src/tracker/report.js | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main.js b/src/main.js index feb5703..fa5f793 100644 --- a/src/main.js +++ b/src/main.js @@ -160,7 +160,8 @@ async function main() { (report?.totals?.newCount || 0) + (report?.totals?.updatedCount || 0) + (report?.totals?.removedCount || 0) + - (report?.totals?.restoredCount || 0) > + (report?.totals?.restoredCount || 0) + + (report?.totals?.metaChangedCount || 0) > 0; const reportTextColor = renderFinalReport(report, { diff --git a/src/tracker/category_scan.js b/src/tracker/category_scan.js index 836aa06..6f814f9 100644 --- a/src/tracker/category_scan.js +++ b/src/tracker/category_scan.js @@ -345,7 +345,8 @@ async function discoverAndScanCategory(ctx, prevDb, report) { logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}${dups ? ` (${dups} dups)` : ""}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); + const { merged, newItems, updatedItems, removedItems, restoredItems, metaChangedItems } = + mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); @@ -368,12 +369,14 @@ async function discoverAndScanCategory(ctx, prevDb, report) { updatedCount: updatedItems.length, removedCount: removedItems.length, restoredCount: restoredItems.length, + metaChangedCount: metaChangedItems.length, elapsedMs: elapsed, }); report.totals.newCount += newItems.length; report.totals.updatedCount += updatedItems.length; report.totals.removedCount += removedItems.length; report.totals.restoredCount += restoredItems.length; + report.totals.metaChangedCount += metaChangedItems.length; addCategoryResultToReport(report, ctx.store.name, ctx.cat.label, newItems, updatedItems, removedItems, restoredItems); } diff --git a/src/tracker/merge.js b/src/tracker/merge.js index 58a08b1..058976e 100644 --- a/src/tracker/merge.js +++ b/src/tracker/merge.js @@ -33,6 +33,7 @@ function mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel } = {}) { const updatedItems = []; const removedItems = []; const restoredItems = []; + const metaChangedItems = []; // Choose a deterministic "best" record among dup active SKU rows. // Prefer: more complete fields, then lexicographically smallest URL. @@ -177,6 +178,13 @@ function mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel } = {}) { oldPrice: prev.price || "", newPrice: nowRaw.price || "", }); + } else if (nameChanged || skuChanged || imgChanged || prevUrlForThisItem !== url) { + // Count non-price changes (SKU upgrades, name/img changes, or URL moves) as meaningful. + metaChangedItems.push({ + url, + name: nowRaw.name || prev.name || "", + sku: nowSku || "", + }); } } @@ -195,7 +203,7 @@ function mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel } = {}) { } } - return { merged, newItems, updatedItems, removedItems, restoredItems }; + return { merged, newItems, updatedItems, removedItems, restoredItems, metaChangedItems }; } module.exports = { mergeDiscoveredIntoDb }; diff --git a/src/tracker/report.js b/src/tracker/report.js index 2e22a7f..9ad6014 100644 --- a/src/tracker/report.js +++ b/src/tracker/report.js @@ -20,7 +20,7 @@ function createReport() { return { startedAt: new Date(), categories: [], - totals: { newCount: 0, updatedCount: 0, removedCount: 0, restoredCount: 0 }, + totals: { newCount: 0, updatedCount: 0, removedCount: 0, restoredCount: 0, metaChangedCount: 0 }, newItems: [], updatedItems: [], removedItems: [],