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

feat: add includeComponentInTag option for strategies and hook up to --monorepo-tags #1119

Merged
merged 2 commits into from
Nov 25, 2021
Merged
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
6 changes: 4 additions & 2 deletions __snapshots__/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ Options:
[string]
--repo-url GitHub URL to generate release for [required]
--dry-run Prepare but do not take action [boolean] [default: false]
--monorepo-tags include library name in tags and release branches
[boolean] [default: false]
--path release from path other than root directory [string]
--component name of component release is being minted for [string]
--package-name name of package release is being minted for [string]
Expand Down Expand Up @@ -151,8 +153,6 @@ Options:
the minor for non-breaking changes prior to
the first major release
[boolean] [default: false]
--monorepo-tags include library name in tags and release
branches [boolean] [default: false]
--extra-files extra files for the strategy to consider
[string]
--version-file path to version file to update, e.g.,
Expand Down Expand Up @@ -182,6 +182,8 @@ Options:
commit log message using the user and email
provided. (format "Name
<email@example.com>"). [string]
--monorepo-tags include library name in tags and release
branches [boolean] [default: false]
--path release from path other than root directory
[string]
--component name of component release is being minted
Expand Down
34 changes: 24 additions & 10 deletions src/bin/release-please.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ interface PullRequestArgs {

interface PullRequestStrategyArgs {
snapshot?: boolean;
monorepoTags?: boolean;
changelogSections?: ChangelogSection[];
changelogPath?: string;
versioningStrategy?: VersioningStrategyType;
Expand All @@ -103,18 +102,24 @@ interface PullRequestStrategyArgs {
extraFiles?: string[];
}

interface TaggingArgs {
monorepoTags?: boolean;
}

interface CreatePullRequestArgs
extends GitHubArgs,
ManifestArgs,
ManifestConfigArgs,
VersioningArgs,
PullRequestArgs,
PullRequestStrategyArgs {}
PullRequestStrategyArgs,
TaggingArgs {}
interface CreateReleaseArgs
extends GitHubArgs,
ManifestArgs,
ManifestConfigArgs,
ReleaseArgs {}
ReleaseArgs,
TaggingArgs {}
interface CreateManifestPullRequestArgs
extends GitHubArgs,
ManifestArgs,
Expand Down Expand Up @@ -239,11 +244,6 @@ function pullRequestStrategyOptions(yargs: yargs.Argv): yargs.Argv {
default: false,
type: 'boolean',
})
.option('monorepo-tags', {
describe: 'include library name in tags and release branches',
type: 'boolean',
default: false,
})
.option('extra-files', {
describe: 'extra files for the strategy to consider',
type: 'string',
Expand Down Expand Up @@ -350,6 +350,14 @@ function manifestOptions(yargs: yargs.Argv): yargs.Argv {
});
}

function taggingOptions(yargs: yargs.Argv): yargs.Argv {
return yargs.option('monorepo-tags', {
describe: 'include library name in tags and release branches',
type: 'boolean',
default: false,
});
}

const createReleasePullRequestCommand: yargs.CommandModule<
{},
CreatePullRequestArgs
Expand All @@ -359,7 +367,9 @@ const createReleasePullRequestCommand: yargs.CommandModule<
builder(yargs) {
return manifestOptions(
manifestConfigOptions(
pullRequestOptions(pullRequestStrategyOptions(gitHubOptions(yargs)))
taggingOptions(
pullRequestOptions(pullRequestStrategyOptions(gitHubOptions(yargs)))
)
)
);
},
Expand All @@ -384,6 +394,7 @@ const createReleasePullRequestCommand: yargs.CommandModule<
versioning: argv.versioningStrategy,
extraFiles: argv.extraFiles,
versionFile: argv.versionFile,
includeComponentInTag: argv.monorepoTags,
},
extractManifestOptions(argv),
argv.path
Expand Down Expand Up @@ -429,7 +440,9 @@ const createReleaseCommand: yargs.CommandModule<{}, CreateReleaseArgs> = {
describe: 'create a GitHub release from a release PR',
builder(yargs) {
return releaseOptions(
manifestOptions(manifestConfigOptions(gitHubOptions(yargs)))
manifestOptions(
manifestConfigOptions(taggingOptions(gitHubOptions(yargs)))
)
);
},
async handler(argv) {
Expand All @@ -448,6 +461,7 @@ const createReleaseCommand: yargs.CommandModule<{}, CreateReleaseArgs> = {
component: argv.component,
packageName: argv.packageName,
draft: argv.draft,
includeComponentInTag: argv.monorepoTags,
},
extractManifestOptions(argv),
argv.path
Expand Down
3 changes: 2 additions & 1 deletion src/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export async function buildStrategy(
bumpMinorPreMajor: options.bumpMinorPreMajor,
bumpPatchForMinorPreMajor: options.bumpPatchForMinorPreMajor,
});
const strategyOptions = {
const strategyOptions: StrategyOptions = {
github: options.github,
targetBranch,
path: options.path,
Expand All @@ -124,6 +124,7 @@ export async function buildStrategy(
versioningStrategy,
skipGitHubRelease: options.skipGithubRelease,
releaseAs: options.releaseAs,
includeComponentInTag: options.includeComponentInTag,
};
switch (options.releaseType) {
case 'ruby': {
Expand Down
3 changes: 3 additions & 0 deletions src/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ export interface ReleaserConfig {
draftPullRequest?: boolean;
component?: string;
packageName?: string;
includeComponentInTag?: boolean;

// Ruby-only
versionFile?: string;
Expand Down Expand Up @@ -86,6 +87,7 @@ interface ReleaserConfigJson {
'draft-pull-request'?: boolean;
label?: string;
'release-label'?: string;
'include-component-in-tag'?: boolean;

// Ruby-only
'version-file'?: string;
Expand Down Expand Up @@ -823,6 +825,7 @@ function extractReleaserConfig(config: ReleaserPackageConfig): ReleaserConfig {
packageName: config['package-name'],
versionFile: config['version-file'],
extraFiles: config['extra-files'],
includeComponentInTag: config['include-component-in-tag'],
};
}

Expand Down
16 changes: 14 additions & 2 deletions src/strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export interface StrategyOptions {
skipGitHubRelease?: boolean;
releaseAs?: string;
changelogNotes?: ChangelogNotes;
includeComponentInTag?: boolean;
}

/**
Expand All @@ -78,6 +79,7 @@ export abstract class Strategy {
protected tagSeparator?: string;
private skipGitHubRelease: boolean;
private releaseAs?: string;
private includeComponentInTag: boolean;

protected changelogNotes: ChangelogNotes;

Expand All @@ -101,6 +103,7 @@ export abstract class Strategy {
this.releaseAs = options.releaseAs;
this.changelogNotes =
options.changelogNotes || new DefaultChangelogNotes(options);
this.includeComponentInTag = options.includeComponentInTag ?? true;
}

/**
Expand Down Expand Up @@ -197,7 +200,11 @@ export abstract class Strategy {
const component = await this.getComponent();
logger.debug('component:', component);

const newVersionTag = new TagName(newVersion, component);
const newVersionTag = new TagName(
newVersion,
this.includeComponentInTag ? component : undefined,
this.tagSeparator
);
const pullRequestTitle = PullRequestTitle.ofComponentTargetBranchVersion(
component || '',
this.targetBranch,
Expand Down Expand Up @@ -327,8 +334,13 @@ export abstract class Strategy {
throw new Error('Pull request should have included version');
}

const tag = new TagName(
version,
this.includeComponentInTag ? component : undefined,
this.tagSeparator
);
return {
tag: new TagName(version, component, this.tagSeparator),
tag,
notes: notes || '',
sha: mergedPullRequest.sha,
};
Expand Down
42 changes: 42 additions & 0 deletions test/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,27 @@ describe('CLI', () => {
);
sinon.assert.calledOnce(createPullRequestsStub);
});

it('handles --monorepo-tags', async () => {
await parser.parseAsync(
'release-pr --repo-url=googleapis/release-please-cli --release-type=java-yoshi --monorepo-tags'
);

sinon.assert.calledOnceWithExactly(gitHubCreateStub, {
owner: 'googleapis',
repo: 'release-please-cli',
token: undefined,
});
sinon.assert.calledOnceWithExactly(
fromConfigStub,
fakeGitHub,
'main',
sinon.match({releaseType: 'java-yoshi', includeComponentInTag: true}),
sinon.match.any,
undefined
);
sinon.assert.calledOnce(createPullRequestsStub);
});
});
});
describe('github-release', () => {
Expand Down Expand Up @@ -1242,6 +1263,27 @@ describe('CLI', () => {
);
sinon.assert.calledOnce(createReleasesStub);
});

it('handles --monorepo-tags', async () => {
await parser.parseAsync(
'github-release --repo-url=googleapis/release-please-cli --release-type=java-yoshi --monorepo-tags'
);

sinon.assert.calledOnceWithExactly(gitHubCreateStub, {
owner: 'googleapis',
repo: 'release-please-cli',
token: undefined,
});
sinon.assert.calledOnceWithExactly(
fromConfigStub,
fakeGitHub,
'main',
sinon.match({releaseType: 'java-yoshi', includeComponentInTag: true}),
sinon.match.any,
undefined
);
sinon.assert.calledOnce(createReleasesStub);
});
});
});

Expand Down
46 changes: 46 additions & 0 deletions test/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1866,6 +1866,52 @@ describe('Manifest', () => {
expect(releases).lengthOf(1);
expect(releases[0].draft).to.be.true;
});

it('should skip component in tag', async () => {
mockPullRequests(
github,
[],
[
{
headBranchName: 'release-please/branches/main',
baseBranchName: 'main',
number: 1234,
title: 'chore: release main',
body: pullRequestBody('release-notes/single-manifest.txt'),
labels: ['autorelease: pending'],
files: [],
sha: 'abc123',
},
]
);
const getFileContentsStub = sandbox.stub(
github,
'getFileContentsOnBranch'
);
getFileContentsStub
.withArgs('package.json', 'main')
.resolves(
buildGitHubFileRaw(
JSON.stringify({name: '@google-cloud/release-brancher'})
)
);
const manifest = new Manifest(
github,
'main',
{
'.': {
releaseType: 'node',
includeComponentInTag: false,
},
},
{
'.': Version.parse('1.3.0'),
}
);
const releases = await manifest.buildReleases();
expect(releases).lengthOf(1);
expect(releases[0].tag.toString()).to.eql('v1.3.1');
});
});

describe('createReleases', () => {
Expand Down
43 changes: 42 additions & 1 deletion test/strategies/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,27 @@ describe('Strategy', () => {
const pullRequest = await strategy.buildReleasePullRequest([]);
expect(pullRequest).to.be.undefined;
});
});
describe('buildRelease', () => {
it('builds a release tag', async () => {
const strategy = new TestStrategy({
targetBranch: 'main',
github,
component: 'google-cloud-automl',
});
const release = await strategy.buildRelease({
title: 'chore(main): release v1.2.3',
headBranchName: 'release-please/branches/main',
baseBranchName: 'main',
number: 1234,
body: new PullRequestBody([]).toString(),
labels: [],
files: [],
sha: 'abc123',
});
expect(release, 'Release').to.not.be.undefined;
expect(release!.tag.toString()).to.eql('google-cloud-automl-v1.2.3');
});
it('overrides the tag separator', async () => {
const strategy = new TestStrategy({
targetBranch: 'main',
Expand All @@ -68,7 +89,27 @@ describe('Strategy', () => {
sha: 'abc123',
});
expect(release, 'Release').to.not.be.undefined;
expect(release!.tag.separator).to.eql('/');
expect(release!.tag.toString()).to.eql('google-cloud-automl/v1.2.3');
});
it('skips component in release tag', async () => {
const strategy = new TestStrategy({
targetBranch: 'main',
github,
component: 'google-cloud-automl',
includeComponentInTag: false,
});
const release = await strategy.buildRelease({
title: 'chore(main): release v1.2.3',
headBranchName: 'release-please/branches/main',
baseBranchName: 'main',
number: 1234,
body: new PullRequestBody([]).toString(),
labels: [],
files: [],
sha: 'abc123',
});
expect(release, 'Release').to.not.be.undefined;
expect(release!.tag.toString()).to.eql('v1.2.3');
});
});
});