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
49 lines
1.9 KiB
TypeScript
49 lines
1.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 {readFileSync} from 'fs';
|
|
import {resolve} from 'path';
|
|
|
|
import {error, green, info, log, red, yellow} from '../../utils/console';
|
|
import {GitClient} from '../../utils/git/git-client';
|
|
|
|
import {deleteCommitMessageDraft, saveCommitMessageDraft} from '../restore-commit-message/commit-message-draft';
|
|
import {printValidationErrors, validateCommitMessage} from '../validate';
|
|
|
|
/** Validate commit message at the provided file path. */
|
|
export function validateFile(filePath: string, isErrorMode: boolean) {
|
|
const git = GitClient.get();
|
|
const commitMessage = readFileSync(resolve(git.baseDir, filePath), 'utf8');
|
|
const {valid, errors} = validateCommitMessage(commitMessage);
|
|
if (valid) {
|
|
info(`${green('√')} Valid commit message`);
|
|
deleteCommitMessageDraft(filePath);
|
|
process.exitCode = 0;
|
|
return;
|
|
}
|
|
|
|
/** Function used to print to the console log. */
|
|
let printFn = isErrorMode ? error : log;
|
|
|
|
printFn(`${isErrorMode ? red('✘') : yellow('!')} Invalid commit message`);
|
|
printValidationErrors(errors, printFn);
|
|
if (isErrorMode) {
|
|
printFn(red('Aborting commit attempt due to invalid commit message.'));
|
|
printFn(
|
|
red('Commit message aborted as failure rather than warning due to local configuration.'));
|
|
} else {
|
|
printFn(yellow('Before this commit can be merged into the upstream repository, it must be'));
|
|
printFn(yellow('amended to follow commit message guidelines.'));
|
|
}
|
|
|
|
// On all invalid commit messages, the commit message should be saved as a draft to be
|
|
// restored on the next commit attempt.
|
|
saveCommitMessageDraft(filePath, commitMessage);
|
|
// Set the correct exit code based on if invalid commit message is an error.
|
|
process.exitCode = isErrorMode ? 1 : 0;
|
|
}
|