diff --git a/lib/manager/maven/extract.ts b/lib/manager/maven/extract.ts index bfd5057152de72ae07dda40d0ba346cc9f959fd0..888c17947cc9236b03d4cf37ff733530655da991 100644 --- a/lib/manager/maven/extract.ts +++ b/lib/manager/maven/extract.ts @@ -39,13 +39,11 @@ 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; @@ -165,18 +163,14 @@ export function extractPackage(rawContent: string, packageFile: string = null) { const repositories = project.childNamed('repositories'); if (repositories && repositories.children) { - const repoUrls = []; + const repoUrls = [DEFAULT_MAVEN_REPO]; for (const repo of repositories.childrenNamed('repository')) { const repoUrl = repo.valueWithPath('url'); if (repoUrl) { repoUrls.push(repoUrl); } } - result.deps.forEach(dep => { - if (dep.registryUrls) { - repoUrls.forEach(url => dep.registryUrls.push(url)); - } - }); + result.registryUrls = repoUrls; } if (packageFile && project.childNamed('parent')) { @@ -188,11 +182,12 @@ export function extractPackage(rawContent: string, packageFile: string = null) { return result; } -export function resolveProps(packages: PackageFile[]): PackageFile[] { +export function resolveParents(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); @@ -204,21 +199,39 @@ export function resolveProps(packages: PackageFile[]): PackageFile[] { // and merge them in reverse order, // which allows inheritance/overriding. packageFileNames.forEach(name => { - const hierarchy: Record<string, MavenProp>[] = []; - const alreadyExtracted: Record<string, boolean> = {}; + registryUrls[name] = new Set(); + const propsHierarchy: Record<string, MavenProp>[] = []; + const visitedPackages: Set<string> = new Set(); let pkg = extractedPackages[name]; while (pkg) { - hierarchy.unshift(pkg.mavenProps); - if (pkg.parent && !alreadyExtracted[pkg.parent]) { - alreadyExtracted[pkg.parent] = true; + 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); pkg = extractedPackages[pkg.parent]; } else { pkg = null; } } - hierarchy.unshift({}); + propsHierarchy.unshift({}); // @ts-ignore - extractedProps[name] = Object.assign.apply(null, hierarchy); + 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; }); // Resolve placeholders @@ -265,6 +278,5 @@ export async function extractAllPackageFiles( logger.info({ packageFile }, 'packageFile has no content'); } } - - return cleanResult(resolveProps(packages)); + return cleanResult(resolveParents(packages)); } diff --git a/test/manager/maven/__snapshots__/extract.spec.ts.snap b/test/manager/maven/__snapshots__/extract.spec.ts.snap index 601c732451fc11802c0837f6a4d3083fc71af5e2..60b96c15f169d5b5e23c2f517287f6ef69c0361e 100644 --- a/test/manager/maven/__snapshots__/extract.spec.ts.snap +++ b/test/manager/maven/__snapshots__/extract.spec.ts.snap @@ -9,130 +9,78 @@ 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 { @@ -153,5 +101,9 @@ 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 1f43c9c35fd53b9c72820122303ac7972b024343..11a30d65b9345ecf16f23fdab50b12cc23767e12 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, - resolveProps, + resolveParents, } 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 = resolveProps([ + const packages = resolveParents([ 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] = resolveProps([ + const [updatedPkg] = resolveParents([ extractPackage(updatedContent, 'parent.pom.xml'), extractPackage(pomChild, 'child.pom.xml'), ]);