diff --git a/lib/manager/nuget/__fixtures__/with-config-file/NuGet.config b/lib/manager/nuget/__fixtures__/with-config-file/NuGet.config index 6cb726de41c628cffdf4b33723bed9e7eb70610c..77da4bd6be1d7716cd85e0d5b385bcd48a2f246f 100644 --- a/lib/manager/nuget/__fixtures__/with-config-file/NuGet.config +++ b/lib/manager/nuget/__fixtures__/with-config-file/NuGet.config @@ -4,5 +4,6 @@ <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> <add key="Contoso" value="https://contoso.com/packages/" /> + <remove key="test" /> </packageSources> </configuration> diff --git a/lib/manager/nuget/__snapshots__/extract.spec.ts.snap b/lib/manager/nuget/__snapshots__/extract.spec.ts.snap index e2e788f8a2fb774735fce6c5d86332726fd55bff..e90466b83895e6d1697620bc54ed923bd497a80b 100644 --- a/lib/manager/nuget/__snapshots__/extract.spec.ts.snap +++ b/lib/manager/nuget/__snapshots__/extract.spec.ts.snap @@ -1,5 +1,35 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`lib/manager/nuget/extract extractPackageFile() .config/dotnet-tools.json with-config 1`] = ` +Object { + "deps": Array [ + Object { + "currentValue": "2.0.0", + "datasource": "nuget", + "depName": "minver-cli", + "depType": "nuget", + "registryUrls": Array [ + "https://api.nuget.org/v3/index.json#protocolVersion=3", + "https://contoso.com/packages/", + ], + }, + ], +} +`; + +exports[`lib/manager/nuget/extract extractPackageFile() .config/dotnet-tools.json works 1`] = ` +Object { + "deps": Array [ + Object { + "currentValue": "2.0.0", + "datasource": "nuget", + "depName": "minver-cli", + "depType": "nuget", + }, + ], +} +`; + exports[`lib/manager/nuget/extract extractPackageFile() considers NuGet.config 1`] = ` Object { "deps": Array [ diff --git a/lib/manager/nuget/extract.spec.ts b/lib/manager/nuget/extract.spec.ts index e7733fb42003b6c6116ea5c85a58cff52922b0a2..926cac2b60cecd331c36e68b5750fa25c23ed2d9 100644 --- a/lib/manager/nuget/extract.spec.ts +++ b/lib/manager/nuget/extract.spec.ts @@ -1,10 +1,11 @@ import { readFileSync } from 'fs'; import * as path from 'path'; +import { ExtractConfig } from '../common'; import { extractPackageFile } from './extract'; describe('lib/manager/nuget/extract', () => { describe('extractPackageFile()', () => { - let config; + let config: ExtractConfig; beforeEach(() => { config = { localDir: path.resolve('lib/manager/nuget/__fixtures__'), @@ -84,5 +85,48 @@ describe('lib/manager/nuget/extract', () => { await extractPackageFile(contents, packageFile, config) ).toMatchSnapshot(); }); + + describe('.config/dotnet-tools.json', () => { + const packageFile = '.config/dotnet-tools.json'; + const contents = `{ + "version": 1, + "isRoot": true, + "tools": { + "minver-cli": { + "version": "2.0.0", + "commands": ["minver"] + } + } +}`; + it('works', async () => { + expect( + await extractPackageFile(contents, packageFile, config) + ).toMatchSnapshot(); + }); + + it('with-config', async () => { + expect( + await extractPackageFile( + contents, + `with-config-file/${packageFile}`, + config + ) + ).toMatchSnapshot(); + }); + + it('wrong version', async () => { + expect( + await extractPackageFile( + contents.replace('"version": 1,', '"version": 2,'), + packageFile, + config + ) + ).toBeNull(); + }); + + it('does not throw', async () => { + expect(await extractPackageFile('{{', packageFile, config)).toBeNull(); + }); + }); }); }); diff --git a/lib/manager/nuget/extract.ts b/lib/manager/nuget/extract.ts index 116a2c023ad0f2fe1de0f8e664a8561d45ced2ad..c6403ed4bd7b360a9cdcda792124472384cd32f3 100644 --- a/lib/manager/nuget/extract.ts +++ b/lib/manager/nuget/extract.ts @@ -8,6 +8,7 @@ import { SkipReason } from '../../types'; import { get } from '../../versioning'; import * as semverVersioning from '../../versioning/semver'; import { ExtractConfig, PackageDependency, PackageFile } from '../common'; +import { DotnetToolsManifest } from './types'; async function readFileAsXmlDocument(file: string): Promise<XmlDocument> { try { @@ -58,6 +59,7 @@ async function determineRegistryUrls( logger.debug({ registryUrl }, 'adding registry URL'); registryUrls.push(registryUrl); } + // child.name === 'remove' not supported } } return registryUrls; @@ -68,7 +70,7 @@ export async function extractPackageFile( content: string, packageFile: string, config: ExtractConfig -): Promise<PackageFile> { +): Promise<PackageFile | null> { logger.trace({ packageFile }, 'nuget.extractPackageFile()'); const { isVersion } = get(config.versioning || semverVersioning.id); const deps: PackageDependency[] = []; @@ -78,6 +80,40 @@ export async function extractPackageFile( config.localDir ); + if (packageFile.endsWith('.config/dotnet-tools.json')) { + let manifest: DotnetToolsManifest; + + try { + manifest = JSON.parse(content); + } catch (err) { + logger.debug({ fileName: packageFile }, 'Invalid JSON'); + return null; + } + + if (manifest.version !== 1) { + logger.debug({ contents: manifest }, 'Unsupported dotnet tools version'); + return null; + } + + for (const depName of Object.keys(manifest.tools)) { + const tool = manifest.tools[depName]; + const currentValue = tool.version; + const dep: PackageDependency = { + depType: 'nuget', + depName, + currentValue, + datasource: datasourceNuget.id, + }; + if (registryUrls) { + dep.registryUrls = registryUrls; + } + + deps.push(dep); + } + + return { deps }; + } + for (const line of content.split('\n')) { /** * https://docs.microsoft.com/en-us/nuget/concepts/package-versioning diff --git a/lib/manager/nuget/index.ts b/lib/manager/nuget/index.ts index f42cb6035220dcfd808005bef33f405f86c026f4..32d3de691697fc32be533071982b21d7447e4837 100644 --- a/lib/manager/nuget/index.ts +++ b/lib/manager/nuget/index.ts @@ -5,5 +5,9 @@ export { extractPackageFile } from './extract'; export const language = LANGUAGE_DOT_NET; export const defaultConfig = { - fileMatch: ['\\.(?:cs|fs|vb)proj$'], + fileMatch: [ + '\\.(?:cs|fs|vb)proj$', + '\\.(?:props|targets)$', + '\\.config\\/dotnet-tools\\.json$', + ], }; diff --git a/lib/manager/nuget/types.ts b/lib/manager/nuget/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..e2cbb13bf93d4f8fafbb4712af6a8e0404ed29f7 --- /dev/null +++ b/lib/manager/nuget/types.ts @@ -0,0 +1,11 @@ +export interface DotnetToolsManifest { + readonly version: number; + readonly isRoot: boolean; + + readonly tools: Record<string, DotnetTool>; +} + +export interface DotnetTool { + readonly version: string; + readonly commands: string[]; +}