diff --git a/lib/modules/manager/nuget/package-tree.spec.ts b/lib/modules/manager/nuget/package-tree.spec.ts index 5725b7997cb66c0ac37bd638cd63ab869b32f647..e16f5a223cc40ff48f993cbc77496d8fb2a4dda0 100644 --- a/lib/modules/manager/nuget/package-tree.spec.ts +++ b/lib/modules/manager/nuget/package-tree.spec.ts @@ -154,5 +154,13 @@ describe('modules/manager/nuget/package-tree', () => { 'Circular reference detected in NuGet package files' ); }); + + it('throws error on invalid xml file', async () => { + git.getFileList.mockResolvedValue(['foo/bar.csproj']); + Fixtures.mock({ '/tmp/repo/foo/bar.csproj': '<invalid' }); + await expect(getDependentPackageFiles('foo/bar.csproj')).rejects.toThrow( + 'Invalid xml file: foo/bar.csproj' + ); + }); }); }); diff --git a/lib/modules/manager/nuget/package-tree.ts b/lib/modules/manager/nuget/package-tree.ts index cce82fb5c870b41808bf33b7b46582a4da8b9274..db23febed63e676f4f5a37bff6d36eaf9b8e9f8f 100644 --- a/lib/modules/manager/nuget/package-tree.ts +++ b/lib/modules/manager/nuget/package-tree.ts @@ -2,10 +2,9 @@ import is from '@sindresorhus/is'; import Graph from 'graph-data-structure'; import minimatch from 'minimatch'; import upath from 'upath'; -import xmldoc from 'xmldoc'; import { logger } from '../../../logger'; -import { readLocalFile } from '../../../util/fs'; import { getFileList } from '../../../util/git'; +import { readFileAsXmlDocument } from './util'; export const NUGET_CENTRAL_FILE = 'Directory.Packages.props'; export const MSBUILD_CENTRAL_FILE = 'Packages.props'; @@ -39,10 +38,11 @@ export async function getDependentPackageFiles( } for (const f of packageFiles) { - const packageFileContent = await readLocalFile(f, 'utf8'); + const doc = await readFileAsXmlDocument(f); + if (!doc) { + throw new Error(`Invalid xml file: ${f}`); + } - // TODO #7154 - const doc = new xmldoc.XmlDocument(packageFileContent!); const projectReferenceAttributes = doc .childrenNamed('ItemGroup') .map((ig) => ig.childrenNamed('ProjectReference')) diff --git a/lib/modules/manager/nuget/util.ts b/lib/modules/manager/nuget/util.ts index ba0751ce1611c75a386103c65d54015d639aa089..f15fd024275a6fbc814cebe9a484654a15b8c4ff 100644 --- a/lib/modules/manager/nuget/util.ts +++ b/lib/modules/manager/nuget/util.ts @@ -6,14 +6,16 @@ import { regEx } from '../../../util/regex'; import { defaultRegistryUrls } from '../../datasource/nuget'; import type { Registry } from './types'; -async function readFileAsXmlDocument( +export async function readFileAsXmlDocument( file: string ): Promise<XmlDocument | undefined> { try { // TODO #7154 - return new XmlDocument((await readLocalFile(file, 'utf8'))!); + const doc = new XmlDocument((await readLocalFile(file, 'utf8'))!); + // don't return empty documents + return doc?.firstChild ? doc : undefined; } catch (err) { - logger.debug({ err }, `failed to parse '${file}' as XML document`); + logger.debug({ err, file }, `failed to parse file as XML document`); return undefined; } }