Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(manager/nuget): update msbuild-sdks section in global.json #11707

Merged
merged 12 commits into from Sep 14, 2021
Merged
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"
}
36 changes: 36 additions & 0 deletions lib/manager/nuget/extract.spec.ts
Expand Up @@ -114,6 +114,41 @@ describe('manager/nuget/extract', () => {
).toMatchSnapshot();
});

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

it('handles malformed global.json', async () => {
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved
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 () => {
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved
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 +161,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
44 changes: 44 additions & 0 deletions lib/manager/nuget/extract/global-manifest.ts
@@ -0,0 +1,44 @@
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;
}
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved

for (const depName of Object.keys(manifest['msbuild-sdks'])) {
const sdk = manifest['msbuild-sdks'][depName];
const currentValue = sdk[0];
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved
const dep: PackageDependency = {
depType: 'nuget',
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved
depName,
currentValue,
datasource: datasourceNuget.id,
skipReason: SkipReason.UnsupportedDatasource,
olegkrivtsov marked this conversation as resolved.
Show resolved Hide resolved
};

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