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
3 changes: 3 additions & 0 deletions __snapshots__/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,9 @@ Options:
the first major release
[boolean] [default: false]
--prerelease-type type of the prerelease, e.g., alpha [string]
--prerelease-initial-number starting number to append to the first
generated prerelease, e.g., 1 results in a
first prerelease of 1.0.0-alpha.1 [number]
--extra-files extra files for the strategy to consider
[string]
--version-file path to version file to update, e.g.,
Expand Down
2 changes: 2 additions & 0 deletions docs/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Extra options:
| `--bump-minor-pre-major` | `boolean` | Configuration option for the versioning strategy. If set, will bump the minor version for breaking changes for versions < 1.0.0 |
| `--bump-patch-for-minor-pre-major` | `boolean` | Configuration option for the versioning strategy. If set, will bump the patch version for features for versions < 1.0.0 |
| `--prerelease-type` | `string` | Configuration option for the prerelease versioning strategy. If prerelease strategy used and type set, will set the prerelease part of the version to the provided value in case prerelease part is not present. |
| `--prerelease-initial-number` | `number` | Configuration option for the prerelease versioning strategy. Sets the starting number appended to the first generated prerelease, e.g. `1` results in a first prerelease of `1.0.0-alpha.1` instead of `1.0.0-alpha`. Must be a non-negative integer. |
| `--draft` | `boolean` | If set, create releases as drafts |
| `--prerelease` | `boolean` | If set, create releases that are pre-major or pre-release version marked as pre-release on Github |
| `--force-tag-creation` | `boolean` | Force the creation of a Git tag for the release. Useful when `--draft` is enabled, because GitHub does not create a Git tag for draft releases until they are published. This causes release-please to fail to find the previous release, potentially generating incorrect changelogs. Setting this option ensures the tag is created immediately. |
Expand Down Expand Up @@ -107,6 +108,7 @@ need to specify your release options:
| `--bump-minor-pre-major` | boolean | Configuration option for the versioning strategy. If set, will bump the minor version for breaking changes for versions < 1.0.0 |
| `--bump-patch-for-minor-pre-major` | boolean | Configuration option for the versioning strategy. If set, will bump the patch version for features for versions < 1.0.0 |
| `--prerelease-type` | `string` | Configuration option for the prerelease versioning strategy. If prerelease strategy used and type set, will set the prerelease part of the version to the provided value in case prerelease part is not present. |
| `--prerelease-initial-number` | `number` | Configuration option for the prerelease versioning strategy. Sets the starting number appended to the first generated prerelease, e.g. `1` results in a first prerelease of `1.0.0-alpha.1` instead of `1.0.0-alpha`. Must be a non-negative integer. |
| `--draft-pull-request` | boolean | If set, create pull requests as drafts |
| `--label` | string | Comma-separated list of labels to apply to the release pull requests. Defaults to `autorelease: pending` |`autorelease: tagged` |
| `--changelog-path` | `string` | Override the path to the managed CHANGELOG. Defaults to `CHANGELOG.md` |
Expand Down
7 changes: 7 additions & 0 deletions docs/manifest-releaser.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,13 @@ defaults (those are documented in comments)
// setting the type of prerelease in case of prerelease strategy
"prerelease-type": "beta",

// starting number appended to the first generated prerelease when using
// the "prerelease" versioning strategy. For example, setting this to `1`
// results in a first prerelease of `1.0.0-beta.1` instead of `1.0.0-beta`.
// Must be a non-negative integer. Absence preserves the current behavior of
// omitting a number from the first prerelease.
"prerelease-initial-number": 1,

// set default conventional commit => changelog sections mapping/appearance.
// absence defaults to https://git.io/JqCZL
"changelog-sections": [...],
Expand Down
5 changes: 5 additions & 0 deletions schemas/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
"description": "Configuration option for the prerelease versioning strategy. If prerelease strategy used and type set, will set the prerelease part of the version to the provided value in case prerelease part is not present.",
"type": "string"
},
"prerelease-initial-number": {
"description": "Configuration option for the prerelease versioning strategy. Sets the starting number appended to the first generated prerelease, e.g. `1` results in a first prerelease of `1.0.0-alpha.1` instead of `1.0.0-alpha`. Must be a non-negative integer.",
"type": "integer",
"minimum": 0
},
"versioning": {
"description": "Versioning strategy. Defaults to `default`",
"type": "string"
Expand Down
31 changes: 20 additions & 11 deletions src/bin/release-please.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,25 @@
// See the License for the specific language governing permissions and
// limitations under the License.

import {coerceOption} from '../util/coerce-option';
import {createPatch} from 'diff';
import * as yargs from 'yargs';
import {GitHub} from '../github';
import {GH_API_URL, GH_GRAPHQL_URL} from '../github-api';
import {Manifest, ManifestOptions, ROOT_PROJECT_PATH} from '../manifest';
import {Bootstrapper} from '../bootstrapper';
import {ChangelogSection, buildChangelogSections} from '../changelog-notes';
import {logger, setLogger, CheckpointLogger} from '../util/logger';
import {
getReleaserTypes,
ChangelogNotesType,
ReleaseType,
VersioningStrategyType,
getVersioningStrategyTypes,
ChangelogNotesType,
getChangelogTypes,
getReleaserTypes,
getVersioningStrategyTypes,
} from '../factory';
import {Bootstrapper} from '../bootstrapper';
import {createPatch} from 'diff';
import {Scm} from '../scm';
import {GitHub} from '../github';
import {GH_API_URL, GH_GRAPHQL_URL} from '../github-api';
import {LocalGitHub} from '../local-github';
import {Manifest, ManifestOptions, ROOT_PROJECT_PATH} from '../manifest';
import {Scm} from '../scm';
import {coerceOption} from '../util/coerce-option';
import {CheckpointLogger, logger, setLogger} from '../util/logger';

// eslint-disable-next-line @typescript-eslint/no-var-requires
const parseGithubRepoUrl = require('parse-github-repo-url');
Expand Down Expand Up @@ -70,6 +70,7 @@ interface VersioningArgs {
bumpMinorPreMajor?: boolean;
bumpPatchForMinorPreMajor?: boolean;
prereleaseType?: string;
prereleaseInitialNumber?: number;
releaseAs?: string;

// only for Ruby: TODO replace with generic bootstrap option
Expand Down Expand Up @@ -308,6 +309,12 @@ function pullRequestStrategyOptions(yargs: yargs.Argv): yargs.Argv {
describe: 'type of the prerelease, e.g., alpha',
type: 'string',
})
.option('prerelease-initial-number', {
describe:
'starting number to append to the first generated prerelease, ' +
'e.g., 1 results in a first prerelease of 1.0.0-alpha.1',
type: 'number',
})
.option('extra-files', {
describe: 'extra files for the strategy to consider',
type: 'string',
Expand Down Expand Up @@ -495,6 +502,7 @@ const createReleasePullRequestCommand: yargs.CommandModule<
bumpMinorPreMajor: argv.bumpMinorPreMajor,
bumpPatchForMinorPreMajor: argv.bumpPatchForMinorPreMajor,
prereleaseType: argv.prereleaseType,
prereleaseInitialNumber: argv.prereleaseInitialNumber,
changelogPath: argv.changelogPath,
changelogType: argv.changelogType,
changelogHost: argv.changelogHost,
Expand Down Expand Up @@ -764,6 +772,7 @@ const bootstrapCommand: yargs.CommandModule<{}, BootstrapArgs> = {
bumpMinorPreMajor: argv.bumpMinorPreMajor,
bumpPatchForMinorPreMajor: argv.bumpPatchForMinorPreMajor,
prereleaseType: argv.prereleaseType,
prereleaseInitialNumber: argv.prereleaseInitialNumber,
changelogPath: argv.changelogPath,
changelogHost: argv.changelogHost,
changelogSections: argv.changelogSections,
Expand Down
26 changes: 19 additions & 7 deletions src/factories/versioning-strategy-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.

import {VersioningStrategy} from '../versioning-strategy';
import {DefaultVersioningStrategy} from '../versioning-strategies/default';
import {AlwaysBumpPatch} from '../versioning-strategies/always-bump-patch';
import {AlwaysBumpMinor} from '../versioning-strategies/always-bump-minor';
import {AlwaysBumpMajor} from '../versioning-strategies/always-bump-major';
import {ServicePackVersioningStrategy} from '../versioning-strategies/service-pack';
import {Scm} from '../scm';
import {ConfigurationError} from '../errors';
import {Scm} from '../scm';
import {AlwaysBumpMajor} from '../versioning-strategies/always-bump-major';
import {AlwaysBumpMinor} from '../versioning-strategies/always-bump-minor';
import {AlwaysBumpPatch} from '../versioning-strategies/always-bump-patch';
import {DefaultVersioningStrategy} from '../versioning-strategies/default';
import {PrereleaseVersioningStrategy} from '../versioning-strategies/prerelease';
import {ServicePackVersioningStrategy} from '../versioning-strategies/service-pack';
import {VersioningStrategy} from '../versioning-strategy';

export type VersioningStrategyType = string;

Expand All @@ -30,6 +30,7 @@ export interface VersioningStrategyFactoryOptions {
bumpPatchForMinorPreMajor?: boolean;
prereleaseType?: string;
prerelease?: boolean;
prereleaseInitialNumber?: number;
github: Scm;
}

Expand All @@ -49,6 +50,17 @@ const versioningTypes: Record<string, VersioningStrategyBuilder> = {
export function buildVersioningStrategy(
options: VersioningStrategyFactoryOptions
): VersioningStrategy {
if (
options.prereleaseInitialNumber !== undefined &&
(!Number.isInteger(options.prereleaseInitialNumber) ||
options.prereleaseInitialNumber < 0)
) {
throw new ConfigurationError(
`Invalid prerelease-initial-number: ${options.prereleaseInitialNumber}. Must be a non-negative integer.`,
'core',
`${options.github.repository.owner}/${options.github.repository.repo}`
);
}
const builder = versioningTypes[options.type || 'default'];
if (builder) {
return builder(options);
Expand Down
9 changes: 5 additions & 4 deletions src/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@
import {ConfigurationError} from './errors';
import {buildChangelogNotes} from './factories/changelog-notes-factory';
import {buildVersioningStrategy} from './factories/versioning-strategy-factory';
import {Scm} from './scm';
import {ReleaserConfig} from './manifest';
import {Scm} from './scm';
import {BaseStrategyOptions} from './strategies/base';
import {Bazel} from './strategies/bazel';
import {Dart} from './strategies/dart';
import {DotnetYoshi} from './strategies/dotnet-yoshi';
import {Elixir} from './strategies/elixir';
import {Expo} from './strategies/expo';
import {Go} from './strategies/go';
import {GoYoshi} from './strategies/go-yoshi';
import {GoLibrarian} from './strategies/go-librarian';
import {GoYoshi} from './strategies/go-yoshi';
import {Helm} from './strategies/helm';
import {Java} from './strategies/java';
import {JavaYoshi} from './strategies/java-yoshi';
Expand All @@ -36,14 +36,14 @@ import {Node} from './strategies/node';
import {NodeLibrarian} from './strategies/node-librarian';
import {OCaml} from './strategies/ocaml';
import {PHP} from './strategies/php';
import {PHPYoshi} from './strategies/php-yoshi';
import {PHPLibrarian} from './strategies/php-librarian';
import {PHPYoshi} from './strategies/php-yoshi';
import {Python} from './strategies/python';
import {PythonLibrarian} from './strategies/python-librarian';
import {R} from './strategies/r';
import {Ruby} from './strategies/ruby';
import {RubyYoshi} from './strategies/ruby-yoshi';
import {RubyLibrarian} from './strategies/ruby-librarian';
import {RubyYoshi} from './strategies/ruby-yoshi';
import {Rust} from './strategies/rust';
import {Sfdx} from './strategies/sfdx';
import {Simple} from './strategies/simple';
Expand Down Expand Up @@ -135,6 +135,7 @@ export async function buildStrategy(
bumpPatchForMinorPreMajor: options.bumpPatchForMinorPreMajor,
prereleaseType: options.prereleaseType,
prerelease: options.prerelease,
prereleaseInitialNumber: options.prereleaseInitialNumber,
});
const changelogNotes = buildChangelogNotes({
type: options.changelogType || 'default',
Expand Down
48 changes: 27 additions & 21 deletions src/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,40 +13,40 @@
// limitations under the License.

import {ChangelogSection} from './changelog-notes';
import {Scm, ScmRelease, ScmTag} from './scm';
import {Version, VersionsMap} from './version';
import {Commit, parseConventionalCommits} from './commit';
import {PullRequest} from './pull-request';
import {logger as defaultLogger, Logger} from './util/logger';
import {CommitSplit} from './util/commit-split';
import {TagName} from './util/tag-name';
import {Repository} from './repository';
import {BranchName} from './util/branch-name';
import {PullRequestTitle} from './util/pull-request-title';
import {ReleasePullRequest} from './release-pull-request';
import {
ConfigurationError,
DuplicateReleaseError,
FileNotFoundError,
} from './errors';
import {
buildPlugin,
buildStrategy,
ChangelogNotesType,
ReleaseType,
VersioningStrategyType,
buildPlugin,
ChangelogNotesType,
} from './factory';
import {ManifestPlugin} from './plugin';
import {Merge, MergeOptions} from './plugins/merge';
import {PullRequest} from './pull-request';
import {Release} from './release';
import {ReleasePullRequest} from './release-pull-request';
import {Repository} from './repository';
import {Scm, ScmRelease, ScmTag} from './scm';
import {Strategy} from './strategy';
import {MergeOptions, Merge} from './plugins/merge';
import {ReleasePleaseManifest} from './updaters/release-please-manifest';
import {BranchName} from './util/branch-name';
import {CommitExclude} from './util/commit-exclude';
import {CommitSplit} from './util/commit-split';
import {logger as defaultLogger, Logger} from './util/logger';
import {
DuplicateReleaseError,
FileNotFoundError,
ConfigurationError,
} from './errors';
import {ManifestPlugin} from './plugin';
import {
PullRequestOverflowHandler,
FilePullRequestOverflowHandler,
PullRequestOverflowHandler,
} from './util/pull-request-overflow-handler';
import {PullRequestTitle} from './util/pull-request-title';
import {signoffCommitMessage} from './util/signoff-commit-message';
import {CommitExclude} from './util/commit-exclude';
import {TagName} from './util/tag-name';
import {Version, VersionsMap} from './version';

type ExtraGenericFile = {
type: 'generic';
Expand Down Expand Up @@ -101,6 +101,7 @@ export interface ReleaserConfig {
bumpMinorPreMajor?: boolean;
bumpPatchForMinorPreMajor?: boolean;
prereleaseType?: string;
prereleaseInitialNumber?: number;

// Strategy options
releaseAs?: string;
Expand Down Expand Up @@ -164,6 +165,7 @@ interface ReleaserConfigJson {
'bump-minor-pre-major'?: boolean;
'bump-patch-for-minor-pre-major'?: boolean;
'prerelease-type'?: string;
'prerelease-initial-number'?: number;
'changelog-sections'?: ChangelogSection[];
'release-as'?: string;
'skip-github-release'?: boolean;
Expand Down Expand Up @@ -1395,6 +1397,7 @@ function extractReleaserConfig(
bumpMinorPreMajor: config['bump-minor-pre-major'],
bumpPatchForMinorPreMajor: config['bump-patch-for-minor-pre-major'],
prereleaseType: config['prerelease-type'],
prereleaseInitialNumber: config['prerelease-initial-number'],
versioning: config['versioning'],
changelogSections: config['changelog-sections'],
changelogPath: config['changelog-path'],
Expand Down Expand Up @@ -1751,6 +1754,9 @@ function mergeReleaserConfig(
pathConfig.bumpPatchForMinorPreMajor ??
defaultConfig.bumpPatchForMinorPreMajor,
prereleaseType: pathConfig.prereleaseType ?? defaultConfig.prereleaseType,
prereleaseInitialNumber:
pathConfig.prereleaseInitialNumber ??
defaultConfig.prereleaseInitialNumber,
versioning: pathConfig.versioning ?? defaultConfig.versioning,
changelogSections:
pathConfig.changelogSections ?? defaultConfig.changelogSections,
Expand Down
Loading
Loading