Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(maven): bumpVersion update SNAPSHOT versions #27274

Merged
merged 11 commits into from
Apr 29, 2024
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>
12 changes: 12 additions & 0 deletions lib/modules/manager/maven/extract.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { extractPackage, extractRegistries } from './extract';

const minimumContent = Fixtures.get(`minimum.pom.xml`);
const simpleContent = Fixtures.get(`simple.pom.xml`);
const minimumSnapshotContent = Fixtures.get(`minimum_snapshot.pom.xml`);

const mirrorSettingsContent = Fixtures.get(`mirror.settings.xml`);
const profileSettingsContent = Fixtures.get(`profile.settings.xml`);
Expand Down Expand Up @@ -140,6 +141,17 @@ describe('modules/manager/maven/extract', () => {
packageFileVersion: '1',
});
});

it('tries minimum snapshot manifests', () => {
const res = extractPackage(minimumSnapshotContent, 'some-file');
expect(res).toEqual({
datasource: 'maven',
deps: [],
mavenProps: {},
packageFile: 'some-file',
packageFileVersion: '0.0.1-SNAPSHOT',
});
});
});

describe('extractRegistries', () => {
Expand Down
59 changes: 59 additions & 0 deletions lib/modules/manager/maven/update.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as pomUpdater from '.';

const simpleContent = Fixtures.get(`simple.pom.xml`);
const minimumContent = Fixtures.get(`minimum.pom.xml`);
const minimumSnapshotContent = Fixtures.get(`minimum_snapshot.pom.xml`);
const prereleaseContent = Fixtures.get(`prerelease.pom.xml`);

describe('modules/manager/maven/update', () => {
Expand All @@ -20,6 +21,53 @@ describe('modules/manager/maven/update', () => {
expect(project.valueWithPath('version')).toBe('0.0.2');
});

it('bumps pom.xml version keeping SNAPSHOT', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
minimumSnapshotContent,
'0.0.1-SNAPSHOT',
'patch',
);

const project = new XmlDocument(bumpedContent!);
expect(project.valueWithPath('version')).toBe('0.0.2-SNAPSHOT');
});

it('bumps pom.xml minor version keeping SNAPSHOT', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
minimumSnapshotContent,
'0.0.1-SNAPSHOT',
'minor',
);

const project = new XmlDocument(bumpedContent!);
expect(project.valueWithPath('version')).toBe('0.1.0-SNAPSHOT');
});

it('bumps pom.xml major version keeping SNAPSHOT', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
minimumSnapshotContent,
'0.0.1-SNAPSHOT',
'major',
);

const project = new XmlDocument(bumpedContent!);
expect(project.valueWithPath('version')).toBe('1.0.0-SNAPSHOT');
});

it('bumps pom.xml version keeping qualifier with -SNAPSHOT', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
minimumSnapshotContent.replace(
'0.0.1-SNAPSHOT',
'0.0.1-qualified-SNAPSHOT',
),
'0.0.1-qualified-SNAPSHOT',
'patch',
);

const project = new XmlDocument(bumpedContent!);
expect(project.valueWithPath('version')).toBe('0.0.2-qualified-SNAPSHOT');
});

it('does not bump version twice', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
simpleContent,
Expand Down Expand Up @@ -65,6 +113,17 @@ describe('modules/manager/maven/update', () => {
expect(bumpedContent).toEqual(simpleContent);
});

it('bumps pom.xml version to SNAPSHOT with prerelease', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
simpleContent,
'0.0.1',
'prerelease',
);

const project = new XmlDocument(bumpedContent!);
expect(project.valueWithPath('version')).toBe('0.0.2-SNAPSHOT');
});

it('bumps pom.xml version with prerelease semver level', () => {
const { bumpedContent } = pomUpdater.bumpPackageVersion(
prereleaseContent,
Expand Down
25 changes: 24 additions & 1 deletion lib/modules/manager/maven/update.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import is from '@sindresorhus/is';
import semver, { ReleaseType } from 'semver';
import { XmlDocument } from 'xmldoc';
import { logger } from '../../../logger';
Expand Down Expand Up @@ -78,7 +79,22 @@ export function bumpPackageVersion(
const startTagPosition = versionNode.startTagPosition;
const versionPosition = content.indexOf(versionNode.val, startTagPosition);

const newPomVersion = semver.inc(currentValue, bumpVersion);
let newPomVersion;
jonasrutishauser marked this conversation as resolved.
Show resolved Hide resolved
const prerelease = semver.prerelease(currentValue);
rarkins marked this conversation as resolved.
Show resolved Hide resolved
jonasrutishauser marked this conversation as resolved.
Show resolved Hide resolved
if (isSnapshot(prerelease) || !prerelease) {
jonasrutishauser marked this conversation as resolved.
Show resolved Hide resolved
let releaseType = bumpVersion;
if (isSnapshot(prerelease) && !bumpVersion.startsWith('pre')) {
jonasrutishauser marked this conversation as resolved.
Show resolved Hide resolved
releaseType = ('pre' + bumpVersion) as ReleaseType;
jonasrutishauser marked this conversation as resolved.
Show resolved Hide resolved
}
newPomVersion = semver.inc(
currentValue,
releaseType,
prerelease?.join('.') ?? 'SNAPSHOT',
false,
);
} else {
newPomVersion = semver.inc(currentValue, bumpVersion);
}
if (!newPomVersion) {
throw new Error('semver inc failed');
}
Expand Down Expand Up @@ -108,3 +124,10 @@ export function bumpPackageVersion(
}
return { bumpedContent };
}

function isSnapshot(
prerelease: ReadonlyArray<string | number> | null,
): boolean {
const lastPart = prerelease?.at(-1);
return is.string(lastPart) && lastPart.endsWith('SNAPSHOT');
}