renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
88 lines (87 loc) • 4.9 kB
JavaScript
import "../../../constants/error-messages.js";
import { regEx } from "../../../util/regex.js";
import { logger } from "../../../logger/index.js";
import { ensureDir, getLocalFiles, getSiblingFileName, outputCacheFile, privateCacheDir, writeLocalFile } from "../../../util/fs/index.js";
import { exec } from "../../../util/exec/index.js";
import { getFiles } from "../../../util/git/index.js";
import { findGlobalJson, getConfiguredRegistries, getDefaultRegistries } from "./util.js";
import { createNuGetConfigXml } from "./config-formatter.js";
import { GLOBAL_JSON, getDependentPackageFiles } from "./package-tree.js";
import { isNonEmptyString } from "@sindresorhus/is";
import { quote } from "shlex";
import upath from "upath";
//#region lib/modules/manager/nuget/artifacts.ts
async function createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updatedDeps) {
const registries = await getConfiguredRegistries(packageFileName) ?? getDefaultRegistries();
const updatedDepsRegistries = Array.from(new Set(updatedDeps.flatMap((dep) => dep.registryUrls ?? []).filter(isNonEmptyString)), (url) => ({ url }));
const contents = createNuGetConfigXml([...registries, ...updatedDepsRegistries]);
const cachedNugetConfigFile = upath.join(nugetCacheDir, `nuget.config`);
await ensureDir(nugetCacheDir);
await outputCacheFile(cachedNugetConfigFile, contents);
return cachedNugetConfigFile;
}
async function runDotnetRestore(packageFileName, dependentPackageFileNames, config, updatedDeps) {
const nugetCacheDir = upath.join(privateCacheDir(), "nuget");
const nugetConfigFile = await createCachedNuGetConfigFile(nugetCacheDir, packageFileName, updatedDeps);
const dotnetVersion = config.constraints?.dotnet ?? (await findGlobalJson(packageFileName))?.sdk?.version;
const execOptions = {
docker: {},
extraEnv: {
NUGET_PACKAGES: upath.join(nugetCacheDir, "packages"),
MSBUILDDISABLENODEREUSE: "1"
},
toolConstraints: [{
toolName: "dotnet",
constraint: dotnetVersion
}]
};
const cmds = dependentPackageFileNames.map((fileName) => `dotnet restore ${quote(fileName)} --force-evaluate --configfile ${quote(nugetConfigFile)}`);
if (config.postUpdateOptions?.includes("dotnetWorkloadRestore")) cmds.unshift(`dotnet workload restore --configfile ${quote(nugetConfigFile)}`);
await exec(cmds, execOptions);
}
async function updateArtifacts({ packageFileName, newPackageFileContent, config, updatedDeps }) {
logger.debug(`nuget.updateArtifacts(${packageFileName})`);
const isCentralManagement = packageFileName === "Directory.Packages.props" || packageFileName === "Packages.props" || packageFileName.endsWith(`/Directory.Packages.props`) || packageFileName.endsWith(`/Packages.props`);
const isGlobalJson = packageFileName === GLOBAL_JSON;
const isDirectoryBuildProps = packageFileName === "Directory.Build.props" || packageFileName.endsWith(`/Directory.Build.props`);
if (!isCentralManagement && !isGlobalJson && !isDirectoryBuildProps && !regEx(/(?:cs|vb|fs)proj$/i).test(packageFileName)) {
logger.debug({ packageFileName }, "Not updating lock file for non project files");
return null;
}
const deps = await getDependentPackageFiles(packageFileName, isCentralManagement || isDirectoryBuildProps, isGlobalJson);
const packageFiles = deps.filter((d) => d.isLeaf).map((d) => d.name);
logger.trace({ packageFiles }, `Found ${packageFiles.length} dependent package files`);
const lockFileNames = deps.map((f) => getSiblingFileName(f.name, "packages.lock.json"));
const existingLockFileContentMap = await getFiles(lockFileNames);
if (!Object.values(existingLockFileContentMap).some((val) => !!val)) {
logger.debug({ packageFileName }, "No lock file found for package or dependents");
return null;
}
try {
if (updatedDeps.length === 0 && config.isLockFileMaintenance !== true) {
logger.debug(`Not updating lock file because no deps changed and no lock file maintenance.`);
return null;
}
await writeLocalFile(packageFileName, newPackageFileContent);
await runDotnetRestore(packageFileName, packageFiles, config, updatedDeps);
const newLockFileContentMap = await getLocalFiles(lockFileNames);
const retArray = [];
for (const lockFileName of lockFileNames) if (existingLockFileContentMap[lockFileName] === newLockFileContentMap[lockFileName]) logger.trace(`Lock file ${lockFileName} is unchanged`);
else if (newLockFileContentMap[lockFileName]) retArray.push({ file: {
type: "addition",
path: lockFileName,
contents: newLockFileContentMap[lockFileName]
} });
return retArray.length > 0 ? retArray : null;
} catch (err) {
if (err.message === "temporary-error") throw err;
logger.debug({ err }, "Failed to generate lock file");
return [{ artifactError: {
fileName: lockFileNames.join(", "),
stderr: err.stdout ?? err.message
} }];
}
}
//#endregion
export { updateArtifacts };
//# sourceMappingURL=artifacts.js.map