Skip to content

Commit

Permalink
feat(manager/nuget): update msbuild-sdks section in global.json (#11707)
Browse files Browse the repository at this point in the history
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
  • Loading branch information
olegkrivtsov and viceice committed Sep 14, 2021
1 parent 03ac68e commit 196df0d
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 0 deletions.
9 changes: 9 additions & 0 deletions lib/manager/nuget/__fixtures__/msbuild-sdk-files/global.json
@@ -0,0 +1,9 @@
{
"sdk": {
"version": "5.0.302",
"rollForward": "latestMajor"
},
"msbuild-sdks": {
"YoloDev.Sdk": "0.2.0"
}
}
@@ -0,0 +1 @@
invalid json
@@ -0,0 +1,3 @@
{
"type": "not a nuget global.json"
}
41 changes: 41 additions & 0 deletions lib/manager/nuget/extract.spec.ts
Expand Up @@ -114,6 +114,46 @@ describe('manager/nuget/extract', () => {
).toMatchSnapshot();
});

it('extracts msbuild-sdks from global.json', async () => {
const packageFile = 'msbuild-sdk-files/global.json';
const contents = loadFixture(packageFile);
expect(await extractPackageFile(contents, packageFile, config))
.toMatchInlineSnapshot(`
Object {
"deps": Array [
Object {
"currentValue": "5.0.302",
"depName": "dotnet-sdk",
"depType": "dotnet-sdk",
"skipReason": "unsupported-datasource",
},
Object {
"currentValue": "0.2.0",
"datasource": "nuget",
"depName": "YoloDev.Sdk",
"depType": "msbuild-sdk",
},
],
}
`);
});

it('handles malformed global.json', async () => {
const packageFile = 'msbuild-sdk-files/invalid-json/global.json';
const contents = loadFixture(packageFile);
expect(
await extractPackageFile(contents, packageFile, config)
).toBeNull();
});

it('handles not-a-nuget global.json', async () => {
const packageFile = 'msbuild-sdk-files/not-nuget/global.json';
const contents = loadFixture(packageFile);
expect(
await extractPackageFile(contents, packageFile, config)
).toBeNull();
});

describe('.config/dotnet-tools.json', () => {
const packageFile = '.config/dotnet-tools.json';
const contents = `{
Expand All @@ -126,6 +166,7 @@ describe('manager/nuget/extract', () => {
}
}
}`;

it('works', async () => {
// FIXME: explicit assert condition
expect(
Expand Down
5 changes: 5 additions & 0 deletions lib/manager/nuget/extract.ts
Expand Up @@ -5,6 +5,7 @@ import { logger } from '../../logger';
import { getSiblingFileName, localPathExists } from '../../util/fs';
import { hasKey } from '../../util/object';
import type { ExtractConfig, PackageDependency, PackageFile } from '../types';
import { extractMsbuildGlobalManifest } from './extract/global-manifest';
import type { DotnetToolsManifest } from './types';
import { getConfiguredRegistries } from './util';

Expand Down Expand Up @@ -112,6 +113,10 @@ export async function extractPackageFile(
return { deps };
}

if (packageFile.endsWith('global.json')) {
return extractMsbuildGlobalManifest(content, packageFile);
}

let deps: PackageDependency[] = [];
try {
const parsedXml = new XmlDocument(content);
Expand Down
51 changes: 51 additions & 0 deletions lib/manager/nuget/extract/global-manifest.ts
@@ -0,0 +1,51 @@
import * as datasourceNuget from '../../../datasource/nuget';
import { logger } from '../../../logger';
import { SkipReason } from '../../../types';
import type { PackageDependency, PackageFile } from '../../types';
import type { MsbuildGlobalManifest } from '../types';

export function extractMsbuildGlobalManifest(
content: string,
packageFile: string
): PackageFile | null {
const deps: PackageDependency[] = [];
let manifest: MsbuildGlobalManifest;

try {
manifest = JSON.parse(content);
} catch (err) {
logger.debug({ fileName: packageFile }, 'Invalid JSON');
return null;
}

if (!manifest['msbuild-sdks'] && !manifest.sdk?.version) {
logger.debug(
{ fileName: packageFile },
'This global.json is not a Nuget file'
);
return null;
}

if (manifest.sdk?.version) {
deps.push({
depType: 'dotnet-sdk',
depName: 'dotnet-sdk',
currentValue: manifest.sdk?.version,
skipReason: SkipReason.UnsupportedDatasource,
});
}

for (const depName of Object.keys(manifest['msbuild-sdks'])) {
const currentValue = manifest['msbuild-sdks'][depName];
const dep: PackageDependency = {
depType: 'msbuild-sdk',
depName,
currentValue,
datasource: datasourceNuget.id,
};

deps.push(dep);
}

return { deps };
}
1 change: 1 addition & 0 deletions lib/manager/nuget/index.ts
Expand Up @@ -10,5 +10,6 @@ export const defaultConfig = {
'\\.(?:cs|fs|vb)proj$',
'\\.(?:props|targets)$',
'\\.config\\/dotnet-tools\\.json$',
'(^|//)global\\.json$',
],
};
10 changes: 10 additions & 0 deletions lib/manager/nuget/types.ts
Expand Up @@ -14,3 +14,13 @@ export interface Registry {
readonly url: string;
readonly name?: string;
}

export interface MsbuildGlobalManifest {
readonly sdk: MsbuildSdk;
readonly 'msbuild-sdks': Record<string, string>;
}

export interface MsbuildSdk {
readonly version: string;
readonly rollForward: string;
}
1 change: 1 addition & 0 deletions lib/types/skip-reason.ts
Expand Up @@ -34,6 +34,7 @@ export enum SkipReason {
UnknownVersion = 'unknown-version',
UnknownVolta = 'unknown-volta',
UnsupportedChartType = 'unsupported-chart-type',
UnsupportedDatasource = 'unsupported-datasource',
UnsupportedRemote = 'unsupported-remote',
UnsupportedUrl = 'unsupported-url',
UnsupportedVersion = 'unsupported-version',
Expand Down

0 comments on commit 196df0d

Please sign in to comment.