diff --git a/lib/manager/maven/extract.ts b/lib/manager/maven/extract.ts index 888c17947cc9236b03d4cf37ff733530655da991..bfd5057152de72ae07dda40d0ba346cc9f959fd0 100644 --- a/lib/manager/maven/extract.ts +++ b/lib/manager/maven/extract.ts @@ -39,11 +39,13 @@ function depFromNode(node: XmlElement): PackageDependency { const versionNode = node.descendantWithPath('version'); const fileReplacePosition = versionNode.position; const datasource = 'maven'; + const registryUrls = [DEFAULT_MAVEN_REPO]; return { datasource, depName, currentValue, fileReplacePosition, + registryUrls, }; } return null; @@ -163,14 +165,18 @@ export function extractPackage(rawContent: string, packageFile: string = null) { const repositories = project.childNamed('repositories'); if (repositories && repositories.children) { - const repoUrls = [DEFAULT_MAVEN_REPO]; + const repoUrls = []; for (const repo of repositories.childrenNamed('repository')) { const repoUrl = repo.valueWithPath('url'); if (repoUrl) { repoUrls.push(repoUrl); } } - result.registryUrls = repoUrls; + result.deps.forEach(dep => { + if (dep.registryUrls) { + repoUrls.forEach(url => dep.registryUrls.push(url)); + } + }); } if (packageFile && project.childNamed('parent')) { @@ -182,12 +188,11 @@ export function extractPackage(rawContent: string, packageFile: string = null) { return result; } -export function resolveParents(packages: PackageFile[]): PackageFile[] { +export function resolveProps(packages: PackageFile[]): PackageFile[] { const packageFileNames: string[] = []; const extractedPackages: Record<string, PackageFile> = {}; const extractedDeps: Record<string, PackageDependency[]> = {}; const extractedProps: Record<string, MavenProp> = {}; - const registryUrls: Record<string, Set<string>> = {}; packages.forEach(pkg => { const name = pkg.packageFile; packageFileNames.push(name); @@ -199,39 +204,21 @@ export function resolveParents(packages: PackageFile[]): PackageFile[] { // and merge them in reverse order, // which allows inheritance/overriding. packageFileNames.forEach(name => { - registryUrls[name] = new Set(); - const propsHierarchy: Record<string, MavenProp>[] = []; - const visitedPackages: Set<string> = new Set(); + const hierarchy: Record<string, MavenProp>[] = []; + const alreadyExtracted: Record<string, boolean> = {}; let pkg = extractedPackages[name]; while (pkg) { - propsHierarchy.unshift(pkg.mavenProps); - - if (pkg.registryUrls) { - pkg.registryUrls.forEach(url => { - registryUrls[name].add(url); - }); - } - - if (pkg.parent && !visitedPackages.has(pkg.parent)) { - visitedPackages.add(pkg.parent); + hierarchy.unshift(pkg.mavenProps); + if (pkg.parent && !alreadyExtracted[pkg.parent]) { + alreadyExtracted[pkg.parent] = true; pkg = extractedPackages[pkg.parent]; } else { pkg = null; } } - propsHierarchy.unshift({}); + hierarchy.unshift({}); // @ts-ignore - extractedProps[name] = Object.assign.apply(null, propsHierarchy); - }); - - // Resolve registryUrls - packageFileNames.forEach(name => { - const pkg = extractedPackages[name]; - const urls = [...registryUrls[name]]; - pkg.deps.forEach(rawDep => { - rawDep.registryUrls = urls; // eslint-disable-line no-param-reassign - }); - delete pkg.registryUrls; + extractedProps[name] = Object.assign.apply(null, hierarchy); }); // Resolve placeholders @@ -278,5 +265,6 @@ export async function extractAllPackageFiles( logger.info({ packageFile }, 'packageFile has no content'); } } - return cleanResult(resolveParents(packages)); + + return cleanResult(resolveProps(packages)); } diff --git a/test/manager/maven/__snapshots__/extract.spec.ts.snap b/test/manager/maven/__snapshots__/extract.spec.ts.snap index 60b96c15f169d5b5e23c2f517287f6ef69c0361e..601c732451fc11802c0837f6a4d3083fc71af5e2 100644 --- a/test/manager/maven/__snapshots__/extract.spec.ts.snap +++ b/test/manager/maven/__snapshots__/extract.spec.ts.snap @@ -9,78 +9,130 @@ Object { "datasource": "maven", "depName": "org.example:parent", "fileReplacePosition": 186, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "0.0.1", "datasource": "maven", "depName": "org.example:foo", "fileReplacePosition": 905, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "1.0.0", "datasource": "maven", "depName": "org.example:bar", "fileReplacePosition": 1053, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "1.8.1", "datasource": "maven", "depName": "org.apache.maven.scm:maven-scm-provider-gitexe", "fileReplacePosition": 1485, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "0.0.1", "datasource": "maven", "depName": "org.example:\${artifact-id-placeholder}", "fileReplacePosition": 2230, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "0.0.1", "datasource": "maven", "depName": "\${group-id-placeholder}:baz", "fileReplacePosition": 2380, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "\${quuxVersion}", "datasource": "maven", "depName": "\${quuxGroup}:\${quuxId}", "fileReplacePosition": 2525, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "\${quuxVersion}", "datasource": "maven", "depName": "\${quuxGroup}:\${quuxId}-test", "fileReplacePosition": 2684, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "1.2.3", "datasource": "maven", "depName": "org.example:quuz", "fileReplacePosition": 2832, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "it's not a version", "datasource": "maven", "depName": "org.example:quuuz", "fileReplacePosition": 2972, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "[1.0.0]", "datasource": "maven", "depName": "org.example:hard-range", "fileReplacePosition": 3130, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "\${profile-placeholder}", "datasource": "maven", "depName": "org.example:profile-artifact", "fileReplacePosition": 3392, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, Object { "currentValue": "2.17", "datasource": "maven", "depName": "org.apache.maven.plugins:maven-checkstyle-plugin", "fileReplacePosition": 3668, + "registryUrls": Array [ + "https://repo.maven.apache.org/maven2", + "https://maven.atlassian.com/content/repositories/atlassian-public/", + ], }, ], "mavenProps": Object { @@ -101,9 +153,5 @@ Object { }, }, "packageFile": null, - "registryUrls": Array [ - "https://repo.maven.apache.org/maven2", - "https://maven.atlassian.com/content/repositories/atlassian-public/", - ], } `; diff --git a/test/manager/maven/index.spec.ts b/test/manager/maven/index.spec.ts index 11a30d65b9345ecf16f23fdab50b12cc23767e12..1f43c9c35fd53b9c72820122303ac7972b024343 100644 --- a/test/manager/maven/index.spec.ts +++ b/test/manager/maven/index.spec.ts @@ -1,7 +1,7 @@ import { readFileSync } from 'fs'; import { extractPackage, - resolveParents, + resolveProps, } from '../../../lib/manager/maven/extract'; import { extractAllPackageFiles, @@ -77,7 +77,7 @@ describe('manager/maven', () => { depName === 'org.example:quux'; const newValue = '9.9.9.9-final'; - const packages = resolveParents([ + const packages = resolveProps([ extractPackage(pomParent, 'parent.pom.xml'), extractPackage(pomChild, 'child.pom.xml'), ]); @@ -85,7 +85,7 @@ describe('manager/maven', () => { const dep = deps.find(finder); const upgrade = { ...dep, newValue }; const updatedContent = updateDependency(pomParent, upgrade); - const [updatedPkg] = resolveParents([ + const [updatedPkg] = resolveProps([ extractPackage(updatedContent, 'parent.pom.xml'), extractPackage(pomChild, 'child.pom.xml'), ]);