diff --git a/lib/manager/maven/update.js b/lib/manager/maven/update.js index aabffbbdc3e282bbac44b1cb15a8ffaaf9378d56..64a91f7f4b66be928248e9ee566fb5164d0904d1 100644 --- a/lib/manager/maven/update.js +++ b/lib/manager/maven/update.js @@ -16,13 +16,10 @@ function updateAtPosition(fileContent, upgrade, endingAnchor = '"') { if (version === newValue) { return fileContent; } - if (version === currentValue) { - const replacedPart = versionPart.replace(currentValue, newValue); + if (version === currentValue || upgrade.groupName) { + const replacedPart = versionPart.replace(version, newValue); return leftPart + replacedPart + restPart; } - if (upgrade.groupName) { - return fileContent; - } logger.debug({ depName, version, currentValue, newValue }, 'Unknown value'); return null; } diff --git a/test/manager/maven/_fixtures/grouping.pom.xml b/test/manager/maven/_fixtures/grouping.pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..179f9f6451196bf352d19b28b7b934b3cb1147dd --- /dev/null +++ b/test/manager/maven/_fixtures/grouping.pom.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.example</groupId> + <artifactId>ExamplePomFile</artifactId> + + <properties> + <foo.version>1.0.0</foo.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.example</groupId> + <artifactId>foo-1</artifactId> + <version>${foo.version}</version> + </dependency> + <dependency> + <groupId>org.example</groupId> + <artifactId>foo-2</artifactId> + <version>${foo.version}</version> + </dependency> + <dependency> + <groupId>org.example</groupId> + <artifactId>bar</artifactId> + <version>2.0.0</version> + </dependency> + </dependencies> +</project> diff --git a/test/manager/maven/index.spec.js b/test/manager/maven/index.spec.js index 9f4edf4a99231ae56fa580cf31e1203d08a5d2d2..412a1b27dc0f21b8c1ff2031e0f6ae4fbc465bb1 100644 --- a/test/manager/maven/index.spec.js +++ b/test/manager/maven/index.spec.js @@ -23,6 +23,10 @@ const pomChild = fs.readFileSync( 'test/manager/maven/_fixtures/child.pom.xml', 'utf8' ); +const origContent = fs.readFileSync( + 'test/manager/maven/_fixtures/grouping.pom.xml', + 'utf8' +); function selectDep(deps, name = 'org.example:quuz') { return deps.find(dep => dep.depName === name); @@ -95,24 +99,46 @@ describe('manager/maven', () => { expect(pomContent).toBe(updatedContent); }); - it('should not touch content for the second update of grouped dependency', async () => { - platform.getFile.mockReturnValueOnce(pomContent); + it('should update to version of the latest dep in implicit group', async () => { + platform.getFile.mockReturnValueOnce(origContent); const [{ deps }] = await extractAllPackageFiles({}, ['pom.xml']); - const dep1 = selectDep(deps, 'org.example:quux'); - const dep2 = selectDep(deps, 'org.example:quux-test'); - const upgrade1 = { ...dep1, newValue: '2.0.0', groupName: 'quuxVersion' }; - const previouslyUpdatedContent = updateDependency(pomContent, upgrade1); - expect(previouslyUpdatedContent).toEqual( - pomContent.replace('1.2.3.4', '2.0.0') + const dep1 = selectDep(deps, 'org.example:foo-1'); + const upgrade1 = { ...dep1, newValue: '1.0.2' }; + + const dep2 = selectDep(deps, 'org.example:foo-2'); + const upgrade2 = { ...dep2, newValue: '1.0.3' }; + + const updatedOutside = origContent.replace('1.0.0', '1.0.1'); + + expect(updateDependency(origContent, upgrade1)).toEqual( + origContent.replace('1.0.0', '1.0.2') + ); + expect(updateDependency(updatedOutside, upgrade1)).toEqual( + origContent.replace('1.0.0', '1.0.2') + ); + + const updatedByPrevious = updateDependency(origContent, upgrade1); + + expect(updateDependency(updatedByPrevious, upgrade2)).toEqual( + origContent.replace('1.0.0', '1.0.3') + ); + expect(updateDependency(updatedOutside, upgrade2)).toEqual( + origContent.replace('1.0.0', '1.0.3') ); - const upgrade2 = { ...dep2, newValue: '1.9.9', groupName: 'quuxVersion' }; - const updatedContent = updateDependency( - previouslyUpdatedContent, - upgrade2 + expect(updateDependency(origContent, upgrade2)).toEqual( + origContent.replace('1.0.0', '1.0.3') ); - expect(updatedContent).toBe(previouslyUpdatedContent); + }); + + it('should return null for ungrouped deps if content was updated outside', async () => { + platform.getFile.mockReturnValueOnce(origContent); + const [{ deps }] = await extractAllPackageFiles({}, ['pom.xml']); + const dep = selectDep(deps, 'org.example:bar'); + const upgrade = { ...dep, newValue: '2.0.2' }; + const updatedOutside = origContent.replace('2.0.0', '2.0.1'); + expect(updateDependency(updatedOutside, upgrade)).toBeNull(); }); it('should return null if current versions in content and upgrade are not same', () => {