0
0
Fork 0
mirror of https://github.com/renovatebot/renovate.git synced 2025-05-13 08:01:49 +00:00
renovatebot_renovate/lib/workers/repository/process/lookup/timestamps.ts
2025-04-14 16:18:30 +00:00

96 lines
2.9 KiB
TypeScript

import { DateTime } from 'luxon';
import { logger } from '../../../../logger';
import type {
Release,
ReleaseResult,
} from '../../../../modules/datasource/types';
import type { VersioningApi } from '../../../../modules/versioning/types';
import { asTimestamp } from '../../../../util/timestamp';
/**
* Calculates the `bumpedAt` value for a set of releases.
*
* This function determines the highest release (a release with the highest version)
* and checks if its timestamp is also the highest among all releases.
* If so, it assigns that timestamp as the `bumpedAt` value in the result.
* This helps identify if the package was abandoned.
*
* The function skips setting `bumpedAt` if:
* - No releases could be determined as the highest (e.g. for invalid versions)
* - The highest release is deprecated
* - A lower version has a more recent timestamp than the highest version
*
* @returns The `ReleaseResult` value, potentially updated with a `bumpedAt` timestamp
*/
export function calculateLatestReleaseBump(
versioningApi: VersioningApi,
releaseResult: ReleaseResult,
): ReleaseResult {
const { lookupName } = releaseResult;
let highestRelease: Release | undefined;
for (const release of releaseResult.releases) {
if (!highestRelease) {
if (versioningApi.isVersion(release.version)) {
highestRelease = release;
}
continue;
}
try {
if (
versioningApi.isGreaterThan(release.version, highestRelease.version)
) {
highestRelease = release;
continue;
}
} catch {
logger.trace({ lookupName }, 'Error calculating "bumpedAt" value');
}
}
if (!highestRelease) {
logger.trace(
{ lookupName },
'Could not determine the highest release to calculate "bumpedAt" value',
);
return releaseResult;
}
if (highestRelease.isDeprecated) {
logger.trace(
{ lookupName },
'Highest release is deprecated, skip calculating "bumpedAt" value',
);
return releaseResult;
}
const highestReleaseTimestamp = asTimestamp(highestRelease.releaseTimestamp);
if (highestReleaseTimestamp) {
const highestReleaseDatetime = DateTime.fromISO(highestReleaseTimestamp);
const higherTimestampExists = releaseResult.releases.some((release) => {
const releaseTimestamp = asTimestamp(release.releaseTimestamp);
if (!releaseTimestamp) {
return false;
}
return DateTime.fromISO(releaseTimestamp) > highestReleaseDatetime;
});
if (!higherTimestampExists) {
logger.trace(
{ lookupName },
'Using "bumpedAt" value because it is the highest timestamp of the highest release version',
);
releaseResult.bumpedAt = highestReleaseTimestamp;
return releaseResult;
}
}
logger.trace(
{ lookupName },
'Skip using "bumpedAt" value because the higher timestamp exists for lower version',
);
return releaseResult;
}