mirror of
https://github.com/renovatebot/renovate.git
synced 2026-11-03 02:53:40 +00:00
0c21df1e22
So all lookups downstream can be performed in `O(1)` time. Suggested by Claude Sonnet. Co-authored-by: Claude Sonnet 4.6 <jamie.tanna+claude-code@mend.io>
122 lines
4.0 KiB
TypeScript
122 lines
4.0 KiB
TypeScript
import { isNonEmptyArray } from '@sindresorhus/is';
|
|
import { logger } from '../../../../logger/index.ts';
|
|
import type { Release } from '../../../../modules/datasource/index.ts';
|
|
import type { LookupUpdate } from '../../../../modules/manager/types.ts';
|
|
import type { VersioningApi } from '../../../../modules/versioning/index.ts';
|
|
import type { RangeStrategy } from '../../../../types/index.ts';
|
|
import { getElapsedDays } from '../../../../util/date.ts';
|
|
import { getMergeConfidenceLevel } from '../../../../util/merge-confidence/index.ts';
|
|
import type { LookupUpdateConfig } from './types.ts';
|
|
import { getUpdateType } from './update-type.ts';
|
|
|
|
export async function generateUpdate(
|
|
config: LookupUpdateConfig,
|
|
currentValue: string | undefined,
|
|
versioningApi: VersioningApi,
|
|
rangeStrategy: RangeStrategy,
|
|
currentVersion: string,
|
|
bucket: string,
|
|
release: Release,
|
|
allVersions: Set<string>,
|
|
): Promise<LookupUpdate> {
|
|
const newVersion = release.version;
|
|
const update: LookupUpdate = {
|
|
bucket,
|
|
newVersion,
|
|
newValue: null!,
|
|
hasAttestation: release.attestation,
|
|
};
|
|
|
|
// istanbul ignore if
|
|
if (release.checksumUrl !== undefined) {
|
|
update.checksumUrl = release.checksumUrl;
|
|
}
|
|
// istanbul ignore if
|
|
if (release.downloadUrl !== undefined) {
|
|
update.downloadUrl = release.downloadUrl;
|
|
}
|
|
// istanbul ignore if
|
|
if (release.newDigest !== undefined) {
|
|
update.newDigest = release.newDigest;
|
|
}
|
|
// istanbul ignore if
|
|
if (release.releaseTimestamp) {
|
|
update.releaseTimestamp = release.releaseTimestamp;
|
|
update.newVersionAgeInDays = getElapsedDays(release.releaseTimestamp);
|
|
}
|
|
// istanbul ignore if
|
|
if (release.registryUrl !== undefined) {
|
|
/**
|
|
* This means:
|
|
* - registry strategy is set to merge
|
|
* - releases were fetched from multiple registry urls
|
|
*/
|
|
update.registryUrl = release.registryUrl;
|
|
}
|
|
|
|
if (currentValue) {
|
|
try {
|
|
update.newValue = versioningApi.getNewValue({
|
|
currentValue,
|
|
rangeStrategy,
|
|
currentVersion,
|
|
newVersion,
|
|
allVersions,
|
|
})!;
|
|
} catch (err) /* istanbul ignore next */ {
|
|
logger.warn(
|
|
{ err, currentValue, rangeStrategy, currentVersion, newVersion },
|
|
'getNewValue error',
|
|
);
|
|
update.newValue = currentValue;
|
|
}
|
|
} else {
|
|
update.newValue = currentValue;
|
|
}
|
|
update.newMajor = versioningApi.getMajor(newVersion)!;
|
|
update.newMinor = versioningApi.getMinor(newVersion)!;
|
|
update.newPatch = versioningApi.getPatch(newVersion)!;
|
|
// istanbul ignore if
|
|
if (!update.updateType && !currentVersion) {
|
|
logger.debug({ update }, 'Update has no currentVersion');
|
|
update.newValue = currentValue!;
|
|
return update;
|
|
}
|
|
update.updateType =
|
|
update.updateType ??
|
|
getUpdateType(config, versioningApi, currentVersion, newVersion);
|
|
if (versioningApi.isBreaking) {
|
|
// This versioning scheme has breaking awareness
|
|
update.isBreaking = versioningApi.isBreaking(currentVersion, newVersion);
|
|
} else {
|
|
// This versioning scheme does not have breaking awareness - assume only major updates are breaking
|
|
// Updates from, or to, unstable releases should be treated as breaking too.
|
|
// But we should not add that as default behavior until we stop treating non-LTS versions as unstable first
|
|
update.isBreaking = update.updateType === 'major';
|
|
}
|
|
const { datasource, packageName, packageRules } = config;
|
|
if (packageRules?.some((pr) => isNonEmptyArray(pr.matchConfidence))) {
|
|
update.mergeConfidenceLevel = await getMergeConfidenceLevel(
|
|
datasource,
|
|
packageName,
|
|
currentVersion,
|
|
newVersion,
|
|
update.updateType,
|
|
);
|
|
}
|
|
if (!versioningApi.isVersion(update.newValue)) {
|
|
update.isRange = true;
|
|
}
|
|
if (rangeStrategy === 'update-lockfile' && currentValue === update.newValue) {
|
|
update.isLockfileUpdate = true;
|
|
}
|
|
if (
|
|
rangeStrategy === 'bump' &&
|
|
// TODO #22198
|
|
versioningApi.matches(newVersion, currentValue!)
|
|
) {
|
|
update.isBump = true;
|
|
}
|
|
return update;
|
|
}
|