Skip to content

Commit 15c1fa6

Browse files
fix(jsonata): updates when version and digest changed (#36461) (#38066)
Co-authored-by: Michael Kriese <[email protected]>
1 parent d437490 commit 15c1fa6

File tree

2 files changed

+102
-4
lines changed

2 files changed

+102
-4
lines changed

lib/workers/repository/update/branch/auto-replace.spec.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,69 @@ describe('workers/repository/update/branch/auto-replace', () => {
13471347
);
13481348
});
13491349

1350+
it('jsonata: update currentValue', async () => {
1351+
const source =
1352+
'[ { "version": "1.2.3", "digest": "abcdef", "package": "foo" } ]';
1353+
upgrade.manager = 'jsonata';
1354+
upgrade.depName = 'foo';
1355+
upgrade.currentValue = '1.2.3';
1356+
upgrade.newValue = '1.2.4';
1357+
upgrade.depIndex = 0;
1358+
upgrade.packageFile = 'deps.json';
1359+
upgrade.fileFormat = 'json';
1360+
upgrade.datasourceTemplate = 'github-releases';
1361+
upgrade.matchStrings = [
1362+
'*.{"depName": package, "currentDigest": digest, "currentValue": version }',
1363+
];
1364+
1365+
const res = await doAutoReplace(upgrade, source, reuseExistingBranch);
1366+
expect(res).toBe(
1367+
'[ { "version": "1.2.4", "digest": "abcdef", "package": "foo" } ]',
1368+
);
1369+
});
1370+
1371+
it('jsonata: update currentDigest', async () => {
1372+
const source =
1373+
'[ { "version": "1.2.3", "digest": "abcdef", "package": "foo" } ]';
1374+
upgrade.manager = 'jsonata';
1375+
upgrade.depName = 'foo';
1376+
upgrade.currentDigest = 'abcdef';
1377+
upgrade.newDigest = 'badbeef';
1378+
upgrade.depIndex = 0;
1379+
upgrade.packageFile = 'deps.json';
1380+
upgrade.fileFormat = 'json';
1381+
upgrade.datasourceTemplate = 'github-releases';
1382+
upgrade.matchStrings = [
1383+
'*.{"depName": package, "currentDigest": digest, "currentValue": version }',
1384+
];
1385+
const res = await doAutoReplace(upgrade, source, reuseExistingBranch);
1386+
expect(res).toBe(
1387+
'[ { "version": "1.2.3", "digest": "badbeef", "package": "foo" } ]',
1388+
);
1389+
});
1390+
1391+
it('jsonata: update currentValue and currentDigest', async () => {
1392+
const source =
1393+
'[ { "version": "1.2.3", "digest": "abcdef", "package": "foo" } ]';
1394+
upgrade.manager = 'jsonata';
1395+
upgrade.depName = 'foo';
1396+
upgrade.currentValue = '1.2.3';
1397+
upgrade.newValue = '1.2.4';
1398+
upgrade.currentDigest = 'abcdef';
1399+
upgrade.newDigest = 'badbeef';
1400+
upgrade.depIndex = 0;
1401+
upgrade.packageFile = 'deps.json';
1402+
upgrade.fileFormat = 'json';
1403+
upgrade.datasourceTemplate = 'github-releases';
1404+
upgrade.matchStrings = [
1405+
'*.{"depName": package, "currentDigest": digest, "currentValue": version }',
1406+
];
1407+
const res = await doAutoReplace(upgrade, source, reuseExistingBranch);
1408+
expect(res).toBe(
1409+
'[ { "version": "1.2.4", "digest": "badbeef", "package": "foo" } ]',
1410+
);
1411+
});
1412+
13501413
it('github-actions: updates with newValue only', async () => {
13511414
const githubAction = codeBlock`
13521415
jobs:

lib/workers/repository/update/branch/auto-replace.ts

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,28 @@ async function checkExistingBranch(
196196
return existingContent;
197197
}
198198

199+
/**
200+
* Check if an update from `current` to `newString` should be performed and return 1 if so.
201+
*
202+
* @remarks
203+
* Useful for counting the number of updates to do.
204+
*
205+
* @param current The current value (if undefined then no update is required)
206+
* @param newString The new value (if undefined then no update is required)
207+
*
208+
* @returns 1 if `current !== newString` and 0 if they are equal or at least one is undefined.
209+
*/
210+
function updatedToInt(
211+
current: string | undefined,
212+
newString: string | undefined,
213+
): number {
214+
if (current && newString && newString !== current) {
215+
return 1;
216+
} else {
217+
return 0;
218+
}
219+
}
220+
199221
export async function doAutoReplace(
200222
upgrade: BranchUpgradeConfig,
201223
existingContent: string,
@@ -224,11 +246,24 @@ export async function doAutoReplace(
224246
if (reuseExistingBranch) {
225247
return await checkExistingBranch(upgrade, existingContent);
226248
}
249+
250+
// count how many strings need to be updated
251+
const changedCount =
252+
updatedToInt(depName, newName) +
253+
updatedToInt(currentValue, newValue) +
254+
updatedToInt(currentDigest, newDigest) +
255+
updatedToInt(currentDigestShort, newDigest);
256+
logger.debug(
257+
{ packageFile, depName, changedCount },
258+
'N values changed and need to be updated',
259+
);
260+
227261
const replaceWithoutReplaceString =
228-
is.string(newName) &&
229-
newName !== depName &&
230-
(is.undefined(upgrade.replaceString) ||
231-
!upgrade.replaceString?.includes(depName!));
262+
(is.string(newName) &&
263+
newName !== depName &&
264+
(is.undefined(upgrade.replaceString) ||
265+
!upgrade.replaceString?.includes(depName!))) ||
266+
(is.undefined(upgrade.replaceString) && changedCount > 1);
232267
const replaceString = upgrade.replaceString ?? currentValue ?? currentDigest;
233268
logger.trace({ depName, replaceString }, 'autoReplace replaceString');
234269
let searchIndex: number;

0 commit comments

Comments
 (0)