Creates a wizard to walk through creating a commit message in the correct template for commit messages in Angular repositories. PR Close #38457
		
			
				
	
	
		
			113 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			4.3 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 * as yargs from 'yargs';
 | |
| 
 | |
| import {info} from '../utils/console';
 | |
| 
 | |
| import {restoreCommitMessage} from './restore-commit-message';
 | |
| import {validateFile} from './validate-file';
 | |
| import {validateCommitRange} from './validate-range';
 | |
| import {runWizard} from './wizard';
 | |
| 
 | |
| /** Build the parser for the commit-message commands. */
 | |
| export function buildCommitMessageParser(localYargs: yargs.Argv) {
 | |
|   return localYargs.help()
 | |
|       .strict()
 | |
|       .command(
 | |
|           'restore-commit-message-draft', false,
 | |
|           args => {
 | |
|             return args.option('file-env-variable', {
 | |
|               type: 'string',
 | |
|               array: true,
 | |
|               conflicts: ['file'],
 | |
|               required: true,
 | |
|               description:
 | |
|                   'The key for the environment variable which holds the arguments for the\n' +
 | |
|                   'prepare-commit-msg hook as described here:\n' +
 | |
|                   'https://git-scm.com/docs/githooks#_prepare_commit_msg',
 | |
|               coerce: arg => {
 | |
|                 const [file, source] = (process.env[arg] || '').split(' ');
 | |
|                 if (!file) {
 | |
|                   throw new Error(`Provided environment variable "${arg}" was not found.`);
 | |
|                 }
 | |
|                 return [file, source];
 | |
|               },
 | |
|             });
 | |
|           },
 | |
|           args => {
 | |
|             restoreCommitMessage(args['file-env-variable'][0], args['file-env-variable'][1] as any);
 | |
|           })
 | |
|       .command(
 | |
|           'wizard <filePath> [source] [commitSha]', '', ((args: any) => {
 | |
|             return args
 | |
|                 .positional(
 | |
|                     'filePath',
 | |
|                     {description: 'The file path to write the generated commit message into'})
 | |
|                 .positional('source', {
 | |
|                   choices: ['message', 'template', 'merge', 'squash', 'commit'],
 | |
|                   description: 'The source of the commit message as described here: ' +
 | |
|                       'https://git-scm.com/docs/githooks#_prepare_commit_msg'
 | |
|                 })
 | |
|                 .positional(
 | |
|                     'commitSha', {description: 'The commit sha if source is set to `commit`'});
 | |
|           }),
 | |
|           async (args: any) => {
 | |
|             await runWizard(args);
 | |
|           })
 | |
|       .command(
 | |
|           'pre-commit-validate', 'Validate the most recent commit message', {
 | |
|             'file': {
 | |
|               type: 'string',
 | |
|               conflicts: ['file-env-variable'],
 | |
|               description: 'The path of the commit message file.',
 | |
|             },
 | |
|             'file-env-variable': {
 | |
|               type: 'string',
 | |
|               conflicts: ['file'],
 | |
|               description:
 | |
|                   'The key of the environment variable for the path of the commit message file.',
 | |
|               coerce: arg => {
 | |
|                 const file = process.env[arg];
 | |
|                 if (!file) {
 | |
|                   throw new Error(`Provided environment variable "${arg}" was not found.`);
 | |
|                 }
 | |
|                 return file;
 | |
|               },
 | |
|             }
 | |
|           },
 | |
|           args => {
 | |
|             const file = args.file || args['file-env-variable'] || '.git/COMMIT_EDITMSG';
 | |
|             validateFile(file);
 | |
|           })
 | |
|       .command(
 | |
|           'validate-range', 'Validate a range of commit messages', {
 | |
|             'range': {
 | |
|               description: 'The range of commits to check, e.g. --range abc123..xyz456',
 | |
|               demandOption: '  A range must be provided, e.g. --range abc123..xyz456',
 | |
|               type: 'string',
 | |
|               requiresArg: true,
 | |
|             },
 | |
|           },
 | |
|           argv => {
 | |
|             // If on CI, and not pull request number is provided, assume the branch
 | |
|             // being run on is an upstream branch.
 | |
|             if (process.env['CI'] && process.env['CI_PULL_REQUEST'] === 'false') {
 | |
|               info(`Since valid commit messages are enforced by PR linting on CI, we do not`);
 | |
|               info(`need to validate commit messages on CI runs on upstream branches.`);
 | |
|               info();
 | |
|               info(`Skipping check of provided commit range`);
 | |
|               return;
 | |
|             }
 | |
|             validateCommitRange(argv.range);
 | |
|           });
 | |
| }
 | |
| 
 | |
| if (require.main == module) {
 | |
|   buildCommitMessageParser(yargs).parse();
 | |
| }
 |