Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,15 @@ __pycache__
package-lock.json
debug.sh
.idea/

# Devenv
.devenv*
devenv.local.nix
devenv.lock
devenv.nix
devenv.yaml
.envrc

# direnv
.direnv

2 changes: 1 addition & 1 deletion docs/customizing.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ version given a list of parsed commits.
| `always-bump-minor` | Always bump minor version | |
| `always-bump-major` | Always bump major version |
| `service-pack` | Designed for Java backport fixes. Uses Maven's specification for service pack versions (e.g. 1.2.3-sp.1) |
| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta) |
| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta). Works together with the "prerelease" settings from [manifest-releaser](/docs/manifest-releaser.md) (see for more infos) - a prerelease version number will only be created, if the prerelease setting is set to true (false by default). |

### Adding additional versioning strategy types

Expand Down
4 changes: 4 additions & 0 deletions docs/manifest-releaser.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ defaults (those are documented in comments)
// when `manifest-release` creates GitHub Releases per package, create
// those as "Prerelease" releases that have pre-major or prerelease versions.
// absence defaults to false and all versions are fully Published.
// Works together with the "prerelease" versioning strategy, which creates a
// prerelease-version (like 1.0.0-alpha.1) only if this setting is set to true.
// This allows to create prerelease-versions on conditions (e.g. publish them only
// on release-candidate branches)
"prerelease": true

// Skip creating GitHub Releases
Expand Down
34 changes: 29 additions & 5 deletions src/versioning-strategies/prerelease.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
interface PrereleaseVersioningStrategyOptions
extends DefaultVersioningStrategyOptions {
prereleaseType?: string;
prerelease?: boolean;
}

/**
Expand Down Expand Up @@ -176,10 +177,12 @@ class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate {
*/
export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
readonly prereleaseType?: string;
readonly prerelease: boolean;

constructor(options: PrereleaseVersioningStrategyOptions = {}) {
super(options);
this.prereleaseType = options.prereleaseType;
this.prerelease = options.prerelease === true;
}

determineReleaseType(
Expand Down Expand Up @@ -207,19 +210,40 @@ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
}
}

let bumpedVersionUpdater: VersionUpdater;
if (breaking > 0) {
if (version.isPreMajor && this.bumpMinorPreMajor) {
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
this.prereleaseType
);
} else {
return new PrereleaseMajorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMajorVersionUpdate(
this.prereleaseType
);
}
} else if (features > 0) {
if (version.isPreMajor && this.bumpPatchForMinorPreMajor) {
return new PrereleasePatchVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
this.prereleaseType
);
} else {
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
this.prereleaseType
);
}
} else {
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
this.prereleaseType
);
}
if (!this.prerelease) {
const bumpedVersion: Version = bumpedVersionUpdater.bump(version);
return new CustomVersionUpdate(
Version.parse(
`${bumpedVersion.major}.${bumpedVersion.minor}.${bumpedVersion.patch}`
).toString()
);
}
return new PrereleasePatchVersionUpdate(this.prereleaseType);
return bumpedVersionUpdater;
}
}
5 changes: 5 additions & 0 deletions test/plugins/node-workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node1',
packageName: '@here/pkgA',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -362,6 +363,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node2',
packageName: '@here/pkgB',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -371,6 +373,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node3',
packageName: '@here/pkgC',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -380,6 +383,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node4',
packageName: '@here/pkgD',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand All @@ -389,6 +393,7 @@ describe('NodeWorkspace plugin', () => {
path: 'node5',
packageName: '@here/pkgE',
versioningStrategy: new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
}),
}),
Expand Down
80 changes: 75 additions & 5 deletions test/versioning-strategies/prerelease.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,15 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
it('can bump a minor pre major for breaking change', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpMinorPreMajor: true,
});
const oldVersion = Version.parse('0.1.2');
Expand Down Expand Up @@ -109,6 +110,7 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand All @@ -118,6 +120,7 @@ describe('PrereleaseVersioningStrategy', () => {
}
it('can bump a minor pre major for breaking change', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpMinorPreMajor: true,
prereleaseType: 'beta',
});
Expand All @@ -126,6 +129,27 @@ describe('PrereleaseVersioningStrategy', () => {
expect(newVersion.toString()).to.equal('0.2.0-beta');
});
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '2.0.0',
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '2.0.0',
'1.3.0-alpha': '2.0.0',
'1.3.0-alpha.1': '2.0.0',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
});

describe('with a feature', () => {
Expand Down Expand Up @@ -177,14 +201,15 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
it('can bump a patch pre-major', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpPatchForMinorPreMajor: true,
});
const oldVersion = Version.parse('0.1.2');
Expand Down Expand Up @@ -218,6 +243,7 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand All @@ -227,6 +253,7 @@ describe('PrereleaseVersioningStrategy', () => {
}
it('can bump a patch pre-major', async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
bumpPatchForMinorPreMajor: true,
prereleaseType: 'beta',
});
Expand All @@ -235,6 +262,27 @@ describe('PrereleaseVersioningStrategy', () => {
expect(newVersion.toString()).to.equal('0.1.3-beta');
});
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '1.3.0',
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '1.1.0',
'1.3.0-alpha': '1.3.0',
'1.3.0-alpha.1': '1.3.0',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
});

describe('with a fix', () => {
Expand Down Expand Up @@ -277,7 +325,7 @@ describe('PrereleaseVersioningStrategy', () => {
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
Expand Down Expand Up @@ -307,6 +355,28 @@ describe('PrereleaseVersioningStrategy', () => {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: true,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal(expected);
});
}
});
describe('without prerelease property', () => {
const expectedBumps: Record<string, string> = {
'1.2.3': '1.2.4',
'1.0.0-beta01': '1.0.0',
'1.1.0-beta01': '1.1.0',
'1.2.4-alpha': '1.2.4',
'1.2.4-alpha.1': '1.2.4',
};
for (const old in expectedBumps) {
const expected = expectedBumps[old];
it(`can bump ${old} to ${expected}`, async () => {
const strategy = new PrereleaseVersioningStrategy({
prerelease: false,
prereleaseType: 'beta',
});
const oldVersion = Version.parse(old);
Expand Down Expand Up @@ -354,7 +424,7 @@ describe('PrereleaseVersioningStrategy', () => {
breaking: false,
},
];
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse('1.2.3');
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal('3.1.2');
Expand Down Expand Up @@ -406,7 +476,7 @@ describe('PrereleaseVersioningStrategy', () => {
breaking: true,
},
];
const strategy = new PrereleaseVersioningStrategy();
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
const oldVersion = Version.parse('1.2.3');
const newVersion = await strategy.bump(oldVersion, commits);
expect(newVersion.toString()).to.equal('3.1.2');
Expand Down