renovate 44.237.2 → 44.238.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +11 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/internal/security.preset.js +14 -9
- package/dist/config/presets/internal/security.preset.js.map +1 -1
- package/dist/config/types.d.ts +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +39 -10
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js +45 -28
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/cargo/index.js +10 -1
- package/dist/modules/manager/cargo/index.js.map +1 -1
- package/dist/modules/manager/cargo/locked-version.js +10 -4
- package/dist/modules/manager/cargo/locked-version.js.map +1 -1
- package/dist/modules/manager/cargo/minimum-release-age.js +216 -0
- package/dist/modules/manager/cargo/minimum-release-age.js.map +1 -0
- package/dist/modules/manager/cargo/schema.js +6 -1
- package/dist/modules/manager/cargo/schema.js.map +1 -1
- package/dist/modules/manager/cargo/utils.js +23 -1
- package/dist/modules/manager/cargo/utils.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +3 -3
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/npm/constants.js +3 -1
- package/dist/modules/manager/npm/constants.js.map +1 -1
- package/dist/modules/manager/npm/extract/index.js +1 -1
- package/dist/modules/manager/npm/extract/index.js.map +1 -1
- package/dist/modules/manager/npm/extract/npmrc.js +93 -0
- package/dist/modules/manager/npm/extract/npmrc.js.map +1 -0
- package/dist/modules/manager/npm/extract/pnpm-minimum-release-age.js +149 -0
- package/dist/modules/manager/npm/extract/pnpm-minimum-release-age.js.map +1 -0
- package/dist/modules/manager/npm/extract/pnpm.js +88 -2
- package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/index.js +7 -1
- package/dist/modules/manager/npm/extract/post/index.js.map +1 -1
- package/dist/modules/manager/npm/extract/utils.js +25 -1
- package/dist/modules/manager/npm/extract/utils.js.map +1 -1
- package/dist/modules/manager/npm/extract/yarn-minimum-release-age.js +181 -0
- package/dist/modules/manager/npm/extract/yarn-minimum-release-age.js.map +1 -0
- package/dist/modules/manager/npm/index.js +18 -4
- package/dist/modules/manager/npm/index.js.map +1 -1
- package/dist/modules/manager/npm/minimum-release-age.js +93 -0
- package/dist/modules/manager/npm/minimum-release-age.js.map +1 -0
- package/dist/modules/manager/npm/post-update/index.js +12 -3
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js +89 -57
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/pnpm.js +132 -90
- package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/utils.js +7 -1
- package/dist/modules/manager/npm/post-update/utils.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js +70 -3
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/npm/schema.js +21 -2
- package/dist/modules/manager/npm/schema.js.map +1 -1
- package/dist/modules/manager/types.d.ts +10 -3
- package/dist/modules/versioning/common.js +14 -2
- package/dist/modules/versioning/common.js.map +1 -1
- package/dist/modules/versioning/rust-release-channel/index.js +21 -0
- package/dist/modules/versioning/rust-release-channel/index.js.map +1 -1
- package/dist/util/minimum-release-age.js +20 -6
- package/dist/util/minimum-release-age.js.map +1 -1
- package/dist/util/schema-utils/index.js.map +1 -1
- package/dist/workers/repository/updates/flatten.js +1 -0
- package/dist/workers/repository/updates/flatten.js.map +1 -1
- package/package.json +3 -3
- package/renovate-schema.json +380 -2
|
@@ -1,56 +1,43 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { coerceArray } from "../../../util/array.js";
|
|
3
3
|
import { getEnv } from "../../../util/env.js";
|
|
4
|
-
import { findLocalSiblingOrParent
|
|
4
|
+
import { findLocalSiblingOrParent } from "../../../util/fs/index.js";
|
|
5
5
|
import { coerceObject } from "../../../util/object.js";
|
|
6
6
|
import { api } from "../../versioning/cargo/index.js";
|
|
7
7
|
import { extractLockFileVersions } from "./locked-version.js";
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { getMinPublishAgeRules, getRegistryMinPublishAges } from "./minimum-release-age.js";
|
|
9
|
+
import { CargoManifest } from "./schema.js";
|
|
10
|
+
import { DEFAULT_REGISTRY_ID, DEFAULT_REGISTRY_URL, readCargoConfig } from "./utils.js";
|
|
10
11
|
import { isObject, isString } from "@sindresorhus/is";
|
|
11
12
|
// lib/modules/manager/cargo/extract.ts
|
|
12
|
-
const DEFAULT_REGISTRY_ID = "crates-io";
|
|
13
13
|
function getCargoIndexEnv(registryName) {
|
|
14
14
|
const registry = registryName.toUpperCase().replaceAll("-", "_");
|
|
15
15
|
return getEnv()[`CARGO_REGISTRIES_${registry}_INDEX`] ?? null;
|
|
16
16
|
}
|
|
17
|
+
/** Returns the index of a registry, from the environment or the cargo config. */
|
|
18
|
+
function getRegistryUrl(registryName, cargoRegistries) {
|
|
19
|
+
return getCargoIndexEnv(registryName) ?? cargoRegistries[registryName];
|
|
20
|
+
}
|
|
17
21
|
function extractFromSection(dependencies, cargoRegistries, target) {
|
|
18
22
|
if (!dependencies) return [];
|
|
19
23
|
const deps = [];
|
|
20
24
|
for (const dep of Object.values(dependencies)) {
|
|
21
25
|
let registryUrls;
|
|
22
26
|
if (dep.managerData?.registryName) {
|
|
23
|
-
const registryUrl =
|
|
27
|
+
const registryUrl = getRegistryUrl(dep.managerData.registryName, cargoRegistries);
|
|
24
28
|
if (registryUrl) {
|
|
25
29
|
if (registryUrl !== DEFAULT_REGISTRY_URL) registryUrls = [registryUrl];
|
|
26
30
|
} else dep.skipReason = "unknown-registry";
|
|
27
31
|
}
|
|
28
32
|
if (registryUrls) dep.registryUrls = registryUrls;
|
|
29
|
-
else if (cargoRegistries[
|
|
30
|
-
if (cargoRegistries[
|
|
33
|
+
else if (cargoRegistries["crates-io"]) {
|
|
34
|
+
if (cargoRegistries["crates-io"] !== DEFAULT_REGISTRY_URL) dep.registryUrls = [cargoRegistries[DEFAULT_REGISTRY_ID]];
|
|
31
35
|
} else dep.skipReason = "unknown-registry";
|
|
32
36
|
if (target) dep.target = target;
|
|
33
37
|
deps.push(dep);
|
|
34
38
|
}
|
|
35
39
|
return deps;
|
|
36
40
|
}
|
|
37
|
-
/** Reads `.cargo/config`, or, if not found, `.cargo/config.toml`, as cargo uses `.cargo/config` if both exist */
|
|
38
|
-
async function readCargoConfig() {
|
|
39
|
-
for (const configName of ["config", "config.toml"]) {
|
|
40
|
-
const path = `.cargo/${configName}`;
|
|
41
|
-
const payload = await readLocalFile(path, "utf8");
|
|
42
|
-
if (payload) {
|
|
43
|
-
const parsedCargoConfig = CargoConfig.safeParse(payload);
|
|
44
|
-
if (parsedCargoConfig.success) return parsedCargoConfig.data;
|
|
45
|
-
logger.debug({
|
|
46
|
-
err: parsedCargoConfig.error,
|
|
47
|
-
path
|
|
48
|
-
}, `Error parsing cargo config`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
logger.debug("Neither .cargo/config nor .cargo/config.toml found");
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
41
|
/** Extracts a map of cargo registries from a CargoConfig */
|
|
55
42
|
function extractCargoRegistries(config) {
|
|
56
43
|
const result = {};
|
|
@@ -76,13 +63,27 @@ function resolveRegistryIndex(registryName, config, originalNames = /* @__PURE__
|
|
|
76
63
|
}
|
|
77
64
|
const registryIndex = config.registries?.[registryName]?.index;
|
|
78
65
|
if (registryIndex) return registryIndex;
|
|
79
|
-
if (registryName ===
|
|
66
|
+
if (registryName === "crates-io") return DEFAULT_REGISTRY_URL;
|
|
80
67
|
logger.debug(`${registryName} cargo registry is missing index`);
|
|
81
68
|
return null;
|
|
82
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns the URL by name of each registry other than crates.io which has a `min-publish-age` in the cargo config, or crates in `deps`, as the crates of that registry have it in `registryUrls`.
|
|
72
|
+
*/
|
|
73
|
+
function getAlternateRegistryUrls(registryMinPublishAges, cargoRegistries, deps) {
|
|
74
|
+
const registryNames = /* @__PURE__ */ new Set([...Object.keys(coerceObject(registryMinPublishAges)), ...deps.map((dep) => dep.managerData?.registryName).filter(isString)]);
|
|
75
|
+
registryNames.delete(DEFAULT_REGISTRY_ID);
|
|
76
|
+
const registryUrls = {};
|
|
77
|
+
for (const registryName of registryNames) {
|
|
78
|
+
const registryUrl = getRegistryUrl(registryName, cargoRegistries);
|
|
79
|
+
if (isString(registryUrl)) registryUrls[registryName] = registryUrl;
|
|
80
|
+
}
|
|
81
|
+
return registryUrls;
|
|
82
|
+
}
|
|
83
83
|
async function extractPackageFile(content, packageFile, _config) {
|
|
84
84
|
logger.trace(`cargo.extractPackageFile(${packageFile})`);
|
|
85
|
-
const
|
|
85
|
+
const cargoConfig = coerceObject(await readCargoConfig());
|
|
86
|
+
const cargoRegistries = extractCargoRegistries(cargoConfig);
|
|
86
87
|
const parsedCargoManifest = CargoManifest.safeParse(content);
|
|
87
88
|
if (!parsedCargoManifest.success) {
|
|
88
89
|
logger.debug({
|
|
@@ -125,14 +126,30 @@ async function extractPackageFile(content, packageFile, _config) {
|
|
|
125
126
|
deps,
|
|
126
127
|
packageFileVersion: version
|
|
127
128
|
};
|
|
129
|
+
const registryMinPublishAges = getRegistryMinPublishAges(cargoConfig);
|
|
130
|
+
const cratesIoUrl = cargoRegistries[DEFAULT_REGISTRY_ID];
|
|
131
|
+
const packageRules = getMinPublishAgeRules(cargoConfig, getAlternateRegistryUrls(registryMinPublishAges, cargoRegistries, deps), isString(cratesIoUrl) ? cratesIoUrl : void 0);
|
|
132
|
+
if (packageRules.length) {
|
|
133
|
+
logger.debug(`Found min-publish-age in the cargo config for ${packageFile}: ${JSON.stringify(packageRules)}`);
|
|
134
|
+
res.packageRules = packageRules;
|
|
135
|
+
}
|
|
136
|
+
if (registryMinPublishAges) {
|
|
137
|
+
logger.debug(`Found min-publish-age of registries ${Object.keys(registryMinPublishAges).join(", ")} in the cargo config for ${packageFile}`);
|
|
138
|
+
res.managerData = { registryMinPublishAges };
|
|
139
|
+
}
|
|
128
140
|
if (lockFileName) {
|
|
129
141
|
logger.debug(`Found lock file ${lockFileName} for packageFile: ${packageFile}`);
|
|
130
|
-
const
|
|
131
|
-
if (!
|
|
142
|
+
const lockFileVersions = await extractLockFileVersions(lockFileName);
|
|
143
|
+
if (!lockFileVersions) {
|
|
132
144
|
logger.debug(`Could not extract lock file versions from ${lockFileName}.`);
|
|
133
145
|
return res;
|
|
134
146
|
}
|
|
135
147
|
res.lockFiles = [lockFileName];
|
|
148
|
+
const { versionsByPackage, hasGitSources } = lockFileVersions;
|
|
149
|
+
if (hasGitSources) res.managerData = {
|
|
150
|
+
...res.managerData,
|
|
151
|
+
lockFileHasGitSources: true
|
|
152
|
+
};
|
|
136
153
|
for (const dep of deps) {
|
|
137
154
|
const packageName = dep.packageName ?? dep.depName;
|
|
138
155
|
const versions = coerceArray(versionsByPackage.get(packageName));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["versioning"],"sources":["../../../../lib/modules/manager/cargo/extract.ts"],"sourcesContent":["import { isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport {\n findLocalSiblingOrParent,\n readLocalFile,\n} from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { api as versioning } from '../../versioning/cargo/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractLockFileVersions } from './locked-version.ts';\nimport { CargoConfig, CargoManifest } from './schema.ts';\nimport type {\n CargoManagerData,\n CargoRegistries,\n CargoRegistryUrl,\n} from './types.ts';\nimport { DEFAULT_REGISTRY_URL } from './utils.ts';\n\nconst DEFAULT_REGISTRY_ID = 'crates-io';\n\nfunction getCargoIndexEnv(registryName: string): string | null {\n const registry = registryName.toUpperCase().replaceAll('-', '_');\n return getEnv()[`CARGO_REGISTRIES_${registry}_INDEX`] ?? null;\n}\n\nfunction extractFromSection(\n dependencies: PackageDependency<CargoManagerData>[] | undefined,\n cargoRegistries: CargoRegistries,\n target?: string,\n): PackageDependency<CargoManagerData>[] {\n if (!dependencies) {\n return [];\n }\n\n const deps: PackageDependency<CargoManagerData>[] = [];\n\n for (const dep of Object.values(dependencies)) {\n let registryUrls: string[] | undefined;\n\n if (dep.managerData?.registryName) {\n const registryUrl =\n getCargoIndexEnv(dep.managerData.registryName) ??\n cargoRegistries[dep.managerData?.registryName];\n if (registryUrl) {\n if (registryUrl !== DEFAULT_REGISTRY_URL) {\n registryUrls = [registryUrl];\n }\n } else {\n dep.skipReason = 'unknown-registry';\n }\n }\n\n if (registryUrls) {\n dep.registryUrls = registryUrls;\n } else {\n // if we don't have an explicit registry URL check if the default registry has a non-standard url\n if (cargoRegistries[DEFAULT_REGISTRY_ID]) {\n if (cargoRegistries[DEFAULT_REGISTRY_ID] !== DEFAULT_REGISTRY_URL) {\n dep.registryUrls = [cargoRegistries[DEFAULT_REGISTRY_ID]];\n }\n } else {\n // we always expect to have DEFAULT_REGISTRY_ID set, if it's not it means the config defines an alternative\n // registry that we couldn't resolve.\n dep.skipReason = 'unknown-registry';\n }\n }\n\n if (target) {\n dep.target = target;\n }\n deps.push(dep);\n }\n\n return deps;\n}\n\n/** Reads `.cargo/config`, or, if not found, `.cargo/config.toml`, as cargo uses `.cargo/config` if both exist */\nasync function readCargoConfig(): Promise<CargoConfig | null> {\n for (const configName of ['config', 'config.toml']) {\n const path = `.cargo/${configName}`;\n const payload = await readLocalFile(path, 'utf8');\n if (payload) {\n const parsedCargoConfig = CargoConfig.safeParse(payload);\n if (parsedCargoConfig.success) {\n return parsedCargoConfig.data;\n }\n logger.debug(\n { err: parsedCargoConfig.error, path },\n `Error parsing cargo config`,\n );\n }\n }\n\n logger.debug('Neither .cargo/config nor .cargo/config.toml found');\n return null;\n}\n\n/** Extracts a map of cargo registries from a CargoConfig */\nfunction extractCargoRegistries(config: CargoConfig): CargoRegistries {\n const result: CargoRegistries = {};\n // check if we're overriding our default registry index\n result[DEFAULT_REGISTRY_ID] = resolveRegistryIndex(\n DEFAULT_REGISTRY_ID,\n config,\n );\n\n const registryNames = new Set([\n ...Object.keys(coerceObject(config.registries)),\n ...Object.keys(coerceObject(config.source)),\n ]);\n for (const registryName of registryNames) {\n result[registryName] = resolveRegistryIndex(registryName, config);\n }\n\n return result;\n}\n\nfunction resolveRegistryIndex(\n registryName: string,\n config: CargoConfig,\n originalNames = new Set<string>(),\n): CargoRegistryUrl {\n // if we have a source replacement, follow that.\n // https://doc.rust-lang.org/cargo/reference/source-replacement.html\n const replacementName = config.source?.[registryName]?.['replace-with'];\n if (replacementName) {\n logger.debug(\n `Replacing index of cargo registry ${registryName} with ${replacementName}`,\n );\n if (originalNames.has(replacementName)) {\n logger.warn({ registryName }, 'cargo registry resolves to itself');\n return null;\n }\n return resolveRegistryIndex(\n replacementName,\n config,\n originalNames.add(replacementName),\n );\n }\n\n const sourceRegistry = config.source?.[registryName]?.registry;\n if (sourceRegistry) {\n logger.debug(\n `Replacing cargo source registry with ${sourceRegistry} for ${registryName}`,\n );\n return sourceRegistry;\n }\n\n const registryIndex = config.registries?.[registryName]?.index;\n if (registryIndex) {\n return registryIndex;\n }\n // we don't need an explicit index if we're using the default registry\n if (registryName === DEFAULT_REGISTRY_ID) {\n return DEFAULT_REGISTRY_URL;\n }\n logger.debug(`${registryName} cargo registry is missing index`);\n return null;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n _config?: ExtractConfig,\n): Promise<PackageFileContent<CargoManagerData> | null> {\n logger.trace(`cargo.extractPackageFile(${packageFile})`);\n\n const cargoConfig = coerceObject(await readCargoConfig());\n const cargoRegistries = extractCargoRegistries(cargoConfig);\n\n const parsedCargoManifest = CargoManifest.safeParse(content);\n if (!parsedCargoManifest.success) {\n logger.debug(\n { err: parsedCargoManifest.error, packageFile },\n 'Error parsing Cargo.toml file',\n );\n return null;\n }\n\n const cargoManifest = parsedCargoManifest.data;\n\n /*\n There are the following sections in Cargo.toml:\n [package]\n [dependencies]\n [dev-dependencies]\n [build-dependencies]\n [target.*.dependencies]\n [workspace.dependencies]\n */\n const targetSection = cargoManifest.target;\n // An array of all dependencies in the target section\n let targetDeps: PackageDependency<CargoManagerData>[] = [];\n if (targetSection) {\n const targets = Object.keys(targetSection);\n targets.forEach((target) => {\n const targetContent = targetSection[target];\n // Dependencies for `${target}`\n const deps = [\n ...extractFromSection(\n targetContent.dependencies,\n cargoRegistries,\n target,\n ),\n ...extractFromSection(\n targetContent['dev-dependencies'],\n cargoRegistries,\n target,\n ),\n ...extractFromSection(\n targetContent['build-dependencies'],\n cargoRegistries,\n target,\n ),\n ];\n targetDeps = targetDeps.concat(deps);\n });\n }\n\n const workspaceSection = cargoManifest.workspace;\n let workspaceDeps: PackageDependency<CargoManagerData>[] = [];\n if (workspaceSection) {\n workspaceDeps = extractFromSection(\n workspaceSection.dependencies,\n cargoRegistries,\n undefined,\n );\n }\n\n const deps = [\n ...extractFromSection(cargoManifest.dependencies, cargoRegistries),\n ...extractFromSection(cargoManifest['dev-dependencies'], cargoRegistries),\n ...extractFromSection(cargoManifest['build-dependencies'], cargoRegistries),\n ...targetDeps,\n ...workspaceDeps,\n ];\n if (!deps.length) {\n return null;\n }\n\n const packageSection = cargoManifest.package;\n let version: string | undefined = undefined;\n if (packageSection) {\n if (isString(packageSection.version)) {\n version = packageSection.version;\n } else if (\n isObject(packageSection.version) &&\n cargoManifest.workspace?.package?.version\n ) {\n // TODO: Support reading from parent workspace manifest?\n version = cargoManifest.workspace.package.version;\n }\n }\n\n const lockFileName = await findLocalSiblingOrParent(\n packageFile,\n 'Cargo.lock',\n );\n const res: PackageFileContent<CargoManagerData> = {\n deps,\n packageFileVersion: version,\n };\n if (lockFileName) {\n logger.debug(\n `Found lock file ${lockFileName} for packageFile: ${packageFile}`,\n );\n\n const versionsByPackage = await extractLockFileVersions(lockFileName);\n if (!versionsByPackage) {\n logger.debug(\n `Could not extract lock file versions from ${lockFileName}.`,\n );\n return res;\n }\n\n res.lockFiles = [lockFileName];\n\n for (const dep of deps) {\n const packageName = dep.packageName ?? dep.depName!;\n const versions = coerceArray(versionsByPackage.get(packageName));\n\n let lockedVersion: string | null = null;\n if (dep.currentValue) {\n lockedVersion = versioning.getSatisfyingVersion(\n versions,\n dep.currentValue,\n );\n }\n\n if (lockedVersion) {\n dep.lockedVersion = lockedVersion;\n } else {\n logger.debug(\n `No locked version found for package ${dep.depName} in the range of ${dep.currentValue}.`,\n );\n }\n }\n }\n\n return res;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":["versioning"],"sources":["../../../../lib/modules/manager/cargo/extract.ts"],"sourcesContent":["import { isObject, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { findLocalSiblingOrParent } from '../../../util/fs/index.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { api as versioning } from '../../versioning/cargo/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\nimport { extractLockFileVersions } from './locked-version.ts';\nimport {\n getMinPublishAgeRules,\n getRegistryMinPublishAges,\n} from './minimum-release-age.ts';\nimport type { CargoConfig } from './schema.ts';\nimport { CargoManifest } from './schema.ts';\nimport type {\n CargoManagerData,\n CargoRegistries,\n CargoRegistryUrl,\n} from './types.ts';\nimport {\n DEFAULT_REGISTRY_ID,\n DEFAULT_REGISTRY_URL,\n readCargoConfig,\n} from './utils.ts';\n\nfunction getCargoIndexEnv(registryName: string): string | null {\n const registry = registryName.toUpperCase().replaceAll('-', '_');\n return getEnv()[`CARGO_REGISTRIES_${registry}_INDEX`] ?? null;\n}\n\n/** Returns the index of a registry, from the environment or the cargo config. */\nfunction getRegistryUrl(\n registryName: string,\n cargoRegistries: CargoRegistries,\n): CargoRegistryUrl | undefined {\n return getCargoIndexEnv(registryName) ?? cargoRegistries[registryName];\n}\n\nfunction extractFromSection(\n dependencies: PackageDependency<CargoManagerData>[] | undefined,\n cargoRegistries: CargoRegistries,\n target?: string,\n): PackageDependency<CargoManagerData>[] {\n if (!dependencies) {\n return [];\n }\n\n const deps: PackageDependency<CargoManagerData>[] = [];\n\n for (const dep of Object.values(dependencies)) {\n let registryUrls: string[] | undefined;\n\n if (dep.managerData?.registryName) {\n const registryUrl = getRegistryUrl(\n dep.managerData.registryName,\n cargoRegistries,\n );\n if (registryUrl) {\n if (registryUrl !== DEFAULT_REGISTRY_URL) {\n registryUrls = [registryUrl];\n }\n } else {\n dep.skipReason = 'unknown-registry';\n }\n }\n\n if (registryUrls) {\n dep.registryUrls = registryUrls;\n } else {\n // if we don't have an explicit registry URL check if the default registry has a non-standard url\n if (cargoRegistries[DEFAULT_REGISTRY_ID]) {\n if (cargoRegistries[DEFAULT_REGISTRY_ID] !== DEFAULT_REGISTRY_URL) {\n dep.registryUrls = [cargoRegistries[DEFAULT_REGISTRY_ID]];\n }\n } else {\n // we always expect to have DEFAULT_REGISTRY_ID set, if it's not it means the config defines an alternative\n // registry that we couldn't resolve.\n dep.skipReason = 'unknown-registry';\n }\n }\n\n if (target) {\n dep.target = target;\n }\n deps.push(dep);\n }\n\n return deps;\n}\n\n/** Extracts a map of cargo registries from a CargoConfig */\nfunction extractCargoRegistries(config: CargoConfig): CargoRegistries {\n const result: CargoRegistries = {};\n // check if we're overriding our default registry index\n result[DEFAULT_REGISTRY_ID] = resolveRegistryIndex(\n DEFAULT_REGISTRY_ID,\n config,\n );\n\n const registryNames = new Set([\n ...Object.keys(coerceObject(config.registries)),\n ...Object.keys(coerceObject(config.source)),\n ]);\n for (const registryName of registryNames) {\n result[registryName] = resolveRegistryIndex(registryName, config);\n }\n\n return result;\n}\n\nfunction resolveRegistryIndex(\n registryName: string,\n config: CargoConfig,\n originalNames = new Set<string>(),\n): CargoRegistryUrl {\n // if we have a source replacement, follow that.\n // https://doc.rust-lang.org/cargo/reference/source-replacement.html\n const replacementName = config.source?.[registryName]?.['replace-with'];\n if (replacementName) {\n logger.debug(\n `Replacing index of cargo registry ${registryName} with ${replacementName}`,\n );\n if (originalNames.has(replacementName)) {\n logger.warn({ registryName }, 'cargo registry resolves to itself');\n return null;\n }\n return resolveRegistryIndex(\n replacementName,\n config,\n originalNames.add(replacementName),\n );\n }\n\n const sourceRegistry = config.source?.[registryName]?.registry;\n if (sourceRegistry) {\n logger.debug(\n `Replacing cargo source registry with ${sourceRegistry} for ${registryName}`,\n );\n return sourceRegistry;\n }\n\n const registryIndex = config.registries?.[registryName]?.index;\n if (registryIndex) {\n return registryIndex;\n }\n // we don't need an explicit index if we're using the default registry\n if (registryName === DEFAULT_REGISTRY_ID) {\n return DEFAULT_REGISTRY_URL;\n }\n logger.debug(`${registryName} cargo registry is missing index`);\n return null;\n}\n\n/**\n * Returns the URL by name of each registry other than crates.io which has a `min-publish-age` in the cargo config, or crates in `deps`, as the crates of that registry have it in `registryUrls`.\n */\nfunction getAlternateRegistryUrls(\n registryMinPublishAges: Record<string, string> | undefined,\n cargoRegistries: CargoRegistries,\n deps: PackageDependency<CargoManagerData>[],\n): Record<string, string> {\n const registryNames = new Set([\n ...Object.keys(coerceObject(registryMinPublishAges)),\n ...deps.map((dep) => dep.managerData?.registryName).filter(isString),\n ]);\n registryNames.delete(DEFAULT_REGISTRY_ID);\n const registryUrls: Record<string, string> = {};\n for (const registryName of registryNames) {\n const registryUrl = getRegistryUrl(registryName, cargoRegistries);\n // crates of a registry without a URL are skipped, and those of crates.io have the age of crates.io\n if (isString(registryUrl)) {\n registryUrls[registryName] = registryUrl;\n }\n }\n return registryUrls;\n}\n\nexport async function extractPackageFile(\n content: string,\n packageFile: string,\n _config?: ExtractConfig,\n): Promise<PackageFileContent<CargoManagerData> | null> {\n logger.trace(`cargo.extractPackageFile(${packageFile})`);\n\n const cargoConfig = coerceObject(await readCargoConfig());\n const cargoRegistries = extractCargoRegistries(cargoConfig);\n\n const parsedCargoManifest = CargoManifest.safeParse(content);\n if (!parsedCargoManifest.success) {\n logger.debug(\n { err: parsedCargoManifest.error, packageFile },\n 'Error parsing Cargo.toml file',\n );\n return null;\n }\n\n const cargoManifest = parsedCargoManifest.data;\n\n /*\n There are the following sections in Cargo.toml:\n [package]\n [dependencies]\n [dev-dependencies]\n [build-dependencies]\n [target.*.dependencies]\n [workspace.dependencies]\n */\n const targetSection = cargoManifest.target;\n // An array of all dependencies in the target section\n let targetDeps: PackageDependency<CargoManagerData>[] = [];\n if (targetSection) {\n const targets = Object.keys(targetSection);\n targets.forEach((target) => {\n const targetContent = targetSection[target];\n // Dependencies for `${target}`\n const deps = [\n ...extractFromSection(\n targetContent.dependencies,\n cargoRegistries,\n target,\n ),\n ...extractFromSection(\n targetContent['dev-dependencies'],\n cargoRegistries,\n target,\n ),\n ...extractFromSection(\n targetContent['build-dependencies'],\n cargoRegistries,\n target,\n ),\n ];\n targetDeps = targetDeps.concat(deps);\n });\n }\n\n const workspaceSection = cargoManifest.workspace;\n let workspaceDeps: PackageDependency<CargoManagerData>[] = [];\n if (workspaceSection) {\n workspaceDeps = extractFromSection(\n workspaceSection.dependencies,\n cargoRegistries,\n undefined,\n );\n }\n\n const deps = [\n ...extractFromSection(cargoManifest.dependencies, cargoRegistries),\n ...extractFromSection(cargoManifest['dev-dependencies'], cargoRegistries),\n ...extractFromSection(cargoManifest['build-dependencies'], cargoRegistries),\n ...targetDeps,\n ...workspaceDeps,\n ];\n if (!deps.length) {\n return null;\n }\n\n const packageSection = cargoManifest.package;\n let version: string | undefined = undefined;\n if (packageSection) {\n if (isString(packageSection.version)) {\n version = packageSection.version;\n } else if (\n isObject(packageSection.version) &&\n cargoManifest.workspace?.package?.version\n ) {\n // TODO: Support reading from parent workspace manifest?\n version = cargoManifest.workspace.package.version;\n }\n }\n\n const lockFileName = await findLocalSiblingOrParent(\n packageFile,\n 'Cargo.lock',\n );\n const res: PackageFileContent<CargoManagerData> = {\n deps,\n packageFileVersion: version,\n };\n\n const registryMinPublishAges = getRegistryMinPublishAges(cargoConfig);\n // a string if the cargo config replaces crates.io\n const cratesIoUrl = cargoRegistries[DEFAULT_REGISTRY_ID];\n const packageRules = getMinPublishAgeRules(\n cargoConfig,\n getAlternateRegistryUrls(registryMinPublishAges, cargoRegistries, deps),\n isString(cratesIoUrl) ? cratesIoUrl : undefined,\n );\n if (packageRules.length) {\n logger.debug(\n `Found min-publish-age in the cargo config for ${packageFile}: ${JSON.stringify(packageRules)}`,\n );\n res.packageRules = packageRules;\n }\n if (registryMinPublishAges) {\n logger.debug(\n `Found min-publish-age of registries ${Object.keys(registryMinPublishAges).join(', ')} in the cargo config for ${packageFile}`,\n );\n res.managerData = { registryMinPublishAges };\n }\n\n if (lockFileName) {\n logger.debug(\n `Found lock file ${lockFileName} for packageFile: ${packageFile}`,\n );\n\n const lockFileVersions = await extractLockFileVersions(lockFileName);\n if (!lockFileVersions) {\n logger.debug(\n `Could not extract lock file versions from ${lockFileName}.`,\n );\n return res;\n }\n\n res.lockFiles = [lockFileName];\n const { versionsByPackage, hasGitSources } = lockFileVersions;\n // cargo does not check the age of git sources, which lock file maintenance updates\n if (hasGitSources) {\n res.managerData = { ...res.managerData, lockFileHasGitSources: true };\n }\n\n for (const dep of deps) {\n const packageName = dep.packageName ?? dep.depName!;\n const versions = coerceArray(versionsByPackage.get(packageName));\n\n let lockedVersion: string | null = null;\n if (dep.currentValue) {\n lockedVersion = versioning.getSatisfyingVersion(\n versions,\n dep.currentValue,\n );\n }\n\n if (lockedVersion) {\n dep.lockedVersion = lockedVersion;\n } else {\n logger.debug(\n `No locked version found for package ${dep.depName} in the range of ${dep.currentValue}.`,\n );\n }\n }\n }\n\n return res;\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { GithubTagsDatasource } from "../../datasource/github-tags/index.js";
|
|
|
6
6
|
import { GitlabTagsDatasource } from "../../datasource/gitlab-tags/index.js";
|
|
7
7
|
import { updateArtifacts } from "./artifacts.js";
|
|
8
8
|
import { extractPackageFile } from "./extract.js";
|
|
9
|
+
import { enforcesMinimumReleaseAge, minPublishAgeRustRange } from "./minimum-release-age.js";
|
|
9
10
|
import { getRangeStrategy } from "./range.js";
|
|
10
11
|
import { bumpPackageVersion } from "./update.js";
|
|
11
12
|
import { updateLockedDependency } from "./update-locked.js";
|
|
@@ -14,10 +15,12 @@ var cargo_exports = /* @__PURE__ */ __exportAll({
|
|
|
14
15
|
bumpPackageVersion: () => bumpPackageVersion,
|
|
15
16
|
categories: () => categories,
|
|
16
17
|
defaultConfig: () => defaultConfig,
|
|
18
|
+
enforcesMinimumReleaseAge: () => enforcesMinimumReleaseAge,
|
|
17
19
|
extractPackageFile: () => extractPackageFile,
|
|
18
20
|
getRangeStrategy: () => getRangeStrategy,
|
|
19
21
|
lockFileMaintenanceIsDelegatedToPackageManager: () => true,
|
|
20
22
|
lockFileNames: () => lockFileNames,
|
|
23
|
+
minimumReleaseAgeSupport: () => minimumReleaseAgeSupport,
|
|
21
24
|
supportedDatasources: () => supportedDatasources,
|
|
22
25
|
supportsLockFileMaintenance: () => true,
|
|
23
26
|
updateArtifacts: () => updateArtifacts,
|
|
@@ -27,6 +30,12 @@ var cargo_exports = /* @__PURE__ */ __exportAll({
|
|
|
27
30
|
const lockFileNames = ["Cargo.lock"];
|
|
28
31
|
const url = "https://doc.rust-lang.org/cargo";
|
|
29
32
|
const categories = ["rust"];
|
|
33
|
+
const minimumReleaseAgeSupport = { rust: {
|
|
34
|
+
passesMinimumReleaseAge: minPublishAgeRustRange,
|
|
35
|
+
readsConfiguredAge: minPublishAgeRustRange,
|
|
36
|
+
enforcedInLockFile: minPublishAgeRustRange,
|
|
37
|
+
note: "If `minimumReleaseAgePackageManagerSync` is enabled, sets `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE` and reads `.cargo/config.toml`, see [Cargo](#cargo)."
|
|
38
|
+
} };
|
|
30
39
|
const defaultConfig = {
|
|
31
40
|
commitMessageTopic: "Rust crate {{depName}}",
|
|
32
41
|
managerFilePatterns: ["/(^|/)Cargo\\.toml$/"]
|
|
@@ -38,6 +47,6 @@ const supportedDatasources = [
|
|
|
38
47
|
GitRefsDatasource.id,
|
|
39
48
|
GitTagsDatasource.id
|
|
40
49
|
];
|
|
41
|
-
export { bumpPackageVersion, cargo_exports, categories, defaultConfig, extractPackageFile, getRangeStrategy, lockFileNames, supportedDatasources, updateArtifacts, updateLockedDependency, url };
|
|
50
|
+
export { bumpPackageVersion, cargo_exports, categories, defaultConfig, enforcesMinimumReleaseAge, extractPackageFile, getRangeStrategy, lockFileNames, minimumReleaseAgeSupport, supportedDatasources, updateArtifacts, updateLockedDependency, url };
|
|
42
51
|
|
|
43
52
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/cargo/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { updateArtifacts } from './artifacts.ts';\nimport { extractPackageFile } from './extract.ts';\n\nexport { getRangeStrategy } from './range.ts';\nexport { bumpPackageVersion } from './update.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['Cargo.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\n\nexport { extractPackageFile, updateArtifacts };\n\nexport const url = 'https://doc.rust-lang.org/cargo';\nexport const categories: Category[] = ['rust'];\n\nexport const defaultConfig = {\n commitMessageTopic: 'Rust crate {{depName}}',\n managerFilePatterns: ['/(^|/)Cargo\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [\n CrateDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n];\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../lib/modules/manager/cargo/index.ts"],"sourcesContent":["import type { Category } from '../../../constants/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport type { MinimumReleaseAgeSupport } from '../types.ts';\nimport { updateArtifacts } from './artifacts.ts';\nimport { extractPackageFile } from './extract.ts';\nimport { minPublishAgeRustRange } from './minimum-release-age.ts';\n\nexport { enforcesMinimumReleaseAge } from './minimum-release-age.ts';\nexport { getRangeStrategy } from './range.ts';\nexport { bumpPackageVersion } from './update.ts';\nexport { updateLockedDependency } from './update-locked.ts';\n\nexport const supportsLockFileMaintenance = true;\nexport const lockFileNames = ['Cargo.lock'];\nexport const lockFileMaintenanceIsDelegatedToPackageManager = true;\n\nexport { extractPackageFile, updateArtifacts };\n\nexport const url = 'https://doc.rust-lang.org/cargo';\nexport const categories: Category[] = ['rust'];\n\nexport const minimumReleaseAgeSupport: MinimumReleaseAgeSupport = {\n rust: {\n passesMinimumReleaseAge: minPublishAgeRustRange,\n readsConfiguredAge: minPublishAgeRustRange,\n enforcedInLockFile: minPublishAgeRustRange,\n note: 'If `minimumReleaseAgePackageManagerSync` is enabled, sets `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE` and reads `.cargo/config.toml`, see [Cargo](#cargo).',\n },\n};\n\nexport const defaultConfig = {\n commitMessageTopic: 'Rust crate {{depName}}',\n managerFilePatterns: ['/(^|/)Cargo\\\\.toml$/'],\n};\n\nexport const supportedDatasources = [\n CrateDatasource.id,\n GithubTagsDatasource.id,\n GitlabTagsDatasource.id,\n GitRefsDatasource.id,\n GitTagsDatasource.id,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAa,gBAAgB,CAAC,YAAY;AAK1C,MAAa,MAAM;AACnB,MAAa,aAAyB,CAAC,MAAM;AAE7C,MAAa,2BAAqD,EAChE,MAAM;CACJ,yBAAyB;CACzB,oBAAoB;CACpB,oBAAoB;CACpB,MAAM;AACR,EACF;AAEA,MAAa,gBAAgB;CAC3B,oBAAoB;CACpB,qBAAqB,CAAC,sBAAsB;AAC9C;AAEA,MAAa,uBAAuB;CAClC,gBAAgB;CAChB,qBAAqB;CACrB,qBAAqB;CACrB,kBAAkB;CAClB,kBAAkB;AACpB"}
|
|
@@ -5,13 +5,19 @@ import { CargoLock } from "./schema.js";
|
|
|
5
5
|
// lib/modules/manager/cargo/locked-version.ts
|
|
6
6
|
async function extractLockFileVersions(lockFilePath) {
|
|
7
7
|
const content = await readLocalFile(lockFilePath, "utf8");
|
|
8
|
-
|
|
9
|
-
return null;
|
|
8
|
+
const lock = content ? parseLockFile(content) : null;
|
|
9
|
+
if (!lock) return null;
|
|
10
|
+
return {
|
|
11
|
+
versionsByPackage: getLockedVersions(lock),
|
|
12
|
+
hasGitSources: coerceArray(lock.package).some((pkg) => pkg.source?.startsWith("git+"))
|
|
13
|
+
};
|
|
10
14
|
}
|
|
11
15
|
function extractLockFileContentVersions(content) {
|
|
12
|
-
const versionsByPackage = /* @__PURE__ */ new Map();
|
|
13
16
|
const lock = parseLockFile(content);
|
|
14
|
-
|
|
17
|
+
return lock ? getLockedVersions(lock) : null;
|
|
18
|
+
}
|
|
19
|
+
function getLockedVersions(lock) {
|
|
20
|
+
const versionsByPackage = /* @__PURE__ */ new Map();
|
|
15
21
|
for (const pkg of coerceArray(lock.package)) {
|
|
16
22
|
const versions = coerceArray(versionsByPackage.get(pkg.name));
|
|
17
23
|
versions.push(pkg.version);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locked-version.js","names":[],"sources":["../../../../lib/modules/manager/cargo/locked-version.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { CargoLock } from './schema.ts';\n\nexport async function extractLockFileVersions(\n lockFilePath: string,\n): Promise<
|
|
1
|
+
{"version":3,"file":"locked-version.js","names":[],"sources":["../../../../lib/modules/manager/cargo/locked-version.ts"],"sourcesContent":["import { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { CargoLock } from './schema.ts';\nimport type { CargoLockFileVersions } from './types.ts';\n\nexport async function extractLockFileVersions(\n lockFilePath: string,\n): Promise<CargoLockFileVersions | null> {\n const content = await readLocalFile(lockFilePath, 'utf8');\n const lock = content ? parseLockFile(content) : null;\n if (!lock) {\n return null;\n }\n return {\n versionsByPackage: getLockedVersions(lock),\n hasGitSources: coerceArray(lock.package).some((pkg) =>\n pkg.source?.startsWith('git+'),\n ),\n };\n}\n\nexport function extractLockFileContentVersions(\n content: string,\n): Map<string, string[]> | null {\n const lock = parseLockFile(content);\n return lock ? getLockedVersions(lock) : null;\n}\n\nfunction getLockedVersions(lock: CargoLock): Map<string, string[]> {\n const versionsByPackage = new Map<string, string[]>();\n for (const pkg of coerceArray(lock.package)) {\n const versions = coerceArray(versionsByPackage.get(pkg.name));\n versions.push(pkg.version);\n versionsByPackage.set(pkg.name, versions);\n }\n return versionsByPackage;\n}\n\nexport function parseLockFile(lockFile: string): CargoLock | null {\n const res = CargoLock.safeParse(lockFile);\n if (res.success) {\n return res.data;\n }\n logger.debug({ err: res.error }, 'Error parsing Cargo lockfile.');\n return null;\n}\n"],"mappings":";;;;;AAMA,eAAsB,wBACpB,cACuC;CACvC,MAAM,UAAU,MAAM,cAAc,cAAc,MAAM;CACxD,MAAM,OAAO,UAAU,cAAc,OAAO,IAAI;CAChD,IAAI,CAAC,MACH,OAAO;CAET,OAAO;EACL,mBAAmB,kBAAkB,IAAI;EACzC,eAAe,YAAY,KAAK,OAAO,CAAC,CAAC,MAAM,QAC7C,IAAI,QAAQ,WAAW,MAAM,CAC/B;CACF;AACF;AAEA,SAAgB,+BACd,SAC8B;CAC9B,MAAM,OAAO,cAAc,OAAO;CAClC,OAAO,OAAO,kBAAkB,IAAI,IAAI;AAC1C;AAEA,SAAS,kBAAkB,MAAwC;CACjE,MAAM,oCAAoB,IAAI,IAAsB;CACpD,KAAK,MAAM,OAAO,YAAY,KAAK,OAAO,GAAG;EAC3C,MAAM,WAAW,YAAY,kBAAkB,IAAI,IAAI,IAAI,CAAC;EAC5D,SAAS,KAAK,IAAI,OAAO;EACzB,kBAAkB,IAAI,IAAI,MAAM,QAAQ;CAC1C;CACA,OAAO;AACT;AAEA,SAAgB,cAAc,UAAoC;CAChE,MAAM,MAAM,UAAU,UAAU,QAAQ;CACxC,IAAI,IAAI,SACN,OAAO,IAAI;CAEb,OAAO,MAAM,EAAE,KAAK,IAAI,MAAM,GAAG,+BAA+B;CAChE,OAAO;AACT"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { logger } from "../../../logger/index.js";
|
|
2
|
+
import { getEnv } from "../../../util/env.js";
|
|
3
|
+
import { detachUrlCredentials } from "../../../util/host-rules.js";
|
|
4
|
+
import { calculateMinimumReleaseAgeMs, calculatePackageManagerMinimumReleaseAgeMs, getMinimumReleaseAgeExemption } from "../../../util/minimum-release-age.js";
|
|
5
|
+
import { coerceNumber } from "../../../util/number.js";
|
|
6
|
+
import { coerceObject } from "../../../util/object.js";
|
|
7
|
+
import { regEx } from "../../../util/regex.js";
|
|
8
|
+
import { CrateDatasource } from "../../datasource/crate/index.js";
|
|
9
|
+
import { isSubsetOf } from "../../versioning/common.js";
|
|
10
|
+
import { api } from "../../versioning/rust-release-channel/index.js";
|
|
11
|
+
import { resolveToolConstraint } from "../util.js";
|
|
12
|
+
import { DEFAULT_REGISTRY_ID, readCargoConfig } from "./utils.js";
|
|
13
|
+
import { isNonEmptyString, isString } from "@sindresorhus/is";
|
|
14
|
+
import { escape } from "minimatch";
|
|
15
|
+
// lib/modules/manager/cargo/minimum-release-age.ts
|
|
16
|
+
const minPublishAgeRustRange = ">=1.100.0";
|
|
17
|
+
const units = [
|
|
18
|
+
{
|
|
19
|
+
name: "days",
|
|
20
|
+
ms: 864e5
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "hours",
|
|
24
|
+
ms: 36e5
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "minutes",
|
|
28
|
+
ms: 6e4
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
const cargoMonthSeconds = 2629746;
|
|
32
|
+
const cargoDurationRegex = regEx(/^(?<count>\d+) ?(?<unit>second|minute|hour|day|week|month)s?$/);
|
|
33
|
+
const cargoUnitSeconds = {
|
|
34
|
+
second: 1,
|
|
35
|
+
minute: 60,
|
|
36
|
+
hour: 3600,
|
|
37
|
+
day: 86400,
|
|
38
|
+
week: 604800,
|
|
39
|
+
month: cargoMonthSeconds
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Parses a cargo duration like `3 days` to milliseconds, or returns `null` if cargo rejects it.
|
|
43
|
+
*/
|
|
44
|
+
function parseCargoDurationMs(age) {
|
|
45
|
+
if (age === "0") return 0;
|
|
46
|
+
const groups = cargoDurationRegex.exec(age)?.groups;
|
|
47
|
+
return groups ? parseInt(groups.count, 10) * cargoUnitSeconds[groups.unit] * 1e3 : null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parses a cargo `min-publish-age`: the age, with months converted to seconds, `null` for `"0"`, which turns the check off, or `undefined` if it is unset or invalid.
|
|
51
|
+
*/
|
|
52
|
+
function parseMinPublishAge(age, key) {
|
|
53
|
+
if (!isNonEmptyString(age)) return;
|
|
54
|
+
const ageMs = parseCargoDurationMs(age);
|
|
55
|
+
if (ageMs === null) {
|
|
56
|
+
logger.debug(`Invalid ${key} in cargo config: ${age}`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!ageMs) return null;
|
|
60
|
+
return age.includes("month") ? `${ageMs / 1e3} seconds` : age;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Returns `registry.global-min-publish-age` of the cargo config, or `null` if it is unset, `"0"` or invalid.
|
|
64
|
+
*/
|
|
65
|
+
function getGlobalMinPublishAge(cargoConfig) {
|
|
66
|
+
return parseMinPublishAge(cargoConfig.registry?.["global-min-publish-age"], "registry.global-min-publish-age") ?? null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Returns the `min-publish-age` which cargo applies to the crates of a registry: the one of the registry, or else `globalAge`.
|
|
70
|
+
*/
|
|
71
|
+
function getEffectiveMinPublishAge(cargoConfig, registryName, globalAge) {
|
|
72
|
+
const age = parseMinPublishAge(cargoConfig.registries?.[registryName]?.["min-publish-age"], `registries.${registryName}.min-publish-age`);
|
|
73
|
+
return age === void 0 ? globalAge : age;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns the rules which set `minimumReleaseAgeExtracted` of each crate to the `min-publish-age` which cargo applies to it.
|
|
77
|
+
*
|
|
78
|
+
* @param registryUrls The URL of each registry other than crates.io by name, as the cargo extractor sets it in `registryUrls` of the crates of that registry.
|
|
79
|
+
* @param cratesIoUrl The URL which the crates of crates.io have in `registryUrls` if the cargo config replaces crates.io.
|
|
80
|
+
*/
|
|
81
|
+
function getMinPublishAgeRules(cargoConfig, registryUrls, cratesIoUrl) {
|
|
82
|
+
const globalAge = getGlobalMinPublishAge(cargoConfig);
|
|
83
|
+
const cratesIoAge = getEffectiveMinPublishAge(cargoConfig, DEFAULT_REGISTRY_ID, globalAge);
|
|
84
|
+
const cratesIoAgeMs = calculateMinimumReleaseAgeMs({ minimumReleaseAge: cratesIoAge });
|
|
85
|
+
const rules = [];
|
|
86
|
+
if (cratesIoAge) rules.push({
|
|
87
|
+
matchDatasources: [CrateDatasource.id],
|
|
88
|
+
minimumReleaseAgeExtracted: cratesIoAge
|
|
89
|
+
});
|
|
90
|
+
for (const [registryName, registryUrl] of Object.entries(registryUrls)) {
|
|
91
|
+
const age = getEffectiveMinPublishAge(cargoConfig, registryName, globalAge);
|
|
92
|
+
if (registryUrl === cratesIoUrl && calculateMinimumReleaseAgeMs({ minimumReleaseAge: age }) <= cratesIoAgeMs) continue;
|
|
93
|
+
if (age ?? cratesIoAge) rules.push({
|
|
94
|
+
matchDatasources: [CrateDatasource.id],
|
|
95
|
+
matchRegistryUrls: [escape(detachUrlCredentials(registryUrl, []), { magicalBraces: true })],
|
|
96
|
+
minimumReleaseAgeExtracted: age
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return rules;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Returns the `registries.<name>.min-publish-age` values of the cargo config by registry name, or `undefined` if no registry sets one.
|
|
103
|
+
*/
|
|
104
|
+
function getRegistryMinPublishAges(cargoConfig) {
|
|
105
|
+
const ages = {};
|
|
106
|
+
for (const [name, registry] of Object.entries(coerceObject(cargoConfig.registries))) {
|
|
107
|
+
const age = registry["min-publish-age"];
|
|
108
|
+
if (isString(age)) ages[name] = age;
|
|
109
|
+
}
|
|
110
|
+
return Object.keys(ages).length ? ages : void 0;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Whether the cargo config sets `resolver.incompatible-publish-age = "allow"`, which turns off the check of `min-publish-age`.
|
|
114
|
+
*/
|
|
115
|
+
function allowsIncompatiblePublishAge(cargoConfig) {
|
|
116
|
+
return cargoConfig.resolver?.["incompatible-publish-age"] === "allow";
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Formats a duration as a cargo `min-publish-age`, using the largest unit which keeps it a whole number.
|
|
120
|
+
*/
|
|
121
|
+
function toCargoDuration(durationMs) {
|
|
122
|
+
const wholeMs = Math.round(durationMs);
|
|
123
|
+
for (const unit of units) if (wholeMs % unit.ms === 0) return `${wholeMs / unit.ms} ${unit.name}`;
|
|
124
|
+
return `${Math.ceil(wholeMs / 1e3)} seconds`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Whether the cargo config sets a valid `min-publish-age` for the registry of `upgrade`, which takes precedence over `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE`.
|
|
128
|
+
*/
|
|
129
|
+
function hasRegistryMinPublishAge(cargoConfig, upgrade) {
|
|
130
|
+
const registryName = upgrade.managerData?.registryName ?? "crates-io";
|
|
131
|
+
return parseMinPublishAge(cargoConfig.registries?.[registryName]?.["min-publish-age"], `registries.${registryName}.min-publish-age`) !== void 0;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE` with `CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=deny` for `ageMs`, or nothing if `ageMs` is not larger than `appliedConfigAgeMs`, the age which cargo applies itself.
|
|
135
|
+
*/
|
|
136
|
+
function toMinPublishAgeEnv(ageMs, appliedConfigAgeMs) {
|
|
137
|
+
if (ageMs <= appliedConfigAgeMs) return {};
|
|
138
|
+
return {
|
|
139
|
+
CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE: toCargoDuration(ageMs),
|
|
140
|
+
CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE: "deny"
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Returns the environment variables which pass the minimum release age of `calculatePackageManagerMinimumReleaseAgeMs`, raised to `registry.global-min-publish-age`, to cargo, lowered to the smaller `minimumReleaseAge` of exempted crates but not below `registry.global-min-publish-age`, and the notice for such a lowering if `rustConstraint` is within `minPublishAgeRustRange`. Returns nothing without `minimumReleaseAgePackageManagerSync`.
|
|
145
|
+
*/
|
|
146
|
+
async function getMinPublishAgeEnv(options) {
|
|
147
|
+
const renovateAgeMs = calculatePackageManagerMinimumReleaseAgeMs(options);
|
|
148
|
+
if (!renovateAgeMs) return { env: {} };
|
|
149
|
+
const cargoConfig = coerceObject(await readCargoConfig());
|
|
150
|
+
const configAgeMs = calculateMinimumReleaseAgeMs({ minimumReleaseAge: getGlobalMinPublishAge(cargoConfig) });
|
|
151
|
+
const ageMs = Math.max(renovateAgeMs, configAgeMs);
|
|
152
|
+
const appliedConfigAgeMs = allowsIncompatiblePublishAge(cargoConfig) ? 0 : configAgeMs;
|
|
153
|
+
const exemption = getMinimumReleaseAgeExemption(options.upgrades.filter((upgrade) => !hasRegistryMinPublishAge(cargoConfig, upgrade)), "cargo", CrateDatasource.id, ageMs);
|
|
154
|
+
const loweredMs = Math.max(coerceNumber(exemption?.ageMs), configAgeMs);
|
|
155
|
+
if (!exemption || loweredMs >= ageMs) return { env: toMinPublishAgeEnv(ageMs, appliedConfigAgeMs) };
|
|
156
|
+
const age = toCargoDuration(ageMs);
|
|
157
|
+
const checked = loweredMs ? `a publish age of ${toCargoDuration(loweredMs)}` : "no publish age";
|
|
158
|
+
logger.debug(`Cargo checks ${checked} instead of ${age}, as the minimumReleaseAge of ${exemption.depNames.join(", ")} is smaller and their release is younger or has no timestamp`);
|
|
159
|
+
const env = toMinPublishAgeEnv(loweredMs, appliedConfigAgeMs);
|
|
160
|
+
if (!isSubsetOf(api, options.rustConstraint, ">=1.100.0")) return { env };
|
|
161
|
+
return {
|
|
162
|
+
env,
|
|
163
|
+
notice: `Cargo checked ${checked} instead of ${age} for this update, because the \`minimumReleaseAge\` of ${exemption.depNames.map((crate) => `\`${crate}\``).join(", ")} is smaller.`
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Whether no registry of the cargo config has a `min-publish-age` which is invalid, `"0"` or smaller than the `minimumReleaseAge` of lock file maintenance, as the environment variable cannot override it.
|
|
168
|
+
*/
|
|
169
|
+
function registriesEnforceMinimumReleaseAge(config) {
|
|
170
|
+
const lockFileMaintenanceAgeMs = calculateMinimumReleaseAgeMs({ minimumReleaseAge: config.minimumReleaseAge });
|
|
171
|
+
const registryAges = coerceObject(config.managerData?.registryMinPublishAges);
|
|
172
|
+
for (const [registry, age] of Object.entries(registryAges)) {
|
|
173
|
+
const ageMs = parseCargoDurationMs(age);
|
|
174
|
+
if (ageMs === null) {
|
|
175
|
+
logger.debug(`Cargo does not enforce the minimum release age, as registry ${registry} has an invalid min-publish-age ${age}`);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
if (ageMs === 0) {
|
|
179
|
+
logger.debug(`Cargo does not enforce the minimum release age, as the min-publish-age 0 of registry ${registry} turns the check off for that registry like allow, so Renovate does not rely on cargo`);
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (ageMs < lockFileMaintenanceAgeMs) {
|
|
183
|
+
logger.debug(`Cargo does not enforce the minimum release age, as the min-publish-age ${age} of registry ${registry} is smaller than the minimumReleaseAge of lock file maintenance, and takes precedence over the age which Renovate passes`);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
const minPublishAgeEnvKeys = ["CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE", "CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE"];
|
|
190
|
+
/**
|
|
191
|
+
* Returns the publish age variable which the environment of Renovate, `customEnvVariables` or `env` sets, as it overrides the value which Renovate passes.
|
|
192
|
+
*/
|
|
193
|
+
function getUserSetMinPublishAgeEnvKey() {
|
|
194
|
+
const env = getEnv();
|
|
195
|
+
return minPublishAgeEnvKeys.find((key) => isString(env[key]));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Whether cargo enforces the minimum release age when it regenerates the lock file, which requires a Rust constraint of at least `minPublishAgeRustRange`, a lock file without git sources, no publish age variable set by the environment of Renovate, `customEnvVariables` or `env`, and no registry of the cargo config with a `min-publish-age` which is invalid, `"0"` or smaller than the `minimumReleaseAge` of lock file maintenance.
|
|
199
|
+
*/
|
|
200
|
+
async function enforcesMinimumReleaseAge(config) {
|
|
201
|
+
if (config.managerData?.lockFileHasGitSources) {
|
|
202
|
+
logger.debug("Cargo does not enforce the minimum release age, as the lock file has packages from git repositories, which cargo updates without checking their age");
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
const userSetKey = getUserSetMinPublishAgeEnvKey();
|
|
206
|
+
if (userSetKey) {
|
|
207
|
+
logger.debug(`Cargo does not enforce the minimum release age, as ${userSetKey} is set by the environment of Renovate, customEnvVariables or env, which overrides the value which Renovate passes`);
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
if (!registriesEnforceMinimumReleaseAge(config)) return false;
|
|
211
|
+
const constraint = await resolveToolConstraint(config, "rust");
|
|
212
|
+
return isSubsetOf(api, constraint, minPublishAgeRustRange);
|
|
213
|
+
}
|
|
214
|
+
export { enforcesMinimumReleaseAge, getGlobalMinPublishAge, getMinPublishAgeEnv, getMinPublishAgeRules, getRegistryMinPublishAges, minPublishAgeRustRange };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=minimum-release-age.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimum-release-age.js","names":["escapeGlob","rustVersioning"],"sources":["../../../../lib/modules/manager/cargo/minimum-release-age.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport { escape as escapeGlob } from 'minimatch';\nimport { logger } from '../../../logger/index.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport { detachUrlCredentials } from '../../../util/host-rules.ts';\nimport {\n calculateMinimumReleaseAgeMs,\n calculatePackageManagerMinimumReleaseAgeMs,\n getMinimumReleaseAgeExemption,\n} from '../../../util/minimum-release-age.ts';\nimport { coerceNumber } from '../../../util/number.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport { isSubsetOf } from '../../versioning/common.ts';\nimport { api as rustVersioning } from '../../versioning/rust-release-channel/index.ts';\nimport type {\n ExtractedPackageRule,\n UpdateArtifactsConfig,\n Upgrade,\n} from '../types.ts';\nimport { resolveToolConstraint } from '../util.ts';\nimport type { CargoConfig } from './schema.ts';\nimport type {\n CargoManagerData,\n MinPublishAgeEnv,\n MinPublishAgeEnvOptions,\n} from './types.ts';\nimport { DEFAULT_REGISTRY_ID, readCargoConfig } from './utils.ts';\n\n// Cargo respects `min-publish-age` since Rust 1.100.0\n// https://github.com/rust-lang/cargo/pull/17335\nexport const minPublishAgeRustRange = '>=1.100.0';\n\nconst units = [\n { name: 'days', ms: 24 * 60 * 60 * 1000 },\n { name: 'hours', ms: 60 * 60 * 1000 },\n { name: 'minutes', ms: 60 * 1000 },\n];\n\n// cargo counts a month as 2,629,746 seconds, `toMs` as 30 days\nconst cargoMonthSeconds = 2_629_746;\n\n// the durations which cargo accepts besides `\"0\"`, see `maybe_parse_time_span` in cargo's src/util/time_span.rs\nconst cargoDurationRegex = regEx(\n /^(?<count>\\d+) ?(?<unit>second|minute|hour|day|week|month)s?$/,\n);\n\nconst cargoUnitSeconds: Record<string, number> = {\n second: 1,\n minute: 60,\n hour: 60 * 60,\n day: 24 * 60 * 60,\n week: 7 * 24 * 60 * 60,\n month: cargoMonthSeconds,\n};\n\n/**\n * Parses a cargo duration like `3 days` to milliseconds, or returns `null` if cargo rejects it.\n */\nfunction parseCargoDurationMs(age: string): number | null {\n if (age === '0') {\n return 0;\n }\n const groups = cargoDurationRegex.exec(age)?.groups;\n return groups\n ? parseInt(groups.count, 10) * cargoUnitSeconds[groups.unit] * 1000\n : null;\n}\n\n/**\n * Parses a cargo `min-publish-age`: the age, with months converted to seconds, `null` for `\"0\"`, which turns the check off, or `undefined` if it is unset or invalid.\n */\nfunction parseMinPublishAge(\n age: string | undefined,\n key: string,\n): string | null | undefined {\n if (!isNonEmptyString(age)) {\n return undefined;\n }\n const ageMs = parseCargoDurationMs(age);\n if (ageMs === null) {\n logger.debug(`Invalid ${key} in cargo config: ${age}`);\n return undefined;\n }\n if (!ageMs) {\n return null;\n }\n // `toMs` reads the other units of cargo like cargo does\n return age.includes('month') ? `${ageMs / 1000} seconds` : age;\n}\n\n/**\n * Returns `registry.global-min-publish-age` of the cargo config, or `null` if it is unset, `\"0\"` or invalid.\n */\nexport function getGlobalMinPublishAge(\n cargoConfig: CargoConfig,\n): string | null {\n return (\n parseMinPublishAge(\n cargoConfig.registry?.['global-min-publish-age'],\n 'registry.global-min-publish-age',\n ) ?? null\n );\n}\n\n/**\n * Returns the `min-publish-age` which cargo applies to the crates of a registry: the one of the registry, or else `globalAge`.\n */\nfunction getEffectiveMinPublishAge(\n cargoConfig: CargoConfig,\n registryName: string,\n globalAge: string | null,\n): string | null {\n const age = parseMinPublishAge(\n cargoConfig.registries?.[registryName]?.['min-publish-age'],\n `registries.${registryName}.min-publish-age`,\n );\n return age === undefined ? globalAge : age;\n}\n\n/**\n * Returns the rules which set `minimumReleaseAgeExtracted` of each crate to the `min-publish-age` which cargo applies to it.\n *\n * @param registryUrls The URL of each registry other than crates.io by name, as the cargo extractor sets it in `registryUrls` of the crates of that registry.\n * @param cratesIoUrl The URL which the crates of crates.io have in `registryUrls` if the cargo config replaces crates.io.\n */\nexport function getMinPublishAgeRules(\n cargoConfig: CargoConfig,\n registryUrls: Record<string, string>,\n cratesIoUrl?: string,\n): ExtractedPackageRule[] {\n const globalAge = getGlobalMinPublishAge(cargoConfig);\n const cratesIoAge = getEffectiveMinPublishAge(\n cargoConfig,\n DEFAULT_REGISTRY_ID,\n globalAge,\n );\n const cratesIoAgeMs = calculateMinimumReleaseAgeMs({\n minimumReleaseAge: cratesIoAge,\n });\n const rules: ExtractedPackageRule[] = [];\n // the age of crates.io applies to all crates, and the rules per registry override it for the crates of other registries\n if (cratesIoAge) {\n rules.push({\n matchDatasources: [CrateDatasource.id],\n minimumReleaseAgeExtracted: cratesIoAge,\n });\n }\n for (const [registryName, registryUrl] of Object.entries(registryUrls)) {\n const age = getEffectiveMinPublishAge(cargoConfig, registryName, globalAge);\n // cargo applies the age of crates.io to its crates also if they come from a replacement with the URL of this registry, so the rule may only raise their age\n if (\n registryUrl === cratesIoUrl &&\n calculateMinimumReleaseAgeMs({ minimumReleaseAge: age }) <= cratesIoAgeMs\n ) {\n continue;\n }\n // an age of `\"0\"` is `null`, and only needs a rule to override the age of crates.io\n if (age ?? cratesIoAge) {\n rules.push({\n matchDatasources: [CrateDatasource.id],\n // the dependencies lose the credentials of their registry URL before the lookup, and the matcher reads a URL as a glob, e.g. the brackets of an IPv6 address, so the credentials go before the escaping\n matchRegistryUrls: [\n escapeGlob(detachUrlCredentials(registryUrl, []), {\n magicalBraces: true,\n }),\n ],\n minimumReleaseAgeExtracted: age,\n });\n }\n }\n return rules;\n}\n\n/**\n * Returns the `registries.<name>.min-publish-age` values of the cargo config by registry name, or `undefined` if no registry sets one.\n */\nexport function getRegistryMinPublishAges(\n cargoConfig: CargoConfig,\n): Record<string, string> | undefined {\n const ages: Record<string, string> = {};\n for (const [name, registry] of Object.entries(\n coerceObject(cargoConfig.registries),\n )) {\n const age = registry['min-publish-age'];\n if (isString(age)) {\n ages[name] = age;\n }\n }\n return Object.keys(ages).length ? ages : undefined;\n}\n\n/**\n * Whether the cargo config sets `resolver.incompatible-publish-age = \"allow\"`, which turns off the check of `min-publish-age`.\n */\nfunction allowsIncompatiblePublishAge(cargoConfig: CargoConfig): boolean {\n return cargoConfig.resolver?.['incompatible-publish-age'] === 'allow';\n}\n\n/**\n * Formats a duration as a cargo `min-publish-age`, using the largest unit which keeps it a whole number.\n */\nfunction toCargoDuration(durationMs: number): string {\n // `toMs` returns fractions of a millisecond for an age like `1.1 hours`\n const wholeMs = Math.round(durationMs);\n for (const unit of units) {\n if (wholeMs % unit.ms === 0) {\n return `${wholeMs / unit.ms} ${unit.name}`;\n }\n }\n return `${Math.ceil(wholeMs / 1000)} seconds`;\n}\n\n/**\n * Whether the cargo config sets a valid `min-publish-age` for the registry of `upgrade`, which takes precedence over `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE`.\n */\nfunction hasRegistryMinPublishAge(\n cargoConfig: CargoConfig,\n upgrade: Upgrade<CargoManagerData>,\n): boolean {\n const registryName = upgrade.managerData?.registryName ?? DEFAULT_REGISTRY_ID;\n return (\n parseMinPublishAge(\n cargoConfig.registries?.[registryName]?.['min-publish-age'],\n `registries.${registryName}.min-publish-age`,\n ) !== undefined\n );\n}\n\n/**\n * Returns `CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE` with `CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=deny` for `ageMs`, or nothing if `ageMs` is not larger than `appliedConfigAgeMs`, the age which cargo applies itself.\n */\nfunction toMinPublishAgeEnv(\n ageMs: number,\n appliedConfigAgeMs: number,\n): Record<string, string> {\n if (ageMs <= appliedConfigAgeMs) {\n return {};\n }\n return {\n CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE: toCargoDuration(ageMs),\n // `deny` is the default, set it to override an `allow` in the cargo config\n CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE: 'deny',\n };\n}\n\n/**\n * Returns the environment variables which pass the minimum release age of `calculatePackageManagerMinimumReleaseAgeMs`, raised to `registry.global-min-publish-age`, to cargo, lowered to the smaller `minimumReleaseAge` of exempted crates but not below `registry.global-min-publish-age`, and the notice for such a lowering if `rustConstraint` is within `minPublishAgeRustRange`. Returns nothing without `minimumReleaseAgePackageManagerSync`.\n */\nexport async function getMinPublishAgeEnv(\n options: MinPublishAgeEnvOptions,\n): Promise<MinPublishAgeEnv> {\n const renovateAgeMs = calculatePackageManagerMinimumReleaseAgeMs(options);\n // without minimumReleaseAgePackageManagerSync or without an age, e.g. for\n // security updates, cargo applies its own config\n if (!renovateAgeMs) {\n return { env: {} };\n }\n const cargoConfig = coerceObject(await readCargoConfig());\n const configAgeMs = calculateMinimumReleaseAgeMs({\n minimumReleaseAge: getGlobalMinPublishAge(cargoConfig),\n });\n // the environment variable replaces `registry.global-min-publish-age`, so it must not weaken it\n const ageMs = Math.max(renovateAgeMs, configAgeMs);\n // `allow` turns the check off unless the environment sets `deny`, so cargo applies no age of its own then\n const appliedConfigAgeMs = allowsIncompatiblePublishAge(cargoConfig)\n ? 0\n : configAgeMs;\n // the `min-publish-age` of a registry takes precedence over the environment variable, so lowering it does not help the crates of that registry\n const exemption = getMinimumReleaseAgeExemption(\n options.upgrades.filter(\n (upgrade) => !hasRegistryMinPublishAge(cargoConfig, upgrade),\n ),\n 'cargo',\n CrateDatasource.id,\n ageMs,\n );\n const loweredMs = Math.max(coerceNumber(exemption?.ageMs), configAgeMs);\n if (!exemption || loweredMs >= ageMs) {\n return { env: toMinPublishAgeEnv(ageMs, appliedConfigAgeMs) };\n }\n const age = toCargoDuration(ageMs);\n const checked = loweredMs\n ? `a publish age of ${toCargoDuration(loweredMs)}`\n : 'no publish age';\n logger.debug(\n `Cargo checks ${checked} instead of ${age}, as the minimumReleaseAge of ${exemption.depNames.join(', ')} is smaller and their release is younger or has no timestamp`,\n );\n const env = toMinPublishAgeEnv(loweredMs, appliedConfigAgeMs);\n // cargo before Rust 1.100.0 ignores the environment variables, so it checks\n // nothing which the notice could name\n if (\n !isSubsetOf(rustVersioning, options.rustConstraint, minPublishAgeRustRange)\n ) {\n return { env };\n }\n const crates = exemption.depNames.map((crate) => `\\`${crate}\\``).join(', ');\n return {\n env,\n notice: `Cargo checked ${checked} instead of ${age} for this update, because the \\`minimumReleaseAge\\` of ${crates} is smaller.`,\n };\n}\n\ninterface CargoEnforcesMinimumReleaseAgeConfig extends UpdateArtifactsConfig {\n managerData?: CargoManagerData;\n}\n\n/**\n * Whether no registry of the cargo config has a `min-publish-age` which is invalid, `\"0\"` or smaller than the `minimumReleaseAge` of lock file maintenance, as the environment variable cannot override it.\n */\nfunction registriesEnforceMinimumReleaseAge(\n config: CargoEnforcesMinimumReleaseAgeConfig,\n): boolean {\n // the age which Renovate would wait for, `minimumReleaseAgePackageManager` only raises what it passes\n const lockFileMaintenanceAgeMs = calculateMinimumReleaseAgeMs({\n minimumReleaseAge: config.minimumReleaseAge,\n });\n const registryAges = coerceObject(config.managerData?.registryMinPublishAges);\n for (const [registry, age] of Object.entries(registryAges)) {\n const ageMs = parseCargoDurationMs(age);\n if (ageMs === null) {\n logger.debug(\n `Cargo does not enforce the minimum release age, as registry ${registry} has an invalid min-publish-age ${age}`,\n );\n return false;\n }\n if (ageMs === 0) {\n logger.debug(\n `Cargo does not enforce the minimum release age, as the min-publish-age 0 of registry ${registry} turns the check off for that registry like allow, so Renovate does not rely on cargo`,\n );\n return false;\n }\n if (ageMs < lockFileMaintenanceAgeMs) {\n logger.debug(\n `Cargo does not enforce the minimum release age, as the min-publish-age ${age} of registry ${registry} is smaller than the minimumReleaseAge of lock file maintenance, and takes precedence over the age which Renovate passes`,\n );\n return false;\n }\n }\n return true;\n}\n\nconst minPublishAgeEnvKeys = [\n 'CARGO_REGISTRY_GLOBAL_MIN_PUBLISH_AGE',\n 'CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE',\n];\n\n/**\n * Returns the publish age variable which the environment of Renovate, `customEnvVariables` or `env` sets, as it overrides the value which Renovate passes.\n */\nfunction getUserSetMinPublishAgeEnvKey(): string | undefined {\n const env = getEnv();\n return minPublishAgeEnvKeys.find((key) => isString(env[key]));\n}\n\n/**\n * Whether cargo enforces the minimum release age when it regenerates the lock file, which requires a Rust constraint of at least `minPublishAgeRustRange`, a lock file without git sources, no publish age variable set by the environment of Renovate, `customEnvVariables` or `env`, and no registry of the cargo config with a `min-publish-age` which is invalid, `\"0\"` or smaller than the `minimumReleaseAge` of lock file maintenance.\n */\nexport async function enforcesMinimumReleaseAge(\n config: CargoEnforcesMinimumReleaseAgeConfig,\n): Promise<boolean> {\n if (config.managerData?.lockFileHasGitSources) {\n logger.debug(\n 'Cargo does not enforce the minimum release age, as the lock file has packages from git repositories, which cargo updates without checking their age',\n );\n return false;\n }\n const userSetKey = getUserSetMinPublishAgeEnvKey();\n if (userSetKey) {\n logger.debug(\n `Cargo does not enforce the minimum release age, as ${userSetKey} is set by the environment of Renovate, customEnvVariables or env, which overrides the value which Renovate passes`,\n );\n return false;\n }\n if (!registriesEnforceMinimumReleaseAge(config)) {\n return false;\n }\n const constraint = await resolveToolConstraint(config, 'rust');\n return isSubsetOf(rustVersioning, constraint, minPublishAgeRustRange);\n}\n"],"mappings":"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"}
|
|
@@ -71,13 +71,18 @@ const CargoManifest = Toml.pipe(CargoSection.extend({
|
|
|
71
71
|
workspace: CargoWorkspace.optional(),
|
|
72
72
|
target: CargoTarget.optional()
|
|
73
73
|
}));
|
|
74
|
-
const CargoConfigRegistry = z.object({
|
|
74
|
+
const CargoConfigRegistry = z.object({
|
|
75
|
+
index: z.string().optional(),
|
|
76
|
+
"min-publish-age": z.string().optional().catch(void 0)
|
|
77
|
+
});
|
|
75
78
|
const CargoConfigSource = z.object({
|
|
76
79
|
"replace-with": z.string().optional(),
|
|
77
80
|
registry: z.string().optional()
|
|
78
81
|
});
|
|
79
82
|
const CargoConfig = Toml.pipe(z.object({
|
|
83
|
+
registry: z.object({ "global-min-publish-age": z.string().optional().catch(void 0) }).optional().catch(void 0),
|
|
80
84
|
registries: z.record(z.string(), CargoConfigRegistry).optional(),
|
|
85
|
+
resolver: z.object({ "incompatible-publish-age": z.string().optional().catch(void 0) }).optional().catch(void 0),
|
|
81
86
|
source: z.record(z.string(), CargoConfigSource).optional()
|
|
82
87
|
}));
|
|
83
88
|
const CargoLockPackage = z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/cargo/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { Toml, withDepType } from '../../../util/schema-utils/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { applyGitSource } from '../util.ts';\nimport type { CargoManagerData } from './types.ts';\n\nconst CargoDep = z.union([\n z\n .object({\n /** Path on disk to the crate sources */\n path: z.string().optional(),\n /** Git URL for the dependency */\n git: z.string().optional(),\n /** Git tag for the dependency */\n tag: z.string().optional(),\n /** Git revision for the dependency */\n rev: z.string().optional(),\n /** Git branch for the dependency */\n branch: z.string().optional(),\n /** Semver version */\n version: z.string().optional(),\n /** Name of a registry whose URL is configured in `.cargo/config.toml` or `.cargo/config` */\n registry: z.string().optional(),\n /** Name of a package to look up */\n package: z.string().optional(),\n /** Whether the dependency is inherited from the workspace */\n workspace: z.boolean().optional(),\n })\n .transform(\n ({\n path,\n git,\n tag,\n rev,\n branch,\n version,\n registry,\n package: pkg,\n workspace,\n }): PackageDependency<CargoManagerData> => {\n let skipReason: SkipReason | undefined;\n let currentValue: string;\n let nestedVersion = false;\n\n if (version) {\n currentValue = version;\n nestedVersion = true;\n } else {\n currentValue = '';\n }\n\n const dep: PackageDependency<CargoManagerData> = {\n currentValue,\n managerData: { nestedVersion },\n datasource: CrateDatasource.id,\n };\n\n if (path) {\n skipReason = 'path-dependency';\n } else if (workspace) {\n skipReason = 'inherited-dependency';\n } else if (git) {\n applyGitSource(dep, git, rev, tag, branch);\n } else if (!version) {\n skipReason = 'invalid-dependency-specification';\n }\n\n if (skipReason) {\n dep.skipReason = skipReason;\n }\n if (pkg && !git) {\n dep.packageName = pkg;\n }\n if (registry) {\n dep.managerData!.registryName = registry;\n }\n\n return dep;\n },\n ),\n z.string().transform((version): PackageDependency<CargoManagerData> => ({\n currentValue: version,\n managerData: { nestedVersion: false },\n datasource: CrateDatasource.id,\n })),\n]);\n\nconst CargoDeps = z.record(z.string(), CargoDep).transform((record) => {\n const deps: PackageDependency<CargoManagerData>[] = [];\n\n for (const [depName, dep] of Object.entries(record)) {\n dep.depName = depName;\n deps.push(dep);\n }\n\n return deps;\n});\n\nexport type CargoDeps = z.infer<typeof CargoDeps>;\n\nconst CargoSection = z.object({\n dependencies: withDepType(CargoDeps, 'dependencies').optional(),\n 'dev-dependencies': withDepType(CargoDeps, 'dev-dependencies').optional(),\n 'build-dependencies': withDepType(CargoDeps, 'build-dependencies').optional(),\n});\n\nconst CargoWorkspace = z.object({\n dependencies: withDepType(CargoDeps, 'workspace.dependencies').optional(),\n package: z\n .object({\n version: z.string().optional(),\n })\n .optional(),\n});\n\nconst CargoTarget = z.record(z.string(), CargoSection);\n\nexport const CargoManifest = Toml.pipe(\n CargoSection.extend({\n package: z\n .object({\n version: z\n .union([z.string(), z.object({ workspace: z.literal(true) })])\n .optional(),\n })\n .optional(),\n workspace: CargoWorkspace.optional(),\n target: CargoTarget.optional(),\n }),\n);\n\nconst CargoConfigRegistry = z.object({\n index: z.string().optional(),\n});\n\nconst CargoConfigSource = z.object({\n 'replace-with': z.string().optional(),\n registry: z.string().optional(),\n});\n\nexport const CargoConfig = Toml.pipe(\n z.object({\n registries: z.record(z.string(), CargoConfigRegistry).optional(),\n source: z.record(z.string(), CargoConfigSource).optional(),\n }),\n);\n\nexport type CargoConfig = z.infer<typeof CargoConfig>;\n\nconst CargoLockPackage = z.object({\n name: z.string(),\n version: z.string(),\n source: z.string().optional(),\n});\n\nexport const CargoLock = Toml.pipe(\n z.object({\n package: z.array(CargoLockPackage).optional(),\n }),\n);\n\nexport type CargoLock = z.infer<typeof CargoLock>;\n"],"mappings":";;;;;AAQA,MAAM,WAAW,EAAE,MAAM,CACvB,EACG,OAAO;;CAEN,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE1B,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;;CAEzB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE5B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE7B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE9B,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS;;CAE7B,WAAW,EAAE,QAAQ,CAAC,CAAC,SAAS;AAClC,CAAC,CAAC,CACD,WACE,EACC,MACA,KACA,KACA,KACA,QACA,SACA,UACA,SAAS,KACT,gBACyC;CACzC,IAAI;CACJ,IAAI;CACJ,IAAI,gBAAgB;CAEpB,IAAI,SAAS;EACX,eAAe;EACf,gBAAgB;CAClB,OACE,eAAe;CAGjB,MAAM,MAA2C;EAC/C;EACA,aAAa,EAAE,cAAc;EAC7B,YAAY,gBAAgB;CAC9B;CAEA,IAAI,MACF,aAAa;MACR,IAAI,WACT,aAAa;MACR,IAAI,KACT,eAAe,KAAK,KAAK,KAAK,KAAK,MAAM;MACpC,IAAI,CAAC,SACV,aAAa;CAGf,IAAI,YACF,IAAI,aAAa;CAEnB,IAAI,OAAO,CAAC,KACV,IAAI,cAAc;CAEpB,IAAI,UACF,IAAI,YAAa,eAAe;CAGlC,OAAO;AACT,CACF,GACF,EAAE,OAAO,CAAC,CAAC,WAAW,aAAkD;CACtE,cAAc;CACd,aAAa,EAAE,eAAe,MAAM;CACpC,YAAY,gBAAgB;AAC9B,EAAE,CACJ,CAAC;AAED,MAAM,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,WAAW,WAAW;CACrE,MAAM,OAA8C,CAAC;CAErD,KAAK,MAAM,CAAC,SAAS,QAAQ,OAAO,QAAQ,MAAM,GAAG;EACnD,IAAI,UAAU;EACd,KAAK,KAAK,GAAG;CACf;CAEA,OAAO;AACT,CAAC;AAID,MAAM,eAAe,EAAE,OAAO;CAC5B,cAAc,YAAY,WAAW,cAAc,CAAC,CAAC,SAAS;CAC9D,oBAAoB,YAAY,WAAW,kBAAkB,CAAC,CAAC,SAAS;CACxE,sBAAsB,YAAY,WAAW,oBAAoB,CAAC,CAAC,SAAS;AAC9E,CAAC;AAED,MAAM,iBAAiB,EAAE,OAAO;CAC9B,cAAc,YAAY,WAAW,wBAAwB,CAAC,CAAC,SAAS;CACxE,SAAS,EACN,OAAO,EACN,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,EAC/B,CAAC,CAAC,CACD,SAAS;AACd,CAAC;AAED,MAAM,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,YAAY;AAErD,MAAa,gBAAgB,KAAK,KAChC,aAAa,OAAO;CAClB,SAAS,EACN,OAAO,EACN,SAAS,EACN,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAC7D,SAAS,EACd,CAAC,CAAC,CACD,SAAS;CACZ,WAAW,eAAe,SAAS;CACnC,QAAQ,YAAY,SAAS;AAC/B,CAAC,CACH;AAEA,MAAM,sBAAsB,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"schema.js","names":[],"sources":["../../../../lib/modules/manager/cargo/schema.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport type { SkipReason } from '../../../types/index.ts';\nimport { Toml, withDepType } from '../../../util/schema-utils/index.ts';\nimport { CrateDatasource } from '../../datasource/crate/index.ts';\nimport type { PackageDependency } from '../types.ts';\nimport { applyGitSource } from '../util.ts';\nimport type { CargoManagerData } from './types.ts';\n\nconst CargoDep = z.union([\n z\n .object({\n /** Path on disk to the crate sources */\n path: z.string().optional(),\n /** Git URL for the dependency */\n git: z.string().optional(),\n /** Git tag for the dependency */\n tag: z.string().optional(),\n /** Git revision for the dependency */\n rev: z.string().optional(),\n /** Git branch for the dependency */\n branch: z.string().optional(),\n /** Semver version */\n version: z.string().optional(),\n /** Name of a registry whose URL is configured in `.cargo/config.toml` or `.cargo/config` */\n registry: z.string().optional(),\n /** Name of a package to look up */\n package: z.string().optional(),\n /** Whether the dependency is inherited from the workspace */\n workspace: z.boolean().optional(),\n })\n .transform(\n ({\n path,\n git,\n tag,\n rev,\n branch,\n version,\n registry,\n package: pkg,\n workspace,\n }): PackageDependency<CargoManagerData> => {\n let skipReason: SkipReason | undefined;\n let currentValue: string;\n let nestedVersion = false;\n\n if (version) {\n currentValue = version;\n nestedVersion = true;\n } else {\n currentValue = '';\n }\n\n const dep: PackageDependency<CargoManagerData> = {\n currentValue,\n managerData: { nestedVersion },\n datasource: CrateDatasource.id,\n };\n\n if (path) {\n skipReason = 'path-dependency';\n } else if (workspace) {\n skipReason = 'inherited-dependency';\n } else if (git) {\n applyGitSource(dep, git, rev, tag, branch);\n } else if (!version) {\n skipReason = 'invalid-dependency-specification';\n }\n\n if (skipReason) {\n dep.skipReason = skipReason;\n }\n if (pkg && !git) {\n dep.packageName = pkg;\n }\n if (registry) {\n dep.managerData!.registryName = registry;\n }\n\n return dep;\n },\n ),\n z.string().transform((version): PackageDependency<CargoManagerData> => ({\n currentValue: version,\n managerData: { nestedVersion: false },\n datasource: CrateDatasource.id,\n })),\n]);\n\nconst CargoDeps = z.record(z.string(), CargoDep).transform((record) => {\n const deps: PackageDependency<CargoManagerData>[] = [];\n\n for (const [depName, dep] of Object.entries(record)) {\n dep.depName = depName;\n deps.push(dep);\n }\n\n return deps;\n});\n\nexport type CargoDeps = z.infer<typeof CargoDeps>;\n\nconst CargoSection = z.object({\n dependencies: withDepType(CargoDeps, 'dependencies').optional(),\n 'dev-dependencies': withDepType(CargoDeps, 'dev-dependencies').optional(),\n 'build-dependencies': withDepType(CargoDeps, 'build-dependencies').optional(),\n});\n\nconst CargoWorkspace = z.object({\n dependencies: withDepType(CargoDeps, 'workspace.dependencies').optional(),\n package: z\n .object({\n version: z.string().optional(),\n })\n .optional(),\n});\n\nconst CargoTarget = z.record(z.string(), CargoSection);\n\nexport const CargoManifest = Toml.pipe(\n CargoSection.extend({\n package: z\n .object({\n version: z\n .union([z.string(), z.object({ workspace: z.literal(true) })])\n .optional(),\n })\n .optional(),\n workspace: CargoWorkspace.optional(),\n target: CargoTarget.optional(),\n }),\n);\n\nconst CargoConfigRegistry = z.object({\n index: z.string().optional(),\n 'min-publish-age': z.string().optional().catch(undefined),\n});\n\nconst CargoConfigSource = z.object({\n 'replace-with': z.string().optional(),\n registry: z.string().optional(),\n});\n\nexport const CargoConfig = Toml.pipe(\n z.object({\n registry: z\n .object({\n 'global-min-publish-age': z.string().optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n registries: z.record(z.string(), CargoConfigRegistry).optional(),\n resolver: z\n .object({\n 'incompatible-publish-age': z.string().optional().catch(undefined),\n })\n .optional()\n .catch(undefined),\n source: z.record(z.string(), CargoConfigSource).optional(),\n }),\n);\n\nexport type CargoConfig = z.infer<typeof CargoConfig>;\n\nconst CargoLockPackage = z.object({\n name: z.string(),\n version: z.string(),\n source: z.string().optional(),\n});\n\nexport const CargoLock = Toml.pipe(\n z.object({\n package: z.array(CargoLockPackage).optional(),\n }),\n);\n\nexport type CargoLock = z.infer<typeof CargoLock>;\n"],"mappings":"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"}
|