diff --git a/lib/datasource/nuget/common.ts b/lib/datasource/nuget/common.ts index 10d4073b13c230be5f5a93839f870a40dbe1b65c..ace325849e4b259f0ff7c972c0513ea5ddf82478 100644 --- a/lib/datasource/nuget/common.ts +++ b/lib/datasource/nuget/common.ts @@ -9,6 +9,18 @@ export function removeBuildMeta(version: string): string { return version?.replace(buildMetaRe, ''); } +const urlWhitespaceRe = regEx(/\s/g); + +export function massageUrl(url: string): string { + let resultUrl = url; + + // During `dotnet pack` certain URLs are being URL decoded which may introduce whitespaces + // and causes Markdown link generation problems. + resultUrl = resultUrl?.replace(urlWhitespaceRe, '%20'); + + return resultUrl; +} + const protocolVersionRegExp = regEx(/#protocolVersion=(?<protocol>2|3)/); export function parseRegistryUrl(registryUrl: string): ParsedRegistryUrl { diff --git a/lib/datasource/nuget/v2.ts b/lib/datasource/nuget/v2.ts index 81875f8596ecc26e1cd144b41581e5427bc6eaf1..67c82f4a10fe3b5f43216c2315eafce8abab4411 100644 --- a/lib/datasource/nuget/v2.ts +++ b/lib/datasource/nuget/v2.ts @@ -3,7 +3,7 @@ import { logger } from '../../logger'; import type { Http } from '../../util/http'; import { regEx } from '../../util/regex'; import type { ReleaseResult } from '../types'; -import { removeBuildMeta } from './common'; +import { massageUrl, removeBuildMeta } from './common'; function getPkgProp(pkgInfo: XmlElement, propName: string): string { return pkgInfo.childNamed('m:properties').childNamed(`d:${propName}`)?.val; @@ -39,7 +39,7 @@ export async function getReleases( if (pkgIsLatestVersion === 'true') { const projectUrl = getPkgProp(pkgInfo, 'ProjectUrl'); if (projectUrl) { - dep.sourceUrl = projectUrl; + dep.sourceUrl = massageUrl(projectUrl); } } } catch (err) /* istanbul ignore next */ { diff --git a/lib/datasource/nuget/v3.ts b/lib/datasource/nuget/v3.ts index 3dec8d0fae0b720dafb1123d903b9b81e35cbae9..e6a3f8c28c90bb217b88960f38c2a3af5ef688b2 100644 --- a/lib/datasource/nuget/v3.ts +++ b/lib/datasource/nuget/v3.ts @@ -10,7 +10,7 @@ import { HttpError } from '../../util/http/types'; import { regEx } from '../../util/regex'; import { ensureTrailingSlash } from '../../util/url'; import type { Release, ReleaseResult } from '../types'; -import { removeBuildMeta } from './common'; +import { massageUrl, removeBuildMeta } from './common'; import type { CatalogEntry, CatalogPage, @@ -133,7 +133,7 @@ export async function getReleases( } if (semver.valid(version) && !semver.prerelease(version)) { latestStable = removeBuildMeta(version); - homepage = projectUrl || homepage; + homepage = massageUrl(projectUrl || homepage); } if (listed === false) { release.isDeprecated = true; @@ -172,7 +172,7 @@ export async function getReleases( const nuspec = new XmlDocument(metaresult.body); const sourceUrl = nuspec.valueWithPath('metadata.repository@url'); if (sourceUrl) { - dep.sourceUrl = sourceUrl; + dep.sourceUrl = massageUrl(sourceUrl); } } } catch (err) {