UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

112 lines 5.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateArtifacts = updateArtifacts; const shlex_1 = require("shlex"); const upath_1 = require("upath"); const error_messages_1 = require("../../../constants/error-messages"); const logger_1 = require("../../../logger"); const exec_1 = require("../../../util/exec"); const fs_1 = require("../../../util/fs"); const git_1 = require("../../../util/git"); const regex_1 = require("../../../util/regex"); const config_formatter_1 = require("./config-formatter"); const package_tree_1 = require("./package-tree"); const util_1 = require("./util"); async function createCachedNuGetConfigFile(nugetCacheDir, packageFileName) { const registries = (await (0, util_1.getConfiguredRegistries)(packageFileName)) ?? (0, util_1.getDefaultRegistries)(); const contents = (0, config_formatter_1.createNuGetConfigXml)(registries); const cachedNugetConfigFile = (0, upath_1.join)(nugetCacheDir, `nuget.config`); await (0, fs_1.ensureDir)(nugetCacheDir); await (0, fs_1.outputCacheFile)(cachedNugetConfigFile, contents); return cachedNugetConfigFile; } async function runDotnetRestore(packageFileName, dependentPackageFileNames, config) { const nugetCacheDir = (0, upath_1.join)((0, fs_1.privateCacheDir)(), 'nuget'); const nugetConfigFile = await createCachedNuGetConfigFile(nugetCacheDir, packageFileName); const dotnetVersion = config.constraints?.dotnet ?? (await (0, util_1.findGlobalJson)(packageFileName))?.sdk?.version; const execOptions = { docker: {}, extraEnv: { NUGET_PACKAGES: (0, upath_1.join)(nugetCacheDir, 'packages'), MSBUILDDISABLENODEREUSE: '1', }, toolConstraints: [{ toolName: 'dotnet', constraint: dotnetVersion }], }; const cmds = [ ...dependentPackageFileNames.map((fileName) => `dotnet restore ${(0, shlex_1.quote)(fileName)} --force-evaluate --configfile ${(0, shlex_1.quote)(nugetConfigFile)}`), ]; await (0, exec_1.exec)(cmds, execOptions); } async function updateArtifacts({ packageFileName, newPackageFileContent, config, updatedDeps, }) { logger_1.logger.debug(`nuget.updateArtifacts(${packageFileName})`); // https://github.com/NuGet/Home/wiki/Centrally-managing-NuGet-package-versions // https://github.com/microsoft/MSBuildSdks/tree/main/src/CentralPackageVersions const isCentralManagement = packageFileName === package_tree_1.NUGET_CENTRAL_FILE || packageFileName === package_tree_1.MSBUILD_CENTRAL_FILE || packageFileName.endsWith(`/${package_tree_1.NUGET_CENTRAL_FILE}`) || packageFileName.endsWith(`/${package_tree_1.MSBUILD_CENTRAL_FILE}`); if (!isCentralManagement && !(0, regex_1.regEx)(/(?:cs|vb|fs)proj$/i).test(packageFileName)) { // This could be implemented in the future if necessary. // It's not that easy though because the questions which // project file to restore how to determine which lock files // have been changed in such cases. logger_1.logger.debug({ packageFileName }, 'Not updating lock file for non project files'); return null; } const deps = await (0, package_tree_1.getDependentPackageFiles)(packageFileName, isCentralManagement); const packageFiles = deps.filter((d) => d.isLeaf).map((d) => d.name); logger_1.logger.trace({ packageFiles }, `Found ${packageFiles.length} dependent package files`); const lockFileNames = deps.map((f) => (0, fs_1.getSiblingFileName)(f.name, 'packages.lock.json')); const existingLockFileContentMap = await (0, git_1.getFiles)(lockFileNames); const hasLockFileContent = Object.values(existingLockFileContentMap).some((val) => !!val); if (!hasLockFileContent) { logger_1.logger.debug({ packageFileName }, 'No lock file found for package or dependents'); return null; } try { if (updatedDeps.length === 0 && config.isLockFileMaintenance !== true) { logger_1.logger.debug(`Not updating lock file because no deps changed and no lock file maintenance.`); return null; } await (0, fs_1.writeLocalFile)(packageFileName, newPackageFileContent); await runDotnetRestore(packageFileName, packageFiles, config); const newLockFileContentMap = await (0, fs_1.getLocalFiles)(lockFileNames); const retArray = []; for (const lockFileName of lockFileNames) { if (existingLockFileContentMap[lockFileName] === newLockFileContentMap[lockFileName]) { logger_1.logger.trace(`Lock file ${lockFileName} is unchanged`); } else if (newLockFileContentMap[lockFileName]) { retArray.push({ file: { type: 'addition', path: lockFileName, contents: newLockFileContentMap[lockFileName], }, }); } // TODO: else should we return an artifact error if new content is missing? } return retArray.length > 0 ? retArray : null; } catch (err) { // istanbul ignore if if (err.message === error_messages_1.TEMPORARY_ERROR) { throw err; } logger_1.logger.debug({ err }, 'Failed to generate lock file'); return [ { artifactError: { lockFile: lockFileNames.join(', '), // error is written to stdout stderr: err.stdout ?? err.message, }, }, ]; } } //# sourceMappingURL=artifacts.js.map