Currently the `GitClient` accepts a generic parameter for determining
whether the `githubToken` should be set or not. This worked fine so far
in terms of distinguishing between an authenticated and
non-authenticated git client instance, but if we intend to conditionally
show methods only for authenticated instances, the generic parameter
is not suitable.
This commit splits up the `GitClient` into two classes. One for
the base logic without any authorization, and a second class that
extends the base logic with authentication logic. i.e. the
`AuthenticatedGitClient`. This allows us to have specific methods only
for the authenticated instance. e.g.
* `hasOauthScopes` has been moved to only exist for authenticated
instances.
* the GraphQL functionality within `gitClient.github` is not
accessible for non-authenticated instances. GraphQL API requires
authentication as per Github.
The initial motiviation for this was that we want to throw if
`hasOAuthScopes` is called without the Octokit instance having
a token configured. This should help avoiding issues as within
3b434ed94d
that prevented the caretaker process momentarily.
Additionally, the Git client has moved from `index.ts` to
`git-client.ts` for better discoverability in the codebase.
PR Close #42468
85 lines
2.9 KiB
TypeScript
85 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {writeFileSync} from 'fs';
|
|
import {join} from 'path';
|
|
import {SemVer} from 'semver';
|
|
import {Arguments, Argv, CommandModule} from 'yargs';
|
|
|
|
import {debug, info} from '../../utils/console';
|
|
import {GitClient} from '../../utils/git/git-client';
|
|
|
|
import {ReleaseNotes} from './release-notes';
|
|
|
|
/** Command line options for building a release. */
|
|
export interface ReleaseNotesOptions {
|
|
from?: string;
|
|
to: string;
|
|
outFile?: string;
|
|
releaseVersion: SemVer;
|
|
type: 'github-release'|'changelog';
|
|
}
|
|
|
|
/** Yargs command builder for configuring the `ng-dev release build` command. */
|
|
function builder(argv: Argv): Argv<ReleaseNotesOptions> {
|
|
return argv
|
|
.option(
|
|
'releaseVersion',
|
|
{type: 'string', default: '0.0.0', coerce: (version: string) => new SemVer(version)})
|
|
.option('from', {
|
|
type: 'string',
|
|
description: 'The git tag or ref to start the changelog entry from',
|
|
defaultDescription: 'The latest semver tag',
|
|
})
|
|
.option('to', {
|
|
type: 'string',
|
|
description: 'The git tag or ref to end the changelog entry with',
|
|
default: 'HEAD',
|
|
})
|
|
.option('type', {
|
|
type: 'string',
|
|
description: 'The type of release notes to create',
|
|
choices: ['github-release', 'changelog'] as const,
|
|
default: 'changelog' as const,
|
|
})
|
|
.option('outFile', {
|
|
type: 'string',
|
|
description: 'File location to write the generated release notes to',
|
|
coerce: (filePath?: string) => filePath ? join(process.cwd(), filePath) : undefined
|
|
});
|
|
}
|
|
|
|
/** Yargs command handler for generating release notes. */
|
|
async function handler({releaseVersion, from, to, outFile, type}: Arguments<ReleaseNotesOptions>) {
|
|
// Since `yargs` evaluates defaults even if a value as been provided, if no value is provided to
|
|
// the handler, the latest semver tag on the branch is used.
|
|
from = from || GitClient.get().getLatestSemverTag().format();
|
|
/** The ReleaseNotes instance to generate release notes. */
|
|
const releaseNotes = await ReleaseNotes.fromRange(releaseVersion, from, to);
|
|
|
|
/** The requested release notes entry. */
|
|
const releaseNotesEntry = await (
|
|
type === 'changelog' ? releaseNotes.getChangelogEntry() :
|
|
releaseNotes.getGithubReleaseEntry());
|
|
|
|
if (outFile) {
|
|
writeFileSync(outFile, releaseNotesEntry);
|
|
info(`Generated release notes for "${releaseVersion}" written to ${outFile}`);
|
|
} else {
|
|
process.stdout.write(releaseNotesEntry);
|
|
}
|
|
}
|
|
|
|
/** CLI command module for generating release notes. */
|
|
export const ReleaseNotesCommandModule: CommandModule<{}, ReleaseNotesOptions> = {
|
|
builder,
|
|
handler,
|
|
command: 'notes',
|
|
describe: 'Generate release notes',
|
|
};
|